hiddifypanel 3.0.0.dev64__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev65__cp38-cp38-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/websocket.py +9 -3
  32. hiddifypanel/panel/admin_2.py +33 -3
  33. hiddifypanel/panel/asset.py +17 -3
  34. hiddifypanel/panel/cf_api.py +35 -4
  35. hiddifypanel/panel/clean_ip.py +125 -3
  36. hiddifypanel/panel/cli.py +172 -3
  37. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  38. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  39. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  40. hiddifypanel/panel/commercial/__init__.py +50 -4
  41. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  42. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  43. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  44. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  45. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  46. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  47. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  48. hiddifypanel/panel/common.py +98 -3
  49. hiddifypanel/panel/custom_widgets.py +71 -4
  50. hiddifypanel/panel/database.py +18 -3
  51. hiddifypanel/panel/hiddify.py +655 -4
  52. hiddifypanel/panel/hiddify_api.py +70 -3
  53. hiddifypanel/panel/init_db.py +393 -3
  54. hiddifypanel/panel/usage.py +85 -3
  55. hiddifypanel/panel/user/__init__.py +25 -4
  56. hiddifypanel/panel/user/link_maker.py +416 -3
  57. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  58. hiddifypanel/panel/user/user.py +233 -3
  59. hiddifypanel/static/css/custom.css +6 -0
  60. hiddifypanel/templates/500.html +1 -1
  61. hiddifypanel/xray_api.py +109 -3
  62. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  63. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
  64. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  65. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  66. pyarmor_runtime_000000/__init__.py +0 -4
  67. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  68. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,208 @@
