trader  v0.1a
A framework to build trading applications
fybapi.h
1 
2 #pragma once
3 #include "app.h"
4 #include "api.h"
5 #include "fybconfig.h"
6 #include "helper.h"
7 
8 
9 namespace trader {
10 
11  namespace FybApi {
12 
13  class AccountInfo : public Poco::RefCountedObject {
14  public:
15 
16  AccountInfo();
17 
18  ~AccountInfo();
19 
20  void readFile(const std::string& _fileName);
21 
22  void read(Poco::Dynamic::Var val);
23 
24  struct DataObject {
25 
26  void SetAccNo(Poco::Int32 val)
27  {
28  accNo = val;
29  }
30 
31  bool isSetAccNo() {
32  return (accNo != std::numeric_limits<Poco::Int32>::max());
33  }
34 
35  Poco::Int32 accNo;
36 
37  void SetBtcBal(double val)
38  {
39  btcBal = val;
40  }
41 
42  bool isSetBtcBal() {
43  return (btcBal != std::numeric_limits<double>::max());
44  }
45 
46  double btcBal;
47 
48  void SetBtcDeposit(std::string val)
49  {
50  std::regex valRegex("^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$");
51  std::string valMatch(val);
52  if (std::regex_match(valMatch, valRegex))
53  {
54  btcDeposit = val;
55  }
56  else
57  {
58  throw Poco::RegularExpressionException("btcDeposit invalid.");
59  }
60  }
61 
62  bool isSetBtcDeposit() {
63  return (btcDeposit != "Empty");
64  }
65 
66  std::string btcDeposit;
67 
68  void SetEmail(std::string val)
69  {
70  std::regex valRegex("([\\w-\\.]+)@((?:[\\w]+\\.)+)([a-zA-Z]{2,4})");
71  std::string valMatch(val);
72  if (std::regex_match(valMatch, valRegex))
73  {
74  email = val;
75  }
76  else
77  {
78  throw Poco::RegularExpressionException("email invalid.");
79  }
80  }
81 
82  bool isSetEmail() {
83  return (email != "Empty");
84  }
85 
86  std::string email;
87 
88  void SetError(Poco::Int32 val)
89  {
90  error = val;
91  }
92 
93  bool isSetError() {
94  return (error != std::numeric_limits<Poco::Int32>::max());
95  }
96 
97  Poco::Int32 error;
98 
99  void SetSgdBal(double val)
100  {
101  sgdBal = val;
102  }
103 
104  bool isSetSgdBal() {
105  return (sgdBal != std::numeric_limits<double>::max());
106  }
107 
108  double sgdBal;
109 
110  DataObject()
111  : accNo(std::numeric_limits<Poco::Int32>::max())
112  , btcBal(std::numeric_limits<double>::max())
113  , btcDeposit("Empty")
114  , email("Empty")
115  , error(std::numeric_limits<Poco::Int32>::max())
116  , sgdBal(std::numeric_limits<double>::max())
117  {
118  }
119 
120  };
121 
122  DataObject dataObject;
123  }; //AccountInfo
124 
125  class CancelOrderParams : public Poco::RefCountedObject {
126  public:
127 
129 
131 
132  void readFile(const std::string& _fileName);
133 
134  void read(Poco::Dynamic::Var val);
135 
136  struct DataObject {
137 
138  // Ticket Number of Pending Order to cancel
139  void SetOrderNo(Poco::Int32 val)
140  {
141  orderNo = val;
142  }
143 
144  bool isSetOrderNo() {
145  return (orderNo != std::numeric_limits<Poco::Int32>::max());
146  }
147 
148  Poco::Int32 orderNo;
149 
150  DataObject()
151  : orderNo(std::numeric_limits<Poco::Int32>::max())
152  {
153  }
154 
155  };
156 
157  DataObject dataObject;
158  }; //CancelOrderParams
159 
160  class ErrorMessage : public Poco::RefCountedObject {
161  public:
162 
163  ErrorMessage();
164 
165  ~ErrorMessage();
166 
167  void readFile(const std::string& _fileName);
168 
169  void read(Poco::Dynamic::Var val);
170 
171  struct DataObject {
172 
173  void SetError(std::string val)
174  {
175  error = val;
176  }
177 
178  bool isSetError() {
179  return (error != "Empty");
180  }
181 
182  std::string error;
183 
184  DataObject()
185  : error("Empty")
186  {
187  }
188 
189  };
190 
191  DataObject dataObject;
192  }; //ErrorMessage
193 
194  class ErrorNumber : public Poco::RefCountedObject {
195  public:
196 
197  ErrorNumber();
198 
199  ~ErrorNumber();
200 
201  void readFile(const std::string& _fileName);
202 
203  void read(Poco::Dynamic::Var val);
204 
205  struct DataObject {
206 
207  void SetError(Poco::Int32 val)
208  {
209  error = val;
210  }
211 
212  bool isSetError() {
213  return (error != std::numeric_limits<Poco::Int32>::max());
214  }
215 
216  Poco::Int32 error;
217 
218  DataObject()
219  : error(std::numeric_limits<Poco::Int32>::max())
220  {
221  }
222 
223  };
224 
225  DataObject dataObject;
226  }; //ErrorNumber
227 
228  class ErrorNumberAndMessage : public Poco::RefCountedObject {
229  public:
230 
232 
234 
235  void readFile(const std::string& _fileName);
236 
237  void read(Poco::Dynamic::Var val);
238 
239  struct DataObject {
240 
241  void SetError(Poco::Int32 val)
242  {
243  error = val;
244  }
245 
246  bool isSetError() {
247  return (error != std::numeric_limits<Poco::Int32>::max());
248  }
249 
250  Poco::Int32 error;
251 
252  void SetMsg(std::string val)
253  {
254  msg = val;
255  }
256 
257  bool isSetMsg() {
258  return (msg != "Empty");
259  }
260 
261  std::string msg;
262 
263  DataObject()
264  : error(std::numeric_limits<Poco::Int32>::max())
265  , msg("Empty")
266  {
267  }
268 
269  };
270 
271  DataObject dataObject;
272  }; //ErrorNumberAndMessage
273 
274  class OrderBook : public Poco::RefCountedObject {
275  public:
276 
277  OrderBook();
278 
279  ~OrderBook();
280 
281  void readFile(const std::string& _fileName);
282 
283  void read(Poco::Dynamic::Var val);
284 
285  struct DataObject {
286 
287  typedef double AsksArrayArray;
288 
289  typedef std::vector<AsksArrayArray> AsksArray;
290  typedef std::vector<AsksArray> Asks;
291  Asks asks;
292  typedef double BidsArrayArray;
293 
294  typedef std::vector<BidsArrayArray> BidsArray;
295  typedef std::vector<BidsArray> Bids;
296  Bids bids;
297  DataObject()
298  {
299  }
300 
301  };
302 
303  DataObject dataObject;
304  }; //OrderBook
305 
306  class OrderHistory : public Poco::RefCountedObject {
307  public:
308 
309  OrderHistory();
310 
311  ~OrderHistory();
312 
313  void readFile(const std::string& _fileName);
314 
315  void read(Poco::Dynamic::Var val);
316 
317  struct DataObject {
318 
319  void SetError(Poco::Int32 val)
320  {
321  error = val;
322  }
323 
324  bool isSetError() {
325  return (error != std::numeric_limits<Poco::Int32>::max());
326  }
327 
328  Poco::Int32 error;
329 
330  struct OrdersArray {
331 
332  void SetDate_created(std::time_t val)
333  {
334  date_created = val;
335  }
336 
337  bool isSetDate_created() {
338  return (date_created != std::numeric_limits<time_t>::max());
339  }
340 
341  std::time_t date_created;
342 
343  void SetDate_executed(std::time_t val)
344  {
345  date_executed = val;
346  }
347 
348  bool isSetDate_executed() {
349  return (date_executed != std::numeric_limits<time_t>::max());
350  }
351 
352  std::time_t date_executed;
353 
354  void SetPrice(std::string val)
355  {
356  price = val;
357  }
358 
359  bool isSetPrice() {
360  return (price != "Empty");
361  }
362 
363  std::string price;
364 
365  void SetQty(std::string val)
366  {
367  qty = val;
368  }
369 
370  bool isSetQty() {
371  return (qty != "Empty");
372  }
373 
374  std::string qty;
375 
376  void SetStatus(std::string val)
377  {
378  status = val;
379  }
380 
381  bool isSetStatus() {
382  return (status != "Empty");
383  }
384 
385  std::string status;
386 
387  void SetTicket(Poco::Int32 val)
388  {
389  ticket = val;
390  }
391 
392  bool isSetTicket() {
393  return (ticket != std::numeric_limits<Poco::Int32>::max());
394  }
395 
396  Poco::Int32 ticket;
397 
398  // Whether it is a buy or sell order. Must be either 'B' or 'S' only.
399  void SetType(char val)
400  {
401  std::regex valRegex("B|S");
402  std::string valMatch(1, val);
403  if (std::regex_match(valMatch, valRegex))
404  {
405  type = val;
406  }
407  else
408  {
409  throw Poco::RegularExpressionException("type invalid.");
410  }
411  }
412 
413  bool isSetType() {
414  return (type != std::numeric_limits<char>::max());
415  }
416 
417  char type;
418 
419  OrdersArray()
420  : date_created(std::numeric_limits<time_t>::max())
421  , date_executed(std::numeric_limits<time_t>::max())
422  , price("Empty")
423  , qty("Empty")
424  , status("Empty")
425  , ticket(std::numeric_limits<Poco::Int32>::max())
426  , type(std::numeric_limits<char>::max())
427  {
428  }
429 
430  };
431 
432  typedef std::vector<OrdersArray> Orders;
433  Orders orders;
434  DataObject()
435  : error(std::numeric_limits<Poco::Int32>::max())
436  {
437  }
438 
439  };
440 
441  DataObject dataObject;
442  }; //OrderHistory
443 
444  class OrderHistoryParams : public Poco::RefCountedObject {
445  public:
446 
448 
450 
451  void readFile(const std::string& _fileName);
452 
453  void read(Poco::Dynamic::Var val);
454 
455  struct DataObject {
456 
457  void SetLimit(Poco::Int32 val)
458  {
459  limit = val;
460  }
461 
462  bool isSetLimit() {
463  return (limit != std::numeric_limits<Poco::Int32>::max());
464  }
465 
466  Poco::Int32 limit;
467 
468  DataObject()
469  : limit(std::numeric_limits<Poco::Int32>::max())
470  {
471  }
472 
473  };
474 
475  DataObject dataObject;
476  }; //OrderHistoryParams
477 
478  class OrderParams : public Poco::RefCountedObject {
479  public:
480 
481  OrderParams();
482 
483  ~OrderParams();
484 
485  void readFile(const std::string& _fileName);
486 
487  void read(Poco::Dynamic::Var val);
488 
489  struct DataObject {
490 
491  // Price to place order at
492  void SetPrice(double val)
493  {
494  price = val;
495  }
496 
497  bool isSetPrice() {
498  return (price != std::numeric_limits<double>::max());
499  }
500 
501  double price;
502 
503  // Quantity of bitcoins
504  void SetQty(double val)
505  {
506  qty = val;
507  }
508 
509  bool isSetQty() {
510  return (qty != std::numeric_limits<double>::max());
511  }
512 
513  double qty;
514 
515  // Whether it is a buy or sell order. Must be either 'B' or 'S' only.
516  void SetType(char val)
517  {
518  std::regex valRegex("B|S");
519  std::string valMatch(1, val);
520  if (std::regex_match(valMatch, valRegex))
521  {
522  type = val;
523  }
524  else
525  {
526  throw Poco::RegularExpressionException("type invalid.");
527  }
528  }
529 
530  bool isSetType() {
531  return (type != std::numeric_limits<char>::max());
532  }
533 
534  char type;
535 
536  DataObject()
537  : price(std::numeric_limits<double>::max())
538  , qty(std::numeric_limits<double>::max())
539  , type(std::numeric_limits<char>::max())
540  {
541  }
542 
543  };
544 
545  DataObject dataObject;
546  }; //OrderParams
547 
548  class OrderStatus : public Poco::RefCountedObject {
549  public:
550 
551  OrderStatus();
552 
553  ~OrderStatus();
554 
555  void readFile(const std::string& _fileName);
556 
557  void read(Poco::Dynamic::Var val);
558 
559  struct DataObject {
560 
561  void SetError(Poco::Int32 val)
562  {
563  error = val;
564  }
565 
566  bool isSetError() {
567  return (error != std::numeric_limits<Poco::Int32>::max());
568  }
569 
570  Poco::Int32 error;
571 
572  void SetMsg(std::string val)
573  {
574  msg = val;
575  }
576 
577  bool isSetMsg() {
578  return (msg != "Empty");
579  }
580 
581  std::string msg;
582 
583  void SetPending_oid(std::string val)
584  {
585  pending_oid = val;
586  }
587 
588  bool isSetPending_oid() {
589  return (pending_oid != "Empty");
590  }
591 
592  std::string pending_oid;
593 
594  DataObject()
595  : error(std::numeric_limits<Poco::Int32>::max())
596  , msg("Empty")
597  , pending_oid("Empty")
598  {
599  }
600 
601  };
602 
603  DataObject dataObject;
604  }; //OrderStatus
605 
606  class PendingOrders : public Poco::RefCountedObject {
607  public:
608 
609  PendingOrders();
610 
611  ~PendingOrders();
612 
613  void readFile(const std::string& _fileName);
614 
615  void read(Poco::Dynamic::Var val);
616 
617  struct DataObject {
618 
619  void SetError(Poco::Int32 val)
620  {
621  error = val;
622  }
623 
624  bool isSetError() {
625  return (error != std::numeric_limits<Poco::Int32>::max());
626  }
627 
628  Poco::Int32 error;
629 
630  struct OrdersArray {
631 
632  void SetDate(std::time_t val)
633  {
634  date = val;
635  }
636 
637  bool isSetDate() {
638  return (date != std::numeric_limits<time_t>::max());
639  }
640 
641  std::time_t date;
642 
643  void SetPrice(double val)
644  {
645  price = val;
646  }
647 
648  bool isSetPrice() {
649  return (price != std::numeric_limits<double>::max());
650  }
651 
652  double price;
653 
654  void SetQty(double val)
655  {
656  qty = val;
657  }
658 
659  bool isSetQty() {
660  return (qty != std::numeric_limits<double>::max());
661  }
662 
663  double qty;
664 
665  void SetTicket(Poco::Int32 val)
666  {
667  ticket = val;
668  }
669 
670  bool isSetTicket() {
671  return (ticket != std::numeric_limits<Poco::Int32>::max());
672  }
673 
674  Poco::Int32 ticket;
675 
676  // Whether it is a buy or sell order. Must be either 'B' or 'S' only.
677  void SetType(char val)
678  {
679  std::regex valRegex("B|S");
680  std::string valMatch(1, val);
681  if (std::regex_match(valMatch, valRegex))
682  {
683  type = val;
684  }
685  else
686  {
687  throw Poco::RegularExpressionException("type invalid.");
688  }
689  }
690 
691  bool isSetType() {
692  return (type != std::numeric_limits<char>::max());
693  }
694 
695  char type;
696 
697  OrdersArray()
698  : date(std::numeric_limits<time_t>::max())
699  , price(std::numeric_limits<double>::max())
700  , qty(std::numeric_limits<double>::max())
701  , ticket(std::numeric_limits<Poco::Int32>::max())
702  , type(std::numeric_limits<char>::max())
703  {
704  }
705 
706  };
707 
708  typedef std::vector<OrdersArray> Orders;
709  Orders orders;
710  DataObject()
711  : error(std::numeric_limits<Poco::Int32>::max())
712  {
713  }
714 
715  };
716 
717  DataObject dataObject;
718  }; //PendingOrders
719 
720  class Ticker : public Poco::RefCountedObject {
721  public:
722 
723  Ticker();
724 
725  ~Ticker();
726 
727  void readFile(const std::string& _fileName);
728 
729  void read(Poco::Dynamic::Var val);
730 
731  struct DataObject {
732 
733  void SetAsk(double val)
734  {
735  ask = val;
736  }
737 
738  bool isSetAsk() {
739  return (ask != std::numeric_limits<double>::max());
740  }
741 
742  double ask;
743 
744  void SetBid(double val)
745  {
746  bid = val;
747  }
748 
749  bool isSetBid() {
750  return (bid != std::numeric_limits<double>::max());
751  }
752 
753  double bid;
754 
755  DataObject()
756  : ask(std::numeric_limits<double>::max())
757  , bid(std::numeric_limits<double>::max())
758  {
759  }
760 
761  };
762 
763  DataObject dataObject;
764  }; //Ticker
765 
766  class TickerDetailed : public Poco::RefCountedObject {
767  public:
768 
769  TickerDetailed();
770 
771  ~TickerDetailed();
772 
773  void readFile(const std::string& _fileName);
774 
775  void read(Poco::Dynamic::Var val);
776 
777  struct DataObject {
778 
779  void SetAsk(double val)
780  {
781  ask = val;
782  }
783 
784  bool isSetAsk() {
785  return (ask != std::numeric_limits<double>::max());
786  }
787 
788  double ask;
789 
790  void SetBid(double val)
791  {
792  bid = val;
793  }
794 
795  bool isSetBid() {
796  return (bid != std::numeric_limits<double>::max());
797  }
798 
799  double bid;
800 
801  void SetLast(double val)
802  {
803  last = val;
804  }
805 
806  bool isSetLast() {
807  return (last != std::numeric_limits<double>::max());
808  }
809 
810  double last;
811 
812  void SetVol(double val)
813  {
814  vol = val;
815  }
816 
817  bool isSetVol() {
818  return (vol != std::numeric_limits<double>::max());
819  }
820 
821  double vol;
822 
823  DataObject()
824  : ask(std::numeric_limits<double>::max())
825  , bid(std::numeric_limits<double>::max())
826  , last(std::numeric_limits<double>::max())
827  , vol(std::numeric_limits<double>::max())
828  {
829  }
830 
831  };
832 
833  DataObject dataObject;
834  }; //TickerDetailed
835 
836  class Trades : public Poco::RefCountedObject {
837  public:
838 
839  Trades();
840 
841  ~Trades();
842 
843  void readFile(const std::string& _fileName);
844 
845  void read(Poco::Dynamic::Var val);
846 
847  struct DataArray {
848 
849  void SetAmount(double val)
850  {
851  amount = val;
852  }
853 
854  bool isSetAmount() {
855  return (amount != std::numeric_limits<double>::max());
856  }
857 
858  double amount;
859 
860  void SetDate(std::time_t val)
861  {
862  date = val;
863  }
864 
865  bool isSetDate() {
866  return (date != std::numeric_limits<time_t>::max());
867  }
868 
869  std::time_t date;
870 
871  void SetPrice(double val)
872  {
873  price = val;
874  }
875 
876  bool isSetPrice() {
877  return (price != std::numeric_limits<double>::max());
878  }
879 
880  double price;
881 
882  void SetTid(Poco::Int32 val)
883  {
884  tid = val;
885  }
886 
887  bool isSetTid() {
888  return (tid != std::numeric_limits<Poco::Int32>::max());
889  }
890 
891  Poco::Int32 tid;
892 
893  DataArray()
894  : amount(std::numeric_limits<double>::max())
895  , date(std::numeric_limits<time_t>::max())
896  , price(std::numeric_limits<double>::max())
897  , tid(std::numeric_limits<Poco::Int32>::max())
898  {
899  }
900 
901  };
902 
903  typedef std::vector<DataArray> Data;
904  Data data;
905  }; //Trades
906 
907  class TradesParams : public Poco::RefCountedObject {
908  public:
909 
910  TradesParams();
911 
912  ~TradesParams();
913 
914  void readFile(const std::string& _fileName);
915 
916  void read(Poco::Dynamic::Var val);
917 
918  struct DataObject {
919 
920  // Trade ID to begin trade history from. You should cache trade history and query only new trades by passing in last known trade id
921  void SetSince(Poco::Int32 val)
922  {
923  since = val;
924  }
925 
926  bool isSetSince() {
927  return (since != std::numeric_limits<Poco::Int32>::max());
928  }
929 
930  Poco::Int32 since;
931 
932  DataObject()
933  : since(std::numeric_limits<Poco::Int32>::max())
934  {
935  }
936 
937  };
938 
939  DataObject dataObject;
940  }; //TradesParams
941 
942  class WithdrawParams : public Poco::RefCountedObject {
943  public:
944 
945  WithdrawParams();
946 
947  ~WithdrawParams();
948 
949  void readFile(const std::string& _fileName);
950 
951  void read(Poco::Dynamic::Var val);
952 
953  struct DataObject {
954 
955  // Amount of bitcoins/dollars to withdraw
956  void SetAmount(double val)
957  {
958  amount = val;
959  }
960 
961  bool isSetAmount() {
962  return (amount != std::numeric_limits<double>::max());
963  }
964 
965  double amount;
966 
967  // Bitcoin address to withdraw to, leave blank for XFERS
968  void SetDestination(std::string val)
969  {
970  std::regex valRegex("^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$");
971  std::string valMatch(val);
972  if (std::regex_match(valMatch, valRegex))
973  {
974  destination = val;
975  }
976  else
977  {
978  throw Poco::RegularExpressionException("destination invalid.");
979  }
980  }
981 
982  bool isSetDestination() {
983  return (destination != "Empty");
984  }
985 
986  std::string destination;
987 
988  // BTC/XFERS (XFERS only for FYB-SG)
989  void SetType(std::string val)
990  {
991  std::regex valRegex("BTC|XFERS");
992  std::string valMatch(val);
993  if (std::regex_match(valMatch, valRegex))
994  {
995  type = val;
996  }
997  else
998  {
999  throw Poco::RegularExpressionException("type invalid.");
1000  }
1001  }
1002 
1003  bool isSetType() {
1004  return (type != "Empty");
1005  }
1006 
1007  std::string type;
1008 
1009  DataObject()
1010  : amount(std::numeric_limits<double>::max())
1011  , destination("Empty")
1012  , type("Empty")
1013  {
1014  }
1015 
1016  };
1017 
1018  DataObject dataObject;
1019  }; //WithdrawParams
1020 
1021  class EndPoints {
1022  public:
1023 
1024  EndPoints(Poco::AutoPtr<trader::App> app, Api* api);
1025 
1026  ~EndPoints();
1027 
1028 
1029  // Get current bid and ask
1030  Poco::AutoPtr<Ticker> GetTicker();
1031 
1032  // Get current bid and ask, last traded price and 24H volume
1033  Poco::AutoPtr<TickerDetailed> GetTickerDetailed();
1034 
1035  // Get list of pending orders
1036  Poco::AutoPtr<OrderBook> GetOrderBook();
1037 
1038  // Get list of executed trades
1039  Poco::AutoPtr<Trades> GetTrades(Poco::AutoPtr<TradesParams> tradesParams);
1040 
1041  // Test whether your signature is valid
1042  Poco::AutoPtr<ErrorMessage> Test();
1043 
1044  // Get account info
1045  Poco::AutoPtr<AccountInfo> GetAccountInfo();
1046 
1047  // Get My Pending Orders
1048  Poco::AutoPtr<PendingOrders> GetPendingOrders();
1049 
1050  // Return my executed order history
1051  Poco::AutoPtr<OrderHistory> GetOrderHistory(Poco::AutoPtr<OrderHistoryParams> orderHistoryParams);
1052 
1053  // Place an order. Works similar to placing an order on Trade Page
1054  Poco::AutoPtr<OrderStatus> PlaceOrder(Poco::AutoPtr<OrderParams> orderParams);
1055 
1056  // Cancel my Pending Order
1057  Poco::AutoPtr<ErrorNumber> CancelOrder(Poco::AutoPtr<CancelOrderParams> cancelOrderParams);
1058 
1059  // Make a withdrawal (Does not require email confirmation)
1060  Poco::AutoPtr<ErrorNumberAndMessage> Withdraw(Poco::AutoPtr<WithdrawParams> withdrawParams);
1061 
1062  FybConfig config;
1063 
1064  Poco::AutoPtr<trader::App> _app;
1065  Api* _api;
1066  std::string _uri;
1067  }; //EndPoints
1068 
1069  } //FybApi
1070 } //trader
Definition: fybapi.h:125
Definition: fybapi.h:274
Definition: fybapi.h:720
Definition: fybapi.h:444
Definition: fybapi.h:13
Definition: fybapi.h:907
Definition: fybapi.h:478
Definition: fybapi.h:548
Definition: fybapi.h:731
Definition: fybapi.h:766
Definition: api.h:15
Definition: fybapi.h:836
Definition: fybapi.h:306
Definition: fybapi.h:606
Definition: fybapi.h:1021
Definition: fybapi.h:942
Definition: fybapi.h:194
Definition: fybapi.h:847
Definition: fybapi.h:160
Definition: fybconfig.h:7
Definition: app.h:7