1
- # 2023-04-08T16:23:19.956295
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x93\x1c\x00\x00\x12\t\x04\x00\xd3\xd67\x82\x94A\xc9\x1bN\xc9\xc4u\xea28\xde\x00\x00\x00\x00\x00\x00\x00\x00/CUtc\xd8\x86x\x11\xa1\x8fP\xf7^\xf7\xf7\x03sKm\x0f\x99\xe5y\xca\xaepq\xc2\x8d\x1f\x17\xf4V^\x98\x9b\x04.\xe5u \x0b\xb5\xcf\xf1\xd1\x1dL]GdB\x93\xc7q\x8e\xe8\x8e\x99\xe8C<3\x91\x18\x19Y\xe2%\x89+\xfb\xf8Zc|Z\x03+^\x05`B\x8c\xd4\xbd\x94\x94\xfb\x87\xf5\xa9l\x19/\xe7:u\x8b\xd5\xdc\xb8W\x86!2\x86@/\x160"\xaa$\x90z\x9f!b-+VF\xfc\x89L\xb8\xc4\xb44$\n\x10\xb7\xb9\x8f\x12\xeb\xde\xc4\xe0\xeb\xc5\xd0\xaf(_r\x9a\xefRf\x1b\xca\xcd[?%2\x87\x04==HDW\xad50V\x1aW\xd2@\xae\xb0D@V\xe7\xcb\x82\x97\x86sh\xc2\xedv,\xdcXl\x9e\xec\xcen^\x8a^7s\x11n\x03.\x8f\xa7\xda\xea\x1a\xc4\x0b3\xf6\xf9[\x01 \t\xfe\x12x_\xf7]\x95\xbf\x95\xe3%\x9b\x02]\xc0\x95G9\xe9H\xebn\xb9\xcd\xbd\x90f\x0f\xa0\x0eA\xfa\xa2\xba{\t\xd4\xf9\xfd`u\xd3\x9d\xba\xf0\x19\xbc,\xcc\x96\x8a\xfa\xee\x8e\xa6K\xbb\xa3k\x99V\xb05\xa8\x9b[\x8c\xaeZ\xa7lKw\t"\r4\x8f\x17\xafA\x91l\x12\xf9\x8eR\xd3\xabT\nQ<\x0bz\xf9K\x8d\'C\x89\xa9\xb9Bw\xde\\ x\x08!\xe2[S>\xfdR\xbdqK\xc0Rf7\x12\xdd\x02*h\x04/\xf6\xfb^\xae\r\xfd\xb3\x97\x886\x87\xa9\xa6\xd3\xe9\x90}l\x9bQ\x93\xe5\xd47\xd4&\xedH &\xd2\xa7\xf6\xe8\x12D\xc6I\r\\\x9c\n\xad\xba\xfd\xa4Fkf\xa8\x85\xb8\xff\xc5\x00\xc4x\x08Pn\xfa\xb4\xb4\x84}cb\xe3l\xd7/Iu2Da\xa6r}\x81\x17\xfd\xf2nC|s\rf\x1c\xe0\x13\x01O\xdcT(\xf1Q\x8fd\x93\xf1\xfc\xf7\x14\x19\xfei\x8c*\xa4v\x01+\x98%>\x05\xb9\x1b\xb1\x01\xae\xc6\x9b\xe4\xe4\xfd \x1d\xd73\xde\xefZ\xd9\xe3\xf9\xe1\xa5f\x12S\xf3\xe5M\xee\x9e\x8f\xdc#\xfa 7\xcc\xfcm|\xefV\x1dM\x06\x11\xcd\x12BB\xa3MpM\xefy\xe5\xb7\xa0\x1c]\xaeu\xc9*D\xc2.\xfa\xf2\xe5d\xd6\xa88\xf0\x03\xb9\xd3\x85My\xf5\xea\x0c\xd3\x1e\x0e\xe3~\xf8\xda\xc7\xd2\x8f\xb7\xe33&\xd1P\xb6\xf4\xd3\xf2\xb0m\xb3\xa4jd\x8e\xc9\x17\xfa\xc9\xd4\xfc\xb2S0\xb8\xd0Umm\xec\x02\xf1\xbbv"\x94\x03|\x13\x05W\x18MhJ&\x88f\x93\n\xda\x03\xfc\x8b\xc0\x175\xc8\x8fz\xa9- \x80\xe7\x03EQ\xe8Q9T\xe3"v6\x8dJ\x90\x91T[\xb1\xeb\xad\xfe\x80\xc5\xeb\n7\x83\xd4=\x9eNr\xc2\xbf\xfd\'qp\xc3\xb9\x9a\x9c\x805\xear\xe2\x8c\x1a\x87\x06\xea^\x0cQf\xc2\x12\xf7\'\xd0\xf7:\xdf\xc6\xc2\x88\x83\x86\x0ck>\x0e\xde-z\xfd\xb0\xed\xfe\x0fwS\x08h\x15[\xa1M\xc6\x9dl\xc4\xc6\xf7d\xc4\x0c[\xbd\xb6\xecM\xf07Dm\x17\xb8\xfdB\xb9D\\k\x8a\xb04\xcb\xc5\xd0\x12{2\x9f\xb0<\xd6\xac|\xfcm4}\x17\x03\xbb\xfd\xbc}q\xb1\x8e\xaf\xf3\x98\xbf_w\xb5\xcb\xfa\xb4\xcb\t\x18c\x1b\x8b#s\xe61\xdca\xf5\xe80*\xc8\xf7N\x1b\xfd\xdcc\xd2_1\xbf\xefU\x98\x0f\x97\xf3|\xab\x94\x92\xbcj\x9f\xc4\xed#\x9a~\x90_?U\x0b\xd4\xd9J\x04\xd7\x01\x16KF\x80\xd5\xe4\xe9T\xa6#\xe7m\x00\xe6\x96^)\xec\x13\xa68\xc0\x1c\x8aF;\xf8\xaf\xe07\xcdgS\x8e\xcbi\xf9o\xfd\xc7\xae\xbd\x86$d\xed\x86\xc4:UT\xd4\x8a\xb3-bO>\xa4\xb11\x11\xa4\xb5\xdd\x0e\xbd*\xfbPy\x97\xd6Z\x8e\xdenuK=<\xfd\xcf\x11#qPc\xa4q(\x00we\xc5\x88\xf0\x17+b\xc4m\xdd\xc0\x92|\xe3\xb8\x10BV\xb3\x8bD\xa5\x1a\xe7\x92\xc8\xd6\xa3\xe51\xb6k\xd0$\x1f\x85^oo\xd2\x9f\x1dB\xdf\xfa\x14\x9d\xf2\x86,\x8a\xc8\xbefd\x9bY\xd8cK\x1f\xa7\nL\n\xe3\x10l\xad\xd3\xef\xcbF\xca\xe9r\xf5\xe0B\xaa\xaa\x18\x14\x00\x8fG\r\x1a\x87\xa9\x1a\xf2\xe8\xc3:0\xce\xde\xea-~\xf0e\x07\xef\xa7\x17\xa7\xf7\xf2m\xe4\xef u\x9c\xcd\xe9\x06\xe1,\x9eO,\x05\xfcw\x05\xc9>\xf0\xb8\xe7\xdd\x9c\xd2\x99\xb2\x84s\x14\x1d\xe3\x9cMWU\xc7\x92\xb9\xef\xc5\xc3\x00tD\xbf\x92\x9e*7\xe5u\xd9*\xcf\xdd\xbf\x1f\xb8\x91\xb6\xc7=9P\xf1\x1c\x992e\xd7\xb70\x90\x10\xcak\x97r\n \x88\xcc\xbb;\x0b\x8c\x11 \xdb\x97\xc9\x1fN\xf5\x80\xba\xac\xec\x05VL4\xc4bQ\x8c\x173?8\xf5\xa9\xa8[A2\xd9@b0\xfer\x87fG\xce\'\xd9LD<P\xcd\xe9\xf9\x14\x14\xd1\xa8\x1aif\x8d\xaa\x81\xc9E\x8eu\xbe|\xae+(\'=\xb1K\xb1\xe5w\xaf3\x1d\x95\xbc5\x80\x9bon\x9d\xab\x8f\xdeM\xf6\xa5\xd7\xefi\xef\x95\x90\x9fP=\xc4J\x0e\xea`G\xbc\xe6\xf7\xbapl_\xf7:\'\xbd\x1d\x8cl\xca\x17\xb1\xcf.\x994\n\xd9I\xa22\xa4\xfa\x02*:\xf3\xfc6\x1b\xdb(\x15k\xff\xb0)\xa7\xa4o\x9f\xcda\x10|!\x1b\x0bc\xb0\xb5;\x14\xaa\x8e\x9at\xb5\xfa\xb3\x03\x99Q\xc4\x07\xeb]"$\xdd\xf5\x0c\xf4\xf7YVh\xc2+\x16\xd6\xbf\xb2\xf8\x00\xee\x83]\x06ol\xaeG3:vz\x9e\x84B\xe5\x9f7G\xd1\xdd\xf8\x15\xeb\x1c\x0c\x93\xd2H(\xae\xeay;\xc9\x1f\xf7W\xa2d\xff\x18D#\xb6o\xcb@8\x86I?\x12\x98t-*%\xf35jm\xb3H\xe4\x84\xe0\xcf0\x8d6S\xe9X\xa4\x06\xc3l\xde~\t%x\xf5Bo!\r\xe8L\x91%\x8c\x15%b\x036\x99\x91\x8c\xe0\xb8B\x82\xb2\x1d\xbb\x08\x03Tb)\x98$\xe4FO\xc2\x81k\x1f\x96\xda\xaeN\x1eO`i<V\xfb{7h\xfa\xa1.\x00\xc8%\x0e\x9dP\xab\xc3MZ\x11\xf6\x04G\x0c\xffy\xc4Q\xfd"\xfbe\xd8\xb2\x00[\xf1^\x9e\xd1\x89ss\xd8\x16*\x9d\xa0\xa0ei\xfa \xd6\xd5\xaf\xda\x8e\xa6\x10"E]\xdfb\x06LH\xc1\xe9U\x17\x0b!\x94\x86\n\xa8\x88m\xf6\xa4\xf6\x1d\x12l\xe9:\x08;\xb7\tc;\xfe\xf8\xe6\r\x84.\x1c\x83\xdd>;\xa5\x11@*\x0e\\X-\xeb\x83\xe4J\xbc\x92\xdf\x14;\x1c\x07\xfbU\x8ay\xe5\xeb\xfd\x1aZ\xef\xe9\xa7\xa3T\xa0\xfb\x92\xbeS\xf8\x08\xe4\x83$\x08\xfc\x15/\xc8\xe6\xf7\xb8\xa8\xb4~8\x07I!\xa0\xec9\xe0\x88\x028\xd3\xab.\xbb\xc7E\xf3\xaf&\x03\xf4D\xf7J\xbe\xd4\'d\x9e\xa4\x80^\x13\x01\xbc\x8c\xe7\xee\xc8\xe1{\xd2\xf6\xdd\xef\x03!\xf5\x00\xdbq\xfa\x0f\xa0\x1a\xe7\x93\t\n\xd5ljW\x04s\x03\xc3\x86\xdf\xdc\xca\x0c\xb5\x0c\x96t\x95\xb0\x7fq\xe7wb\'j\xff\xddk\x96\x1e\x1b\xea\r\x7fs\xab\x05E\xc6Z\xa7\xe4cDQ\xfeoe:\xaf\x9bO\xe9\x9b\xcf~\xf4\xf6\x83Z\xc0%\x1e\x84\xf9\x02\xc6b4R\xaeN\x01\xf8\xe8\x94\xb6\xe6\x8c\x93\xb1\x9dJ\x84\xc0\x19\x0c\x8a\x8e,\x97\x04\xf9\xcc#\x99\xba\x15|\xafM4\xddH\xff`\xb5\x03I8\xf4\xdb\xc8\xa5 rb<\xc4\x1f?{\x18\xca\xd0\xd5\xf8O\xaczn\xaaG\x80\xc8\xbb\x89c\xac\xf5\xf1y2\x98\x03!d\xd4"\xdd\x86\xb0\xe1\xcfQ\xfbX=}\xa0A\x006\x9f\x10\xd2\x85\xbc\x1e\xb5\xc8T_\xbe\x8a\xd8=\xad\x18\xad/\xcdG\xb3N\x83\xed\xa2\xc3\xe0\xd1JsD\xde\x9e\xfa7\x8e\xd8\xe7^\x90\x9e\x15\xc5T\x0c\x96\x15\x88\xac\xbeT\xaap\xf7\xb5w*+\x01d:\xbe\xed\xcf\xf3\x07\xc7\x02\x94VJ\xc5&\xaa[\xf5&\\lz\x1b=\x8a\x97DT\xc0\x9c\x0e\x9c\xe1$A\xc3\x11v\xff<\xc0\x03\xdc\xca\xea0\xde\xc2\tk\xd5\x80"\x80M\x98\x96\xdf\xff\xf5Y\xbe\xb2\x8a\x11\x95;\xf6\x9a;\xcd\xb2\'TPeL\xba\xcf;\xed|#v\x05\xd7\xaaS\xd6\xcf{Q:\x9d\x84zN\x14\xc7\xee\xcdq}\xd7B\xf1V\xd1!\xe5\xc0s\xa1$\x84\xd7\xc2\x80\xbf{\x84\xc4\x06\x03nM\xac2$\xc4U\xc9\x83\xd9jd\x9f\xf6=\x19RE\xa2\x06y(1Q?FC\xf5\xbb6]Af\xeep\x03\xc0\xbf\xd4}\xfeI\xb0\xb9p\x1f\\\x03\x86\xa6\xf1\x86\t\xbb\x03\x9b\xbe\xe8!3\x93\xb1\xc8D2\xfc\xe8\x06^<S\x16\xd8\x9b%\x10\xbc\xa2kfv9\xe5\xd95\xac\xc8\x87\x94\x10m\x15%\x0f\xf7\xdfG\x00\xf7\xb8\x921-\x8e\x9dr\x13\x04P\x9f0\xd2\xc8-.\x15\xb5\xb0\x1cj\xd7mD\rY\x18\xdfV\x8e5\xa7\xc2\xe10\xddB\xf9\xc0\x8d\x03\xbf\xfd\x17S\xcd\x10S\x1e\x86\xdc\xf7\x9a\t\xcc\xbe\x97\xfdzy]\xd0\xbf\xa6\x00\xcf\x80\xa5\xd7\xf8\x88\xd8\x96\xc0\x0c\xc1\xefQ\xaefK\xe6\xc7\x8fZg\x8c\x99\x9a\xe6\xac\xe7\xeal\x18\'N@N{\x06\xca\x06\xd4O\xc7\x17\xb8r\x08\xa7>\x05\xdfG\xe1\xd3fh\x05\xa2\xe0?\xc97\xd5\xee\xb1r\xd0\x15\xbejG\xc8\xb7\x88\n*W\xb3{\xee6*(\x9co\x16\xa6\x920\x93E\x08\x83p\xee-V~\xcc\r\xc5W\x8cu\xc9+X\xac!\xc2?F\xd9\xe1F\xf3`\x7ff\xc8\xd4\xa5\xdb\xfc\x19\xa4\xca\xab\xf9N\xf7\x14JU\xdd\xac3\xf9\r\x8e\xdff\xcd\xe5\x1a\xec\xc3j\xc2\xec\xe0b\x02/\xd9\xf7"\xfa?{\x12E%\xa2\x86\x9cJ&H\xe2\nr\xda\x91\xcd[\x9e\xe3\xf9\xc4A\xa7<\x07\x8b\xaeUd\xe0\x0c;\xb5\xfc\xd9\xe5\\\xc9\xae\xb4\x7f\xe6\x9e\x12\\H;\xb0\xa3p\xc8\xadmvL\xfc>\x9bq2\x1fIH\xd6\x1e\xb0\xb0e\xd1\xa1i\xff^b!\xa56d\xf1\x88%7\x9d\xab\x1c\x93!\xccTj\x00x\x9f~]\x1b\xb9\x80\x06\x99y\x19\xa3o|\'by{K\xe3"\xb5,\x88\xe7$\xe2`\xbfM\x1c\x9f\xe0&W\xe9\xae\xb4\xa6\xd3\x95\x83\xb3Y\x8b\x8e|)\xb8\ra\xd7E\x95\'#>\xe1\xc9\x88(\xec\xa8\xb5\x13Q\xa4\xe9\xa5\x10\xb2\xe6c\x85:|\xaa\xce\x9dK\x84\x8dk^\xc0EX\xed\x91`^\x9e\xc5!\x0b\xaa\x90\'k\xd1"\xb0\xf2\x80\x11\xff\xa9b\xfe\xb1\x1b\xce\xc7\xe7\xa1\xd6\x92\x7fh\xd3\x81\xa4\xe4\xbe;\xfd\xb8U\x90bQK\x91\x97^\x96\xf7\\\xe4g\xf8\xcea\x8at\xd8mRM&\xe3I\xec\x96?\xcc\xee\x8c\xda\x98J\xb4\xe5\x9b\xdc\x9d3\xfd0J\x08\xa4\xff\xfaY\xce\xa5\xb6\x96\x18\x9fI\x1b\xde\xdbl\xdf\x1f\xb8\x8eq\x0e`&Z\x08\xea[\xa8\xa8\xd7h\t&$\x7f\xda:Q\xe9\x1be\x9f}\x89\x0bt\xe1p\xce\x89\x7f\xeb\xa5\x8c\xb5\xbe\x8b\xc9\xcf\xae\nq\xd5\xe2\x00\xbb\xda\xb6\xbcn\x90\x9f\xd8;\xdc\xf9\xda 9B\x17)U\x97\xba\xce\xd3\xe21\xc4q\xb9\xb7\x96*\x19\x8c\xbeh\x9e\xd8\x95\xe1O;~\x8dK6\x81\x9a\x15\x9bX\x07\xb8N\xe0$7\xdf\xe1\xf0\x07\x11\xde2S\x15\x8e>\xfa\xc7\xfd\x07\xb1\xf0\xd6\x01\xda\x8c\xac-\x01\x83\x94\xb1\x07\xcc\x9cu\xa7\x85L\xd6\x9d\x81\x11\xfc\x12\x1b\xde`k\xe9\x02\xa5\x9a\xe4{\x02\xa2v,\xac\xffh\xb4?\x8cK\x82\xe8\x1f\xf1\xb2o\xe6\xb0\x02\x8f\x17b=U^\xfb<\xe9KB\xb7\x9a\x9b\x85\xfb0$\x01\x13\x14\x06\xe7\xc2\x07T\xf5\x89u\xd6\xed\\\xc6\x824\x04\xf4\xf9\xb9d\x0f\x88\x16\xf8u\xe3\x05\x95\xc3B\n\xb7\x0b\xb0\xf6)\x84\xd1P\xd3\x11S\x07\xb1uo\x17\xd2\x92\x86v\xf5\xbb\xcb\x8e\x92`\xeaQ\n\xdej\x83\r\xe2d\xf0\xdf\xa22\x91\xff\x96\'Y\x10\x9ds\x15\r\x07w\xcd5f\xef\x97\xd8Re*0\xa5}\x91\x8d?\xb9\xf2J?\xd2\xc1\xb2\x14\x9aE\x03\xa8\x815\x9d\xb1\xa7u\xb2\xa4_y%m|\xd5Y\xcdw\tWse\xdd\xac\x8b\xa3KL\x9db\x97%^\x1f\xa7WS\x03\x0c\x80\xb3<7DTV3\xb7Q6\xbc\xff\x9ax\xd9\x1f\n\xb2\xff\x07:\xcer\xa2\xeb%w\x8dA\xe5/;\x8e\xcf\x8b\xd8\xb2B\xaeq^7\xc6\x99\xc1\xb4(\xe2VUq\xe2\x85\xd5\x0e\x0e\xbc\x9ae\x83~\x13\x8b\xdc\x95>\xcd\x06\xa5Z\x91Z\x04h\x83\x11\x9a8\x89=\x84\xd2\xcct&\n\xb1\xbb\xcb\xb2\xc1(\x1aFOq\xe7\x1fsK\x8e<Vk\xb8_ka\x88v\xa8\xaa\xfdT\xf1k\xf9\xb0\x08[\x14Z\xd4\x08\x8dLY\x15\xdc\xbe\x93\xaa7Ku&$\x99x\x1bZ\xf6\x8a\x98F\x92\xfbq\xb8g\x96\x98\xa85\\\xe8\xdc[L?\x13\xa3\x11\xcf\xb0A\x0b\x18\x9ag\xb1\x92H\x19\x00R\xfdt1\x0ef464\xb7D\t\xc7\x87$\x91\xab\xf2\x88\x13\xcd\x03\xef7\xa1\xcf\x99jc;\x80\x7f]\xe7W4eY\x90\x0fs\x9a\xfe3\x02\xa4\xf6\x8a\x111\xce\xd5J\x92\xb0\x8eM\x8a\xe4IY\x8e\xb8\xb4\xeb\xbd\xa9\x94\x071\xf2\xd3#\xb79?%\xac\xf6\xfey\xe3?Y~-\xab\xc6\x02\xae\x94)\xb7\xb5q\xcb\x90h\x9b\xea\xce\x87\xe0\x03\xb9\xae9\x9dmZ\xb3\xf1\x14\x90\x874\xe7eL\xfe\xac\xbaQ\xec\xb2\xf2^\xf2>\x1e{#\t\x18\xe0w\x01\xd0b)\xa9\xe9V\xe2\xeb\x11\xb2a\xb30\xecf\x18\xb8\x91\x83Y\xa6+N\x84\'\xb7\xcf\xe8\xecN~\xf8\x04\r\xcb6\x8ee\x85J\xb2\x13\x11\xe5\xba\xd3+k\x86\xd6\xd1\xf3J&\x06ZQ\x9f\xd2[h\x11\xa8j\xd5\x1d=\xed\xc5z\xad\xa4O>\xa4\xa1}\xf7\xd7ce\xb8\xb7\xe7\xc6\x94\x13\x94\xbb0a\xadO\x1bRg\xab^\x85\xb8\xfcz`\xfb9\xce\xd7\xe5\x87\xa2\xcf\xb2\xe8\xccc\xb2\x819\x04R\x8aZ=I5O\xa1{\xa4=0\xc6\xdf\x96=I\x83\x8f\xb7\r\x86\x17\xa2j()P\xcd\x99\xc2Y\x07d\x9d\x06\xf4`\xce\xa4\x17\xfa\x96\x91\xa1Ujl\x10E\xa6<v\xed4\x1e%D$\xefy,v\xff\xd4<\x93N\xf37\x0f\x9a\xc7\xe6\x9eY\xd9\xe8\xe2\xdc\xc6{\x1c\xcb\xbe|\xfd\xeem\x03\xf3\xa1\x8e"<\x05\xfc\xc4\xa7@0=\xb5\x1fy\x92\xf6G S\x8b\xc5\x1a+q\x85y\x15\rOj\xe4A\xac\x87\x8a AD\x0c\x0b\x10\xa0\xe1\xf9\xd4\x07\xce$,\xcf\xeazi\x12\x83\x10\xae\x91\x91\xac\x9eAl\x83\xec5\x8e\xa8q\xe4\xaa\xaf<R\n(Wh[\x93oK\x10\x8d\x91\xce\nR!\xd9r\xe1\xa8\xde\xa7\x9bV\x9f\xd0\xbc\xe4$O\xf2H\xc2S\xf1\xe0ZMe-\xca\xa1\xce\x83\x9e\xfc\xdf\xf4]\x89\xac\xec\xc1\x96\x01\xc5\xeb\xf6|kV\x8b\xd6\x18MyA\xb8\xafdWB\x9dF=\xecH:D<\xa1\'4\x80\xc9\x8c\x85b\xd0U\xfc>iP\xc4{\xd5\x03!\x117}]\xc8\x00\',\xe6\x0b\xd9T\xae\x99X\xb6\x90\xef\x99Cy\xaao\xb4\\\ty:~\r\xe1//`\x8f\xea\xa7\xf2FK>\xd6\x11\xc1\xe5ml5\x9f\xd4V\x11\x17\xfa}\x9c\x83\xd1~:\x14\x13\x02\r3V6m\xb5\x1f\xbanl\xecc\xb6H\x95\xdc\x0e\xc7\xa5cD%\xbd)s\tA\x12\x1d\xce\x0f\xbe\xa6U\xf3\xba\xf6\xc4\x96\xc4\xe2\xafC"\xf0\xb7b\x03|;\x7f\xa2\xc9\xefA\x1c\xd6\xc8MQ\xb5\x1al\x96\xdc\xf9\xae\xc9C\xaa\xd81\x06i5\xb6P\x06\xcf|\xb23\r\xd1\xcc\x9d<\x85\x88T\xc4\xe4\x8a\x91F=\n\xa8\x89\x97-\x8fI\x1f\xc5\x93\x89"q\xf1\xd2H1\xb6B\xf3\x7f\xcf\x8e\xdb\x99\xe4q\x10\xe6Y\x88\x9c\x95c\x03\x07\xdf\x14c\x0cm\xf4\x91\x19\xb2\xdf\x88zC\x08\xcdrX\xce\xd7}Rl\xd4\x939\x00\xcc\x03\x9b\xeby\x1b\x92\x8cr\x17\xfe/S\xb2\x8b\xbb\xce\xfc\x87\\\x07kK[\x0eI\xf6A\x99\xd66B\xee\xffMH\x0f\xb2h155\x0c_\x8bedL9G_\xc4\xcdy\n$\x11:2\x89\xea\xd2W\xb9\'\xb0\xdfc\n\xcd\xa0U\xcbf\xfa\xc7 \xee\xea\xb4\xee\xdc6%\x11\xf6\xc8ha\xf8\x0c\xc5\x1d\x07\xdf\xf2pM#\xe3\x9cg\xd3\x11\xd7]4\xc8\xaf\xbd\xbc\x9a\xf1\x84\xc0\xe2\xd3\x81\xda\xaf,tm<\x8c\xf5Q\xf1\x87\x1bvn\x1c\x0e\x8d\x9a\xb0\xbe\xed\x0b\xdb\xb0\xb5\x01\x0e*\xe9:+\x12\xb5\xdb6\xddq\xe9&\xdd|2\xfe\x8b|\xf7\xc0\x07\x95\xf1\x93\xa5\xc6\xc7\x95\x978\xa4`U\xd8\xde\xe9\xc2\x92\xa9\x04\x0b\xf6MxB5\x8b\xda;\x1e,K\xd8\x1e,\x08%\x9e\x95\x8f(s\xd5A\x11\x1eZ\xb1\t\xa5\x84\xcc\x19D9\xaf\x8f\'\x98\xc9D\xa7\xaf\x90\xc8\x84\x05\xd1\x0b\xe6/\xdb\xc4.\xffF4SW0A\x13\xc9\x94\xf3\xef\xe3n\xd6\x87\xcd\xb3\x7f\x94\x1eB\xbe&6\xbf\xd2\x84\xe2#\x1c\xab/\x12?\xc13^n\x84\x00\x15\xafz\xa0\x0c\xbbu`\xa8s\xfd\xfc\x05f.\xf9\xa5RU-\xb1Oa\xcd\xd3,\xd7~`f\xc6u\x10*A\xa94\xbc\xdd\x1d\xb7\xbf\xdd\x1c\xa0\xab\x14u\x83\xf9\xc2aT:\x8a/\xfa\x19\t\x81s\x7f\x08\xdc\xa8\xb8g\xb0\x0c\xa5qY\x034\x8a\x1d\x1d7#\x9d\x16\xa7\xd4z}S\xc4\xcb\x18\xb58\xbd\xf9\x9c+%\xbe\\\xd3\x95h\x97T\x8a\xf0dp\x06\xb64b\xaf\xa3z\'\x84\xc37\xd5\x9f\xfd\xea\xdc\xb0y\xb4B\x8a\x8bD2+\x90\x01\xf5XE\xf3\x13\xe5\xf3\x8f\xc1\xdcm\x970\xe8J}\xd9\xc1c\xf1\xdc\x011\xcfAye\xa4\xf6K?\x1b)\xdd\x95`\xa0=yw\xc8\xcf\x0e\xc6k\x19\xeb5m\xd3\x8b7\xf0\xadzM\xe6Bq\x0c\xf4\xc6K\xb6\x03\x8d\xb6\xa5\x1f"\x9a\xe3\xae\x1b\xd2\xabg\x98\xcf4W\x17o\x03 \x0clH\x9dw+|\xe6\xf0\xcd\x9c\xa0\xc8\x84\xc1#\xac\x10\xb9j+\x87\xc8\xd8zr\x91\xbcf\xe8\x13\x00w_\xc4\xc6\xc0_\xb3\x99;z\xac\x7f\xdc\xae\x91\x9e\x13\xf8y\x84\xf7\x0b\xf2\xbe\xb3#dJ\xea\xbe\xd0\xb7\xf6\xeb\xef\xfaNxk\xed\x17l\xc9\xd8l\xbb\x08\xa2\xd9\x1ay\r\xac\xca\xf7E\xc1\xcd\xc7\x8eSry\xb7]Z\x0f\x08\x12\x14\xd6\xb4\xa9u\xb3\x7f.\x1d\x86\xe7\xa7\xabo\xfba2`Ww\x17h2\xee^}\xc0\x13\xc5\x89\x9a\xf6\xd5T\xd0sYBr\xaa\xb3%\xa8\xf0"\xd6\xd7\xb4\xdfl\xf8\n\x07i\xdf\x03\xd3.Ii\x9c.\xe6\xba\xbf\x94\xe0\'\xa5\\\xe9\xb3v\xae\xa7\x1f\x0b\xcb\xe7*\xba(\x00\xbf\xc5\xb5\x81\x16\xa8\xb8t\x11\x18\xe9i\xb6\xa3\x9c\xd8q=\x0e\x96\x99\xb8\xf9#\xa5\xa8Q\xcaZ\x83@rZ\xa1/)\xca\x91\xf8\xdbJy\xf6\x03\xbcQC\x8eV\xef^\xaedSL\x06\xef\xech\x99*\xde\xa3c\xfd\x17\xaf\xdao\xa7\x8aP\xec\xbfA\xf3(6s\x9e<\x1f\x7f\xcbw8B\x11\\\x8b\xf2\xe7\xa3Z\xed\x17<\xde3\x19\r*UV\x1f\xc9\xfd@\xe2\xa7\xc9pHZA\x06S\xd8\xb5\xaa\xc6\x17`\xbf\xa6\x99*\x1dyG\xd9\x11@\xf1\x8c\x8eZ\x95\xc3\x8b\xf5\x8fakr{t\xf5E\xac\xb2\x8c|_V)\xf3\xb8&\xda\x9e,H\xc9\n\xb1w\x11\xff\x86:\xfe,\xcb@\xa7#\x05\xab\xab\x13S|.\xeew\xb4_\xd2Dc\x01\x15\'\xfaiB\x95\xd46\xd6\xb7\x921`\xbe\x89z\xa6y\xe9\x15\xca\xec\x94\xa7\x8b."\x86\x9bT5\xc1\xe5\xbb\xc6\x7fm\x1cc>\x98\x83OA\xab6r-\xba\x04\x89\x0b\x93\xa4S\xda3\x07]\xbb\x8cm\x13\xf5@q\xe3\xcd\xear\xa8\x13?7\xf4m\x86rI\xe2\x1f\x0c`\x0b[ZJ\xb5v\x81\x16\x8a\x13,\xf4]=\xfb\x10\xd4\x009r|\x1e\xc9\x9f\xd2\xde&\xc5\x90\xc2\xd5\xf3d\xb9\xb6J_\xd4\x81y\xac7\xfad\xaf\x13g"\xaay>\xb7[\x86\x94\xbd\'\xdf\xe4%\x1c]$\xd2\xda\xa0)\n\x8b\xe3PR\x93\x81\x10\xe5\xac\xc2a^6Y*?\xc6\xc6\x8de\x00\x97H\n\x1d\x1d<!\xd7\x86\xbe\x9b_(\xa7\xb6\xc63\xa9IKH6\x9a-\x0b\x92\x85\x1f\xdb\x9a\x9cc\xf4E\xed/`\x7f\x01\xc5\x1d\x81\xce\xc9\x15BB\xab\xde\xfc4L\xe5H\xf9\x92\x9d\xfd\xbd\xe8\x16j|\x13\xe1\xc1\xfeWH/\xcbeSC\xc6/\xb4\xf6dD0\x9c\x00\xacFbd\xfa\x14Xd\xed\x16\xf4\x8f\nW\x96\x9f\xa2f\x9c\xebv\xc1\xba"\xf8\x15,\x92P\x7f\xd5S\xb61\xe9E\xb4E\xa1\x9e\xbe\xb2\xee\xfd\xb92F\x94\x0ek\x8c8;&\xf4\xf2\r\x88\x9b\xb0\xd8\x8d\xf5\x88\xf3\xc4\x10\x90h:\x1biy\x18\xcb\xca\x91\xd6F\x11@\xd1\xb7$\x15A\xc5/k\xa3\x16\xef4\xc5\x824\x19\n=\x8f\xb8Z\xd5\xa9SI\xd2_\xd74\x0c\xb2\x17F\xcd\xe12\xc5\x84\xfc\xc0e\xb62Y\xca\xe3\xd4\x8ew\x91\x17\xa4\x7fE/\x1ch\xc4\x03\xad\x02c!u0\x83\xd0\xedE2\x00\x95\xac\xe6n`OH\x87R\xcbD[m=\x95\xd3?\xe3\xf4xjo\xe4%r\x89\xb2C\xcf\xab\x97\x18\xedq(s~\x9eb\x94\xeb4>\xafR\x98\xf0\xd7\xbf\xf8\xfc\xf1\xa04\xce4v\x8e\xd3\xd0\x18\xf1\xb4@\xba\xa8,\x11\'R\x89\x8f\r*\xd1\xc9\xd7\xaa\xc9\xfe;\x0c\x8e?\x18\x10F|Lmn?\xa5e\xc5y\xa9\xc9\xc6+\xd4\xaa$\xc8\x1a\t\x1a\x0b\xf0\x88d\xeb@\xd1\xf5\xf1\xb4\xd9\xc2\x0bf#DQ\xb2\x85K\xfe\x0c\xad\x9a\x10\xcd\xcde\xfdt\xcbM\xda \xd1\x02\xefx\xde\xc6\xd6fd\xfe\xbc\x0c\x12\xeanC!\xa4\xf0s\xa6\x1d4\xbeh\xed\xd5\x9c\xa6\xf4\x05\xeb\x93\xadvh\xe7\x07^\xb3V1\xd7\x0c\x89\x8ba\xb0xEo\xc7jv,5\xbf\xf7N\x18&\x92.\x95P\x9cL\x99\x8a\xbf\xf5\xc7\x8e!d\xa8\x83s\'\xf4\xe2\xa6\xa3\xd3\n\xcb\xb1\xc9\xf4\xd1\xb2\x80\x7f\xe6\xf4\xd5FyOz@,\xd5\x8c\xd7\xee\x8f\xad\xc2vP\xe1\n\x03\xb0\x8f\xa99\x15$\x7f\xc0\xf6\xa07\xf1(\xcer\xceI\xa1\x81tv\xf1\xd5\x98H\xe1\x8d\xfewE!\xbe\xd4\x94\xed\xf0k3\xe2\xc2X`\xa7\x02\x14\xfe~\xe22D\xd8A\xb5\x07km\xa2\xbc\xc6Rs\x10I\xc0\xe9\xa4\xecZw*\x96Sx\xd6\xe7\x97!k\xa9\xbc\x82\xe8\x86g\x19\xc5\xa5Ts\xf3(\x06\xe7V\x94\xb1\x83\x87\xa5\x05\x9fX\xf0\xc0"2WGb3\xed\xd6\x11k\x9c\xf6\\?}\x16\xfe\xcb\x17_\x08\xd4\x95\x83^\x93\xaf\x14\xdf\x9aG\xea\xecXI&\xa9\xb5\x06i\x82\x9a&\x8b\x17\xb7\x97/\xbc\xe4\x91\x13\xba\xcf\th\xd2\x08\x96Q\xcc\xf7\xe8\xe2\x8a\xc17\x15\xaf\x85@m\xd3r\xb8\x18E/\xa1\xf08Uzd\x7f\x19\xa2\xc1\xbd\xb3\x9d\x06\x8f\xdf\x07v\x0c\x0c4\xe0Q\xddjcp9\xb5y\x0b8a\xbd\xb8\xe7\x1fJ\x14\xb4\xefD\x9f\x00\x8c2".,::7O\xd3\xf1\xee]\xd1\xba\xfc\xeb]\x93\xbey\xda\xd9\xaf\x0cx\x8a\x9f\xe8\xfe]\xe8\x80]\xc6\xc7\n\xfb\xbe9\xb9c\x1e\xaf]\xa8\xf6\xdd>\x82\xdbv\xf1\xf6r\xd4h[\r\x9cX\x05\xd56\xf6\x84\xf1Y&\xfc\xcf\x95K#\xb9\x0c\xc0\\\xe1\x0c\xfc\xe4\x1a\xa7\xcc\x08\xcf\xbe6\xc8[\x1cm&Y\xf1\x8c\'\xbf\xe7\xf0\x18\x1c)\x91=\x998R*\xa2\xdc??m#\xc2WKIS\x8bQ\xc7m\xe9\x06\x1e\x93h\x9f\x1ed\x04\xa6\x12\xac"\xa9\xa7o\x00\x04\xd3y\xc8Y\xb6\x98\x9e\x16\x8e\xce\xd2x\xe2\x0eEP`\xe4\x11@&\x92\xedo\x03\x1f\xcd\xd7\xf2\xc6\xe5m\x86\xd7\xd2Et\xa4]\x95\x14\x16!(?\xda\xdc\xbf\x85\xb4\xe5,\xb1\xb4\xff4?EG\xb3y\xfe\xcf\x10\xf8+\x9f#\xb2\xbca\xad3\xeb\xa1\x19I\xf7\xe4\t\xfa\x99\xf8\xcb\x99,1\x1e_\x14\xb8ul@\xc3\xb1\\\x1c?0K\xd7h\x06.\xece\xc9\xd8"\xa5\\\xec/H\xbe\xf4\x15\xfa\x88\x92J\x15d\xc2\xc2\x80\x7fM\xf9n\x89\xea\xbbmtIQ\x07\x82\xba\xf3\x9eg\xef\x9b\xda\r?]Fq\r\xf39*\xc83\x94\x06\xd3\xfb1U\x14\x1bZ\xc9\xd1K\x1b\xde\xd1h3d<\xf9OT\x9f_\x87\xd1NSO\xac@\xfb\x04\x7f\x8dp\x06\xd6\x9dN5\r\xea]b\x9e\xbc\xf0\x02\x08\xb5\xfc\x1b\xb26\xa2\xc7\xd3\x03^\x0eU\xe3sl\x8c\x1d5k\x9a\xeaD\x05\xa4\x0c\xe0\xaeT\xbb\x0b,\xf7d\x85S\xe7+\xb9\x1e6\xe1\x98\xe0\xd0\xa7\xd8.S\x92\xc6\xfc\x97l\x813\x13\xec\xe0\xd7\xf9\x8a\xc4}\x0f\xbe\x86\x18\xf8\xea\xaeAE\xec\x9f\x95:\xca\xc3V*\x1f!\x12\xdf{\'\x86:?K\x8dl\xaa\x0b\xc3\xfe\xd2\xa8Z\'\x1a\xc7\x91!\x85&\xb8*\xc1\xbbAdJ+W\xd5\xbd\xf2\xe22(U\x0cqs\xeb\xd6\xf5D0bB\xc1\xd6\t\x96g\xd7#\xdb\xc3\xb2^\xea\x85\xa6|\xb2\x14\x9b3\x97D\xc6\x1f\x7fa5\x05OZ\xce\xf0\x11\xbe\xf3m\xd4\x06UZ\xc4\xef\x89c{\x9d#\x0bP-\n\xd2w\xb9n\xcaHpT<\x04\x91^t\x98V\x80\xdcu\x07^;\xed\x8aZN"\xaa\x89\x0e\x90i$\xf0"\xaa\x91\x14\xcd\x9d\xaa\xfd\x8d/\xb2j\xa9\xe2 \xcf\xb9\xdbJK\x1a\xe0\x1c\\\xa8\x10_\xd5\x84\xfa\xf7(\xfb\xedSq\xe6\xeb\x0b\x08\x91.\x8b\x14\r\xe5\xb7\x1ft\xc8\x13\t\xbd\xbf}\xf1\xbeM\x89\x92\xe2;\xd3\xe22\x9d\xbbS\x97\xa5E\xed\xee;\xa0I\x18;\tP2\xe4\xaf\xafr,\xf7\x16\xcdqgc\xef\x01\x9cV\x19T\x80\n\xa6\x7f\xee\xd6\xf1\x85\xe2\xf6\x82c\x88\xd5\x12\x14`dXq\xebD\x06N\xd9~\'\xd3=+\x9b\xeb\x11sq\xb1&\x99\xdb\x87m\xf6s1f\xc5\x14M\x1b\x12e\xdf\xa7\xcdd7\xac\xcd3A\xc3VYc\xe5\t\x81\x92\xcb\x8a\xef\xbc\xa5\xb1f\x8a\xa6eD\xa7\xe8<\xa4\xbb\x0e5(0\xafP\xe0"\x8a\xa6\xcc\xb7U\xde\xf1\xbai\xeb)BY\x11\xe1\xad\xc3\xfc\x07hP}Hm\x8c>\xc5~\xffLWy\xd0y84{\x17\xd0Su\xaaH&:O\tQ\x0e\x15?\xf8/\xfd\xbe\xe1\x8f{\x1f\x83V9|H\xf1\xcch\x00\xa4\xa8\x1c\xcd2y|\x9eh\xcdr\x1c\x82H\xec\x8d\x0fb\x8a\x0cl\xc7\xe9\x84q3\x80\x15\xb4\xf2hO\x99K\x82LI\xe3J\xf8<\x17\xe0\xeb%\x06\xd6\x17DA\x0b#\xe1xx\xda\xbe\xa4\xda\x99\xd55\xfc\xc2J\x8f\xff(\xd9\xd6;@P<H\x83\xd1k)L_\xd9YL\xbaI5\xdbf^Z\xc2\xeaw\x9e\xa4\xbfC\n\x9d\x00P\x9a\x0f\t\xae\xadwG3\xa6\xfc\x9d\xeb\xda\xa8\x14\xd7\x8fo\x11[f\xbbOh=V\xce\xfe"?\xf5\xc7\x8e\x14O\x04S.\x1b\xcb^=\xa9\x0bP\xb4\x9f\xb7\xe0\xf92eL\xf7g\x80{\xea\xad\x1ce\x8fC&\\\xbd\xbb\x02\x95*\xe9H\xd6EU\x11(J\xa3\xd8U)\xd7\x8awgC\xc5\xa5\xae$\xb3\t\x0cJ\xf4\xd2\xed\xcb\x1e\xa7G\xb68\x0c\x19ML\xf0\xa7\xee\xcb\xb1\xc9\xd6H%!\x11\x06\x89\xcb\xb7\xdd\t\x89{\x8b\x064^]\xa0\'_^p\x0f\xea\xb3z]\x0f\xe0&m\xe5)\xe1\xbc\x80\xc5f\xdf\xbe\x8b\xa5t\x12\xc1gj\xe8\xe2\xf58\xbf\xc1\x8c\xb8\xe6\x04\xf3\x9b\xa6%\x14D_\x05\xe4v"\xeb"\xd3\xf2Z]\xac\x92r&\xec]\x8b\xeby\xcap\x99&\xa7\xae\x0c\xc5\x12\xdb\xd1\xd8\xe4FVl\x82\xa77\x1de\xc4\xdb7\xe0\x92\xb6\x92[\xdc\x14v\xde\xce7\xa3|\xd9,i\x9c!X\x08\xd8\x04\x90N\x80\xe2\xdca\xc8S\x89L\x19\x8d\xd1M\x8d,\r\xe9\xa2\xa9\x08?\xb0\x10\x03\xa3v\xd5h}\x9a\x93\x8b\xa7\xbbvk@$\xc1Z\x9a\xe4\xd0{\xd3\xa8=jd=zT\xd2r\xf8/\x8e\x1de\r\xaf1\x04\t\xc1z\x93Qw\x0b\xae\x95\xef\xd3\xde\x11c\x04\x04\xf2\xdbZp\x03\x11\x90\xd1\xca\xe9h\xf9\xbc|l\xc1Jn\xf50j\x1f\xa6\xf4\x99\xea\x9f\x19\x04t\xfff\xb36m\x9e\xef@\xf0\x9b\xec\x84\xbdi\x8f\xe3qJLX>\x17U\x9cw\xca\t#V\xdf=\xb5\x19\xb3\x93!\xdd\nH\x8f6\xcfp\x08db\xf5@%\xb0\xf6\xc6\xf6\x94\x84\nQ\x83\x89\xe5nor\x93\x83m!\n\xeaW\x97\xf0\x8e\x96\x84\xe5<4\xf3\x17\x82\x18}\x9f\xcb\xe0\xc4\x81\x95R\x9a\x16kg\xb6_}y\x0f=\x109\xdc0\xbe\xa9q\xd1\xee\xe9\'\x05\xde\xc7\x8f\xfc}Gx\x0c\x88\x83\xb8\xbb2X\xbc\x1a\xdd\xdf\xc9%-/\xe8\xd6j\xca\x88iWr\n\xde\xf0\xe9\xac\x85\xe5\x8d\xb1\x1dg\xfe]"\x0f\xc0\x0eE\xcfJ\x13RG\xfa\xb0\x8cg\xaae\xe0\xf7~;e\x87\xfe>@\xe6_\xf5\xa4\xb7M\xa6Y#\xecU\x95\xed\xff\x16\x8b\xc3\xcc\xa7#\x80PQ:\xba\xb3\x1f\xc4I\x9ft,\t\x8f\xf0\xd8\xaa6\xde\xb7<R_\xb7\xdc8^dv\xe2\xb7c\xd8\xfal\xa7\x90"\xc7o\n\x0c\xf7\xbaE\x9a\xc2V\x8e{\xc6\x1fj\xad\xf5J\xa4\xc46e\x90\xe3+|\xf4\xe8h\xdd\x9b\xa8\xc8q\xc0\xbe\x94\'\xc6\x12\xf8{\x1e\x82(\xefN\x06\x81\xf73R\x05\x9b\xe1\xb0\x03\xc9+\x0eQZ\xcd\xef9\xd0\x81\x17Btv\xd2\x14\x0bo\xcd;\xe3\x06S\r\xec\x14\x03\x83\xfb\xe3p)\xcb\xef\x9dP\x1fO>IAG\x99\xfd\xd2\xfe\xbc\',DD1\x9f\xa1\x91\x00H\xd7\x9e\x0b6@3r\xc1\xa3\x8e"\xfbg5l\x8b\x01\xba|\xbd\x18\xef+\xce\x91\x15\xaf\xd5lYC\xcf\xcf\xacn\xc0\x93,')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+
8
+ from sqlalchemy.orm import backref
9
+
10
+ from flask import Markup
11
+ from dateutil import relativedelta
12
+ from hiddifypanel.panel.database import db
13
+ import enum
14
+ import datetime
15
+ import uuid as uuid_mod
16
+ from enum import auto
17
+ from strenum import StrEnum
18
+
19
+ class ConfigCategory(StrEnum):
20
+ admin=auto()
21
+ branding=auto()
22
+ general=auto()
23
+ proxies=auto()
24
+ domain_fronting=auto()
25
+ telegram=auto()
26
+ http=auto()
27
+ tls=auto()
28
+ ssfaketls=auto()
29
+ shadowtls=auto()
30
+ tuic=auto()
31
+ ssr=auto()
32
+ kcp=auto()
33
+ hidden=auto()
34
+ advanced=auto()
35
+ too_advanced=auto()
36
+
37
+ class ConfigEnum(StrEnum):
38
+ cloudflare=auto()
39
+ license=auto()
40
+ country=auto()
41
+ package_mode=auto()
42
+ utls=auto()
43
+ telegram_bot_token=auto()
44
+ is_parent=auto()
45
+ parent_panel=auto()
46
+ unique_id=auto()
47
+ last_hash=auto()
48
+ cdn_forced_host=auto() # removed
49
+ lang = auto()
50
+ admin_lang = auto()
51
+ admin_secret = auto()
52
+ tls_ports = auto()
53
+ http_ports = auto()
54
+ kcp_ports = auto()
55
+ kcp_enable = auto()
56
+ decoy_domain = auto()
57
+ proxy_path = auto()
58
+ firewall = auto()
59
+ netdata = auto()
60
+ http_proxy_enable = auto()
61
+ block_iran_sites = auto()
62
+ allow_invalid_sni = auto()
63
+ auto_update = auto()
64
+ speed_test = auto()
65
+ only_ipv4 = auto()
66
+
67
+ shared_secret = auto()
68
+
69
+ telegram_enable = auto()
70
+ # telegram_secret=auto()
71
+ telegram_adtag = auto()
72
+ telegram_lib = auto()
73
+ telegram_fakedomain = auto()
74
+
75
+ v2ray_enable = auto()
76
+ torrent_block = auto()
77
+
78
+ ssfaketls_enable = auto()
79
+ # ssfaketls_secret="ssfaketls_secret"
80
+ ssfaketls_fakedomain = auto()
81
+
82
+ shadowtls_enable = auto()
83
+ # shadowtls_secret=auto()
84
+ shadowtls_fakedomain = auto()
85
+
86
+ tuic_enable = auto()
87
+ tuic_port = auto()
88
+
89
+ ssr_enable = auto()
90
+ # ssr_secret="ssr_secret"
91
+ ssr_fakedomain = auto()
92
+
93
+ vmess_enable = auto()
94
+ domain_fronting_domain = auto()
95
+ domain_fronting_http_enable = auto()
96
+ domain_fronting_tls_enable = auto()
97
+
98
+ db_version = auto()
99
+
100
+ branding_title=auto()
101
+ branding_site=auto()
102
+ branding_freetext=auto()
103
+ not_found=auto()
104
+ path_vmess=auto()
105
+ path_vless=auto()
106
+ path_trojan=auto()
107
+ path_v2ray=auto()#deprecated
108
+ path_ss=auto()
109
+
110
+ path_ws=auto()
111
+ path_tcp=auto()
112
+ path_grpc=auto()
113
+
114
+ # cdn_forced_host=auto()
115
+ @classmethod
116
+ def _missing_(cls, value):
117
+ return cls.not_found #"key not found"
118
+ def info(self):
119
+ map = {
120
+ self.lang: {'category': ConfigCategory.branding,'show_in_parent':True, 'commercial':True},
121
+ self.admin_lang: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
122
+ self.cloudflare:{'category': ConfigCategory.advanced , 'commercial':True},
123
+ self.license:{'category': ConfigCategory.hidden, 'commercial':True},
124
+ self.proxy_path: {'category': ConfigCategory.too_advanced,'apply_mode':'apply','show_in_parent':True},
125
+ self.path_vmess:{'category': ConfigCategory.too_advanced},
126
+ self.path_vless:{'category': ConfigCategory.too_advanced},
127
+ self.path_trojan:{'category': ConfigCategory.too_advanced},
128
+ self.path_ss:{'category': ConfigCategory.hidden},
129
+ self.path_tcp:{'category': ConfigCategory.too_advanced},
130
+ self.path_ws:{'category': ConfigCategory.too_advanced},
131
+ self.path_grpc:{'category': ConfigCategory.too_advanced},
132
+ self.path_v2ray:{'category': ConfigCategory.hidden},
133
+ self.last_hash:{'category': ConfigCategory.hidden},
134
+
135
+ self.utls: {'category': ConfigCategory.advanced,'commercial':True},
136
+ self.package_mode: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
137
+ self.telegram_bot_token: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
138
+ self.is_parent:{'category': ConfigCategory.hidden,'type':bool},
139
+ self.parent_panel:{'category': ConfigCategory.hidden, 'commercial':True},
140
+ self.unique_id:{'category': ConfigCategory.hidden,},
141
+ self.cdn_forced_host:{'category': ConfigCategory.hidden,},
142
+ self.branding_title:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
143
+ self.branding_site:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
144
+ self.branding_freetext:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
145
+ self.not_found:{'category': ConfigCategory.hidden},
146
+ self.admin_secret: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
147
+
148
+ self.tls_ports: {'category': ConfigCategory.tls,'apply_mode':'apply'},#tls
149
+ self.http_ports: {'category': ConfigCategory.http,'apply_mode':'apply'},#http
150
+ self.kcp_ports: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
151
+ self.kcp_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
152
+ self.decoy_domain: {'category': ConfigCategory.general,'apply_mode':'apply'},
153
+ self.country: {'category': ConfigCategory.general,'apply_mode':'restart'},
154
+ self.firewall: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
155
+ self.netdata: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
156
+ self.http_proxy_enable: {'category': ConfigCategory.http,'type':bool},
157
+ self.block_iran_sites: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
158
+ self.allow_invalid_sni: {'category': ConfigCategory.tls,'type':bool,'apply_mode':'apply'},
159
+ self.auto_update: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply','show_in_parent':True},
160
+ self.speed_test: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
161
+ self.only_ipv4: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
162
+ self.torrent_block: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
163
+
164
+ self.shared_secret: {'category': ConfigCategory.proxies,'apply_mode':'apply'},
165
+
166
+ self.telegram_enable: {'category': ConfigCategory.telegram,'type':bool,'apply_mode':'apply'},
167
+ # telegram_secret:{'category':'general'},
168
+ self.telegram_adtag: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
169
+ self.telegram_fakedomain: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
170
+ self.telegram_lib: {'category': ConfigCategory.telegram,'apply_mode':'reinstall'},
171
+
172
+ self.v2ray_enable: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
173
+
174
+ self.ssfaketls_enable: {'category': ConfigCategory.ssfaketls,'type':bool,'apply_mode':'apply'},
175
+ # ssfaketls_secret:{'category':'ssfaketls'},
176
+ self.ssfaketls_fakedomain: {'category': ConfigCategory.ssfaketls,'apply_mode':'apply'},
177
+
178
+ self.shadowtls_enable: {'category': ConfigCategory.shadowtls,'type':bool,'apply_mode':'apply'},
179
+ # shadowtls_secret:{'category':'shadowtls'},
180
+ self.shadowtls_fakedomain: {'category': ConfigCategory.shadowtls,'apply_mode':'apply'},
181
+
182
+ self.tuic_enable: {'category': ConfigCategory.tuic,'type':bool,'apply_mode':'apply'},
183
+ self.tuic_port: {'category': ConfigCategory.tuic,'apply_mode':'apply'},
184
+
185
+ self.ssr_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
186
+ # ssr_secret:{'category':'ssr'},
187
+ self.ssr_fakedomain: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
188
+
189
+ self.vmess_enable: {'category': ConfigCategory.proxies,'type':bool},
190
+ self.domain_fronting_domain: {'category': ConfigCategory.domain_fronting},
191
+ self.domain_fronting_http_enable: {'category': ConfigCategory.hidden,'type':bool},
192
+ self.domain_fronting_tls_enable: {'category': ConfigCategory.domain_fronting,'type':bool},
193
+
194
+ self.db_version: {'category': ConfigCategory.hidden},
195
+ }
196
+ return map[self]
197
+ def commercial(self):
198
+ # print(self,self.info().get('commercial',False))
199
+ return self.info().get('commercial',False)
200
+ def category(self):
201
+ return self.info()['category']
202
+ def type(self):
203
+ return self.info().get('type',str)
204
+ def apply_mode(self):
205
+ return self.info().get('apply_mode','')
206
+ def show_in_parent(self):
207
+ return self.info().get('show_in_parent', False)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
208
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,107 @@
1
- # 2023-04-08T16:23:19.934867
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xa1\x19\x00\x00\x12\t\x04\x00\x84\xc4\xd2\xa7j\x08\xbdK\x06x\x83\xb5\'\xe3\xda@\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xd4#\x97\xabl\x187\xeb\xe3e\x16\x95{5A\xa2P\xb3\xcf\xf8{1\x16\xbd\x04\x83\x17s`\xfdY\xcc\x02\xbag\xc2_j{\xb5\xcf\xbc\xde\xe4\xd7R7\xc3\x0b\x88\x01\xe2N\x8c`\xf5\xa8b\x16\x11\x8d\xb1GCd\x11\x13\x0bbM\x1cx\xd6+Zg\xccBVy\xbdE\\!L\xfd\r\xee\x0e\xf3e\x8b~]\xd6\xff\x86\xa0\xe4C\x18\x8e\xe2\x90\x8d\x00S\xfb\xe1\xb2/q7\x89\xc7\xe9~\xe4\xe7\x1f\x80\xdb{\x1d\x0es\x83=\xaaD\x81\xbb\x98K6*w\x80\xbf>\xf6\'\xf7z\x9d:\x18\xd9|\xbb9\x99u\xeewz\x9b{E\xae\xc0\xedw\xaasr\xa8\xe8`q\xc4n\x81\x1f\xda\xedz\xb1\xf2\xd9}\xc2]L\xe8\x9b\x05\x9d\xa7\xbfHR\x84Do\xc9\x85\xa6\xc5\x88\xac#\x9e\x13\xd0\xd5\x91\xa3k\x81\x98:?\xfc\x8c\\\xac\xa3\xb6m\xd9\xb1\r%T\xe9\t"\xa5toK\xdfOfS/4\x8b(z\x01\x8dEv<G\xfd\xcfA\xeb\xb3\xa5g\x9en\'\xaa\xc1\x83Qt\x95:[\x03O\xdd\xb3j\xd2\xc0\xa9f(\x9a\xa0+\x1c&Ybd \xd2\xf9\xe79\xa3\xdcX\xf8T\x83\xaf\xde\xf6/\xd3\xf4\x1a\x1d\x17\x9f\xc8#x\x97\x08f\\\xbf;\x91\xef\xb8\xbb\xba\xd4\xbb\xa6\x8bX\xf7E\x8cX\xa5h\x94\x9a\x9aX\xa8zC\xc5\xd2W\x19\\\x16\x0f\xdd\xacA\\\xa0\xd8|\xc9\xf0\xf3\xfe@\xa7{\\\xc8 0\xca\xba\x1bRShR\xc2\x00F\xda\x12\x06\xa8\xc0\xd2\xbc\xf4\xca\xbb\xf2y\xed\x9e\xa1fvp\xf7\x19\x96\xf7\xb3\n\xf2\xd9`\x80\xa0\xe8@YS\xd9"\x9b\x1d\xe3\x8f\x07q\xc0m\xcf\xa4\xdf\x93\xd4,l\xf2\xf7\xd79\xe3\x93\xb3\x7f\xe7\xebc\xaa\x90\xbf\xcf\xa93\xa6\xd7\xea\xe3\xf7\x1af7[\x7f/\xd0\xd5\xa1@\x85\x92(\x89\xc6\xc4\xc0\x88\x83j\xf7\x16r\x87W\x8a\x9eu\x19=6\xe0)v\xf1\x0f\x1f\xc3H\xaam\xd6\xb9\x1c\x9b\xac\x81\x153\xe3\xcen^\xcanjB"\xea\x8e\xa7\\\xca\xcc\x9axj^\xbd\x8f:\x13\xe8\xeb<\xc8L$\x8a\x91\xf8\xaf\xf8AK\xda\xe7\x84\xc2(\xf6\xc5\xe50\n+\xf4K\xe0@\x88\x918]+\x06\x98\x1d^f@{\xc1\x1aMg\x9d\xc2V\xc9o\xd5 \xbe\xc1\x9d\xdb2q\xc8\xf1qq\xec\x93G\xcf,\x163\xfb,\x06\x7f\xc2\xba\x89\x0c?T\xd3\xf65Bu\xbe\x85n\xbbRz\xf4M<\xb8\x00\xbb\x0e\xaa\xaaKS\x88\xc4\n\xa0\xb9d\xd5\xdc\xa6\xca\xe9\xc5\x05\x8fb\n\'e\xfbmI\xc1\xcbH\xab,\xbb\xb9>b?\xb7E1\xa8}\xde\xf9\x82#\xbf$\x90=c\x90_Nd\xac\xb6I\xe4\x87\x98\xa7\xa6 i+\x04/f\r\x92\xbbl\x9av\xf8m>\xd9\x95\x0b\t\xf2\x1a\xa5^\xae\xe9\t\xdd\xce\xb1/0p\x87\x90G\xa4\x11\xe6x&2\xa0\x89\x0cf\xfb-\x86\x81\x99\xb0r\x0e\x9d\x9bJ\xec&\xd4\xb0/8\nU4<~\x15(sn\xf1c5\xea3\xc1\xfa\x80gEO$}\x8e\x95\xca\xa7?]\x031\x1c\x80\xad\xf6\x118\xaf\x0f\x171\x8c\x02\xfe\xe4\xdfD\xb5\xea\xdf\x08\xfa\xec&\x178\x19\'\xc3\xecoT\x1cT\r2x\xb6\x86F]?\x1b\xfe\xdd\xcfhb\xa5&\xb4\xa1\x9c\xfe[\xb0\xcdL\x96\xc5\x15#6\xb75Z\xc9\xf3\xdc\xa8\x8e;$F\\.\xe15\x14\xee\xe3^\x84\xa9\xbb\x9555\xcd\xc4\xbce-\xb6b\x1e\x1b\x03\xeb1N\x1e\x8e\x7fG?\n\xddz\'=\xb5\x9f\xffdr\xed\xb13\xca\x11\x99\xacw\x84:\xca\xb9K\xaew\x13(x\xc9\x8e\xb6Y\x9aI\xa6\x9f\xb6\xf1\x86 %\xff\x00\xbd\xe8\x02\xd1\xe8\x10\xa9|\x81\x8e\x1e<\xbd=\xbc\xe8\x10]\xffHR\xc9\x88\xd9)C*\x1c`e\x94\xc7\xdd\xab7\x93m\x15\xb0\xbe\xbe\xf3\xce3\x88\x1ap\xa4Y\xcf9\x97\x95\xf2\xe9\xbb\x97\xd6]\xe0\xfa\xd7e\xff\xaa\xfc\xde3\xa9\xa4e\xa9\xd6\xe0\xd2\n\x91\xdch\xb8\xef\xc9B[\xa4\x0c\xf2d\x80."c{n\x01\'R\xf0C\xe0\xfd\x7f\xfa\xd0\xbb\\\x9e\x81\xc51\x06\xcd\xc6|\xcbC\x8d\x97\x18\x84U\x18L^\x89\xb9\xbf\xf5#\x83\xe7\x07\xc8\x86\x07\x1b\xe0J\x9b\x95\xfar\x1aHI\xb1,wJ\xe42~\x97\x01\x87s\x90\xffw\xa4\xf5\xf8\x9b\xafp\x00\xa7\x95oE\x8c\xd8f\xbd\x10\x13P\x973\x18\x95\x13L\x06\x9f2\xeb\xaa\xf5e\x1b\x13\x85\x85o\xc2\x00\n\xa2\x02\x10\xb2\xad\xd4\xaf\xaa\xd49RWT\xf6\x84\x86v9\xe5J\xed\xf6v\xdb2\xf2\xd9U 7\x95\xda\xb0\x8c\x1a\x08Y\x11zl%z\xb1s\xcb\xd6\xc3l\xeb\xa4\xb0\x1bZ\xf9\x98\x81\xd7\xb3\xd9.W\x0c\xcc}<\xb8D`\xbckri\x81TE\xd4\x81\xfc\nB\xb1\xd1L\x12I\xbc\xf63\xf1\x12\xec\xcc\x8b^7\x14\x19{$\xfe6I\xb3\x12__\xb3\x99\xdb\x9f4A\x08\x14\xd8XR\xc0\t\x8e\xe8\xc6\x9d6\xb5P\xaa\xfeA\x05\xfe\xeb\xc76pE[\\\x1b\xc3\x18WT\xa7\x19x\xf5\xf4\xc7\xd5\xfc\xd5\x06+\x96\x0f\x96\xc0\x0f\x00\xd0M\xed\xb2\x12\n\xa6g\xc6\xf3\xdd\x89R\x19\xf2\xd8\xa8\xeca\xfbi\xc8\xfe\x98\xc1\xa3.B\x8fc\xf6c\xfd\xe1aK\t\x92\x16\xdd5u\x06J\xf2\xa3Fp\xac\xc0c\xb3\xf6\x9e=\x81@\xbe7\xc0X\xe3\'\xa7~\x81R\x0c\xe4hW\xa1\xf0V\xb2"\xf6\x02\xad\x10\x93\n\x9d\x15\xbd\xed\xe9\x00\n\x1b/\x8c&\xf4\xad\xed\xb3_K\xa8\xa5\xe6\t\xa7\x0e\xd3\xe9\xb8\r[\r\xee_:\xc5TYD\xbb\xc3@\x9e\xaevJ\xa17&\xd7a\xb4\x12B\xa0\xce\x1c\xc1Z\\b\x0ea*lGr\xf1\xeb\x19\x9f\xd6M\xd7\x92\xf9G\x83\xeb\x0e@*+<%c\xf3\xa1\xf9:\xf1}\xc9\x16\x00\xdc\x0btiY\xe0\xae\xfc:\xe0\x93\x19\x0c\xa0\x9eP^\xc6\xc4\xc6D\xe9zT\xe1\x0c\xb9\xfd@%n\xc2U\xd1t\xcc5\xce\t\xb0\x89@V\x1d\x8dMWNc\xf0\xe7\xcd\x8c=XI\xcc\x1c\xd7\xe2\xf1y[YL).u\xc6H\xd2u\xf4\xe8\t\xf8\x98)$y\xd1wkv\xae\x168(W\xea\xc7\x03\x94y\xd6&\xa7\x9fxk\x9d\xab\x0f\xddS\x97\xad\xfb\xb0\xa7\x04B\xf9|\x87 \x97\xa8\xa37T\'\xa1S\x14l\xa1Z\\\xf6\x95zk\x89\tZ\x89\ts!}\xc6p\t~\x01i\xfa\xf4e\x03W\xd5&\xbe\xe0\xa3\xc4yz\xde\xdef\xab\xa35yw\x90\xe2\x19T\xc1D\xfd\x87\x1c\x84w\x83`W\x16%X\xb2\xc6Q\xdd=\xe8}\x8a\xb4\t\xc3\x17\x99\xe5\x83S\x9e\xb22\x16\x96\'\x92l\xa5\x98\xfb\xaeX\x89\x1e~0\xa8#2\xe3\xea\xb1\xe5\xe5\x82\xe8lt\xd3\x17\'\x0e9\x16n\xa6"\xde\xf0\x85(^\xa7(o\xc7\xa9T9\x82\xf8)\x8b\xc5UW\xf9\xfe\xcf-0\xce\x9c\xe9Q\x86\x8d\xafe\xa1\xaa\xd5\xbd\xe1\x14\xb3j\xc2\xd4\xc8\xf7n>e\x93R"\xff92A\n?n\xcb\x14\xab\x96\xaf\xb1\xe9\xa8x\xb8\xe4\xd1\xa1\xf1\xe9\xbfM\xd1\x7f\x94Sg\xff\x1e\xc4B\xeb\xcb\x8b\x13\xd8\xa0\x07p3w\\\xc0\xf4\xb0@\xb3\xd56c}\x079\xeb\xbe\xa2\xb10H,\xe2\xd4\xbd)\x94\xb9z\xf7E\x0f\xedPz\x15\xe1M\x18\xe1\xc9\xd4/\x0e\xa7\x7f\x903h%,\xc2;\x19 \xb3b\x1cg\xf5\x89\xd7\xa6\xe6Z\xfbth\xc5\xa4\x82\xc4\xf0C\x12\x93Z\xc6\xd9\xcd\x13\xe4"\x06L\xdb>\xe2\x91\xbe\x14\xfc\x0b11\xc4b0\xd9\xbav\xea\xcd\x11\xd6TH\x83\x0f\xder\x17\x83\x0e\x17\x8e:Wf\x80%\xbd\xdf\x91\x02\xa2\xcf\xbd\xbe\xe8D\x829\x08ih\x158\xa0\x89a+p\xa8\x19\x99iC5\x99\xd8\x9c\xff\xce\xc05\xb5V\xcf+y\xeeo\xa7Trg\xd8\xcev\x7f5r\x87\\\xf2\xcb\xa1\xfd\xc0k\xe1p\xa1g\x96\xa7\xdd\x85\x06\xb3\\\x84\x8f)\xc7\xc4h\xe0@\xe2\xa6\xb0W`nk,\xaa\xbd\xa8\xa93:\x11^\xcc\x90\xb2\xf5P\xb0y\xd5\xb90A\x0c\xc3\xd5\xf8I\x9b\xdc}\xd2\x1e\xf9\x1a\x9a\x9b\xaaW\xec\xce\xff\x18\x10\xee\xa9\xb3\xb2\x96>B\x1b\x1f\x03\xed\x1cD\xff\x99\xb7\xdc\x8b\xfec{\x86\xe4[o\x93\xe4\xb0i=_\xab\x15\x0b\x15\x0e\xd7\x05\x815\xc2h\xae\x87\xd0\xbb6E\x00\x92\xf9\x95\xe6\x99x\xdf\xc2\xdb\r\x05\x13\xfb\xa0\tG\xb8l\x1f\x8d <;\t,\xd6\xd5@\x91\xa3q_\xa3\xa2\xaf.$\xe1\xc7\xef\xc3\x19\xdd\x8a\xba\xdb\xa7A\xcf-\xf6\x1dV\xe5\x98\xc8\xb8\xba\x01\x82\x12kM\xf2\x93\xc2\x89\xfe\xa5\xe4\x88k\xe7<T\xb6\xe3\xf7\xd1\t\xd4\n\xa8\x11\xd7_\xaf\x03+\xe7\x7f\xacB\x8b\x8f\x8fJ\xd8D*fb+{k\x12\xca\x83\x05\xb8\xa9p\xec\\\xfe\xf3\xc2\xe5u?\']\xbd\x0e\xe3\x88\xe6\xd5\x05w\xf4\xa0{\xbe\x17d\x92!}\x91e\xeb\x87\xb1\x1e\x7fb$/\t\xb6\x9aD\xab\'\x85\xfa\x86/\r\x8f\x01Q\x9b\x97\x87F\xfc\x9fl\xf1&\xe0w\xf9=\xdc\xf6#\x81\x13\x05S\xa9\xee\xb2\xf7\xc4\xae\x07\xb4Y\t\xb2y\x072\x15\x0ed\xca^\x9cz\x8b\xd8\xb1\x19\x81\x18\x1b\xa0WI\xd6s%}p?\xcc\x17\xcb\x97\xd0\x987\x01\xd0C\xc7\xc0\xb2\xcb\x89\\\x9b\x83=\x96\x07\xd8\xc2H\xd9\r\xf8%\xa1\xda\x9a\xe3\x91\xbe\xc4\x8c\x9b\x942n\x88.CzV\xda\x15\xb4\x0f\x89\xe32\xc6f\xf3l\xbd\x02E\xe3\xbf\xaa\xf6\xd2k\xf62\xc0{\xca\x13n\x15\x11w+\xb9G\xbc\xc3\xb6\xae\x99]][*\xa1\xe7|\xea=uy\xa7Yw\xc9j\xf0WsQ^1\xb3\xd7\xae\xd8\xbc\xe1\x96"*\xe0O\xf5!\x0c\xad\x965\xaeml\xcen\xef\xe6n\xacY\xb1i\x92\xed\x9b\x95x\xfa\xc4\x00\x01)eP\x99\xc2\xcb\xdb\xc1r\x17{b\x8a\r\x12F\x97\xa0|\x8fp"\x1bD\x00\x83cB\xbc\x99i7t"\xc7\xf6nm\xfbJ\x8cS\xb0\x88\xaf\xa3d\xaf\x1a\\\x1d\x98\x0bq\xc9\x15\x0c\xbc\xf5v\xa2\x18B07\xf3\x8b\xe3w\xcfV@8m\x9cJR|\xea\x1d\xc4\x97\x9fcbHlpJU\xab(V\x8aIi\xee\x13h\x8c7\x96\xc7\x0e\x18g\xc5\x9c\xc7Z%V\xbf\xf4\x01nD0\xed\x1d\xa9\x05(\'#\xb9b\xfc\x7f\xee\xca\xc7\x1d\x88\x18)[\xae\xbd\xf5\x9b\x99b\n\x19Ww\xff\xc3\x82\xbc\xdb\xfc\xb6\x93\xbcg\xf6\xbaw\xa9\x9d\xe3\x17[5kMt\xb6;/+\xb9p\xd6,tA\xe5C\r\xd0_\xb1\xa5\x9a\xb9]\x18\xe6i0\xc3\x07\xb3j\x92E\xdd\xd6.\xdc>{p\xf7\x9b\xfdh\x93b\x10\xb6\x1f\xda\xe2\xfaz]\xd1!HecI\xbd\xb9[n\xb4?\xe7}n\x99>&\x97\x95w\x8c\x9d5\x7f\xe8c\x1d\xcc\xcb\xb5]\x9f\x88\\\xe0\x7f\xa6)\n\xca\r\xd7^-\xa1,\xcf\x14\x83|\x1cV/\x11-8\xd8^e[JK^\x113\xef#\x03\xebJ\x16\x1f\x85\x866;\xeei\'\xeb\xb7g\r\xe5\xa1\x11\xfc\xb1\xbaQ\xb4\x90\xbd\x04\xde\xa0\xc7\xffbIB\xd4\xa5p\xefi<\xcf{\xde\x04d:*9nV\x8bg]\xd4}\xbdc\xf6O\xb2\x01\xa9\xd0d\xb5V&l0.\xb5\xda\x04\xd0\x96Kq<\xb0\xb9<<\xc4\x8b\xbd2\x9a\xd7\xa8\xa8\x8d\x0f\xb58\'a\xf2\x1e\xc1C\xbeg\xb1L\xeb\xaf\xf0\xa1\xd5\xdc\xd4S\xd5)\xab\x95\nv-{\x17\x11\x0c\x86\xed\xe5#\x044\xae\tr\xb2\x8f9\xa6\x8d\x0b\x8c\xb7}\x87]\x90\xb1j\x15\x0cW\xd8\x05\xe0D\xc6N\xd3C\x12\xc4\n3\xbbWP\xa9eB\xe8\xafuI\x19u\xd0\xfa\xc8\\\xe7\x83\x0e\x03\\n\xe9\x870\xb6.\xc5&Z\xbf7^\x0e\x1c\xfd\xb9\xe9\xbf\xf3Z\xfa\xf8T\xaa\xb0\xb33\xf4R\xb5\x9c\xb0\x90\xdd\x14\x1c\xc8\xfe\xc8`x\x9bg\xf4\x8cu\xb8\xcd\xf3\x0f\xda\xf0\xb4\xd0z\xf2\xb1\x18m\xaa\xe7mt\x9e\x99kvCCf\xfd\xee\t\xba\x14;\x81\xf5\xd9zO\xcd\x8d\xa4}\x86\xd5\xb5\x80\xe9"\xc2l\x07\xd0\x10\xc0\xde\xbf62\xe3q\xaf2\xa4\x8ee_bO\x81\x0f7o/:K\xe4+*\xde\xf2@\x8a\xbf4\x99\xfa\t\xd2\xfc \xae\xb6|c\x00[\xa9\x05\xe4.\x82\xca\nV\xac\x8d\xdf\xc9\xcd\xef\xec\x98\xb9\xdb\xfb\x03\xdaq\xc3O\x97\xdf\xf7R\xb3\x02\xc3\x87N{\xb1\xca\x81l\x05I\rL\xe8o\x96&\x95\x98\x10\xf6\xa4\x07>\xc8\x1c.\xa4-q\xd5\xbc\x0e\x9c%\xddC\x98\xde\x8f\x0e}?\x8e\xd5E\xa0u\x10\xe4z\x108\xe7B\xd5&\xbc\xbc\xd4\x93A\xf2\xa2.\xa7\x02E\xec\x90\xac\x81@\xe3\x1c\x12\x01\xa4`\xb7\xa7S2\x1f\xbc\xa5\x9e\xba.\x97\xed\x1a\x1f\x9d\x1d\x87\x8e\x113\xce\xc2\xde\xefZ]\\N\x9c\'C\x80n\xf7l\x90\xb0\xf5\x01\x91\x16\x02\xb7\x904\x0c!G\xffRM\xf4!(\x1fG\xeb\x1b\xa8\x90O\xf0\x95\x9c\xaeaJk\xb7\xf2\xce\xe5\x1fs\xab\x16\xed.\xa5P\xf3\xb41\xfb\xbd\xd9\xfb\x95,\xfb\xfc5\xb6%pmc\xc9\xa9\xeel\xd2\x1cpe\x0eB\x1c\xcd\xfc\x0c!x\xd9O\x01\xaa\x0e\xfd\xa5\x8b\x8c\xc7\x1b\x85\xcc\xf4<\xdd\xf9\x89\r+V>f\xfc\xa73`\xa1\x8fB\x86\x96\x8e\xbf\x1c\xf9\xda\xbe\xe34\x8d\x9e\x1e\xf5\x81n\xc9\xec\xf8/\x84U\xf5\xcfZk\x83\x13\xca\xc4\xf9g_\xc5\xa7\xbc\xff\x07\xe8e\xcc\xa3\x9eb\x0f7\xb9\x8d2\x00\x06j$Y\xb2\xaaP\xed\x02K\x98\xae\xdb~Y:m\x0b\x8d\xe0\x91\xfdz\xe7\xb4p.\xbc\x89\xc6!f\xdaK\xedi\xd1k\xc6\xb69\xc1Vj\xd0\x8b@\xa3\xbf$= \x07\x1eg\xe1\xa1\x9b\x8a\xda\xbc"\xaf\x9a\x99\x19-\xeag\x8c\x832\xb7\xdf\x9e\xb5hxo\nhe@\xdd\x91\xfaP\x15\x07\x84C\xd1\xd3yC+\x89\xac4\xa3\xd4\xf0bL~\xc1\x91Db\xb9\xfe\x17\x85Z\xf0\x19]\x96\xd7\xd57\xbb\xa5\xaa\xa7\xc3t-y\x8b\x1cSVr\xe7I\x17\x8bV\x0c\xb2\xe0c\xe9\x80.\xeb\xc8\x91\x99\x8fA\x8a\xeb\x9aI\x92I,\xeb\xc7\x82\xb1W\x0c;\xdbW\xbeK\\\x1b\xfex\x88 \x1e(\xe5\x17\x8b\x84\xce\x19m`|~A\xcf\xd9\x94Q\x18\xe44m\x9f\xfb:\x8d\x8d\xa3i\xf5ZZ#\x87\xe4\x19D\xb0c\xed\xb2v\x05\xac\xe28\x96\xf4Y`\xd4\xba8\x16\x10\xbc3\x12\xc4\xa3\xb9\xf4\xbc\x1f\x0fZ\xc3/\xd5\xab\x0eU\xd2\xe3\xf2\xe6\xf2e\xe1[\x9e#\x8e\x17n\xad\xb4\xcc\xb1t\xa7A\xce(\xf0(\xccD]\x97\x1f\x9eD\xacwU\x81\x12\xbb\xb6\xc7\xe8\x06\xb61\xefJp\xab\x14\xc0\xe0\xab\xe4\x1f9d\xb0D\xbeV\xc2V\x8e7\xbb\xd37\xb6\xdbCUXe\x94;\xac\xd1\'\xdb6ro \xe5\x9fS\xbb\r\xaf\xf0\xa7m>R\xdeXu\x8c\xc4\\\xb2\x0f\xdbt\xa1\xeb\x92\xdbi\xd3\x0et\x85\x16\xae\x0f\xf1\xe1\xb0\xcb\xa9m\xd1\xf0?}\x8ff\xa1\x8d\xb2\xd7l\x16\xc3\xb3\xdd\xd9\x85*\x94\xdb\x98\xa07l\x1f\xd6\xee!\x7fei\x05l\xab\x1c\t\xda\x94\x8d\xbc$:r\xbe\x9a\xe2\x98\x9eT\xba\xef\xd7\x9e*+.eM\xaa\xad\xc33\n|\x18\x07\xbb\x13\xf4\r\x8ai\rj\xb8\xe5K\x08u!\xcd\x83f\x9e\xae?\xd2\xd7\xf84\xae#e\xa8\x98\x9eZ\xb1V\xd5\xab\xba\xf7\xfa(3\x1b\xf3\x1b$\xe2\xd3\xfe\xef\xe5\xd1;\xab?\xfb\x98f\x11 -\x99\xbc\xf7\xe2\xd2\xf6\xa1\xf9\xa7Q"\x05L\x18b\x1cV\x0f\x02S\xab\x95/\xff\\\xe2+la\xcbUm\xe7\xe93<\xff\xf3\xab\x84kkO\xd7\xc4\xfe\xcb\xcei\x054~.\x99q/o\xcd\x99\xee>`\x11Z\x81\x1bkt\x89\xb5\x10\xb5\xc1\x92U9\xf7vc\xf0\xf9Kr\x07i~\x16;u\xa1mN\xff\x06\xc3\xdf\x97\xb8+\x87\xb6\xa5\xf4\xed\xc8:\xa7\x94\x165VO|\x8d\xb52\xd9\x94\x98\xf6\xca0\xaa\xea\xa5^\t\\\xebI\xc4c:\xed\'?[\xfc\x82V\xdc0\xd6g\xb3D)\xa7Yr\xdcJk\xd9a\\th\x8b\xe8\xda\xf3-1B\xf5j\xa1\xa92\x1b]#\x91\xa4f\x80\xe3\xabY\x8e12\xb6g\xdd\x8aot\xd7\xa7\xac\xd4"\x17\x80\xd8%u\xce\xce\xccPB\xdd,\xf3\xfa+\xe5\x95\xf2\x06R\x10\x96.\xadB\x97\xa5#\x04\xbf\xa2(^0\xb0\x89\xca\x18g\xb0\x0e3w(\xabE-\x91\xdc\xa6n\x82\x81\xa6\x1f\xdd\x7f\x80\x17m\xb9bG\x8bo\xe9\xab\xe7\x13\xcal\xd6\xdb\xb0\xe8\x08\x0bF^\xff\xe2\x00\xcd\xc9h"\x8f\xa4E[_\xfc\xad\xaa\xcf\x8bs@\xa6p\xb7\xb1\xf2\x11`\x85\xa4\n\xb4\xacr\xc6\xc4a\xe8yO\xee\xe2\xf7O\xf2\xf8\xacvd\xe6ZF5(\xd6\xb6\'\x87\xac3{5\xb9b\xb0\x91qP\xa0\xd1\x9f\xaef\xc9\xf9B\xb1\xdbP\x1b:\xdd\xb2}\xd4\xb5$\x80}\x05\xf0`\xe05\xea\x91\xa5\nE\xc0x\x97\xb3\x95\xe4\xc7m\xd4q\xd4\xe7\xa42\xc9A\xb1\xe0G\x86kjA+@\x944\x1b\x1c\xfc\x18F\xe9\xbbxxn\x02\xa9q^\xa6/\x17\xdf9\xf3\xb4ba\x9e\x8e\n\x9d\x80\xca\x9c\x08\xe0\xd5\x19\xab\x11\x1b\x0e~Uy\xeal\x18\x86\x05=*\x1d\x08 \x05P\xf4}\xcd}\xe1\x8c\x1d*\x8fO\xa9r\xe7&q\x01\nT\xc0XJ\xdc\xaf\xe6\x14\xab\x0bk\xbfW\xef/\x9d\xb4Wm\xa3\x88\xa5\xe5\x92L1\xdcP9\xc0\\\x8d\xf3?\xbf\x85\xa6\xa1b\x95\x92\xd9\xb7A\x07\xea\x88\xa6\xde{\xc6\xb3w\xa925#7\xb6\x07\xd4\xde\r\x16E\xaeq\xa3\xf0\xcd\x03c\x8a\xeb\x1b\xb2\x8c)\xe9\x143\xb2\x9e\x88\xbd\xf5\x7f%\xd0L\xe8\xb3\x8eN\xe7\'\x8d~\xfb\xeb\xd6\x1bu<\x7f\xec\xff\xdf6\xa3$\xfbE\xcf*\x83Z\xc8\xdb\xd0\x020v\xefM}=\x94\x02~#4\xa8N\xabD\x8d*h\x1f\x9d\xab_\xb7\x9b?\x92ll\xc5\x16F\xc8\xd3\xa2\xfc:y~/aZzlO,kqI%\xac\x1ca\xf1r\xd9\xc2Al\xf2Q\xd5\xadXZT\x8e\xd8I\xca\xb3S\xb7v\xe9\x14[\xe7\x05}\x86\x87P\xce\x0ef\x0eq\xb7\xaf\xc5\x89\xb9\x8fNQ\xc7mR\x05\x1d\x18\xc1\x90\xe0K\x97\xd4\xc6\xa7X\x913>S\xfe\x01\t\xf1=>\x00\xc0\xfe\xe1Ki\x9d%\x05\xbb\xff^\xa8;\xf9\xc4\x17\xe5;\x1e\x85\xbfu\xc8s\x0c\x7f\xa5\xb6\x90,\'\xd4\xda#\xdc\xdaB\xef\xff\xba\x11\xfc.\xf2\xab\x02x\x8ee\xa5_1\x16\xdcVy\xca\xcf\x88B\xc8$[\xa1b\xa0\xd7\x0fc\xb8\x98\xd767I\x04\xd2Nc?\x1a\x95\xea\xd2\xcb\xd8\xc9\xd2\xfd"\x8aU\xddso.\xb6\xdbg\xbb\xf3u\x87mlq\xb6\xf4\x96Z\x89x\xc5\xf5\xc9\x95X\xed@\xcb\xef7?\xae\xa9\x87\x1dt`(\xc3\xff\xe5$8$\xf8\xb9\xe2\x13k\xcc\xf5\xfdJm\xb7\xba>\x1c\xa3\x94\xf83\xf5\xa3\xfeu\xc4*\x14\xf6\xac\n\x95\xeb\xee\x07\x9c\x12\xb88\xff,\xfdJ\xbf\x0e\xe8#L\x13g\xf05\x05\xcc\x82\xe3\xe87\xf9\xd9k\x91!\xca\xe8\t\x00\xd6\x11\x9fQf\x9fR\x07Oq\xf0\xc1\x99@\x95\x93ns\x99\xd6\x87\xa1*s\x1f\xe8m\xed$\xbc\x19#\xc5\xf5\xcc\x17\xd8a\x9cg-8c\xfe)%+vI\xf2\xf8\x9b0N\xc2\xe3<\x10\xf8pZ\x13u\xb4\x12R\xae\x9f\xe0{\xab)!\x9ffh\x0e\xe6d\x7f+\x19\xc79t\xe4\x0f\x83\x96d\x85[\x8f\x03g{\x8d\xc0=\xf7\x0f\x19\x0c\xb8n{3\x87\xb1d\'\x7f\x86\x07\x8ff\xd9\x0c/\xd5\xbf2&\xf5\xa7\x14\xac\xa2\xcb\x19\xb3\xef\x15\xa6\x8d-\xdc\x8c+\x06I\xbd\x81\xaf\x13u\xfe\x1c\xf1O\x8b\x17\xed\xe7O\x08\x0f\xae\xf8y\xe7g\x85H\xf0\x96\xb7\xef\xd20r\xc7"5\\\xa5c\x16\xc5L\x14m\x96\xc2=\xd0\xb3~\xa0\xd3\xc7A\x8fY\xed\xdb\x84\xf5\x1ad\xdf\x13xh5\xe9:R\x01Z^\xb8\xa0\xb9\xd2\xe1@Z^\x90~\x16\x12\x94\x88y\xda\x87\x8c\xc3\x02\x84\x96\xe8\xb4\xc8w|/\x92#\xe7\n\xee\xad\x1cc\r"~6<\x8cCw\xfc&\x14\xfe\x97j\x8aI>\xaf\xe8\xcf\x05;\xd2:\r\xaal\xde\xad\x06S\xac\x97k\x08Ffj\xce\xfbi\x03\x1c\xe2#\x93\x87*\r\xf9\x90\xda\x95o.\xbb7!\r>V\xb9\x981{\x8da\xe9Zg\x7f,\xf4\x17p\x1c\t\x1d;\xefiP\x17\x9f\x19\x82n\xd6\xf5\x8b&\xea\x83\x1e\xb8.\xf2{`\xf2\xa5\xc9\x11 \xa5N\xd4\x81hCA:\xf6\xa1\xefI\x99\n\x97}\x1b\xc4\x06D\xc7\xe18g3\x08\xf23\xa9\xc2r\xe13\xa1\xdc\xbflON\xaf\xaa\x1c\x8b\xb14rb(\x11\xf3N\x03$\xd9\xe8!J{*&\x9d?C\xc1\xbf\xc2W\n|\xdb\xf2\xce;\r\x98\x8c\xcb\xe3\x86\x11a\xa2\x9aFh\x9bL\x02\n\x97G\'\x12\xd3\xe4\x17E|r-\x0f\xef\xdaO\x13[c\xb31\xfb\xc2/\xeb(5&\x93\xa4\x08]c\xb1\xd0M\xa7\xa7#\x89k\x8c\xef\x16\xbb\x04\nV\x94|s\xa7\xefq\xd5\x14\xcd\x1fYu\x13\x85\xac&(>\x8d\x1eVE\x8a\x87\x11\x83\xec\xdfS\xe4\x93\x1b\x08N+<\x08\xff\x83IR\xa9\x07\x99\xd5\xa1\xfe\xb9\xf1\x17\xc4jt%\x85\x80\x99\x98G\x0e\xec=\x9dp\x1a\x0e\xda\xe3ir\xfd*n\x903\x11u\xc2\x1cOt\xdb\xb5\xe3u7\xb8W\xc6U~y\x7f\xfb\x0bKb\x97&h:\xa1H\xcb\xc9Y!\xf7\xf2\x005\x850v\x1cz\xf7\x9a>\xcc\xc6\xc3\xc8\xb12,W\x1e\\Ml\xc8\x12\xb4@9\xf5\xa9x\x86\xf8O!}B\x98\xa5\xcb\xe0\xc9\xb6\x1f\xebo\xb5"\xd4\xf1\x8cQY\xa0\x13w4r\xe0\xd6\xa7\xb1.\xc9\x158\xc9\xb5\xda\xb6\xb0\xf5L!\xe7\xbe\x16\xaa\xb8\x19\x9c\xb8\x96K\xe9\x90\x9d\x1e\x0c3\ny\xb9!_\xfe\'\x1e\xc4\xae\x9e\xf7;*\xf9\xca?\x92\xf6qy\xb9\xaa\x90\x1eu\xd8O,\x12\x83\x98t\xf1\x12\xcc\x02\xcf\xff>k^\xb0\xed\xb6\x18\x06\x8c*\x00\xc0\xcd\x1e\xcd\'\x0c\xe33\xcf\x1a\xd3\x11\x00\xab\xc3\x99&\x11\xd6\x19\x1d&\x7f\x96\x1c\xa2\x1a\x08\xef\x0b\x04\xdbwa\x96Y\x18M\xf5\xa2O\xe8.\x04\x0c\xde\x95\x8dBm\xe4\x83K\x8e\xa1\x9a\x87@c\xbb\x03l\xca\x15qAA\xfd\x149\x1eH\xc6\x08\xdb\xa5\x86\xa9\x05\xd3\xd9M\xc2\x00\x89\x139y]\xd3"8\x8b\x16\xcb\xf2K[:Z_\x7f\x1bkw\x99\xa1C\'lB\xdb\xad\x08w\xd7J.Fe\xb7\x9a{\xb6\x1b$|\xf1\x16(\x0cJ\xf9\xfc\x8bF\xe4\na\x89\x01j\x01\x9b\x97\xd4\x12H\xf4\xb6\xe34\xb51\x8b F9:\xea\xa2\xf9\xf4\x051\x89\x1b\xa0Il\xe1I\x93\x8f\x1a\xb2\xefM\x81\x9c\x84\x853\xff\xcf\xaeFe\xea\xe6H\xbcC\xfc\xfc\xd2\xb97\xba\xdd\xcbW\x8aY\x96:\xa2\x80\xa4\x97IF\xb7\x9bl\xcc\xe0\x0c!\xaf\xc0Z*\x1e\x86\xcf \x81C\xded\x15\xcbWr+\x12Hc9#w\xc4\x07\x897\r\xf1l\xa2\xea\x01F\xc4\xa0\x88\x06\xd2\xdex\xf1\xd1\xb2-\xd1\xebp\xae\xb2o?\xea\x01dIgJ\xcb\x189\xeca\xdbE\x11\xa1IH\x8b4\x82\xd8\xb0\x87@p`\xe5\xbb\xfe\x80]\xbb\xfak)\x0f\x94\xdc\xce\x01\xa1\xf2\xebtY\x9c\xfc\xa4\xf71\x97\xb9\'\xa58\xbfk\x97\x10\x8c\xbb\x13U\xf3~\xf8hi\xcc\x8b6\xdb\xc5\x98\xbb\x0cz\xa5>!\x0e\xfeA\x12R-\x86b\xc2\xcf\x18\x08\xbcBh\xecA6.\x9b3\x1f\xdf\x17\xe1\xa7h\x89u{p\xfc\x94<\x82\xe1\xf2\xf3IK\xac\xb4\xe8l \xd4\xea?p\xc5<OLl\x14\xffy\xact]\xe9\xe4\x95\xbe;F\xfd ;0\xad\x8dB\xc0\xb0\xdd\xd3oa\xcbc\x06\xd5\x97\n\xc2Xg)04x%\xfa\x8d\xa4\x9c\x91 \xa5\xe9\x92\xc8\x94\x1e@\xa0\xe7\xbcf6!3\x138\xf7jU\xbe\xb6\xf2\xa1=\x91\x9f\x07 \x10\xd4\xaa*\x07s\x82\xfe\x8b\xd8\x93m\xfd]\xc8V\x02\x99!\x81\xc3\xccH\x90\x81o\xde )J\xf3\x16\xecE\xef\x00\x87\n\x1e1\x1e\xf3\xdb\xf1%\x97:BEC\x05\x05\xb9\x8ae\r\x90\x84_4\x95xt\xed\xc0\xd2\xdaSd\x14\x12\xf9x\xa4\xa2\n\x93:\xa3\x1aJ4}\x92_\xc4rCRo\xcd\x82\xb1Rl\x98\xdeh\x96\xf0\x84\xbd\xe1\xd6>\xa6\xfa\x1c\x90:\xa4r\x89h\xef3mN\x9ayzW\x15\xeeI\xf7\xc6\\\x8bM\x88n\x87\xa4O\xcd\xb5\x9a\xca\x06\xe2\x8d:A\xd3`\xe5\x01\xff\x08~\xc2Ap;\xf2O\xa8{\xed\xca!\x99\xdffe\x04\xe2\x7f\xf3\xe8%\xf5-m\xe6\x91=\x13\x00V\x1e\xc3\xc6E\x10\xa6\xa0+r\x9b\x17\x93\xc8\x8e\xa1\x85s!\x19\xee\xe5\':FC%\xcd\xa3#\xec\x86\xe0\x7fI\xd7C\xb5I\xa1yPNf\xf5H\xd0\\t\tF\xd5\xa5\x92=\xa8\xc8\xc0\x84\xa9\xd2\x01\x8b\xc7\x18t\xaa\xd6\xf1\xab\xa0~\xea\x1f\xe4i0$GCHb[\xefc\x1c\xd3\x0cy\x98w\xae\xfc\xbap\xc6\xd0\x8c|9\xf6D\x80\xd4L\xd2\xa7z\xfb$\xac?\xdc\xb6~\xfb\xdc\x89\xa7\xf6n\xbdiJ\xa3\x98\x9a`\xd1\xc2I\xe0f\xf5Y\xd4C\x9fo\x18\x9b\xd3O_\x19\xe2\xf8Z\x18\xdb&\x16oS\x8f\x83IR%\x95dT\xf0\x90\xca[\x18WE0{3\x95\x82\x8cx\x96\x1b\xe4\x15\xda\xafr\x89\xc9*\x9e\xc0&\xee\xa1\xfe\xca\xd5\x12\x9fP+\xacc\x84\xd40:p\'W\xc1\x17\tcs4\xbd\x92,\x01\x0c\xd6\xda\xc1\x8490\xd1\xb9\xdb{!\x05\x90Q\xf4\x9bz\xcb6\xfe~\xda\xd5\xcc\x0c\x18\x84\xac\xf7\x0eh<J\x16H\xb0\xe9z\x0c\x00Dm.\x8f\xc1>\x8b\xeci\x8f\xed\x83{\x1e\x11#\x0b\x9f\xb7Z\x95L_\xf7]\xccu\xe0\xcdSP\xd2\x10G\x07\x80\xe3a\xcb\x19\x12l\x17\xbb\xce\xa7\xfc\xff\xaa\xff\x8dc\xf8\x16\x19\xfa\xec\x86\xcb|\xcfLr\rg] \x907?\xc9\xc8\xcdeX\xf3\xa0\xc6\x08\x94Fi|\x1a\x9f\xf2\x95\xca.\xd6\xd8\x19=\x87\x17\xe9\x9a\xf9-\x80\xe9\x06x:\xec\x97\xdfU=\x9d\xa7\x8cYo\xd7\xc9\xcbi\x02\n5\xb2\xd3\t\x90\xa2\xa7 \xb4\xab\x91\xa6U]\x9aE\x94\x16\xfcS\x04\x17d\x17hr\xf4#F\x14\xba-\xf5\xf0\x0c\xdb\x14)\xec\xedd\xd4a\x05')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask,flash,request
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+ from urllib.parse import urlparse
8
+ from .config_enum import ConfigEnum,ConfigCategory
9
+ from .config import hconfig
10
+
11
+ from sqlalchemy.orm import backref
12
+
13
+ from flask import Markup
14
+ from dateutil import relativedelta
15
+ from hiddifypanel.panel.database import db
16
+ import enum
17
+ import datetime
18
+ import uuid as uuid_mod
19
+ from enum import auto
20
+ from strenum import StrEnum
21
+
22
+ class DomainType(StrEnum):
23
+ direct = auto()
24
+ cdn = auto()
25
+ auto_cdn_ip = auto()
26
+ relay = auto()
27
+ fake = auto()
28
+
29
+ # fake_cdn = "fake_cdn"
30
+ # telegram_faketls = "telegram_faketls"
31
+ # ss_faketls = "ss_faketls"
32
+
33
+
34
+ ShowDomain = db.Table('show_domain',
35
+ db.Column('domain_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True),
36
+ db.Column('related_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True)
37
+ )
38
+
39
+ class Domain(db.Model, SerializerMixin):
40
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
41
+ child_id= db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
42
+ domain = db.Column(db.String(200), nullable=False, unique=True)
43
+ alias = db.Column(db.String(200))
44
+ mode = db.Column(db.Enum(DomainType), nullable=False)
45
+ cdn_ip = db.Column(db.Text(2000), nullable=True)
46
+ # show_all=db.Column(db.Boolean, nullable=True)
47
+ show_domains = db.relationship('Domain', secondary=ShowDomain,
48
+ primaryjoin=id==ShowDomain.c.domain_id,
49
+ secondaryjoin=id==ShowDomain.c.related_id,
50
+ # backref=backref('show_domains', lazy='dynamic')
51
+ )
52
+ def __repr__(self):
53
+ return f'{self.domain}'
54
+
55
+
56
+ def hdomains(mode):
57
+ domains = Domain.query.filter(Domain.mode == mode).all()
58
+ if domains:
59
+ return [d.domain for d in domains]
60
+ return []
61
+
62
+
63
+ def hdomain(mode):
64
+ domains = hdomains(mode)
65
+ if domains:
66
+ return domains[0]
67
+ return None
68
+
69
+
70
+ def get_hdomains():
71
+ return {mode: hdomains(mode) for mode in DomainType}
72
+
73
+
74
+
75
+ def get_domain(domain):
76
+ return Domain.query.filter(Domain.domain==domain).first()
77
+
78
+ def get_panel_domains():
79
+ if hconfig(ConfigEnum.is_parent):
80
+ from hiddifypanel.commercial.parent_domain import ParentDomain
81
+ return ParentDomain.query.all()
82
+ return Domain.query.filter(Domain.mode!=DomainType.fake).all()
83
+
84
+ def get_proxy_domains(domain):
85
+ if hconfig(ConfigEnum.is_parent):
86
+ from hiddifypanel.commercial.parent_domain import ParentDomain
87
+ db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
88
+ else:
89
+ db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
90
+ return get_proxy_domains_db(db_domain)
91
+
92
+ def get_proxy_domains_db(db_domain):
93
+ if not db_domain:
94
+ domain=urlparse(request.base_url).hostname
95
+ db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
96
+ print("no domain")
97
+ flash(_("This domain does not exist in the panel!" + domain))
98
+
99
+ return db_domain.show_domains or Domain.query.all()
100
+
101
+
102
+
103
+
104
+ def get_current_proxy_domains(force_domain=None):
105
+ domain=force_domain or urlparse(request.base_url).hostname
106
+ return get_proxy_domains(domain)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
107
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,57 @@
1
- # 2023-04-08T16:23:19.964621
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xd0\x0c\x00\x00\x12\t\x04\x00\x1cr\xcb\xe4E\xbc\x036L\x05\x0f\xf8q\x15\xc7\x94\x00\x00\x00\x00\x00\x00\x00\x00\x85\xdf$!P*\x16|\xe9\x92m7\x05fX\xf9Tt\xc1e,\xb8\xc7\xf2\xa8I6\x823\x1e\xc4\x8d\x82\xc1\xce\x07V\x1eN\xd3C\x06\x8c\x01>\x8e{+\xf8\xb5hb\x9b-E\xd5\x0e\x1cTr\xfe\xe4\xef\xbf\x02\xe13\xa1xt\x94\xf6m\xb0l\xa8\x89\xf1\xf9\xfeF\xdb-\xd4\xdd\xfc\xe2,n\xb9WETp\x94\x95\xc5\x05\xa5b\xd86U\xd89\x9e\xe4\x87\xea\xd2N\x96\t\x01O_g\t\xeb\xb4U&\x06\xbe\xb8\xd4`\x1d\xc9k\x92\xae$\xf2\xb1\x01-N\xf2\x98\xa7\xd7\x8d\xde\xc8\x84\x94\xe5`\xbb-\x1b\x16\x01\xd6V?\xcc\x1eXY\xf8\xdb`\xd3\x0b\x0c\x88\xf7\x02\xcbkG\x80j\x01\x9c\x90\xddA+)?G\xd7\x0b\x9d\x12\x91n\xbb\x8cl\xc4>1eM\x13\xd5\xbb\x95\x14]\xc8\xaf\x93\xca9\x90\xe9&\xc6\xe9I\xe4\x9c<Vw\xe2\xf3OO9\xa8\xdc\x1c\x16\xf7\xa0\xbdC+C\xc7$\xb3\xb4\xbe\x90\x01"\x1eK\x14\xadOh.*\xde\xec\xde\xad\xb9\x1d\xdd\x88H\xfb\x96`\xe6I \x07j\xbbfm\xdaE_\xc6\x9ac`^\xb7k\xf5\'~\xbfY\x07*\xedY"x\x17\xe5\xfa\xca\xc8O\x02H\x92\x95\xee\xb6\x9fxW\xa5\xf8\xc9\x11\x99\x16)\x9c\xa4\xd0\xef\x85U\x88,\xe0S%\xbf\n4\xc2\\\xdb?\xa8cX\xc1\xb4\x8a\xce\xbc\x82%j\xd2\x1e\xb4\xe6\x81\xc5?,\xe9\xba~\'\xf6\xe7\x9f\x0c\xd8{aO\xe8OA3\xb2X*\x95\xde\xb1\xb1\xad\x00@:\x1bU6]\x8eOVi\x82\xd4\xf6\xfe\xa7%R\xf9\x08I\x05\x8f\xd2\x9c\x80\xf56\xce\xeeP\xac\xe1\xa3\xc1#GB\x03e\xa4\x89R\x1f27\xf9\rl\x10\xe2\xe8z^G\x89\xd5\xd17Q\xb8Ks\xdc3\x1b\xc2\\\xa4-\xb1\x06\x92,\xf5U\xeb\x04\xcb\x01\xb0\xc6s\xca\xf4\x89\xf6UUF\xc0\xfc \xaf\x8b\x1e*\x14\xeb\x80\x0f\x8cTQ\x11\x07\x001\xca\xc8\x8f\x9b\xb5\x0f\xc4`\xd5/X[\xae\x99\xd6\xff\x96\x9d3\n\xc3\xc5N\xc24>7\x17\x84\xa9\xb6\x05\xf0<\xe4\x0fv\x98n>\x7f\x02\xc6\r\x8d!d\xc6\xe6-k\xd4\xb2\xe3\xf8\x0b\xe0\xb2\xa6\x1d7\xf4\x16\xe4\x98.\x06\xd7\x03S\xd1\xa9\xab\xbf7T\xd1\xf0n\xd5\x16\r~\x82%\xe8/\xcd\x97\xe5\xf8\x9f\x92D\x90\xb6\x8c\xe2a\x80\x18<<\xfb\xf5\xfa1\xa2\xe4\xc0u\x0c\xe3\xc3\x17\x9c\xbe%\xe0q\xc5\xad\xc1\xe5\xa85A\x03\x1d\xa7W\x83w/\x9d\xabx\xd3\r\xe0\xf3p\xb1\x11\xf5\x19gw\xcf\xee\x14{\x83f\xc5\xf5\x8f\xc8\xa8C\xe4y\xa7\xbd\xe6\x84\x0f\x89g3\x82\xceZ$\xf4\xbd\x06j\xbd6\xf2*\xda\xd4n{\xae\xdc\xcc\xdf0\xbf\x1c\x8c\xa0G\xb3r\xef\x98\x83#\xaaG\xd6\x05\x8eQ\xae\x88\xcc\x14r~\x95Z\x08G\xd7\x99\x03\xab9 v\xabI\xbb\x82\xbf\x033^\xaa\xbc\x1c<"\xdc}\xeb\xa3f\xb4\xda\xc2\xe8\xe3\x08J\x13\x8b\xba\xde\x9b\xc6\xe8E\xc2\x19\t\xecH]L\xbbP\xd2-\x18\xe0F\xb8\x9c\xd5\xcb\xef\x83\xdatf\x98\x04J\xf32P\x16\xc8\xe4cv\xf5E?\xad\xb2\xb3\xa6<n\'t\xee8\x98\xa7\x93\ne)\xb8\x85\xa7\xb8O\x99V\x93\x90n=c\xa2\xb7d\xbd\x95\x1b\xbfr\x03\x98\xc8\xa0\xd7E\x86Es\xf0x\nJ3\xf8\xdd\xdc-5~\x00\xf8\x07\xba\x8d\x0c\xe1p\x8d=\x14\xff.\x0b`\x1d\x14\xf0w\x0b\x98\x9c\x06\xf8\xdd\xe5S\xea\xf8\xedy\xac\x8d\x14r\xc8s\x1a\x11\xb4_\xe1\xf5\xd3\x12\x12\x84DD\x98\xd2\xf8\xf8\'\x07\x07\xf8\xae\xa2\x83\xbdAkK&\x8d\x96\xf7\xcc\x12`\xcc/\n7\xb2\xe5\xfe\xee}X\x1a\xef\x1b\x89b\x08\xd04\xd5\xb6sE\xd0\xd3\x91\x13%e\xde<%\xa1\xcd\xa77j\xbe\x851z\xbd\x89B\r}\x85\x89[\xbb)\xb6\xe8~\x9a\xaaQ\x0f\x08=\x91\xd4x24\t\x95\xcd\x01\x1e:-j_\xe8Z\xa7\x9d\xe5\xb5t\xa5m\'\xc2K\xc71\x80\x89\x7fm\xf6\n6\xe9\x18|7t\x87<o\xfa\r\x8e.\xb8\xa1R\xab\xb2\xe3 \x97\x9e\xfc\x01\xe20Q\xe3\xbb\\\xfa\'P\x01\x8d\xc7\xa1\xc6\xb1\xbb\xde\xa0\xd8\x17Y*\x04\xcf\x15\xdbNc8\xb7\x89\xb3E\x9f=\xe4\xd8\x1d\xa20\x17\xf6\xa6\x13\xd0S\xe5\x0b\x11\x8b\x03\x16\xabyW\x12w\xdd\xeb\x04\xde\xa7b\x1d&\xf1\xdcr4\xf3p+\xc4\xfd\xacIb\x07\x7fZ\xb4s\xa6\x13\xefe\x82\xbb\xba\xbb\x03L\xf8z\xae\xa28%l\x9f(7\xd8\xe9\x10\xb5@xJ\x03\x85\xfcJ0Y2\xc0\xb1\xf4So\xc5\xb3\x03\xeb^\xe8\x9f\'[\x9f\xb4\x7f0GzzW:\xbd)\xb38\x99\xd4A\x807\x8b\xf6\xa3\x8d\xea\x12\rr\xf3\xa0\x01\xfa\xc6\xa9.#\xe7\xd3\x10,<:^\xa0\rL\xa5\x10\xe5\xe4\x83\xac\x0b\x13z\xb4\xaf\xff\xfe*\x12f\x07\x83\xce\xba\xb0\xd5\xd2\xbb\xaf\xe6e\xb1\xd5\x9c\xb9\xdd\xea<\x03\x02\x99\xe5\xe2\xf9\xcf\x84\xacvK4\x1e\xc3\xa2\xec\x7f\xf4\xe4\x87,\x9c\xe6d\xa6#_\x9a\xc4<;\xcc\x89\\\x802j@\x97(\xf3>\xe7\x06\x88\x94\x18\x96\x89XW\xe4\x07\xf1\xc3\x94t\x16\xe5ga\xd8\xab%\x11\x8fw~\x94\xff\x93\x9f\xb8\x1bB\x0e)A\x88\x1e8\xca\xfe{\x9f\xd7\xd7\xcb\x03\x12\x99\x0f\x8e\xc2\xf8h\xe4\xb2\xbc=\xb2#\x1c\xaa\xfc~\xd1Z\x1e\x1c}8y\x10Ri|\x85\xb6\xb9\x1d\x9e\x91\xd2\x87{\x03G\xa0\x87\x0f\xbb\x9d\x02\x98\xe5\xc7c\xde\x19\x7f\xbd\x1d\xbbU\xcf\xcc\x07^\x1a\xab\xc5\x0b\x14s<\xf1\xb6\xc7+E\x8fD\x81\x1a\xc8h\x8a`ST\xfcT\xfd\x11\xbbl\xee\x9ag\xbe\xa9\x95y\x13\x8f"\x92(\x88v\xc4\xe1\x89$6\xe0\xd4\xf3\xfe\xf5\x89\x8b\x92\xc5\x1f0\xb8B\xa6>\xe5\xee\xf8J\xc3\'\xa0\xde\xeb\x97*Z\xc1\xd5\xa0\xec\xee\x11\\\xb1\x7fZ\x82W\xe8T\x86t\xd9\xa9w\t\xd2,[\x1atN\xf0d\xe1\xd6\xac`\xbb<6\x8f\xbbH%\x82\xba\xc5w\xac\xc8>\x96\x8d\x8e(\xbc\xc4\xa5\xbb1\xabvUG\xb2\xbc\x83x\xe3\xc8rg:\x84\x9e\\\x19p\xc6c\xc8u\xa1\x11-\xdb\xa1\xeb\xc6\x142\xddR\x04\r\xc5\x99\xccf\\&U;\xb0\xef=~x\x19=H\xdcIpe\xca%\x85v\xf7\xce\xd2E\xaf\x95\x9e\x1dm\x84/\xe9Z\x7f\x80\xc7D\xf5\x1e5~A\xbd\xbc\x01\x16]\xe3-\xa7t\xf8\xae\x0e\x87\x07y>\x10\xe0\xcf\x84\xfeFV\xa9r\xdd\xc5l\xcf\x00:\xb4\xec\xab\xcc\x80\xd6\\\x87\xcc\x16\x9b*\xb0\\\xbee\xf2\xa2$a\xa2\x0c\xe2\xa4\x8fhG\xf2-\xef\nU\xe1M\xe5\xa7\xafG\x89?\xeb\x80lq\xdf\xf5\n\xd17O)-M\xb8\xdf\xff\x8dW\xd4\x9f\xd4Yed\xd9\xf1\x01OR\xe2\x8d\xb6C\x14\xb6\xa8\xfc$\xd2"\x19\xd7\x126\x90\x1c\x81\xe8k\x16\xd6\xfa\xa7\xca\x06l$\xdf2H)\x9fr\xa9\xe1\xb1\xe1\xdc&%MI\xbd=\x96#\xba\x1a\xd8\xc7=\xf3%\xc9 \xe2\xcb\xa1\x1d\x19\xe3\x9b\x04\xa6\xf7\x9e\xa4\xca<t\xfc\xfeq\'\xfcLo_\xdd\x9dH\n`\xfeR\xe8\x98\xe5\x06\xe9\xf8&V\x9e\x9bM^\xabVz\xd2\xabk\xf7e\x9f\xcfo\x0fB\x02\xeb\xe0\x01\xcd+\xd0K\xdad\x9cD%\xa0\xbd\xff\xb3\xc7\x1bH\x06\xb8\xc0[\xc2\xca\xde\xbe\xf1\xd4\x7f\xfa\xc5\xb6\xdb\x84I\x14\xa0\xce\x9d\xf8\xd3\x1c5b\xab@\xfas\xa3\xbb\xa8p\x85\x96\xd1\xef\xa9\xb2\xd9\xd4i\x8d\x9a\xe3;\xe6\xc1\xb4\x18\x84\xb2Q\xd6\xb8\xae\xdc\xe9t*y\x97\xb6X\xbc\xed\xc7\x80\x03v\xa0_\x7f\xe8\xb8\xc4\xe6\xf1xM\x99T\xb3\xe7\n\x8e\xe8-!\xd6]\xbdFS\xa8\x9e\xdf\x05 \xf0*\r\x10V\xaf\x99\xfe6JULGCbQ\xc6\xb6\x01\x9b\xdf/@\x1a\xca2\x84\xff\x88\xc1\xea"Q\xf9\xc4\xc5l\xb3\xba\x97\x8b\x17\x14\x88\x9ap\x1d)e\xed!\xbc\xb9q \x86\xcf\xd8\x17\x0e-\xec\x19+\x81\xc1\x95\xe8#0l\x1c\xdb\xda\xbd\xe4>\x02\x08\xad\x8af\x17V\xa0\x8b\xa0W5\xfb\xe7"-\x90\x11\xa6P\x05\x8d\x17U\x01\xf4?)\xdeB\xa7\x14=\x81%\\\x02\xa1\xa0\xb8\x00=\xfe\x8d\xbaE\x92\x98\x15\xeb\x05\x8d\xc0\xdf\xba\x1f\x10\xe0c\xb8\xf1\xc3\x98\x8e0Z9\xc7F\xe3\xdf\x83\xab`\xaa\x7f\xd5\x9a\xbf^\x8cz\xa5\xf1\x93D\xc9\x1b;"\xb0\x9a\xe7\xc9\xec\x9f\x11\x16\nIe8N\x85GIP\xee3#\x02.@/9;K\x1c\xec\x8d\xc2\x1a"\xb7\xb8\xe8=cb`\xf4\x12\x06l\x08\x07Y\xc0*(~2\xaa\xf7\xe7\x17\x08\x01\xe5\xaa\x9d\xb0\x17\xd2\xb3&\x07\x17\xfew\xef|?\xc2\xc3\x81\xd8E5\x15\x9f\x10r%^\x89LT\x89\xeb\xb6:w\xf7FD\xfc\x9f\xb3/&\x94\x8e+\x1c.\x0cWh*S\x0f-\xb9v\x05\xa8=\x10\xf70\xd7\x06\x08\xb2\x0f\x936Ly\x19\xb7kM\xe9wJ\xfcd\x82\x1e\x89\xcf]\xdb(+\x939\xf4\xd2)\xabHS%j\xa7@Y\x9e\x1a<\xf7\xb5\xcd\x0e#\xcd\xdc\xca\x8e\x90\x83w\xb4h\x07\xe0\x02},P\x96\x05(\xd7\xe6e\x1f\xa6\x07;S\xd1\xb4[\'p\xa6j\xa4)g\xa2\x82UH_\x84\x8ev\x88p\x10\x858\xf2\x8f~n\xc4V\xd0v1\xfb4\xca\x1f\x97\x00\xc4\xcdK\xf3\xe7\xae\x0c\xdc\x02\xad\x95\x14\xadw\xce\x10\x05?\xcf\x96{U\xd6\xc7\xf7\x00\xf4\x86\x8d\xe3\x9a\xeft\x95\xdf\xdby\x9cg\xd3Z\xf9\xb8\xcb\xd3T\x15\x1a\xa2\x8b\xd9\x93\x0e\xc0\x1b\xe8\x9e\xb3\xd7\xdd\xbdc\x15\x8b\xb1\x9a%\x9bM\x9eq\xfc+\xf8\xcd5\x90Qo+\x895d\xf69\xbd&SZj\xd5 \x0e\x91\x10\xcb\xaf\xad)o\xfa\xe21\x9a\xa7J3\xd6-\xc1\xb1*\x94h\xff\x01{\x90X\x00\x95r\xd8L\xf0i\xfd\xbd4N\xddd6O\xb9\x8a`\x93Q\x98\x05Y\xba\xbb\t\xaf\x0e\xab\xaa\x15M\xfe\x8a\xb5`!bp\xe0\x0e\x92\x056]\x1c\xd6\xb9\xf8\x85\xa2\xe04#\xbf\x07\x19\xa4\x06\xa6\x0bA6le\x90[\x18\xb7\xf3\xefOi\xda;z\x7f\\\x1fd\xa1\x8dw\xd6\x14m\xa5\x1fla\x8e\x86E\xfc\xe0Ex\x9c9X\xcc c\x8a\x918\xc2\xba\xa2WE\x98-$C\xa391\xfa\xde\x00T\x10\x94~T$$[\xfax\xb3\xef*\xf2M\xe35H\x8fYIS\xa4\xf2f\xbd6\xe2\xca\xa9\rj`]\x14\xffi\xf2\x1c\xfb#\x90\xd0\x93\x94%\xc9\xcc\x0c\xd4\xc8\x1f\x0b\x86\xb9\xa8\xd4\x97\xe5\xab\xec,\x9b\xbd\xa2O\xd7\xd5\xce\x01\xfey\x8a\xa3\x90\xc3\x94\x03n\xac3\x91r\xa3\x14{\xb4\x9f\x8d*`_\xbf,\xb9\x05\xab\xf2L\x99^L\xdf\x8a9\xae\x07\xa4\xbc\xf4+\x9e2}\x18\x1e\x1f\xcf\x87\xb8DV\xee\xd6\xfb\x8c\xb4\xce6\xb1I\xc06\x04+\xde\xdc\xb0H\xc6ika\xc4d\xe4\xa3\x80\x1b\r\xc5a\x1e~&\xa9e\xe6^\xd8g\xbcgD\xcf\xe2\xd7h\xbf\'G\xe7"\xe2\x12\x1d7 \x1b:R\x9e\xa5C\x93\xef$C\xf7\xda\x94\x9f\xea\xe7%\'g\x1c\xa2{\xa5\xb6\x7f\xaa\x84\x8a1DYB\x99\x04\xf7\xca\xc5;V\xb4\xa4\xd4\xf9\xfe\x9f"\xa6h\x9c\x08}\x1fwv6^\xad\xca,\xbc\'J\x07B\x7f=\x85\xfab\x1fW\xd7\xe0\x86\x02\xbdl\x13\xe9S\xcf\xce\xd5\xd4\xdf\xc8\xd8J\xa4\x89Tz\xd1\x84.MH\x0fW\x05\x9dd\x8b\xd8\x06!I\x8f\xb2V\x0cY\xcd\xfd\xf8\xfd*\xb3\xb6\xd4\xa2L\xda\xd5b\xa0a\x0e\xf77\x8f29D\x96\xe3\x9c& \xa7\x02\xf9c\x9c\xbd@\xac\x99\x82\x15\xed\xf4\xebs\xfd\xad\xd7B\x9bph\xc7\xcc\xa4G\xa2\xb4tPQ\x8c\xf2\xb0x\tKp~\xeaq\x84S\xe9kSW\x85\xe9/\xe0u\xee\x99\xd0\xe6Go$\xdd\x82\xe67\xc9<\xcd\x0c\xe4B\xf6+\xcb)\xe7\xf0\x96\x07\xcf<\xec\xcf\xb3\\\xec\xd4\xeb\x91\x11|\x98t@\xbd\xe8\x92\xc8\xc1\xd5\x12\xcb\x1blq\x8f\xc0\xab,\xe492\xfe\xff\x10\xa8\x16\xdb:\xa4\xfb\x98+\xe2\x87\xd4\x92m+\x0e/\xa0m\x1cc\xear\x187\x99\xc7/\xc9`\xcc/\xdf<P\xe2t\xc27\x08\xa7A\x98G\x11\xb2\x1e\x03\x8a\x0b\xc8\x8f\x8aeC\xb7\xc7\x8b*\x8d\tj\x15\xbc \xe4pR\x079GSy\xd0\xc7\xdb\x11\x03\x88\xd2\xa7\x1eQO\x04p\x96$?Lo\xfd\x86\xfc\xfd\xf7\x0f\xc0o\xd8G\x043We\xb0\x11\xd3\x02\xb0\x1e\xfa\xffO\x17/6N\xa8\xd1\x0f\x0f\xf4\xc7\xb16\xebh\x9fO\xb3o\x03u\x16@\x9d\xb9\x86\xe8\x01\x9a8\xcc\xd8\x13\xb1V8(s\xc5\xfc\xb7\xe0\xb5m\xc7\xb4\xb0\x0b\xc0\xefM\xaf?\xa6\x1e\xda^\x99\x1e\x9a\x03b8\xb5\x14]\xe4\xb8\x82\xd8}\xcf\xa0\x81B\xb4\x11"\xcb\xe2\xf6\xed\xb1N\xc3\xcao^\x91_\x87Fe\xbf\x1dRkB\xa6\x16Wt\x01E\xbc1d\x1b\xa9\xdd\x82\xe5\xe7&\xb0Q?\xceBO\xb2]\x00\x85\xfa\x9b\xc8\x1f\xba\x8b\xb7C\x86\x9c\xad1J\xe5\xaa\x90A7\xf3\x88\xe4\x99\xa6\x13[\xda\xd7fu{\xf5\xb0n\xdb\xf8<\x1e`Zs\x97\x055\x81:4\xfb\x8c\x99)\xa4\xd9wAC')
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+
8
+ from sqlalchemy.orm import backref
9
+
10
+ from flask import Markup
11
+ from dateutil import relativedelta
12
+ from hiddifypanel.panel.database import db
13
+ import enum
14
+ import datetime
15
+ import uuid as uuid_mod
16
+ from enum import auto
17
+ from strenum import StrEnum
18
+
19
+
20
+ class ProxyTransport(StrEnum):
21
+ grpc=auto()
22
+ XTLS=auto()
23
+ faketls=auto()
24
+ shadowtls=auto()
25
+ # h1=auto()
26
+ WS=auto()
27
+ tcp=auto()
28
+
29
+ class ProxyCDN(StrEnum):
30
+ CDN=auto()
31
+ direct=auto()
32
+ Fake=auto()
33
+ class ProxyProto(StrEnum):
34
+ vless=auto()
35
+ trojan=auto()
36
+ vmess=auto()
37
+ ss=auto()
38
+ v2ray=auto()
39
+ ssr=auto()
40
+ class ProxyL3(StrEnum):
41
+ tls=auto()
42
+ tls_h2=auto()
43
+ tls_h2_h1=auto()
44
+ http=auto()
45
+ kcp=auto()
46
+
47
+ class Proxy(db.Model, SerializerMixin):
48
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
49
+ child_id = db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
50
+ name = db.Column(db.String(200), nullable=False, unique=True)
51
+ enable = db.Column(db.Boolean, nullable=False)
52
+ proto = db.Column(db.Enum(ProxyProto), nullable=False)
53
+ l3 = db.Column(db.Enum(ProxyL3), nullable=False)
54
+ transport = db.Column(db.Enum(ProxyTransport), nullable=False)
55
+ cdn = db.Column(db.Enum(ProxyCDN), nullable=False)
4
56
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
57
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,60 @@
1
- # 2023-04-08T16:23:19.988087
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x9f\t\x00\x00\x12\t\x04\x006GuX\xdd\xeb\xb6\xd15<\x1a\x91\xc5b\x19\xad\x00\x00\x00\x00\x00\x00\x00\x00\x1c\xa3\xdf\x0b\x8f=\xe3\xf0\xa5)a\x17\x06\x90\xbf\x08i$Rl\'\xf7\xce\xcd\xdb\x05g\xf0\xb0C{H\xcf\xf5\xbd\xae\xbeJ\xba\x07l\xcf\xf41h\xbc\x9e\r\xf4\x81\xb1\xf8f\xbdzC\xf1\x90\xb6}1V\xc9\xba\xae\x0e0O\xee@w|\xf7\x8cRiF\xd0\xf6\xd6\xe7\xf9\x96\xb1\xa1\x14S\xa2\'\x1e#\x94H\xa2l\x87\xef\xbb\xae\xc4\xf5\xa66\xc3\x89]^6v\x0c\xc0\x97\\\xfd\xd90\x94\xabBd\x854\x08|e\xdc\x868\x15\x19E\xb8v\xa88F{\xeeK\x813\t\xc5\x87v\x8dq\xd8\xb6{\xdb\x94\xac\xe6!$|\xb7E\xa3\x16\xc6\xeb\xb0\xfe\xd5\xb2t\xcb\x01\xccj~b\xf2\xee\x08\x9f\xbeGl\x97X\x98\xfd\x8aD\xd1\x14\xb0\x91\x82\xc1\x92\xa8\x02<_I\x11\nQQ3\xf4b\xd7E\x19\x1dQ\x8ag\xe9\rat\xdcS(J\xf6\xd2\x02r\xdb\xe3\xdd\t\x9f\x8fc\x07fn\xef|E\xf0T\x1b\xa8:PH\x02\xc3d\xd9\xf6e\xbb\x9f\x08\x90^\r\xeeB~$E\xc7U\xf2\xa8\xd6\xf0\x86\xca\xe1\x915\xda\x04\x02\xbb\xc9\xe8"4\xc0\xd1\xdb8\xa3xP\xc2b\xc1\xe5^\xecz\x04\xfa\x0e\xbda\xf2\xf3\xda\x1f\x96G\xa7rE\xce\xdbR\x7f9\xb0\\\xc7*\x7f\x86\x1bhq\n^+\xe4o>Xz\xad\xff\x08\xd9s\x0f\xee\xf4\xca\xf4\x16L\x97?E\x9b\x1d\x98\xec\xa9\xda\xa3\x18\x8c \xff\xad\xa0\xfb\xbfi\xa1r\x85\x1aXW\xc1\xb9\xean\xe2\xd4\xbd\xf1\xbd6/D\x14\x84Y\x82\xd2\xe8\x9f\x8c:\r\xed\x98#\xc2\xa9\x9d6\x81\xd7\x8f\x15S\xb1^W\xfc\xf2\xb3o`\x076A\xaex\xc3\x00\xc4\t.\x11Y\x82Dz\xbcc\xf2\x02N\x02\xcd~\xbb\xfao;\'\xfe\xad\xd3T\xa4\xbaV?\x93\xa1$?1\xc3\xb5\xed\xe2-\xe2{\xe5my\xfa\x00\xa0\x12h\x06S\xb4\x1a\xd1\xb8E\xbb\xfeB\xb7\xe8F\x87\xdd\xf2\xc8=\x8aR\xb7:\xec\x81\xeaf\x17\x9c\xfa\xa3b\xb8\t\xc3\xffR\x93\xf8\x0e(\xe4\xb4\xa2\xab<\xfc#j<\x91R\x16\x9a \x0f\xd2\x97S\xfb\xdd\xe2kYA\x16\xa5\xfc>\xdc\x11\xee\xf7\xb9\x13\xa9\xb3\xce\xd0\xa2m\xa8\x81=9K\xec+F\xc0[\xf3\xd2\x19)E\x07,i\xa4*\x94]\x17\x13\xd0\xa9\xef\xfd%T\xf0\xac\xf3I\xefM\xd7\xfaY\x80\\\xf3\xed9\xdf\xa7\xfc!\xea\xb8\xe3q\x18w\x06\xcc#Qg\xba\xd7\x0e&\x81\xa2\x13\xcba\x7f&r\x97cU\x9a[\xbbR\xf8R\x04\xd0\xdc\xcfx7n\x06{\x16\xc2\xf7jo(\xce\x99pC\xf6\xb4\xf17\xf5\xd6\x1f\xc8\xa5t5tI\t\x01\xa5&F\xfe^\xdb\xaa\xe8\x17\xc8\xaa\xe7\xe6\xe5\x19X6m\xc5\xcf4>X\xa4?\xe5lg\xe6\x95\xd4)X\xdc\x81l8\xc5A\xb9\xed}s e\x8a\xd0\xe9\t1/pA3\x1cs\xc3\x06h8\xad\x90\x04\xe1\x96\x88$\x87\x92\x92>\xe9o`\xf8xMO\xfc\x84T\x19oh F\x981\xb9\xa1\xeaR\x13i-\x8a\xee\xb0LG!,L\xdct%\x0f\xdd.O4\xa5\x15\xe2/\xdcu/\x1cEE/\x86\x1a\tv\xe5\xef\xc0\x1f\x0b"w\x84\xcdS\'\xb0\xa9t\xd9*\xe1\xc3\xf2X\xa9+\xea(\x04\xe2\xa6n\x84\x92\xd2\x01\x94\x02\xae\xe12V\xd3\xae\xd3\xb2\xfc\x03\xe8 \xb1\x98o`\xdcb\xa8\x1c\xff\xb5\xef3\xf6B\xa7U j\x89\x8d\xf0\x16\x94\xba\x81\x03I\xbe\xdb\xe5!\x17?\x99\xaf<\xd7\xbf\xfeU\xe3g\x8a\x91r\xaf\x80\xfd\x05:Y]\x13J\xf7\xf5\x16P\xb2]\x8eX\x1f\xee\xa0>]\x96\x85\xd0\xba.f\x99W>\xfe\xd9\x92\ns\xb2\xd0\xd2\x18\x81\xf1-u\xf6\xc0\xa4\xf0\xdb\xe2\x99(b\xa6\x03`mZ3t\xfeq\x85\xdc\x10+#{\x03\x17\x8a\xafX\t\xf7n1\x18[]\xa1\xe9\x15;\r\xefr%"#0%G\xd0\x8ej\x88/\xbc\xf7]\x03\xa1\x0b\xfa\xa6!\x8e\x81\xde\xc6\xb2\xd5\x7f\xab\xe6\xcd;>\xd5\x97\xa3\x9aO\xa1h\xf9\x8b\x10=/\x7f\x88(x16>?\xd0Tc\x8a5^!\x82\x8a#\xcb\x85\xce0\x9b\xcc\x0b\x10H\xb8\xc6?O\x15\x12\xd9\x92\xd9\xcf\xaf\x9dD\xfa.f/\x1d\xc2lCz\xed\xc2X\xcb\xc1nn\xe0\xb4X\xf1)\x1f\xe9\xf17-Y\x1e\x1d!\xcfw\x87\xb8y\x81\xab\xbc.\x80\x80"\x01\x1f1vC\xf1H\x90<2\xa5Oqt\xce\xc0\xe4\xbb\xab\xf7(/"\x0c\xa24\x16\xe0z\x07\xd9a\xf1(\xa7\xb7\x05\xe5-\xbe\x02\xfa\xa0\x03\xc1\xed\xee0\x1f\xe3\x10A\xca\xd6\x19\x95\x94\xcb\xf6\xd3\r\x1cwJ\xc1)2Jl\x00\x17\xda\x11F\xb9MJ\xcfJ\xd2j\xd3\x0f\x9d\xc2\x9f_\xe7\x8f~,\x1d\x1d\t\'\xab\x838\xb8\x95\x12\x02u\xcf\xb3~L\xa9iJ\n\xe1u\x85\xd7]\xaf\xa3\x8f*h\xe8"\x12\xbd\xcc\\z7(a\xefA!Rh\x93<\x97J\xf2\xa4Z\xc6\x8fk\xddi5]\xec$\x98\xb4\xc9-\xc9\xefI\xf2\xc6\x88X\xc7\xb7X\xbcx\x8c\xbd\ti\x0c[.\x1ed\xce\n\x96\xa4Vq\x89\x97\xa2\xf0\xc9\x93\xc4\x8e\xae\xaby\xf5\xa7\x15\x17\xee\xeb#\xdb\xdc\x06\xd9A0\xc5\x8c\'\x94<\xe7\x1f\xeb=\xd0JA\xe5\x9aK=\x96\xba\xa1\xfc\x86Q\xb1\x955U\xc6Q\xd5C]\x15\x899\n\x8f\xd3/\x13\xa5\x9a\x95\x12\x91\xd3c\xccv>\x83$\xce\x04K\xd0b\xe3BkE\x01B\xcebe;\xee\xc39\x82\xf8\'s\xcf\x00\xc1\xe2\x05^\x94\x9d(6U\x93+J\xd9\xb5\xbe\xf7\xca\xc8\x9dA5\xdf\x94x\xf4\xa5\x17.\x01\xccS\x00\xca,\x879\t\xdf\xb1P\xdcd\xb1\x8f\xe7dUC\xedQ*\xf3\x8f\xdaA\xb7\xad\x9e\tY\xee\xfc\xf8Y\x90Mj\x04\xcdaU\xe6\x96\x92\x00>\xf4.)\x02\xc1\x16\xf7\xa0\x88\xa5\xe7\x0c\xady]Kl\x91\xfe\xc3\xf3i)\xe2rz;b ;t&J\xba;l\xe7\xb2\xebX\x9b\xc2\x17\xe1|\xe3W\x98\xa09h\x9b{\x922G,\xde\xc1\x97\xdcz\xab\x89\x86\xca\x96>\x7f\x8e\xd4\xf1\xf6\x1a!\xa3-\x80\x0f5\x85P\x99{\x98\xfa\xeft\xfc%\x00\x03\xbc\xaa\xc6\xe4\x9e^\xf2\xbf\xec\x04\x93\xcb\xbd\xf4F\xb3KD,\xbd*\x03\xe1\xfa*\x0c\xe9#DG\x08c\xd1 \xa8\xa0\xbd|\xd4\xce\x08\xa2\x0e\x84\x85\x7fE\x1a\x9d\x17\x9b\xb6n\x7f=\xd8\xfb\x07\x89Z\x96\xac\xb7\xc6\xd6\xc9\x97\xd43\x97_^\xfa\x83\xd9\xebD\xf1\x97\x02L+\xbd.\x03\xc1&~\x93?\xf7<\x99\xba\xe3\xe2\xeci\xabM\x0b\x9d\xc9\xd7\xb40?\x05\x1dw\xb2\x04g\xc0\xf8(~\xdd f\xfb\x98N1\xe6\x9b\xaa\x1c\xbbj\xfb\xa2\xb1k&\x07\xe8\x99\x82\xd2\xe1\xfb\x9f/uM\xc9\xf0R\xc1\x00\xa2\xd1\xad\x93U\x19WW\xa1H\x88\xc4\x8a\xfe\r&V\x8aX\xd9\x90\xcc\x9a\xb6\x83l\xcd\x02BR\xbd\x1a\xe4P\xae\xfa\x0b\xddu\xb5R\xc3\x97\x05\xf1D\xd7\xa9\xd1\x8da\x96\x9d[/;sR\xda?\xe3$NB\xbf\x9b\n>\xbb\xa12\xd7!\x95]X\x14s"\xf8J\x98e\xbc"\xa9\xab\xb3n\x95\x1a\xfe3\x8b\xb95\xb5\xe9\x8b\xbfd+y;\xcdv\x96\xdc\x83D\xd14q\x8bw\'Y\x19%\xf7\x1d#\xc7\xd8\xf7\x9e\x9bza9\x94wb,$S\x83\xc6\xb551P\xbc\x8eL\xf5[\x9c\x04L\xe6\x1e\x91\xa5\xc2@04\xda\x8e\xc5\xb5\xf9\x00\x01\x04\xdf\xd9bk\xce\xbd\xe9\xfc\xb9F0Uj\x05\xbdCbw1q\x05\xb0Z\x0fc0f\xcd\xecGP\x07\xcb\x83So\xb5\xfb\xb4(afZ\xfb\xae2\xe3\x04\x1d\xe2\xed\x9eL\xe7\x7flm\xe6\\zo\x0f2\xaa\xb7\xeeu$\xd4*\xee6\xaf\x90R6[\xe8pi!\x8c\xafz\'\xfb\xe0\xad\xb5\xe5\xca\xed<p\x14\x00A"\x92\x94OD\x8br\xc7\x0b\x8ck\t\xfa\xa5\xa3\xf0\xa8L~\xee\x7f;\x9aP\x8do\x84\t\xa6\x15\xb6\x02\xc9>\x17\xe2\x0c\xa3\x9e\x02\x9d[\xac\xadn\x80\x88!\x90\xcc\xc9\xe3\xe4\xfd\x92E\xfeoTX\xda,\xcb\x1d\xb8\xcf\xd6\x9cx\x19\xd8\xc0C\x8b)\x92\x89\xf7\xa6f\xae\xd5\xc2>\x90\n\xed\x01\xc6[\xa9\xf6\xe1gD\x9a\x88\xc9\xc0z\xd2K\t\xaa\xf2dxG\xcd\xcfo\x99\xdd\x96&\x8d\xd2\x08?\xed\xbe\xfe\xa96\xd9\xc4M\xba\xf7\x8d\xe0\xa8\xda\xc9\\`\xda\xf97\x9f\x7f\xa1\x1a\t\x9d\xea\xb0\xf1\xaf\x7f!cK>%\xc1<\x16\x0b\x84\xf0\xc7 \x02o\x04\xb4\x1a\xfb\x85\x19;\x8f\xcd\x0e\xeaQ\x0f\xee \xe5\x9c\x86\x08\x8b\xaek\x02/\xc2\xf0\xfc\xe2kxq{\x9b\xdf\xdbF4\x06\x86[\xd3\x86y\xe6\xba\x8e\x1e\xa1\xaa\xed\xfa\x0f<u\xd9\x16\x0f\xa2|\x96\xda\xb4E\xa1\xef\xe62\xf1A\x7f4\x98\xe4]\xe8,i6\xf8\xf2\x9fo\x91\x80\x1fT\x07\x1epc\t\x80\x03Q\x01\xe7\xc9\xbd\xf1>y\x1dPwR\x12UFT\x98T\x03\xf7\xee\xa9\xba\xfb\x86\x06[\xf1\xcd\xd9\xddi\xe2\xa0\xb8u\xf9\n\xfa\x9e\xc3\r\x81/Z\xa9q!\x02(\xbf\xcc\xa9%\x90.J{t\xc7\x9a$f`{i\x9a\xd2\xbb\x92\x88\x92\xb6\xa8m\x95\xf8\x01\xd2&q.A\xee\xd2`\xce\x9b O\x06\xff!\x0fK\xd2c\xea\xd8\xa9\xd6U\x11\xdd\xf2g\xa0\xfe\xd5\x80T\xe2J&M\x1a\xd4\xda\xd9!\xa7*\x8d\x00\x15}\x01\x1f\xd6\xe0\xa3\xed7\xe0E\x96\xf0\xd1o\xf8\x12\x83~\xa9\x7f!\xf1\x13T\x92l\\\xfe\x19\x19@\xf3\x84e\x85f\x8d\x84\xd9\xb7z\xa0\xde\xb2\x989\x12(z~\x8f23\x1b5r\xbfw\xa1v\xb8\x18\x85$\xa4\xf8\xdcK\xb6\xb0\xc3\x80\xd4\xfc\xff\xf4L\x92\xb3`w\x1e\xedS\xe9\xdb\r\xcb\xa7\x1c\x91P\x8f~\xf3\xc6\xf7\xaa} \xb9C\xd4\x8b\xd4nT\xce\x8e\x99Q`\x8a\xf2\xf7\xa1*\x00\xaeYGCo\x0f\x10!')
1
+ from flask_sqlalchemy import SQLAlchemy
2
+ from sqlalchemy import func, column
3
+
4
+ import datetime
5
+ from flask import Flask
6
+ from datetime import timedelta, date
7
+ from hiddifypanel.panel.database import db
8
+ from sqlalchemy_serializer import SerializerMixin
9
+
10
+ class DailyUsage(db.Model, SerializerMixin):
11
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
12
+ date = db.Column(db.Date, default=datetime.date.today())
13
+ usage = db.Column(db.BigInteger, default=0, nullable=False)
14
+ online = db.Column(db.Integer, default=0, nullable=False)
15
+
16
+ from sqlalchemy import column
17
+
18
+ def get_daily_usage_stats():
19
+ from .user import User
20
+ # Today's usage and online count
21
+ today=date.today()
22
+ today_stats = db.session.query(
23
+ func.coalesce(func.sum(DailyUsage.usage), 0),
24
+ func.coalesce(func.sum(DailyUsage.online), 0)
25
+ ).filter(DailyUsage.date == today).first()
26
+ users_online_today = User.query.filter(User.last_online >= today).count()
27
+
28
+
29
+ # Yesterday's usage and online count
30
+ yesterday = date.today() - timedelta(days=1)
31
+ yesterday_stats = db.session.query(
32
+ func.coalesce(func.sum(DailyUsage.usage), 0),
33
+ func.coalesce(func.sum(DailyUsage.online), 0)
34
+ ).filter(DailyUsage.date == yesterday).first()
35
+ users_online_yesterday = User.query.filter(User.last_online >= yesterday, User.last_online < today).count()
36
+ # Last 30 days' usage and online count
37
+ last_30_days_start = date.today() - timedelta(days=30)
38
+ last_30_days_stats = db.session.query(
39
+ func.coalesce(func.sum(DailyUsage.usage), 0),
40
+ func.coalesce(func.sum(DailyUsage.online), 0)
41
+ ).filter(DailyUsage.date >= last_30_days_start).first()
42
+ users_online_last_month = User.query.filter(User.last_online >= last_30_days_start).count()
43
+
44
+ # Total usage and online count
45
+ total_stats = db.session.query(
46
+ func.coalesce(func.sum(DailyUsage.usage), 0),
47
+ func.coalesce(func.sum(DailyUsage.online), 0)
48
+ ).first()
49
+ ten_years_ago = today - timedelta(days=365*10)
50
+ users_online_last_10_years = User.query.filter(User.last_online >= ten_years_ago).count()
51
+
52
+ # Return the usage stats as a dictionary
53
+ return {
54
+ "today": {"usage": today_stats[0], "online": users_online_today},
55
+ "yesterday": {"usage": yesterday_stats[0], "online": users_online_yesterday},
56
+ "last_30_days": {"usage": last_30_days_stats[0], "online": users_online_last_month},
57
+ "total": {"usage": total_stats[0], "online": users_online_last_10_years}
58
+ }
4
59
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
60
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product