hiddifypanel 3.0.0.dev63__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 (72) 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/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,235 @@
1
- # 2023-04-08T15:11:13.971002
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\xc1&\x00\x00\x12\t\x04\x00\xd8\xbc`\x8b0\xc4\xc7\x9d\xa5\x99G\xcc\x88\xca\xed\xe7\x00\x00\x00\x00\x00\x00\x00\x00!\x96x\xe7\x8e\xe9\x95\x85$z\x83\x89\xa1\x9dM\xf4\x99\x9b(\x01U\xd6_P\x0c"Q\xed\xe4\x81\xa3O\xb3q\x0c\xcc\x14[\xfd]\xaf\xa9a\xbc)\xdd\xa5\xbe\xfeNo\xb7k\x1e\xd2\xd8\x9e\xc5LD\x1d\xc7O\x10\xd1\t\x0c\xcf\xdb(_\xcc\xbbG00\xe9\xbb\x0cB1\x82p\xfcoi5\x83G\x1ez\x05Do;\xcb\xd4\x86CxW\x9dG.\xb2N+\x82\xe3\x10vg\xad\xb9M\xff@PO`\xe5\x94\xc8Y\x92\x8aM\x94x\x9d\xd4q\xef\xbd\xc4\xbe\x1f\x15\xce\x8c\x9d\x9a\x95Wk\xee;\xac\xdbgi\x99\x11\xeer\x8bE\x968\x03\xdbb\xf2Pg\x9c\xea\xae$\xf2gU\xef\x14\x07l\xec\xb6w}iO\x96cw\x91i\x07\xff&L\xcd#6\x8b\x920\xce\xea]\xc0hd\xb7|\x01\x90`\xfe\xa5\xe3 \xb5\xb5\xcdyx\xf9\xc8\xca\x95\xc6\xd8i\x17\xfc\xec\x8c3\xa4V\xf2\xf4\xd0f\xb8DOw\xd7\xcb\xfb\xbck\xe7y{a\xaaV{|\xf1rYU\xfcO(\xa1\x96p>\xe3\xc0\x05\xfa\x01\xe1\xf9G\xae\x88\xe4\xe2\xc0\xd2\xddi\xfc\xc2\x99\x95oo,W<5\x17\x01\xc8\x82=\x16\xf7\xcdo4\x0c&\xdc\xf0\xb4\x00\t\xf1Ex+\x81\xad$A\xe2-0l\x17R3\xbe\xdfm\x96\xd9l\x92\x87~\xb6\x8d-\xb5\xe3\xfbv\x96\x0e\xc1\xe2\xb2\x915\x7f$Yn*\x8b\xf9\x02\xc5\x9e\x9e\xc2\xceL\x9b\xf5F\xa7d\xec\x93\xaa\x0e\xab\xad\xf5"1\x1c\x15\xf4\x87^\xa4W\x07x\xb8\\Ef\x1acLR\xff\xb9\xfd\x98v\xd1\x9f\xf8\xd9/\x8e\x98\\\x11\xe9>E\xe5\xdf\xea\xa9\x03@\xc2D\xba\xb9u\x18pIf\xc8e\xfc\x949I\x1b\x0c\xb7\xe7@B#\xf5\xda#\xa4O\x0e\xc2\xdeIy\x03p\x08\x11\x13\xc3\xea\x08x)\x1c\x18-t\xab\x84\xd9\xbf\xf7@I\'\x07\xe7\x15r\xb5.\x17\x15T\xad\xc9x\xb9\xf2\x12"1\x91\xa3\x1as\x08\xbd\x00\x83\xe5|\x7f\x08\xf51\r\x9e\xbc\xa5\xe9\xe7\x9a\xc5\xc8\xd3\x9f\x9a\xa8\xe6\x13\x07\x9dPW\x02\xef+\x80\\\x03%\x1a\x18\xad\x85C\xd1]\xdc\xfb\xd5?\x8c\xf3`\x9f\x00\x11\x91#:\xff\xdb_\xe22s~\xc0\xcfK\x01_`\xea\xd0&\xe0Y\xc0\x88\xe6\x12\xd4h\xabo\x88\xdc;\x8c\x10\xb1J9e&=#\x93\x8a\xb3\xbbI9u\xab"\xf3\xdbs9\xf3c\xda\x11\xe1i\xcf\xf7H\xd6\x03\xa2o\xc3\xe5\x83\xc8\x84\xd8\xbb\xa8\x18\xb7|c\xdb\x8eQ\x1ev\xd4\x11\xc8(\xeb\x981\xb4)\x02Y\xe3\xc45E\xf06\xeaLQp\xfd\x91\xe6Z\xdd6\xe4\xa7J\x12?\x03\x18\x1c}g\x18\x8f\xec\xe3\xaa\xd4\x0c4\xbf?\x13\x97\x1ai\xf6%\xffZ\no\'\xe7*cQ\x9b\x17\xde\x96"\x91psl\xaa\xbc\x8c\xa6}\xd6h\xe9\xaf\xa4*b\x0f\xa9t\x87#a]\xb3EA\x07\xc8\xd03\xd3mp/\x02%\xe0\x82\x8d_y\xf3I\xd3\xafB^\xed\x96\x9bT\x94P\x933;U$5 \x9e\xb3\x01\\C\xee\x96\x00\x96M\x99r\xf9\x01F\xa0n\xe6\xe4\xf4\xdd\xab\xc9w4a\xb1\xed\xc3.\x04\x8eA\xcd\x19\x91\\\xe4s\xe8\xb3\x06\xc8Q\x13\xfeZ\x04T\xc9\xe1z\xca\xc7\x97\x12-\xcfW\xfe\x04S\xae\x97\xae\xbe\x91"\xe9\xb5\xa0h?\xb9\x0fl\xa0\xf1?\xf35\x1bh\x05(\xf9$\x897P\x7f\x82^\xd8\xa21U\xdcs\x1c\xd6#\xb0\xf8\xce\xeb\xafu\xc4\xec\xd9\xf4xR\xe2\xbb\xb7+\xf6\xb4\xdc\x12\xdc\x99G\xb6M\xf5\n<\xd7q\xab1\xd6\x0e\xf3\xbc\x15\xa2\xdf\x17\x99\xd4\xc2\xb9\xee\xc9\xbb\xb8\xde\xe2\x895\xde\x05|\x07\xe1\xc5\x1a\n-\x1f\xd2hv\xb2\x17\xb3\xb4\x7f\\\xb9\x00Mz\xe3\x12b\xa2!\xf10\xf4\x12~\xf1\xb3\x01\x14t\x98!uE\xf1\xdfG\xdf\xe7(\xf4v4\x06\xe34\xef:\xe6^\xe0\x13\x01P\xde\xe8\x93\xe3\xd4\x00\xc6\xc4\x03l\xfb\x03m\x12\x94\xa0\xce\x13\xa3\x86\xb3\x15\x9d\x15\xa9\xe3\xd3Tid\xfa7|\xd6\x05\x1a\xb7\x88\xdc\xe6\xd2\xfa\xc1@\x0e\xf9m)*\xf2\x80\xde\xafP\x9eg\xacy\x0ck?\xccSct8S\x815\n\xcb\xf9\t\xcd\xec\xbb!\xe5\x82(\'\x81\xc8\xec\xc5\x86\x98\x0fL7}\xed&\xfe\xac\xb4\xf8\x88\xcec+[\xd3\x9e\x03\xf2\xc7yO\xe2\x1d>@3\xa5\r\xbe,g\xbe\xd0a\xafJdW\x1f~:\xea]\x06\x88\xday\xd0\xfb\xd4\xa7\xa3\xd2\x19\xafx\xdb[@D\t\\\n\xbdx;\xf1\xe1U\xd0\xd1\xe9\xcd\xf0)\xcc]m2\xcf\xcb\x87\xeam\xe9%6\xb0&\x12\\b\xcbg\xd2\xd9\x18=\xf3\x0fI\x96]\xf7\xa5\x0f_p\x17\xd0\xfe\xcd\x88_\x98\x07\x07\x03K\xd4\x1bk3\x98\x81\x13\x18V2c\x14\xfd\xd6\x0b\xa0\xee\x8aRZa\x16&\x966\xe7\x03q\xa2\x80E-\n\xd7\x8f\x82\x96\xe8?)\x007\x8dI\xd9r!9\x8ah\xd1\xe0\xae\xa2\xdc\xfaV\x00\xd2\xd4\xc1A\x1dy\xeb\xb9\xb4\x84\x81\x8b\xe3\xb9\xf0?\x1fm\xfdU\xf7\x1d\x06\xf9A\xd6\xee {,(\xf5\x06\x92\x0f\x95sp\x86\x18i\xda\x02cq.\t\xd5\x19\xb44S\xa9+\xa2\xc38\x89a\x88\xdb\x05\xf1\xe4\xc0[>(0\xda\x7f\xfe:\xfc\x81\xa4\xb3<\x08\x15\xea\x18c\xdd\xbf\xbd\xd8\xc6\xae!\xa7\xe8\xe0\x80\xcfQT.qf[\xca\xc0\xed\x9d\xc7\x1bPd\xb5\x15\xb6\xa8\x04\xd0=dD-\x9f\x90\xe0\xd3\'\xad+\x08o\xda\xb2\xaa\\\x1f\xd2\n\x92\xe2\x12\x9cQ\xa6\xeb\xd1o\x95X\xc7\xc7\x900\x8c\x06\xe4\x89\xed]\xe3Jj\xeb\xc0\xfa\x06/\xf6&\x1f)Z<Ih`P\x02\x0e\x031\xa4\xabh\xfc\xe6\xf0\xabd09n\x8f\xf0w_|\xbf0\xabX\xd2\xc9oy\x85\xc1U\x15U\xc2\x0bV\x8b\x92\x98\xdb\x0c\n\xfd\x17\xa4\xdcV7~^\xd3\xe0\xe8)LL\xc8]\xd0\xba<\x8eK\xab\x0f}4\xb2\xd1=I\x1f\xaa\xac$\xa4\xe7\x11\x02=u\xfbcC\x91jD\x1aT\xfb\xd3\x12S\xc4\x9b\x99\xd7\x97%\xf7C\xd6\x9av\xcemH\xdc\xff9\x03\x8c\xd2j\xe0\xbeI<\xb8\x98l7lr\x80\x85\xbb\xf1\x82\xc9\x1b\xbb\xce\xe3\x9b\xe7\x99y\xfe\x93w\xa3\xf7\x07lX\xb0\x96*\xb1\x9c\xb2\xe2\x18I\xda\xf9\x88\x16\xba\x9e\xab\xe7\x8e\xb6bc\x83\x8d\x98\xd8\xb1\x0e \xeb\xb90\x16\xb4\x1e\x87$\x17\x93\xc7\x84\x8a\xe9\xaa_\x07F\x9f=\xe7\x87\xfd\x9ep\xf4N[\xfd\xc6]p6\x01\x8d\xfe1N\xabp\xc9K\xfb\x97C\x87\xe3\xfcot\x7fz\x81/Bn\x06\xd1?\xe1\xa9\xb0x\xc6\xf7\x00\xc8D\xd0\xdcQk\xa61\xb5O\xae\xe4h\x12\xc6\xccT\x98\xa7`(=\xcc<\xc2\xf31\xccf\xcb\xa1v\x1e[\xe7l;\xcdxyf7R\xd2\x92\x1d\x12\xbfA\xba\xe1\xa7>\xf1\xa0\x1f\xb4\xa9\xb5S\xdb\xa3\x15\xeeO\x9e\x0f\xc7\xa5\x08%:\xe1f\xf8\x14\xa9\xeaz\x1ajZ\xb0yZ\x11\xb9e\xb8\xe6\xfb\x8e\x05\xed\x0b\xb9m\xf9V\xa9\xb87\x1a.{\xb9\xfe0\x82:\x0f\n\x10\x12\xfc{8h\xda4\xfc\x00\x1f\x86t4\xab\x85\x85\xf9EY\xa2\xe1\xaa\xd1\xd5QAA\x0cm\xd5\xbe\x0cBS\x8eba!\x06\xeb\x91F\xa9D\xd2\x0cK\xb2\xaa8_\xeb!m\x01\xe4\xae\xd4\x1f\xeaZa\x02\x0e\x04\x9ce\x10\xb0\xde\x94\x1fI\xd1M\x9a\xf4\x98E\xf2\x1f\x14\x8f\x8b\xc7\xc8\xff\xf54t\'Kd\x06\x96a\xd4pM \'\xbf\x0b\xab\xf50\xf3a\x86}\xb3\x16 \xba2\x04\xad\x83\xaf\xd4\x11\x84.\xc9G\xf4\x19n\xd5q\x88\n\xc1H\xd0\x86\x8d\xa1\x03\x14\x86\xbe\t\x08mb\xc7\xa2\xe7&\xaa\xab0\xd2(Hq\x19\x7f<ts\x83e\x00\xc5\xba\xd7\xfb\xea8j\x17bJ\xe2\xe0\x90?\r\x81D\x92\n_\x1d{~\x18\xa9\xabg\x1e/Ah$\x9e\xec\xe1\x08zV\x9f\x08\x06-\xf1\x06\xdfY\xe7%\x10\xacVC\x0e\x8c:4\x93\xb1&w\x98\xd5\xdc\x9a];\xa3\xa7)P\xca\x9a\xbf%\xa4\xa3\x19\xd5s\xcd\xdf\xa5O\xa2\xb5).(\x0eI\x106\\8\xc2a\x16\x8b\xd5\xb2\xd7~\xa3A\x1aK&\x7f\x03<\x98\x1e\xca\x84\x1e\xc3\x89y\xa6\xdc}\xe2\xb499\xdb\xf5zqB<v\xb2t\xaf?\xda\x01+\xd0\x1a\xfdS\xe9]N\x05F\xbd\x1f\x95gq\x0b]\x7f\xb2lAA\x14 \xb7\x81C\xca\x7f\t\xe2\x89(V\xddl\xb4\x87\xc7\xe6p\x9a\xb6\x8b\xdf\x7f\xd2-4\xe5\x81\xd9\xb1\xdfT\xa0\xbb2>\xd7aZ\xac\xd6\xd3\x14\x101\xa7\xc7\xe4}\xf8\x90\x8e\xbdZ\xf2\xabH\x87\xef9\r\xc9LjWqA.H|\x8d\xf6I\xfc\x044B\x06\tF\xaa\n\x95\xa1\xde \x9d\x08n\x9dx\x9ce\xe2\xf1\x1b\xa1#/\xb7Je\xc9\xb3\x17\xff\x805tER\xa4^\x17\\\xe6@\x15)\xf9\x12>\x06N`\xac0\x12\x99|\xc4\xe8\xc5\xf0p\x04\xa5\xa2$\xd1\xa97\xb3\x88L\x90m\x8d\x13\xa8\xe1\xcf\xc5\xb3OJ\x0b\x9bYJ\xed\xf6~\x9akc\xeff\x9a_\xb1\xd5\x8d%\x88\xfb\x08Iy\x9c\x05\xcd\x0f\xdcf>\xd7,\x80~M-\xf1\x0f\xfe\x9b{ \xc4\x07\x0cT\'g\x03\xa9\xa5\x1b\x99K\x80ls(\xe5\xe9>&&L8i\xa1\xc7^\x8f\x14\x17\xd3\xe4\xbc+R\x04\xcer\xb7\xd8)T\x93\x7fL\x9b\xf7\x10\xf9\x9a\xde\xe3 \xe9\xb7\xa1\xaf\xda\x00\xc0O\xe9\xd7#]a\x89\xa1t*6t\x9b\xf0\xec\xba\xa4\x83\x98O$\xe1U\\0\xd6xJ\xaa\x9e\xe8\xbb;LP\xc0S\xbez\xf34\xad\xec\xccci\xa8+-j\xe4Dtx\xb0K%\x02\xf8\x95\x18\xb3]\xbcqz\x7f\x8ej \xf2i\xa8hsf\x80?\x11\xa8\xf5\xdf\x83j\xa1\xde!\xb3P\xa2\xfe\xadz\xc9nx\xef>\xa7\x1b\x8e\xb5\x05n*\xc5o\x10\xa8\xd7f. \xbdM\xab\x80\x03\x8d:\xd7\xf9\xa1\xa0\x82\x1e,\xaa\x9e\xe7\xe0d\xccU\xe4\xe1%\xc7\xda\xc5\xdd(\xe1\xda\xec\xcc<g\xb8\xa2\x89y\x884\xdd\xc4\xf0x\x9a\xeeh4\xcd9\xac\xea\x96\x7f^\xaf\xf4nXg3\xd5S)\xb4\x9d\xb5\xfb\x07\x92\xdc t\xfc\x8a\xff\x07\x0f\xa6\xad>p@\x84\x92\xb6\xa7\\\x88\x10\xaaE\xfb\x0bH\xc1\x11c]D\nZ8\xec\x14\x96\xc2\x13)@\xe0\xfdo\x8c5\xa1\x1d)\xcc\xc18\xadQ\xa6\xb5\x82{L&XX\x01)\t\xf1\xbe\x1d\x1eqzi\x81\x041\x98\x84\xc6B\x8a\t\xa9\xfd\xb1<\xe5vX\xa7\x03\xe9B\x16\xeb\xb2\xc1\xd4\xc47\xaf*\x06\x88\xde\x98G\xfbmj\xd3\xc5\xf0)\xcfg>\x8d\xfa\xefs\x0c\xe7up\x94\x1e\xd5\xed\tc\xc0\x92I^\x1e\xc0??f*\xa3\xeav\x8a\xb2q\xa4*)\xb2\xdf\xdfjw\xcf\x1d\xb1\xec[\xfd\xc9\x97B\xd6vu\xec\xf4\x88\x99B2u\x8b\x8b<j\xc9\xa2p\x96\xdbd\xca\xa93\x009\xaf\xb2\xed\x84\x0fw\xaf\x8c\xafsL\x11\x88\xfe\xb7C\xe3\t\xeekg*K\x8beG\xf9\x11,p6u;\xfe\x82\x1f\x94{dnimm+\x19\x0fi\x9b\x1b\x84\x10J>\xf9O\x18\x00+z\x0f\xc22\xab;in\x1a\xf7\xa1\xed\xe4\xb9\xcb\xa5\xe0\x8e>`$\x1ec\xbc\xc0\x06\xec\x94\xd7\xf1\x1d\xb5\xb95<\rM\xe0Q\xd4a\xdfT\x86\xf0\xf3]Z\xd2\\\x1c\xc9\xc3F5M\xde\xed.\x9fX\xbe\xdd\xef\xaa\xed\x1bt0\x9c\x0c\x19?\x1b\x0e\x8c\xdf\xae\xfa\xcf\xc8\x16\xe8\xfa\x99Ui:\x8cG\x11d\xe5\x1cl\xf0\x114\xa7TS\xf3\xc7\xb9VH<\xad\xd5B\x0c\xd7+\xfe\xfe\xb8(e\xf4FoS\x90!\xf0\x9a\x08u\x8e\x9bS\xba\xcf\x18\x7f\x03s<\xf8 \x8f\x07,^\x0b\':\t\t\xfaX~\xfb\x98\x96\xc8\x83d \xc5E4\x86\x17\xa8\xff\x13\xde\x80\t+U\xafZz\x8av\xf5\xcb\xba\x03\x93T7I#x\xf0\nJ\xd6\x97G\x1c\xdb\xc0\x94\xad\xc93\xa3\x06O\xe9H\xab\xc8\x8f\xe1\xd6\x8bh\x19\xfd\xb1\x01\x0fa\xa8\x8f\x07Y\x80\x0b\xd1\xb8\xf8\x12yq\xb2K\xce*r[\x1d*\xf3\xd32\xdd\x9f\'\xb2\xaa\xe3\xd3\xb4~;\nrE\xfc\x8fo\\\xd9\xa3\xba\x87b\xacI\x1fv\xa1\xfa\xfe\x95\xdfH\xfb\xe8\x83\x88\xf2\xbe\xdexuc\xcbV\x9e\x919\x97\xda\xd7I\xec\xf8o\x0b\x01\x18\x8e.p\x00\xe7\xfe\xb5a\xb2}\xf2\x83b\x16N9\xc9\xa8H#x\x12\xf1\xaa<\x9f\xb8p\xeb\x1b\x17\x08[\xdc\xc2\xc6\xf8\xb0\xc0\xa1\xb9\x19\xfb\xbf\xdd\xe0\x90Jh\xf4\x88\xe5\x1d7\xd00\xa3).\xb2`2+\xdd>\xc6\x0e\x95\xc7:\x04\x10{\x1cB\x00u\xb3\xcf\xdc!\xe4\x0cq\x10\x1b\xde\x93\xab\x10\x9dZ\x96\x8d\x95\x8aBJ\x9de\x83@\xff\x92o\xe0U4\x9b\xb1\xea\xacc\xfa7\xc7\xe4T\xcb\xce\xc8\xec\x1a\x92i\x1b\x01\xa7M\x9c\xad;\xc7\xecS\xdf\xa0\xb0BV\xb8\x1a\xa2\x84\x1fj\x0eZ\xf9\xb7I\xc6\xfb\xdc\xffb9<jZ%\xfa\xe1l\xf5k~\xe7\x9e\x15\x04\xb2\xf8N%\xf8\x81\x04\x04\x87/5\x9e\xcd\x16\n^HL\x92\x19]\xa1\xefH\xa9n?m\xce\xa9\xe4>\xfe\xc3s\xd3@&\xa8\xcb\x9d\xf1\x00\xc7\x1b\x94\xbd?\x1cM\xdeK.\xd4\x18)\x98/\xc3\xe9\x121\xaf\xb2\xd7x\x10B\\]\xb3\xa1A\xc9[\xa3=C\x04n\x99\rn\xa9Q\x1fh\xd0\xa9\xf08X\xca\x831\x18U\x86[\x97\xcf\x88;XL\xf6\xc5\n\x04\xd5\xb8jM\x9dEB\x15\x14\x0b\xc0\x9e\xa5\x84\xef=\xb2\\iDQ\xa1\x8b\x96K\xa9\xe0^\x8f\xb3v"\x160G\x16]\xd5=\x10\xcc\x14M\r\x01\xba\x99\x94\xe1\x1d\xf7o M\x08\xbf\x99\x0b\x98\xd4\x0eU\xacx\x1f\xa2\xcf^F3\x11\xe4\x899\xd5\xad\x9eN.cv\x9fX\xfab\xe6\xa5\xe5\xd2\xdf\x83\xd2\x08\xe8\xb1\x85q\x81\x02\x9cE\xa6\x85\xdcD\xf7\xc8$\x1dWU\x8b\xc7\xc9\xa2}\xf1\xc2yb\xc6\x16Q\x11,\x81\x9f\x86$y\x1e\x93\x85\xcb\x97+Q\xce\xd2S\xda\xd7\x9d\xb2\xbeF\xb2\xcc\x1f;\xfd\x9d\xe32\xe4@\xb0\t5\xb3\xe3\x01c^\xd66\xca\xe7\x7f\xc3&\xef\xd6\n+\xd2H\xa1\x17\xb8\xe0\x05\x0b`3E\x10G\xb3\x06\xca\x93\xc0\xdc\xc8\xf9\xbe\x986\xf6r1\xb8\xe0\xe9\xbd--e\x84\xe7\xa08|(\xafI\x8d\x1d\xa9\t\xbcN\xf9\x93C\xb3\xd1\xfd\x90\xd7\xf7uNC\xf9\x19;PftoP\x0f@#\xb8\xf6\x8c;\xd9\xb3\xa6m+\xc0\x7f\xc4\xff\x04\xaf\xd8_\xd2\xe4znf[\xb4\x0b\x88\xfc\x9d\xf0!\x10\xe5\xb1\xa8`.\xf3\x05I\x12\xde\xd8\rT\xcf\x94O0S\x0e\x1c\x92h\xfcU\x966\xf4dd\x8d\x7f\xdf\xbf.B\x96zA\xd2E\xd6\x96\xfd\x93\xfa\x9e!\xd4Y\xadZ\x89Ue\xc6\xdbD\xc6\xb7\xf9@\xad\xeb\x9a}\xe1\xbb\xafr\x9b\x1a\x83G\xd7\x1a\x1e\xac\x04!d;q(\x056\xa6\x9c\x8d\x1f\x89\xa1(\xeb\xc3\x95cU\xbf\xe90\xe8\x84\x13z\xcd\xaf8\xc0n\xe3z?\xb0\x81\xbb\x8b\xa5\x8bx\xc60\xafBB\x8c2\xe9}\x18\xe1\xa0\xfb\x18\x01\x7f}c}\xb9\x10N\tQN\xaa\x89Ky\x9a\xc6\x1c8\xd9\xf4B\xa2\xd0Y\x94\xef\x8d\xee\xaa\xe2\xe8\x14\xb8\x05\xd6\x9f\xd9\x97\x01\xecI fk\xcd@lkg\xec\xab~!d17\x85\xe3e:2J\x94\xae\xa5r\xf7\x93O\xe6\xc1\xb1\xd9w\x9f\x11\xb6\x14\xf9\xb2XT\x87\x97{r\xbf\x04\xaf\xdf6\xe8$\xd3Ps\xae{\xdd:\xc9X\x86U\x08\x02n\xea\x19.\xf1\r\xdd\x84\x95Y\x01\x16\xa8\xfe\x88\xeaU\x84\x99\xf3\xe0m$\x84b\xb6\xfft\xf5x\x9e5a\x86\xc0\xff\xa1!8\xa1$\x8a\x99\xeb\xe2\x81\x08T\xe9(\x0b\x1e\xc47\x17NC\xd1D\xdfSt\xc9\x82\x94\xa2\x01\xe7O\x7f\xf8d\xbbfk\xb0k\x92g|c\xb7\xb7\xde/Ng.\xb9\xbeN\x17\x9a\xeaU@\xc0!*\xecq\xf5\xcd\x98\xb1-\xb3\xd09_\x87\xec$\x16\xbeX0\xa2^\xcc3<\x13\x05\x03\xf6\xd7\xb7/\xeb\xff\xce\xbe\x0f\x067j\xa2\xa6p^\xb9\xc3\xb7@\xbe\xc2\xc9s\xf1bu\x84\x89\xd2\xc4\xc9\xd1\x85"\xbe\xe8\x15\xaf\xcf\x17_\x98\xa0\xbe\x0c\x1c\xf2e.\x8d\x8ez\x18\x8a09|\xc3\xaaJI^\xca_h\xea\x88]P\x83O\xdc\x89L\xeeF\xe2\xb5\x18Hf\xcdol\x0f\x06,\xedV|]0<Y\x0c\xea\x9a\x03\x06\x95F\xc5\x1a\xad\xa0n\xe9\x0f\x81\x84\xef%e+V\x16\x97{\x1fl\xbd\xd2]\xd2._\x98\xe0\xc4\xf1\xc9\xac\xb4\x1f\xdf\x97\x17\xd1\x9f\x150\xe8&a\xe5\xe2\x0c\xab\xd7lP\x03h\xb7\xa9\x83\xe0\x1afA\xd86?8T"\xfb\xffj0:\x95fO\x7f\xcd\x9eY\xbf\x05>\x03\xe7t\x02\xb3\xbb\xbf\xc3\xb3\xdd\x0eCg;(\xb9\x8b\xe1\xc6\xd3\xaf2ad\xdf\xdde\x0e\x19X\x8e\x8eB>:\xb0\x81\x12\x9d|\xa5\x8e]\x18\xc8\x86-\xc48\xe3\x89\x82@\x93[\x999\x1d\x7f\x80\xa1\x8aI\xe1\xb0\xc2f\xa2\x90\x86f\xcc\x7f\x99\xcd\xde\xdd8|iC\xba\x1dS\x92\x0b\x8fi\x82/\x92\x15@\\#\x1d\x8a\xc5*\xe2\x08?u\xa1\xac/\xbd@\xfa@\x03\xbb\xc0H^\x80\\\xbe\xe9\xc7\xc4\xca\xa3!\x00\x0f\xbbX\x1a\x8d\xa0\x07\x99\xad\x01;0\xd7\x80\xdf\xb6\xf3\x0e\xde\x0f\xa7\xbfCQ\xe9\x14{\xea\x970Q&\xb1\xcf^\xb2\xe8\xe8\x88\x8eu\xd1\x11\xf4\xa0\xe5\x93\x85\x95\xfb\x08\xc5\xbd;9\xc5l\xfed\xbfr\xd95\xfa\x1b\xda\xfc\x13c>\xe5\xa5b\xcb6\x8f\xf4\xf2\x934j\xf0 \xcc{_\x87\x96$\x10\xb5\xccPy\xbd\xa7\r\xe2}\xa2\xc34d\xb0\xf6h,\xca\x196\xd8M\xc0\xd9\x90\x95\xd9\xdcVb5\xcf&\xf7\xd1\x9a\x89q\xf8qU\x8a\xc3|\xb1\x9d\xd6L\x94\rJj\xa9<\xec$\x1d\xde\x8cXM\xa6Z\x81\\\xd7\x1fq\xf3\xba\\\x91\xb4O\xc4(\x1b\xc2\x11d8<9\x94\x06\xed\x1adF\xc0\xaffPjb\xc2\xf2\x91qXe6b,\xb3ze\x85\x91\xa5@i9\xa2\xb16>\xe4#\x1a\xeagSr\x9c\x1aSvU"\x7f\x05Um\x92/4\x0b\xea\xb8*\xc4\xf1Y\x00h\xe8\x88Qr>\x1a\xe6\x18\x1f-\xd5\xb0\x9c\xf5\xeb\xad\xbc\xc0\xd7\x85\x81\x15\xd7\xf6x\x95\x02\x01\x92\x00U\x91<.V\x8b]3U\xe2\xefk\xe7\xd2\xdb\xed,\r\xf4\x1f\x1d\xa2F/\xad\xac\xec\x8436)\xbc4_t\x969"\x97\x8e\x15\xcf\x97[\xaf\xaf\xf2\xae\xbf7C\x1f\xd5~\xbd\xe4!\xb2\xbd1\xfb\x87\xb1>\x98,:R\x03Fd\x05\xd8s\xfbE\x0b\xfd\xf590\x98\xa2F$\xf2A\xfd\xb1\x03W "\xf6\xf7\xf7t\x1d\xfa\x87;\x91\xb8%\xff\xf3\xcfi\x05\xdd6\x1c\xfal\xc6\n\xb7\xad>\xfb\x17UtyBo8\xd9E\xf8\xf9"\x85\xdbMN\xc4\xacA>t\xcah\xd1\x8f\xfcm5\x9dp\x19{\xc7x\xbb\xcd\xfd9\xc8w\xae\xab\\/\xe3\xb8Cxi\x13\xf1p\x88\xb7\xa9aCp\x8e\xc0\xb4"\t\x94\xa1a\xc2\xdd`\x1b\xd6\\\xec\xfeS\xef\xd2\x81Z(\xa9\xad\x83\xaeMy\xa9\x19\x00\x16Kh\xd7\xc3\xe0{\xdc\xb1\xcb\x9eD\xb5\x1f\xb3\xa9\x01\x86\r\xf7\xac~K\xe7~,O\x0c\x91:\x85\xc6\x17\x19\x9fGo\x9d\xec\x98\xd9\x1c\xe61\xe5\x0b\x8bus\xad\xf5K\x0bc\x7f\x98\x9a$rD=\xcd\xec\xaf[\x13\xc0\xad\xe0\xc8_li\xeb4\xd1\x03\x02\x18\xb1B\xd1\xf1A\x1eC\xd1M\xc4+\x8dj\x07\xac\xf9KW9\xba\xd87gbq\x1aq%\xf1\x12\xbep\x9e;\xd3\xdb\xd6\x93\xff@\xa54\xa4n\xc5\xa5\xc4\xa8\x02Z\x89\xc7wdS\x9c\xfa\x16*\xe1\x06)\x1c:~@\xaaM\xfe\n\x85|\x92e\x0e\x0eL\xc2\xec\x86\x85\x83\x94]\xaaH\xf4\x05\x13\x8c"\x0314\xae\x02\n\xa5\xf3\x82\xc8o(\x9f/\xed\xbb\x8f\xbd\x8fh1[\xc6\xfe\xc9\x0bx"\xfeg\xa2\x99==\x8fT\xb00\x0e\xdb\xd8v\xcd\x91\x11\xc6++\x9b\xcf\xab\xcc\x85\xfe\xc6\xe8\xbfg \xed)!eu\xb8\x7f\xafiJ\x8b\x98\xdb\xab\x16_^\xfcfG!bU\xdc\x02\xdf<+\xe4\xf0\n\xcf,\xa75\x97s\'\x9c\x84Y7\x1f\x9dQ\xab:!r(B5*~t?_\xef\xef \xbf%\xa6\xa1\r\xb8\xed\xff:\x8f\xa8F\x0c\xd6o.\xccu\xdch.43\x94\xa5[\tyF\x97\xcaT\xbb\x182\xd3\xe7\xae\xce\xaa\xe6\x99N\x8aJ\x9a\xff\xe9n\x19\x1b\xdf\xfb\xe3\x9f\xd9\xd4\xde\xebyG\rA5\xb5gze\xe7\x9b\xab\x81:"\x04\xcb\xb4\x9e\xf1\xedu\x81\xa1a\x8a\xa0gH\x0b\xee&\xfa\x8c\r\xc8\xb5ffm*\xdc.\xaa?X\xcc\xc2\x0fJ\xcf\x1aD\xe0\x90CQ\xee\xad\xcb\xa7\xdaf}*\xc0\x18O/\x1bbd\xf0\xf9\x92\xb3\x1a\xa6\x91\xd9Zw\x14]\'\x93\xf5e \x85o\xf08-e\xfbc\x0c\x0f\x0f\x8d\xea\xe2\x8a,[\xf1\xd0\x13\xe4\xb2\x0c \x92}\x87\x85=nE\x8f\x82\xb3<\x0f]l\xa3\x943\x12h\xc8\x99u\xef\xa5/\xb8:pL\xb4\xf5\xbe\xd7\xd6\xf0lh\x82\x0e\x7f\x023\xcaLlq\x9b\x12\x11\xacc\x9a\xf1\x10](\xefA}\x93\x8ey\xcc\xd1\xd9\x84\xf7X\x8e"0(\x85\xc8y\x8a\xf2\xe0\xbe\xf9Z\x0f\xc3\x84\xabhHN\x92\x02l\xf6R\xe3e\xecb\xd6\xb8:L\x89\xa3\xe2\xbf\x96\xcbp\x0e*\\\xde$\xc5\r\\\x9dS\xc5\x9a\x14)\x8a\xa78s~\xabu6v\xc3\xfa\xc5\xfd\x0f\xf8\xef\xd5\xce%\xb4\x18#\x89\xf3\x10Xh3e\xeb\n\xf2s\xf9.\x8c\x92\xfc\x1dy\xc1\xaa\xe5\xf7|\'r\xe3Kw\xbf\xf0\x88Z\xac\xe3O\xbf\x96*\x853\xda\xfcC\x91\xaa\xc6Q!\xcfD\xe2\xfb\xc1\xad\x81!/\xda\xb3\x01V\x8e\xe3>[\x1e\x8e\xd1\xdfW}\xf9\xa0C,+\\-K\n\x7f\x93\xb6\x86\xc6\xbbN\xda4\xd9\xe1\xa2\xf6Q\xe67W\xeb]5\x94;2\xa2u\xd34D\xc7\xdaG\x06\xb2\x84\xaa\x9f=\xd5\xc4u\xaf\x90\x88\x81\x0egM\xbb^\xb7u\xf0Yt\x0f\x9fL\xe1\xc1\xd6Wt\xaf\xca\xaf\xbd\xcd\x02\x84\x84g2\xc5(G\xda\x9a\xe4;\x12tQ\x8cZ\x0e^\xdd\x96\x835O\xcd\x8c\xae\x99\xc8aX\x81Y\xae\x9d\xc4\xd4\xfe\xf3\x05\xfa\xe0|\xa2\xda\x01\xbd\xdc\x94<Zw\x06\x1e\xfd\xca\xbck\xd0\x12\xef\xab\xf8\x85\xfdI\xaf\xbb\xd4\xb1\x8c\t\xf5\x81\x8f\x9f\xc3\xbf[\xe6s\xdfN{\x84\x1b\xda\t\x1f\xdf\x1c\xee\x95\xd9\xca\xce\xb0\xac\x06\x10zN}\xd1\xa5\x968S\xb3%:}V\xe3l\x9b6\xdd!\xae\x88\xe3\xb9P\x94{\xd64s:\xefj\xfc\xf7\xa6\xbdY\x89\xc3b\xca\xb9)V\x07\x84~\xf7\xc8\x9cu1\x14\xb2\xd7c\xab\xa2\x06\xeb%\xdb\x1cNE!\x95\xc1\x15\xe6+\x02M\xdfa\xa7\x9c\x10H\x06\xd7\x00\xb2\xdf\x04\xe9\xa0\x93\x19[\xb1\x01k\xcfC\xd2n\xe4\x1f.&\xce\xa7\xc7[?\xde\x00\x19\x88\x01\xa6\xfe\xee\x16\x8a*`h\xc7\x08N\x08\xc6"\xe6\x9f\xdeeU\xe7`9%\xf0@PJ\xb2\xcb\'\xadi\t,| \x93\x1fZ\tV\xb9\xea\xdb\xe7\xbf\x87d\xbd\xaex\xdcY*\xf9rB-\xdd\xfab\xcf\xc7\xfb\x06\xec@\xe9\x02\xa4/\xb8yFW[\xf7\x1bja\xf9\xb1\x18\xdc\xa2\xce[\x9b\x02\x9dG\xb7I\n\xb1k\xf0T\x96\x00\xa6\xfe\xe4\xf5\xf9ok\xe8\xe3\x88m\x1e\xb6\x1a\xb17\x97An\xf2`\xb9P\x90\xb7e7\x0bN#\xcd\x83zB\xf1F`\xb9\x8ce\xeb\xbe\x95q\xf5+\xb0\x0e[Fv\xbf+8\xc0\x96\xe5\x9d\x98!f/\xe7z\x1a,\xcc6$0\x17\x97\x83\x91-\xed \xdb\\Z\xf6\xfb"\xcf\x81}\x95\x88 s\xd8v\xbf\x99E\xd2\x84}8$f\x13s\xea\xd4\xdd\xa3&\xa1\xe0\xb5X\xa8\x9b\x8d\xe2\xdd\x03n\x1dsLOty\xe1\xaa\xb9\xe9\xfe\xd8\xfc\xa7*\xf7A\xe3,:\xac<\xc6\xc8%~\xbc+\xa5%\n\n9\xb18\x8a^\xb6\xe13\xa8_\x1aum\xc8<\x02N,\xf9\x9a\x0c=>q\x16\x8a\xad\xe7\x1dZ\x8c\xfb5"\x9a)I\xaec)37D\x14\x03Y\xce\xfd\xacR"\xa5\x7f\xbe`oX:m\xd0\x05\xd6*\x8c\x07\xa4r\x90_\xfd\xab!u\x1bW\x07\xe2\x1a\xaa~aLA\x11\xbbg\x10\xd0{\xb8\xd5\xd6`p\xc3dn\x1a`z\x1e\xfd\xe0f\x03/L7\xff\x9f\xb4\x90(\xe2\xee\x11\x9b,7\xc08]\xf0P\x02v\xcaN\xed\xcc\xceck\x04\xd2\xdav\x12\x9c\x065Z\xee\x182\xbf\x8d\xe7\xefT\x1a\xa2O.\x16=7@\xcaG\xba\xba\xdf\xa9\x8d\x9c*d\x0b\x91\x8f"\xd8`\xcb\x13\x12\xd2\xa0\x9e\xc9V\x8d\xff\xd51\xe4\xc5x\xe2M@\xb7\xbaA5\x99ie\xd770\x0cm1N7o\xfc\x8f\xed<;gV\x83y\xb8R\xc7\xf1\x89\\\x16\xce\xa3\x94\x19\x04\x14#G\xa3\xd1\x12*\xc2\x83X\x9e\x1fO\x8c\x9b*\xac/\'\x11\xf6}\xe2\x13O\x0f\xe1v\x86\xac\xfd\xd8\x13\xcf\xb5\x8c\x1c\xfb\'\x13\x11xJ|\x90\x00\xf3w\xd2\xf7\xf1;\x13\x8a\xe6Pn\xda\xf4\xcd\xe4*\xb07\xd0{g\xb3c\x1c\xbd"\xb2~R\x8c\x9e\xe3\x88\xdf\xd1;\x96\xa1\rk\xf4\x06\xe8s\x145\x06N\x14\'J\x83w@h\xc0\xd0\t\xb6\xc1v\xfd\xab\x1e\x9d4O\x89\x99\x12\x19\xc6\xe6\xf9|i\xf2\x9d\xd8\x89\xdb\x96\xe4\xb3\x85\xdd\x00\x07C\xb4ys\xa2O\xb9C}\xaf\x94\x1e\xf0y,t\xb5\xe1\x0c\xf4+\xe2]\xc6Ez\xc4\x85T\xfaC/ \xf7\xf6\xb2E_\xf4\x10O\xd8\xb5\xd2\xe8*\x02\x86\x07\xad\xc3\x1eb(\xd1\xac\x0c\xd0\xd8\xbenj\xed\x9f\x9cf>\xd9\x13\x15\x1a\xee\xfb\xd7\xd7\x89\x91\x8a\xca?\xf6\x81\xf6\x8f\xa6\xd7\xdb-\x02\xb5Ay\xe1\x02\xc6\xf1\xba\xb8\x99\x94j\x8c\xe7E\x02D\x1f\xee\xae\xbe\xa6\xc8\xc9\xb8\xb3~D*\x0f\xe7\xac\x8b\xe9&s\n\x04\xaeU\xf18\xd6De\x12/^6\x11\xea\x82}\xedW_,xz\xcfY8\xddA>\x85\xe3\x8c\xe1=\xfc~P\xb8U\\\xbc\xa4\x80M\x99XQYYme\xdb&$\xc8\x98\xd7\xc9\xf7\x97\xeez\xb3\x95\xe9\xe1\x06\xc0\\J\x95\x03\x87B\xd5>\xad\xe8\xe3\xcf`\x87c\xf7\xe7+\xe6;\xdb\xe1\xc6F\xdaD\xba\xb3\xdb\xe9\xcf\x06v\xad8\xc73_\xf5g\nh\x19\x0f\xa3\x12\xe1\xa56\x08\xcd\x05:\x17\xd0\xe3y^s\xaf\xfc\xe1\x95!.P{t~\xc7:I\x8a\x1aK\xd5\x91\x02\xfe\x00I\xfan{\xc8\xab:k`\x1b\xc6\x06\xb7\xbdf\xd1\x9d\xe7\r\xb8\xa9K\xa9v\x99<\x07\xc8\xc3\x96\x82!\xbf\x9f\xc4N\x8c\xcd\x0c\xd8\xbd\x19\xf1\xeeH\xd81\x93\x1b\x9d\xe4\x18\xa1\x8br~~\x11K\xf8?=A\x17\x99"\xfd\xa7\x15\x01{\xa6\x93\xa1\xc9\x8f\xeezo>\xdeg@8\x186Y\x10\xfc\xc4i\x8b\xab\xbb\x89\xdf}\x17@\x9cps\x87rx\xdf\xc8s4\xdf*\xe8\x1b\x9f\xc8N\xe1t\x1d\x1d\xadG\x06p\xfa\x86Rp\x9f\xc4\x9b\'3%\x04\xfb\xa6\xa6\xf1\x94\xb0\x80\xe6y\x100\x16O\xf0\x82\xfb\x9f\xf5\xf0\xbf\x1d\xb7\x13\x03\x94\xd0\x8ec8\x12\xdf\xdd\xa3\xb5\xd4\xa1\xee\x0e2\xfc\xa2\rc\xebw\xe2\x99-\xaa\xd5\x0e\x9a&\xd5\xbc\xbc\xcd\x86Y\xf9\x02\xec\x08u|4\x0eR\xeb\xa2\xda\x1aJ\xf6\x85\xd0}i\x1c\xc7\xec\xcd4\xcbb\xba\xa9t\x9e\x95\xb93o}4\x19\x03\xf5a5\xe8\x0e\xd3\x88\xee\r\x86v\xf1\xad\x98\xe7\x97\x05\xe43\xfb\x07m\x95\x11#G8\xaeY\xac\x18\r\xec\xf6\xfc\x0b\xbd\xa2\xad\xf0\x06\x1fYmi\xd2"C\x8a\xc2\xd6q\xf8\xf4\x97B;\xd9\x1b\xca\xc5\xf0\t\x85\xdf&\x00\xaalN\xb2\x03n\xbb\x8c\xc8R\x1e\x05\x94\xccv\xb5\xa1\x03\xb6({\x86\xdc\x16\xe4\xd4nO\xff\x8f\xcelS\x18\\\xc9\xcf\xa6\x02\xb5\xed\x8f\xeb|\xb7\xc0^G\x90\x7f\x90\xe8\xd0E\xeb\x8a\xe1\x1e\x13\x1c\xd7o\xf8\x821S\xbc\xc2\x03\xa0I\x12\xc3[\xda\xec\xb0T\xd8Zo\x85\xdd3f\xc2\x8f\x07Z\xc5{<\xc0F\xf8\x8d6\x9f\xe6\x18\xd5R\xf2\xd4\xc1\xa66\x8d\xc6\xbf\x1c\x90\xf9qH\x84Z&\x8b\x00!\x172\x10\x9e\x01GC/\xdf\xc1?\x06n\x1b\xc5\xf8\xbcp\x97\xce\xf5\x1c\xbey\xd4\x980\xf0\xc2Q-*p\xf9\x97ui\x18\x02\xde\x1b\xe4\xa3\xf2\xd4\x8e\x95Gw\xbf\x80v\xc76\t\xba+\xaf\x0f-\xd7\x8f\x85\xe9>$\x83\xc8J\x02\xff\xc8\xb1\xa5\xa7\xa1$\x9ec\x0bQ\xbf\xd8\xde\xab\xac\x00\x85\xb6P\xf8\x7f\x8e?\x9ei0\xd6\x18\xdag\xa0]|\x04M\x90\x96\xd3\xee\xa0A%W\x05o\xecJ3Q\xf8\xc2\x82\t\xd1\xf1#\xd2\xeb\x8e\x10\xd4\xf2\xb1\x9a6\xe4\xbf\xb0N\xa0\xf5P\xa9\xba\x87\x877\x8f\xe6&\xfa\x12\xadJ\xa3\xb0\xa2\xf1\x85\t5\xdf*,\xf5\xa1b\x86\x9e\xcb\x1c||\x16\xad\x99J\xcfq}x\x914&\xa0C\xc8 f\x021\xe6\xfar\x85M\xa2\xbd\xef\xe8n/D}K\x8dV\xafF%u\xe0\xf5\x9d\xf59\x92\xfa\xdf\xb9\xee\x0c\xbd\x19!\x7fL\x8aZ\x1ek\x06\xbd\x0c\xc8\xd4\xc2\xcb\xfd\xb5\x8f\xd5#f\x8br\\@L\x9d^Q~\xce\xc1\xc5\x8a\xa6\xf6\xaa\x92\xee\xf9J+s7\xe6T\xb2\x8a\x03{\x8cH1%$Pf\xd3\xa1\x1c P\x81+\xd7\x81"\xcb\x05\xd3\xae\xfb\xd5\xe3\xe6\xe32o\x9c\t6\x1e\xb1\xb1j \t\xd8\xf0\x99\xc4\xe6\xe1J\xf5\xa0\xf3L\x1e`\x00q\xcf\tq\x03\xc1\xd8\x8e\xc2D\xfd\xf7\x83\x8cQS\x98\xfd\x8d\xf2`ga\xc5\x0b\xeb\xab!\xecC_\xa6t\xcf\x12\xee\xba"\xad\xb7\x11\xe60>\xde@\x17a\x08\x89\x84\xe82\x0b\x12\x9a^\xeba\x91\xe6\xad\x87\xb8\x84\xa5\xb2\xb21mc\xd1|.\xe1SCK\xac^GT\xa0\x84\xd4J\x9f\xc9C\xd0\xbf\xd3=\x10\xac[\xb9T\x8b\x06\xf9\x84\xbb<\xd2\xf0f\xbb\xab\xf6\x87@D.\xfd\x86\xa7\xf9\xca\xcd\t\xa1Q\xe2\x99/\x15\xdd!\xb1\xc9Z\xa3\xa6u\x16\xe1Es\x8f(UX=\x10\xc8a\xda\xf2\xb6\xae\x8e\xa5\xbe\xf5\x8d\xfdF\xd5X\x8f\x0e\x07\x08\xe2mk\x1a\xa3Q\xd6\x94&\x1b\x1b\x81\x1e\xca\xcd6B\xfe\xc3\x8b \xfe\x94\xd7I\xb7\x0eN8iN\xe0\xb2Vq\x95\xa6E\xf1\x82\x94&\x1b{\xf7\xa8\x00\xc8\n9\xaf\xef\xc557d%`\xc9:\x8dw+\x83AC\xe7\x96\x19t\x19-b~-9\x1c\x80\x8dQ\x112O\xb2\xc8\xde0\x1dWB;\x87N\x02/\x00\x0e\x1a\x02\xddm@\x9f\xa7\xc2,\x8fL\xdd \x16I\x17\xb2\x1a,d\xd9\x8a\xa2\xec\xe2\xb7Hel\x94\xfba%)\xcbe\xc3s\xc4t\xb4\x1b\xbaj\xf7\x9b\xc1\xb8"\x17\x14m\'\xc6\x0cm\xf3\xd9\xfc\xdb\x1cW\x13u\x0e"k\xa1\xff\xd9L&\xf1=\x8e\x9a\xe2\xe5\x92F\x93nS\x08G\xa6\x005hEhw\xe5\xda"\xd1=\t\xa7\x8d,\x8ae\xb9%/5\xd0\x8f`\x99\\C\x03\x9f\xe1\xfe\xc1\x16R\x8at\xd0jhVO\xbdC\xda\xe0z\x12f\xe1\xc4[G\xbc\xe8\x88\x8d\x16\xe8\xba\xae\xb5\x94\xcf\xf0\t\x95\xcc\xa3\x9c\xeb\xc4w\x05W*D\xb7\xdd\xe0\xe4{\xd1\xc1\xf4\xa2\xb5fpPw\xde\x1f\xf1\xf4\xb0\xbc\t\n,\xe0\x0ex\x87\x16\x83\xcf\xcf\x855\x11\xca#F\xd7\x17\x82s\x10s/\xe8\xb0|\x06\xbd\xfaT\xa2f\xd6\xd7\xe6!"~Q\xe1s\xa7\xc3\xc1\x1b\x8a\x87*\xfat\x92$\x9do\x04\xa8\x19h\x9e\xbe\xd0\xde\xad\x8b~\xac\x05h\xed\xfe\x10\xcf\x11\xe9]\x18I\xed\xed\xcd\xc2\xf6\xff\xee\x9e.\x1bSEUR+\x98Q;-\xdd\xb7u\xf6\x11\x00\xf5)\xff\xcd\xe3\xea\xbc\xf8\xc8\x8e\xe63\xf4\x18\x94#Ai\x07\x90\x9a\xd5\x15d*\r\x89\x0e:d\'2.\n\xe5\xda\xd3X\xf8r9oJsq\xe9c*+\x8f\xfbF\xdd\xa1\xd2\x10\x90\xb7\xf2\x8fF\xe9\x8eIL\t/\x1c\x04\xb7\xbe\xf4\x83[\xe7\xa3\xa6\xb1@\x99\xfb\x02\xde\xeb\xb7\xa6\xd0\x85\xf8\xa4:\xb4\xd8\x95\xc9\x15\x88\xf0\xe8i\x82\'\xbc\x03\xb3\x84\x06~1\xca\xf3\xd0b\x1c=T!\xb3\x83[Oc\x03)Lj\x02\x03\xf2H\x08\xb0\x05?l\xb5\x8bW\xa9w;\xa1\x14\n!f\xfa`Qe\xac\x14\x0f%?\x1av\x13\xef\xb0Z\xa8\xc4RO\xfe\xd0\xce\\P\x1ey\xac\xe0\xfe\x85\xb7\xd7\x1cEX\xea=?\x1d\xc1\x1a\x0b\x17\x10aT\xa3\xd6\xf1\n\xd8a}\x92\x8f\x87\xf8Hd\xed<X\x85\xe9\x9de\xb0\xfaD\xc3ef\xdcu\xfc|/ (\x87\xe2\xeb\x08V\xe1\xbdR\xdb\x0f\xe0\xe1\xfc3T\xa7\xef#n\'\x0c\x11\x91\xe8\x18\xdd\xe6~\xb6+Y\xf8z\xbac\x9b\xbf\x11o&\xf1M\x9d\xd2\xb1\xcc4\x7f\xeb\xcb7\xa3fF\x03\xc2\x89\x1b\xbe\xe1j\x8d\x19(\x10W{\x1f\xa5w7>\xa4\x1c\x12\x86\xaf$C\xc5\x8ex"J\xee\xafr\xe90\x0e\xf0\x9d\xb7\xc3\xa7FN\\\xd2\x11\x12>\x7f\x95\x97\x16\x10\xe3\xcd\x90\xd9^\xbf\xaa.\xeb\xb2\xd2\xc2 \xc7\xe5M\x96\xab\xa6\x06~\xaa\x85\xab\x82\xdc\xd6\xc5\'\xdd\xcb\x13X\x1e\xbc\xc3\xffZ\xdc\xcd\xfc`r\xd4\x98\xd0\xe3",\x9b\x80\xc7J\x18!a\xfc\x1b\xfc1e4\x0e*{\xd6?\x07\xce\xd8\x1b\x90\n2\xc4\xdf4-\x7f~\xf8KG]\x96\xb1\x96A\xf1\xecxC-= \x8a\xcd\xa9\x12\xfc\x9a\x91\x88\xf8\xa4w-\xf9z\xfa\xf9\xd3\xd1\xd4\xef\x80\xe5\x00P\xab\x90\x1aqsqp\xa1\x94\x7f>\xf1\x7f\xe9\xe7\x89)c\xbf\xc2\tYX\xfa_\xe6\xf9\x92\xac\xabJ\xba\xeb\xef\x1dJ\x1c\x90#\x1e\x94\x92\xfcV\x89\xa5\xfb\xb4\xa9u\xab\xcd\xba\xe4\xbef,eq\xf4l\xca\'H\x9e\xa8\xf3\x10Rovq\x10X\nu*\xc8\xbd\x08\x9f\xe8\xa1\n\xb3;\xae\x11\xa4a-\xcat\xf9\n\xd6\xd7ey\xcf\xe4\xd1\xec\xb4\xc6\xaeDe\xbd\xac2\x131\x83N\x8e\xa0\xc2`\xdd\x9a\xab\x99&\x9a\xbf\xc09\x9d\xde\xdc\xc0"\xd5a\xbf\xc9\xe6z\xbd\xa3F\xe9"\xd4x\x8a\xdb\xe9\xf5\xc4u\x80/\xad\x85\xa4!\xda\xa6\xd2\xa7\x88\x0b\xa5\x9a\x87qzY\xad\x04\xc1\x08\x84\xa8!\x08,\xd2\x8c\x80\xd3*\x82?[(@;\xbbtg\x97\xea\xf8P\x7f\xcb%\'+\xe6\x07e=$\x8dT\xf7\xe3\xae\xa1\x93\x05\x9f\xd3\x00\xf9\xf9\x01\xdfSv\x9a9\x00M2N\x96\x03} %\x11\xd3\xc0f\xde\x8f/\xd1\x0e\xc4\xc8[\xdb\xff\xb4\xee\x1b\xd9a $\xea\xdb\xe4\xe6\x7fU.|x-U\xe9\xf6d\xfe\x16t\x9dQ\xaa\xd7\x92\x88O9\x88\xdb\xe5\xf9s\x0c\xc5&\x1c\x0f\xea\xc6,\x89\x0f\xe5X\xd2\xf4M\xb2\xa1r\xa6c6\xdd!\'\x06\xae\xb3\x0c\x9c\xfa\x87\x1e},\xd9\xd6\xb6\x15\xa4\x92x\xfc\x03vy\xbb\x91\xcag\xa8=\xf8\xda\x97\xaf\xea\xfe\x8e\x9d+U\xf5\xd4?r\xa2\x17^$\xad\xfa+\xd9$0\xfe\xd9\xeec\xa8l@\xf38\x82\xff@$\x8e\xca\xd0\x82\xe2\x9eF\xf2\xbd\xe2\xb9\n\x92\x1f4=|*\'\xa3\x85\xb6l8\xba\xf3\xea\xdc0\xbe\xf3%7\xfeN\x87\xce$\xab{ \x8a\xd92\xc1\x90\xbd\xfb\x1b\xef\x16\xa2\xef\x90\xfbB\xb3\x14\xaebu\xc3w\x834F\x03\x12\xba\xf5_\xb0\x80\xb6\xc2\xe7\xff\xae\x8c\x85\xe6%1\xc9o.\xd4Xc\x89\xbe\xedd\xf7XO,,\xa2\x89\xd7\xbb\x10\xf34<&mT\xa0\xf3\x1d\xcb_!\x91\xcb\xca*6m\x9c\xe8=_\x19~Q\xcd\x02\x8b\x9b\xf9\xc4VR\x8ad7\xe9\n\xcc\xfdDM\xa7\x9c\xfekX\xa5\xea\xe9lI\x15u\x05\xa5\xfa\xc0\x07\x0c,\xa35\xa6C\x8d:\x07\x8f\xb8\xdf\xbbBC\x19k\x10T\xc2\x14\x8d1td0\xe1m\x97\x9bt\xeayk\x9eX\xa2v\xfcm\xcc\xb0\xfb0\x19\xfd\xfbFW\x1d\x83\xddg\x1a\xf2F\xcd\x90\xfel~Z\xadS\x7fh\xe6\xbe\x99G\\5\xfag=\xcd\xeaS\xc8\'\x87\x0f\xc5\x1f\x0c\xb8"\x81!\x88\x02\xfa\xc8K\xfdw \xa6\x85\xce\xcd6\xcd\x83\xac\x1e5A\x91a\xe0\x8eB\x8b\x91hh{$\xe3\xe6\xa0_\xadh\x91-:B\xa4$\xb9z\xaf\xe9\x82\x9ft06\x9eS\xceT|\xbfT5\x0b\xef\xbf\xe8K\xab\x11I9s\x14\x85\xd7\x88_\x15\xacm\x12\xdc\xec\xdbT\x01\x88\x8e\x1bZ\x91\x19\xdb\x16]L\x1e\xe8\x94\xc4\xd6)\xa9jI\xaf\x0cs\xd0\xf7\xb0\xff\xb7X@\xd7\xe7\xf5\x855\xd6\x98\x82\xe0\x9c\xa3\xac\xf5\xcayf\x95\xd7`\xdd\xb6\x08\xec\xc5du<\xfc!O\x84\x94\xad\x1f9q/I\x80\t{e\xf6\x1baS\xebO\xb9\xa2\xc9\xe2\xd3<}\xea\xd7\xd8\x98\x9aT"[0E\xe1\xfb\x1e\xed\xc6\xa0\xf4\xf5i\xeb1\xac\x07\x8d\xe7K\xec\xc7\x10\x83\xf1($@\\`\xdb\x90\x96\x10\x95@\xde\r\x0c\x1b(\xda^\x85l\x91\x11oU\x8f\xdd\xcf,\x88\xe5\x90_:j\x0f\xfc\xe1\x97\xce\x9a\x8a\xbc\xa1\xe8\xb2\xeaS\xb7\xb8\xfa(=\x035\xe5\x8e\xed~\xe2\xb5p\x07a\x1b\xd8x\xc63Hg\xd4\x84/RI\x14W\xf5\x9b\xb5D\x0f\xce\xee|\xceK\x89-\x82]\xb9 \xbc\x1fvp\xeaeI\xc7\x11\x0f\xc5\r\xd2\x1d\x05M\x15\x00\xc3\xa1\'\xda6=\xfd\x86~\xfdG\xbcO\xc7\r\x99\xdc\x95\x90\x8dU\xd89S\x9f\xd0H\xec\x15\xa9\x8a\x0f\xda\xf1\x0e\xb9W\x95\xf8\xa7\xb03\'\xb3T\x0c\xef\x19\x121R>\xc7\xc1\xd4\xc3P\xf1\x04\x18\x8e\xaf\'\xa099p\x0f\xcf\xedh\x10\xf2\x05\xd8\xec\x18\xd0t\x9c7\xf0\xd4&V\xd4\xe4\x15v\xc9C<\xc9s\xdc\x94\xc3f\xd3/WT\'!\xc2!\xcd\xc3\x8c\xcfQ[\x02T\x03i\xbe\x96D\xd3\xfa\x9e\xb1\x02\xe5\r\x9c\xfa\xd2f\xf2\x89\xce\xb9\x91g\xd8\x1d 1Ru\xef\\\xa5SQ\xad\xf9\xf5k\x01k+\xf2\x7f8?\xc8-\x8a((\xc2@\xd3\xa1V\x10>\x94C\xb9\xbf\xfd\xccCqg\xc2@:\xad\x15\xc9\x12xv\xe7[\x823\x98\xff\\\x83n\xa3$\x82q\xa2\x9c+\xc31u\xb02J\x05c\x8a-%\xe3\x93\x12\x14m\xaf\xbe\xd3\xee4M\xe7z1\x04\x0f\xea\x10\xb0\x18K\x9e\x9f\xbd\x87;1{\xb6\xbc\x12\x82j/n,\x14\xb0\xf9\x92\xf3l\x8e\xe3\xb2\x92\x89\x8c\x8c\xcd/g\xbb\xd0\x0b\xace\x05\x81\xd7\xab\x19\xb9\xba\xb2\xaa\xd6\r?\xe6v(Z\xa9~\xba\xd9E\x9b]\xedd\xd8@S\xd88Y&\xd4}\x80l\x9f\xab\x15F\x98@\xd0gJ\xb1\x9fn"9\xce\xace\xe6-n\x9a\x1a\xed\xdf\xd8\x06TN\xf3\n\x19\nta\xb6I<\xe9\x8e\xb5\x9a~Y\x99lb\xa4\x08*\x03z\xb6k\x82v\x96\x84\x9a\xa6\xb2\xf0\xe2\xf5{\xea\\#\xafc\x03\x9f\xb9\x049J\xafd\x89\xffs\xa5a\xe56\t|c\x89\x90\xa8\x01\x82w1<\xaa.\\\xea\xb7\xc9\x84\xe2f*\xec}\x9bt\xea\xbb\xf1\xb3\x13z:\xb2\x89[\x04k.=\x06&\xb2\xaf\n\x9a\xea\x0c\xdb-W\xa2?\xb6\x11\xd3\xda\xc5\x10\x08)GY\xd3U\xa5\x96\xdbs\x0b\xef\xbc\xb1\xa5\xa6\xe7\x02N2\xcb\xb9\xe2\x11\xc4\xbc\x9fF\xe8\xed\xfav\x1bW\xe1\xf0\x84[\xe6\xb9\xc2\x8b\x07\x8f\x99\x8e\xf8S\xf6\xad\xa1\x9c\xf9\xef\xa8-\xb5\xca\xf3+\xaf{n\xff\x07\xc7\xea\x1c~\x08\x08\xcd\t\n\x184\x90\xe5w\xef\xd8B\xd1\x17g\x1b\xf0+\xd9J\xf4o\xa6\xc2T\xaa\xec"\xabl\x02\xaf4\xb9\xceeze2\x9bb\\\xff\xc8#\x8e\xc5\x1aCt\x0c)\xf5\xb3\x17m\xe5h\x98][\xb5\xac\xaegv\x9c\xc7%\xc4=l\xa3)\xd5\xf3,c~\x16\xed\r\xae\x13a\xfez\x98-w\xb9\xf4s\xabR\xac\x0e\xf3})\xa5')
1
+
2
+ from flask import abort, render_template,request,Response,g,url_for,jsonify
3
+ from wtforms.validators import Regexp,ValidationError
4
+ import urllib,uuid
5
+ import datetime
6
+ from hiddifypanel.models import *
7
+ from hiddifypanel.panel.database import db
8
+ from hiddifypanel.panel import hiddify,clean_ip
9
+
10
+ from . import link_maker
11
+ from flask_classful import FlaskView,route
12
+ import random
13
+ from urllib.parse import urlparse
14
+ import user_agents
15
+
16
+
17
+ class UserView(FlaskView):
18
+
19
+ @route('/old')
20
+ @route('/old/')
21
+ def index(self):
22
+
23
+ c=get_common_data(g.user_uuid,mode="")
24
+ user_agent = user_agents.parse(request.user_agent.string)
25
+
26
+
27
+ return render_template('home/index.html',**c,ua=user_agent)
28
+ @route('/multi/')
29
+ @route('/multi')
30
+ def multi(self):
31
+
32
+ c=get_common_data(g.user_uuid,mode="multi")
33
+
34
+ user_agent = user_agents.parse(request.user_agent.string)
35
+
36
+ return render_template('home/multi.html',**c,ua=user_agent)
37
+
38
+ @route('/new/')
39
+ @route('/new')
40
+ @route('/')
41
+ def new(self):
42
+
43
+ c=get_common_data(g.user_uuid,mode="new")
44
+
45
+ user_agent = user_agents.parse(request.user_agent.string)
46
+
47
+ return render_template('home/multi.html',**c,ua=user_agent)
48
+
49
+ @route('/clash/<meta_or_normal>/proxies.yml')
50
+ @route('/clash/proxies.yml')
51
+ def clash_proxies(self,meta_or_normal="normal"):
52
+ mode=request.args.get("mode")
53
+ domain=request.args.get("domain",None)
54
+
55
+
56
+ c=get_common_data(g.user_uuid,mode,filter_domain=domain)
57
+ resp= Response(render_template('clash_proxies.yml',meta_or_normal=meta_or_normal,**c))
58
+ resp.mimetype="text/plain"
59
+
60
+ return resp
61
+
62
+ @route('/clash/<typ>.yml')
63
+ @route('/clash/<meta_or_normal>/<typ>.yml')
64
+ def clash_config(self,meta_or_normal="normal",typ="all.yml"):
65
+ mode=request.args.get("mode")
66
+
67
+ c=get_common_data(g.user_uuid,mode)
68
+
69
+
70
+ hash_rnd=random.randint(0,1000000) #hash(f'{c}')
71
+ resp= Response(render_template('clash_config.yml',typ=typ,meta_or_normal=meta_or_normal,**c,hash=hash_rnd))
72
+ resp.mimetype="text/plain"
73
+ resp.headers['Subscription-Userinfo']=f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
74
+ return resp
75
+
76
+ @route('/all.txt')
77
+ def all_configs(self):
78
+ mode=request.args.get("mode")
79
+ base64=request.args.get("base64","").lower()=="true"
80
+ c=get_common_data(g.user_uuid,mode)
81
+ # response.content_type = 'text/plain';
82
+
83
+ resp= render_template('all_configs.txt',**c,base64=do_base_64)
84
+ res=""
85
+ for line in resp.split("\n"):
86
+ if "vmess://" in line:
87
+ line="vmess://"+do_base_64(line.replace("vmess://",""))
88
+ res+=line+"\n"
89
+ if base64:
90
+ res=do_base_64(res)
91
+ resp= Response(res)
92
+ resp.mimetype="text/plain"
93
+ resp.headers['Subscription-Userinfo']=f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
94
+ return resp
95
+
96
+ @route('/manifest.webmanifest')
97
+ def create_pwa_manifest(self):
98
+
99
+ domain=urlparse(request.base_url).hostname
100
+ name=(domain if g.is_admin else g.user.name)
101
+ return jsonify({
102
+ "name": f"Hiddify {name}",
103
+ "short_name": f"{name}"[:12],
104
+ "theme_color": "#f2f4fb",
105
+ "background_color": "#1a1b21",
106
+ "display": "standalone",
107
+ "scope": f"/",
108
+ "start_url": f"https://{domain}"+url_for("admin.Dashboard:index" if g.is_admin else "user2.UserView:new_1")+"?pwa=true",
109
+ "description": "Hiddify, for a free Internet",
110
+ "orientation": "any",
111
+ "icons": [
112
+ {
113
+ "src": url_for('static', filename='images/hiddify-dark.png'),
114
+ "sizes": "512x512",
115
+ "type": "image/png",
116
+ "purpose": "maskable any"
117
+ }
118
+ ]
119
+ })
120
+
121
+ @route("/offline.html")
122
+ def offline():
123
+ return f"Not Connected <a href='/{hconfig(ConfigEnum.proxy_path)}/{g.user.uuid}/'>click for reload</a>"
124
+ def do_base_64(str):
125
+ import base64
126
+ resp=base64.b64encode(f'{str}'.encode("utf-8"))
127
+ return resp.decode()
128
+
129
+ def get_common_data(user_uuid,mode,no_domain=False,filter_domain=None):
130
+ default_asn=request.args.get("asn")
131
+ if filter_domain:
132
+ domain=filter_domain
133
+ db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[],child_id=0)
134
+ domains=[db_domain]
135
+ else:
136
+ domain=urlparse(request.base_url).hostname if not no_domain else None
137
+ if hconfig(ConfigEnum.is_parent):
138
+ from hiddifypanel.panel.commercial import ParentDomain
139
+ db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
140
+ else:
141
+ db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
142
+ if not db_domain:
143
+ db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
144
+ print("no domain")
145
+ flash(_("This domain does not exist in the panel!" + domain))
146
+ print("HI")
147
+ if mode =='multi':
148
+ domains=Domain.query.all()
149
+ elif mode =='new':
150
+ # db_domain=Domain.query.filter(Domain.domain==domain).first()
151
+ domains=db_domain.show_domains or Domain.query.all()
152
+ else:
153
+
154
+ domains=[db_domain]
155
+ direct_host= domain
156
+
157
+ # if db_domain and db_domain.mode==DomainType.cdn:
158
+ # direct_domain_db=Domain.query.filter(Domain.mode==DomainType.direct).first()
159
+ # if not direct_domain_db:
160
+ # direct_host=urllib.request.urlopen('https://v4.ident.me/').read().decode('utf8')
161
+ # direct_domain_db=Domain(domain=direct_host,mode=DomainType.direct)
162
+
163
+ # domains.append(direct_domain_db)
164
+
165
+
166
+
167
+ # uuid_secret=str(uuid.UUID(user_secret))
168
+ user=User.query.filter(User.uuid==f'{user_uuid}').first()
169
+ if user is None:
170
+ abort(401,"Invalid User")
171
+
172
+ has_auto_cdn=False
173
+ for d in domains:
174
+ db.session.expunge(d)
175
+ d.has_auto_ip=False
176
+ if d.mode==DomainType.auto_cdn_ip or d.cdn_ip:
177
+ has_auto_cdn=True
178
+ d.has_auto_ip=d.mode==DomainType.auto_cdn_ip or "MTN" in d.cdn_ip
179
+ d.cdn_ip=clean_ip.get_clean_ip(d.cdn_ip,d.mode==DomainType.auto_cdn_ip ,default_asn)
180
+ print("autocdn ip mode ",d.cdn_ip)
181
+ if "*" in d.domain:
182
+ d.domain=d.domain.replace("*",hiddify.get_random_string(5,15))
183
+
184
+
185
+ package_mode_dic={
186
+ UserMode.daily:1,
187
+ UserMode.weekly:7,
188
+ UserMode.monthly:30
189
+
190
+ }
191
+ bot=None
192
+ if hconfig(ConfigEnum.license):
193
+ from hiddifypanel.panel.telegrambot import bot
194
+
195
+ g.locale= hconfig(ConfigEnum.lang)
196
+ expire_days=remaining_days(user)
197
+ reset_days=days_to_reset(user)
198
+ # print(reset_days)
199
+ # raise
200
+ if reset_days>=expire_days:
201
+ reset_days=1000
202
+ # print(reset_days,expire_days,reset_days<=expire_days)
203
+ expire_s=int((datetime.date.today()+datetime.timedelta(days=expire_days)-datetime.date(1970, 1, 1)).total_seconds())
204
+
205
+ user_ip=clean_ip.get_real_user_ip()
206
+ return {
207
+ # 'direct_host':direct_host,
208
+ 'user':user,
209
+ 'user_activate':is_user_active(user),
210
+ 'domain':domain,
211
+ 'mode':mode,
212
+ 'fake_ip_for_sub_link':datetime.datetime.now().strftime(f"20.%y.%m.%d:{max(1,datetime.datetime.now().hour)}"),
213
+ 'usage_limit_b':int(user.usage_limit_GB*1024*1024*1024),
214
+ 'usage_current_b':int(user.current_usage_GB*1024*1024*1024),
215
+ 'expire_s':expire_s,
216
+ 'expire_days':expire_days,
217
+ 'expire_rel':hiddify.format_timedelta(datetime.timedelta(days=expire_days)),
218
+ 'reset_day':reset_days,
219
+ 'hconfigs':get_hconfigs(),
220
+ 'hdomains':get_hdomains(),
221
+ 'ConfigEnum':ConfigEnum,
222
+ 'link_maker':link_maker,
223
+ 'domains':domains,
224
+ "bot":bot,
225
+ "db_domain":db_domain,
226
+ "telegram_enable":hconfig(ConfigEnum.telegram_enable) and any([d for d in domains if d.mode!=DomainType.cdn and d.mode!=DomainType.auto_cdn_ip ]),
227
+ "ip":user_ip,
228
+ "ip_debug":clean_ip.get_real_user_ip_debug(user_ip),
229
+ "asn":clean_ip.get_asn_short_name(user_ip),
230
+ "country":clean_ip.get_country(user_ip),
231
+ 'has_auto_cdn':has_auto_cdn
232
+ }
233
+
4
234
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
235
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -163,4 +163,15 @@ legend {
163
163
  .sub-sidebar {
164
164
  background-image: linear-gradient(195deg,#185f9d,#135085)!important;
165
165
  width:200px;
166
+ }
167
+
168
+ .dark-mode .ms-choice{
169
+ background-color: #343a40;
170
+ color: white;
171
+ }
172
+ .dark-mode pre{
173
+ color:white
174
+ }
175
+ .dark-mode .callout a{
176
+ color:#b0b8bf
166
177
  }
@@ -17,7 +17,7 @@
17
17
  </div>
18
18
  %if not has_update
19
19
  <pre class="ltr">
20
- {%if "codec can't encode characters" in error %}
20
+ {%if "codec can't encode characters" in (""~error) %}
21
21
  Please restart the server.
22
22
  {%endif%}
23
23
  {{error}}
hiddifypanel/xray_api.py CHANGED
@@ -1,5 +1,111 @@
1
- # 2023-04-08T15:11:13.549552
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\xdf\x14\x00\x00\x12\t\x04\x00\xe1\xf3\xab\xf0ar\t\xa2\\\xbd_5g^\xa5\x93\x00\x00\x00\x00\x00\x00\x00\x00G\xf7N\x19\x1ej\x80)m\xf4\xac\xfc\xe5\x85?+\t"G"\xe0\x03\x18=T\x89(\xb2U\x8d\x18A\xab\xa5!\xa4\x03\x99\x03\x88\x057\xfb\r\xb1a6\x83\xa1P\x17?\xfem\xe4\xc9o\x9bQf\x1d\xbf~\xa7\xa6\xae\xc8\x97\xedn\xd5\xa3\xa3\x0b\xf6\xcdL\x92\x8d\x80\xd6x)N_\xe5\xdb\xc7+0\xbc\x8dX\n\xe7\xa9\xfe\xd0\xa4e_$u\x15-?\xf7\xf3\x97\r\xce\x1f\x88\x8f\xf9\xbem\x08\x96?\xc4j\xc7\x10ca\xce\xc3&\xca`\xad\x0b\\\xb9\x1fCD[\x97O\xe4R\xb1\x89x_\xbf\xf5\xda|\xa1\xc6\x1b\xc3(\x04\xbbO^\x96[\xbfq\xa9\xa3Z\xb1"\xdb$\x93\xaa\x8a\xaany\xb4\x0b\xbfm\x97\xb6O\x13\xcfKt\xb0\x14c\xff\xe3\xb2\xbfft\xe0\n\xd7\x90[e\xd5[\x8e#\xe6\xb5\xf3v\xd6E2\xc8^z\xf1\xac\xea2\xf4|\x8d\xc9\x12\x99\xd3w7\xf2`\xd7\xe4>\xc7\xe8j\r\xf6UX\xcf\xabX\xb41\xad\x00\xda\r[&\x19\xd9\xb6\xef\xbb\xdf\x82\xaa\x85\xfc\xdd\xee\x10\xbb\x1fS\x94\xd2\xc5@\xb7&a\xc2\xd3L\xb6\xafW\x7fc\x1c\xf8\x93\x11a\xb7\xd6\xbb&\x8b\xf0M\xd1c@2\x04\xbe0\xc7\xf2\xbcl\x88\x19\n~\xfc\xd3\x81_\xedH\xb9@\xdb\x837X\xe0x\xa1\x9b\xf1\xcf\xf8N\x98W\xab\x14":\x18\xec\x13,\xeeR\xd6\xc4\x03w\xc1\xf8T7\x99\xef\xf6\x00\xb7\xdd\x9f\x1b\x07VR\xf9\x89J\xdfqr\xd9\xa7\x10\xfa\'\xdcc\xff\x94\xff*Y\x9d)A\x8cd<\xb0\x9a \x11\xd5\xf1\xc2Ht\xd0\xaa\x05\nN\xc3\x83lQ\xe1\x95\x1a\x89\xcc\x91\x00Ev\x95\xa4\x92\xefd\x83\x02\xb0s\xa2\x14\xcd\xd2z\x887\xaf\xc5Nu\x87uo3>\x07&\xb0\xa0\xb8\xa2ntKV\x85\xef~\xd0\x08\xb9\xceg6bjsg\xc4\xaa\x85\x0f\xb2Y\xe0Hy\xd4\x8aF\xb8\xf3\x06\xb1,\xce\xb5&I\xe9\x94H\x00ql\xc5/\x91\xbf\'\x02\x06\xe5\xc2\xd4=5\x02\xf2\xc5\x1d\xed\xf1\xdf&h\r~\xcf\xf6]}\x18\x049btm\x83\xedJf[/\x14H9W\xccC4\xa8\xf7\xa24\xb6\xb1\xd3\xdd\xeb\x17$`1\x12\xb1A,\x1d\x02\xc565J\x01\xb4^\x1f\x14\xe8U8xf\x8a&\xb2\xd0\x06i\xce\x94p\xebKD\xe2\x9b>u\xb6\xa7\x86p\xd0r\x8e#\x06\x04T\xf3\x8c\xf0[\x1e*S<\xd6\x85_fw\xbd\x93h{&\xe4\x05\xc9\xcf>#t\x86\x80F}\n\xe1\x84!\x06/\xad\xf1\xb1\xc9N\xbc\xa7\xed\x97RW0\xe0\xbaS\x8c\x99\x8d\x89\xcb$\x12e\xf2\x0f\x84\xb3kX\x02Bc\xb0\x89Ck\x9eG\xd6\xa9\x11^{\xbfb\xc3\xa0{\x9e|\xe8\x1d\x0c\xf3\xf2\x9a-\x034\x94\x01\xe4w\xeb\x8eP\x0c\x85\xe6l\xd0&;\xf3\x8d\xac6\xcd\xe8\xefj\xe1R\x1ef\x8e\xc6\xf57K\xc9a\x01\xd2\xfeQ\xee\xac\xd6<\xf8\xc8\xe0\x9aT\x19\xaf\x05z\x16\xec2\xe4\xa7=~\xc1A\r\xf3\xb2(\x15;\xda"\xfb\x1dL\x85<\xc1\xb1\xc5\x8b\xa6\xf4\xf67\xf7|yn\xbaP\x8d1\xa5\x04j{\xd5=2L\xf4\xcd$G\xfd\xb3*\x9a\xdc\xa6\xc2\xce/G\xd9$[\x7f\x97\xefh\xd6\x13\xa4\x97I4\xd1n}\xa0\xc4\xf2\xf8\xf2b \xdf\x83C\xa8\x05\x80\xfa\xf9\x0cK\xd0\x01\x11\xdf\t\xc2\x04{.\xebu}\xc0\xad_}mv\x15\xfc\x07\xd5,\xeb\x98r\x80\xbayo\xf3\x964r\xdf\x1a\xb7\xa3\xca\xcb>\x0f\xea3s\x91\x96\x80\xa7\x86\x9cb\x16\x14\xbf\x9f\x08}\x06s<5\x06\xbf|\x9b\xe39\xd7\x13M\xa8\xea\x0b\x88\xcb1\xf5\xd1\x0c\\y=\xa2\x08\xacE\xdaUU\x17Aev\x03\xdfj/\xe4XW0\xfe\xca|\xd5\xa6K\x95\xef-\x1b\xe9i\x8c]\xd5\xb7\xb2\x9ax\x83\x1e9\xb6\xa1\x17j\x9a\xc3\xe8\xf2\xf8f[S\x9e\x90"\x11%\x86\xdc;\x16\xaa\xdb\xe5\xb1\x95\xea\\\xbd0k|KGz*\xfdW\x99\xd3\xeeT)\xf1gw\x0f\xed\xd0\xe9(?$\xfb\x0fn\xdc\x8c\x05\x80s\xc0YM\x05\xca\xae\xde\xc7\xcd\x1e!+\x12\x8bv\x15\xb4\xbcE\x88\xe0\xcd\x93 r\x96\xd0i\xaes$Gt\x8e\xac\xd1h\xce\x05\xb3NL\xd5\x00\xb8\xc3\x17%l\xcb2\xf2\xcd\x07Gv<v\xac\xff\x81\xc4\xb3\xa8\xac1\xbb\xbc\xcfR\xcf9\xf3g@\xa9\x84\xe2,L+>\r\xd8_\x11$\x92fnE\xcf\xb7\x90`\xf9\'7\x8bE\x84\xae\xe4\xab\xe0\xcb\xaaX\xe6\x11\n\xab\xd7\xe2\x8fc\xecz\xce\x8cR\xd8\x81\xe5\xd4\xe9e\xb8=\xefQ\xd9\x15\xb7\xc0\xb8I\x8d\x7f\xc5\x16\xc6\x0e\x1f\x85\xd9vz\xe1\x11U\x18|G\xf9[\x8am\xfe\xcb2u/C|\x8bf\xa48D\x98\xf9RU\xb1\xd3M!j\x14\x92\xcf\xe9\xa7\xdb\xdfj\xd0\xed\xad\xfd\xd3\xc3\xed\x05\x8a\x0c\x0b\xa7v\xa6|z\xb9w\x1d\x88"\\k\xbf\x14\t\x9c@j<\xcd}\x07\x90\xf4\x8c/\xa9:9\xdf\xce\xe5\xa2\x03\xfa\x0c\xe9\xbe\xfa\x90C\xc4\\\xbd\x84\xff\xb0\xb87%8\x14\xa0Oh\x1f\xe4Zi\x14\x1c\\-L+\x82\xfc!\xad8\x9a\xe7\x04\x82\xcd\xce\xec\x03\xce7(l\xc7\xa8\xae\xb0\x15\xd7\xfe\xee5\x87\xe2\x1e\xb9\x03\xe3\xac\xc0\xc8\xa86\'lt{|\xd6\x7f\x9b\xd26\xc9\xda]`\x82\xe3\x13\xe4\x10\xecrF[Y\xa8E\xe4\xee\x82?\x90J\x0c\x03\xfd\xba\xd1\xd0\x10w\x1f\xd1Y\xb7"sN\xf7\x8em\x13\xe4b\xbf\x9b\xf9\xdc\xb5\xa1\xe0(\xe8\xb1\x9e\x11\xcdj\x06\xa0W\xf8\x03\xc9\xe9}\xebD\xe4\xffvU\x9a\x18\x1b\xbb$\x1dw(/\xc0\xd95\x02\x93]\n>\xd6=Sk(=\x91\xd4&\x1e\xe9\tB\xbew$\xd6\xbb\xb5\xb8\xf4\x91\x03\x91H[\x1c\xf6\x0e\x11\xf6j\xda5\x91\x93\x1a\xd7x\xbe,\xcb\x16~\xb6h[\xeb\x81\x06\x86&=!?\xd5\xb8\xbet\x8b\xa7\xac\xe4\xf0\xd0\x04\xaa\xb9q~\'n\x03XF\x91*\x0b2\xce\x8a<V\xddd$~"\r\x1a\x8az.\xc9.\xb0\x1a\x9880\xf33\x81\xf3\xe6\x8b\x0ejT\xed\xfc8\x07\xcb4\xa26:\xc98F\xbaQYc\x95\x85\xd5Y;1\xed\xbc\xdc\x7f;\x1b&\x1c\xb1\x93K\xf0\x8a\xe6\xa7\xdai(uj|\xd0\x8a\x97\x93\xf1\x94\xf1WM\xf7\xae:\xffa\xa9j\x966\xa3O\x97=\x82IrK\xac\xc8\x1b\xeb\xa1\xdc\x12\xcc;]\xfe^v\xd5\x07\xbb\x9b\xef\xb2D\xb9\x9d\x81\xda\xb8\xe6h\xd3\x81K~\xc0k\xce\xc0\x0ee\xb9\x93\xa5\xfa\xfb\xd3|\x8bMp\xee\xe2X\xe6\xd6\x99\x8e\nC*\xa8\xafD8\xa3\xc5[u\x80\xda\xb0\x06\x03\x12\xf2\xbd\xafu[\xde\x18\n\t\x0c\xe2w\xf6,\x91\x9a\xbb\x19\xca\x9a\x1b\xf7\x83\x8b\xfd\xd7\x804\xee\n%\x06f\x82\x0e+\xfe\x17/-\x9e \xba\x87f\xe9\x80"\x8b\x08w\x1e2\xd3\x82\xef\xddI\xf8\x9cd\x04\x87,\x10\x8e\xb3F\x81B\xd1\x9f\x9b\x11n\xa0\xa4g`\xc8\xf3.F\x99\x03P\xcar\xb2M\x99\xdd\'\xafW\x8cg\x90\'\xa2e\xfa\xe7&\xe2l\x93\xffO\xc8\'\xdc`K\x98\x93\x7fM\xfa\xc3\xd4\xd4\xd9\x12\xa4\xa4^`\xdar\x1dc\xdfs\xed\x9c\x19~\x89\xc9;v\x90\x10R=r\xe1C\x99L\t\xc4N\x1bc\xbdxr\xf3II\xe1\xb9G\x97\xf0\xf0M\x10\xe7J\t\xd9#\xc91\x83\xb1}\xba\xcd\xb7`\xee\x02j\xac\xdc\xda4;xG;\x0f\x81~+\xee;\xd6k\x89\xa7\xa5l\xf3\xf6_\x1d\xef\xc4\x8d\xae\x01\x05\xf4f~d@"\x07\xea&\xc2TF\x82\x80h\x04\x1f\x94^\xac|\xd2\xe2P\xd7`\xf6\x1ad\\ufa\xc4;\xc6\x02c\x9a\x87)\xf7e\xe17K\xb4\x10\x8b\xb5H\x99\x0f\x7f|\xe7:\x87\x166\'*\x13{\x0c\xb8\x88+\xe3H$\xae\xbf\xae4s\xef\x9e\xf1\x1cXHewd|L\xab\xea,@V\x99d\xdf\xfb\xb8yD\x1dtk\x1eo\x14d\xf0Bv\x90\x1c`_\x8d\x82[\xaaE!f\x93_2/9_`6\x93\xbd\xd4\x0f\xad\xf4j\xe2\x99w\x80}\xb3\xc7\xd5\x85\t\xab\xb3&\xb1q]\xb8\xbd\n\x13\xb3In\x8b\x18p6\xbb\xc7\xcc\xb9"\x1c\xecf\xe7d\x97\xc0(\x98\x9d\xc6\xe2|\xa3\x87w&\x13D}^>\xb9S\xf9\x9c\xc4\xb9(\\!A\xeas\x1b\xcb}\x80^\xd1\x17Q\x96\xa4\xc6\xcej\xfa\x97\rc\xa28O\xff\xef\xaa\x14\'\x17\xfe*\xe1\xb2\x9e\xdc \x1e\x8ao4\xb1 Dz\xfa\xc4\xc6\xeb1x\xec\xb8\xbc\xad\x19\x1b\xe0\xbc\n\xed\x8a\x0b\xebAk\xfe\x1d5\tQ\x8f\xadp\x13\x18\x15\xfb\xef\xf3\xc7[\x9f(\xea0\xca\xb1U\xe9\xc1\xad\xecud\xef9\xd8C\x80\x8e\x81c<\xdb\x87\xac\xe8V\xe6\x07nO2\x020\xa6\x06\xa7\x95\x9egt\xa8\xa6wK\x9d\x8c\xb9&\x8bb6\x00\xfd\xef\x81\xc4\xb7\x03\xb9=\x14\xfc\xeeR\xe5"C\x84%\x7f\x166(\xc79\xdfI\xb2\xf9U\xaf\xf4\x86\x04\xfe\xb6B\x83\xe1\x03\xc6\x90\xc1\xff1M\x1d\xbb\xf9^\xaf1Yv\xc9J\x90R[O\xc3\x03\xf30+\x0f\xccP\xbe2\xca\xed@\xd9\xb6h\x01\x99\xd2\x82\xdf\x01,\xfd\x1f\x81\x19\x00)2\xf5\x87(\xfb"V^\xd8\xc6sS\xba\xda\xcc\x92\x97\xdc\x86j$\xf5W\x18@\xf4\xa4\xfe\xb5\x9b\x84c\xb5\xe1.\xbe\xb6\x17\xe7x\x9a@\xf6K\xd0Z\xc3Pj\xb14\xe2\x08\xe7\x0c\xc1M\xd9\xcc:\xafD=\x82\xd7\xb6\t\xe5\x91\xcd\xe9\x1cP#63\xbf\xeff\xe4,\xb0\xd5\x1c\xfbH7\xd2\x17@\xa4\x8aK\x0b\x81\x98\xc4VA\x9c\xddT-i \x8b\xad+d\tCU\xc4\xaa\xe2Sl\xc7\xe3\xe3\xb5\x92)\xa8R\x97\xfa0\x82\xad\xf1~\x1a\x96\x8a\xee\xba\xf8\xc6n\xecw\x16\xe6\xba]\x9e\x0f\x9e\xc5\t\x81\x0b\xaab\x89\xcfwP\xb8\xb8\xf3U\x98H\x0c\n\x02\xd3\xac\xbd\x15Q&\xb5\xa5\xda*\xcf\x1c\xbb\xee\x16\xbd3`!w\xc1rg\x8b\xa1$\xd1f\xce\x85]v\xe0\x12\x8a\xf64\x9f\xedQ\x037\xc3k8\x00\xfe\x04\xa9i\x9f\x10,\xa8\xdd\xae|o\xdf\xc4Ih\xc3\x0fGo\xaa0\xa07\\P\x8e\x14\xc2\xbc\x8a\x01G"\xbbL\x97|\xd1|@\xf6\xf3\xe8\x9c\xe0\xbd\xa0\xef\x17w\xd2_\x83L\x18\xaa\x9f>\xfb\xfb\x87\x07C\x9b\xfe\xa7\x99\xb6\xa1\x89\xd2\xd0\xb4\x80\x90bn\xaf\xbe%\xed\xc0\x8e\xd1\xc0\xb0r^0\xb4t\xc9q\x83\xa1\xb0\xd8\xe7\x00\xab(g\x84N\xb3\xd0\xa0\xb0=\xb1\xb8ov\x1eH\xd53\x83\x8d\xd7\xb0\x10\xa8\x82\xd7p\x8f\xbbQ\x92\r\xfaf\x89\xa4"\x8e\xd1W\xc5\xe0\xea\x85\x96\x8a{\xafn\x06[S\x12qz-pF}\xf7*\xae\x90\xfb\x02n\x82K\xa0\xc4\xff ?\xd6\'e\xa8\xc0lj\x81\xa8e\xe0N\xb1s\x80\x14\x91\x1c\x98E!\xc1\xcb\xcc\x82\xbe\xfcYq\xcc_\x9e\xa9\x12$\x8c71\x14,c=m\x924\x8f\xda@@\xfawU\'\x975\xe6W\xfbjk`!\xdc\xce8N\xb9I4\x80\x02\x84\xdd\xb8\xfck\xbc\xacn.\x820\xc7\xf6\x93W\xca\xa6\xaf\xbd\no\x9b}\xba\xb1s\xe7\xc8\x9d$m\x14\xc8?Y\x1e\x016\xf7\xc7t\xa6\x9f\x9cp+\x83M\xad\xdf=\xd9\xe2q\x9d\xef\x89\xf8\x88\x12\xf5h&e+\xad\x8a[\xe5\xc7/\x16_\xcd\xd4\xdb^\x16\x81\xc5\xc2I\xa7\x98\xd2\xb3\xc1\xf1\xc0\x12\xad\x08@\xde%\xd2/\x0b\xb0V\xb3nZ\x93o\x0f\xe8\x90"\x01P0\xd7\xec*\x8f\xe2\x18\x9b\x9eniJ\x10B\x17\x84(O \xfa\xf4O\xc1@(\x00\x13~\xa6\x1dB\xa9\xb0*X\xdb\x9a\xd2\x80\xa4\xfe\xd7\xaf\x91\xd1\x14\x82\x89\x05oh\xc9?D\xa1\x92\x18\x8d\xcb)\x1d\xf9pP\xf0\x08\x98\x97Wv\xbadQ\xe1\x18Iv70\xf6\xe8>1\xcbx\x9eP\xee]\x94\xdc\xd5\xc6\x07\xf9\x97\xfe?.\xeco}\xb3\xe4\x99\x1c\xc8\xa5\xda\x8e/\x05hG0\xc6\x9c\xe7\xdb7\x9a7\xd0H\t\xe2iO\xf3\xf6l>\x90\x98N\x18\x1c\xcbz\xfb\xed+\x1e@\x1f\xdc\xd0\xbbT\x83\xe0!O\xa3\xa8\xdf\xd4 \xe1\xb3\xe8R=\xdf\xbc59\x83F\x13\x0e\x19\xea\xac\xa2m9Bo\xae\x94\xc1\x12Z\x01\ty\x12\xbc\xd7\'\xb67n\xaa\xffo\x11V\xe9\x9d6\x99\\\xd8~\x89X\x01F\x19\x11>\x98~\xae\xa1=\xbd\xf9\x9e\x19\x85\x19\xa6\x83]\x90\xdey\n\x99rh%&SS$CE\xe7\xad\x8b0V\x16q\x8c\xa1\xab&,\x95\x99\xc7INE\x1c\x86\xf9\xc0 \x97o#\xf1n\xdf\x10\xfd \x1fA\x1c%\x10\x07u\xad\x90\x02"\x1eBT\xf3 d\xf7I\\\xf3\x84\x95(\xb1\xb3\x80\x17\xac\xf7\x8f\x02x\xa3\r\xa4\xec\xf7i\xbb\xa7\xf2\x08\x8a;\xc5-\x8d\x9d,\x1a\xc3ey"i~\x9e\xadL@\x05V\xa7$1\xaeB\xbb\xeex%]\xe4!l\x86\x01\xf4i\xcb)3\x99\xf9n3\xf9\xa6K\x98\x8d\xfe\x04\xa6\xc3\xed[^[?\\\xf2L\x0b\xc5\x1d\xeb\x8f\xd0B\xaa\x0f\xf3\xbd\xb9\x8bF. *\x0c?\xf4\xf8\xaa\xbe\xb2\x06\xfa\xa22J\x90\xa8\x10\xc7\xfb\x90\xe9I\x99\xde\xe3\x83\xc5\xcd\xa7E\xc6E\x1ay7\x86\x85\x0fX\x01\xc8\xe5\xbe\xc5\xfc\xce\xb1\x17\x00^\xe8\xe4\x82 C\xdc9(\xe78\re\xb1\xcd\xfb\xf44\xed[1\xf9!\xa3;\xb0x\xa2\x11\xddiR\xcb\xce\x17&T\x88\xa2\x8b\xca{\x83\xe7.B\xa3u\xe7\xaaE\xde\x19>W\xb0\xdd\xf5.0\x06\xe7C^\x87z7}\xc7\xab\x1c\x0b\xf7[v\x04\xc5\x8f\xdb\xc0\xd1\xa7\xa5Z9\xf5\x16\x9e\x99\x98\xe62\xcdv\xc2=u&w\xc9\xfc\xabi\x93\xac\xbeA2\x07\xf9S<Gq\x9e\xb28\xf8\x97\xa3\xc9n5\x9b\xfb(1\xb7\xb9\xb9\x93\x91\xa6\xad\xca\x7f\xfa\xf2\x11"%yH\xb2x-\'\xe0\xb9\x84\xdbS\xf6\xbaF\xa11v\xa8\x8f\xd6\xd5\x89\x99\xa6Ab^\xcd+\xb2\xeby4\xe2\x06\xfd\x84\x81\xe8h\x06\x97K$\xe3DR\x1b|\xb1}g\\\xb4@\xec\x9c\xd0\rC\x15}xL+z\xac.\xc6R\x9be\xa5u\xa6{\xc1\xcf\x17\xbb\xb3\xdf\xb5\x060\x8cD\n\xa2\x00\xa3\r\xf2\xf6\x04S|x\xcb\xad;j\xa0\xd9\x10:\xca\x02FZ\xc4U\xa2\xaduI\t4\xa4\xdf\x14\xc3\xc1o\x99]\xcb\xccv\xeaN\xc5\xde"x\x058axW\xb7\x8fH^62\xa1\xb9\x0e\xcb\xe3\x0e\x90=\x8b\r3?\xc8e\xfe\x02\xc4\xc5\xa0\xa0\xffT\x16\x13\xf9\xe1!P\xf2\x13\xc6m\xc4\xc6\xae\xd5\xa1b\x85TJ\x84o=~^5\xdc"\xec\x1a\xf2-\x01\xed0\x8c"\xa9\xf0\xb4E\xe8t\xcc\xa0\x02!\xe1j\xee\x9bF\x97)V:\x10F3\xcc\\\x01\xce\xc3_\xff\x11\xa9\xa2\xa3\xcb\xb7\xb0|\xc2\x99\x901Jk\xda{f$\xb0\x89/\xe8\x9e\xcbEY\xab%\xa5>J\x9co\t\x13\x9f\xdf~\xfa\xfa\x1c\xd0,\xd2\x83\x85\x1d\x8c\x96g\xf0J\x07\xd6\x93i\xd3\x9f\xce\xe5\xa7b\xcfv\xfc\xa7\xe4 -\x10Ip\xe0\xb0O\xb8pQ\x818\x84\x10\xb9\x95:\xa0\x975~1\x1f\xb4z\xe0z\xb7\xaf\x87/p\xb4\x03FK\xcd\xd1XD\rM\xd6\xf8?\xbe$K\x1fG^\xf7\xc1,\xb8\x99W\xa7\xb6\xdb\x95\xdf\xf3\xc8\x06|\x1b\x84\xab\xb7\xa6\x87\xb9\xfd\xa8\x9e&D\x84\\\xe7B\x14\xaaf]\xf0V\x1a\xf4\xb5\x106\x19\xc0\xce\x18\xf2\xa7d\x94\xb5\x1c\x81,\r\xe1&:\x19\x7f\x92g\xfe\x17diX\xb7\xa4\xf8=\x07T\xd1\x83Y\xdb!"\xbc\xd3H\xbe\x87\xf0\xae#\xfd p\xbc9\xf4z\x8bn\xa5h\xee+\x17J \x05$`T\xe1T\xd7.\xae\xca%_@\x1d\xa9\xe6\xc7\xe9\x939P=\xa5?\xeb\x08\xd1b1>6r\x1f\xe8|\xa5\x8e8K%\xa8\x8d>\x99\xfc\xda\x1c\xee\x86\x9eb\xdcRF\x9aK\xde^\xb2\xe5\xf6\x15\xa8\xcf\xd5\n\x103}\xa5\x84S\x0b\xed\x11\x97\xd4\xd4\xca\xdf\xe9\xcaN\x18\xee\xd4\xf7\xee\xac\xd5\xeb\x83\x8b\xcf{\xbcb\xa0\xc7\x1an\xa1\xbb\xac\xf0\xc4\xd7\xddo\x13|`:\x11X\x9d>\x17\xd1c\xdd\xd6\xab\xc7g\xdf\x0409\x90:\x84\x88D\x9fm\xfc\x0b\xf3\xf8&\xf4\xdd\xdb\x9d\x14\xc3\x1bfF\xf6A\xeb\xa8\x03\x8d`\x8c6\x8d\xbf\x1b \x12\xab\x1e\x13{<\x08l\x1f\xb6\x1f5\xa9\xa1]m\x1c)$`\xb6\xcd\x8a\t)T9)<\x14\x84>&E\x8e+\x1b\x91\xb3n}\x00\x81\xdc\xf6\x97R\xfe\x1a\xab\xa4\x90\xbbr!\x98r6\xc1\x89\xd1@\xe49\x81\xf7\x83\xb1P\xe4\xbe\x04\x9d\x0f\x13_2\xf9\xc2=\xd1^}\xbc\xce%g,O\x0c\x0e\xf7{\x89\x877\x86\xa3C\xc0\xbczj\xab\x87\xc0\xea\xec\xa3,\xbf\xaf\x1b\x87\x88\xf8\xb6\nV\xf1&\x04bs\x1a\x16\x06($\xb5\xe5\xe6\xd5\xbc\xcdw?\x8bAa\x8a\xd2\xae\x7f\xc4,VYq%\xbf\x9f\xea\x99\x80:\x15\xc7){\x8e~\xb7\xf8\xb0\x0cH[\xd7\t\xb1\xa0\x18C\x10j<\x9a\xd0\xafR\x7f\xe5\xd2"\xf4\x9c\xad\xf80\x03k\x0eB\x94n<5<\x07\x8b\x05\xda{\x8e,\xddm\x92\xf3\xef\xd7\xcbV\xd1\xc4$\xc2\xdb3\x92\xd8\x8a\xdc\xbe3\x88\xc8\xa2\xd6Hf\xed\xfb$j\xae\xd9s}BV=S\xfd/\x1b\xcd\x88d\xef\x14\x16\x82\xb5\x90\xcd\xde\xc2\xca\x88\xff\xb0\xfc\x17\xbc\xf7\xa9\x14\x0e\xc9\x1c\x0e\xdc\xb3\x882\xde\xef\x97&\x0b\xb1\xfe\xc8\xfa\x94\xba-\xcfw%A\xa9e\xa0\x13\x1f\x97\x87\xfb\x89\xba\xf0*\xea\xdb\xb0\xb487YXB\xab\xd1\xc6s\xa7\x9ec\xab\xb3\xe1\x8b\x1e=r\x02B\xa0\xd7\xd2\x1d\xa7\x07\xf8\xf9C\x7f\xcez\x03VH\xfb"c\xc0\xbc\x86\xb8E\xce\x8b\x99\x0e\xf2\xb1C\xcal\x9fg\x02\xbe\x0b\xcaJnx\xcc{u\x12\x8b\x9d1\x08\xb4\x13}y\x90\x9a\xaf\xde\xe7\xe4]\xe1(\xe5\x03\xecr$W\x8dV\xcd\x9b&g\xbf\xbd\x97\xe0%T\x82\x1a\xa34Q\xde\x97p\xef\x1f\xac\xd4m\x85m\x19\xd3\xba\x0b\x84\xa1#A\xab*\xbe8Z\xf14\xfdf\xa4g\xad\x8d\x7f\xe7\xb2\xff\xc1R\x97\xe5\xb2\xaa\xdd\\\xc5=\xda\xf4\xce\x06U\xc3G\xdcY\x1c\xeb`\x1e=\x18\x17\x18\x1d!\xa4(lZ\xdd\xc6\x1f\x1a\x7f\x11\x1d\xb1\n\x9b]b\x9c\x83<\x11?\xc6\t\x1b\x9cD\x8c\x93\x15%&\x00\x9b\xabz\xa6\x1aYP\x1aC\x91\x96z\x11\xee\x16\xba\xd7\x003B\xf4E7\xa6\xe2\xec\xb2\xc8\x00\xc6\x0f\xb9\x8d8\xca\xc4\xbc\x11\xb7g\xde\xa1\xef7\x1a-\xfa\x1fO\xc4\xbc\x8a9\xf2\x0fJ\x89\xca\xf2\x84\x1e\x04\x18\x80\x8f\x92\x1b\x08\xb2a\xc9Gv\xf7\xf3\xd1\xdc#\xf3\xdf8\xcba\xa7\x91TV\xf8B\x1e\x88\xde@\xdd\x805\x19\\\x84\xe8\xfba\xbe\xe1l\x97Ge\xc6\xf9L\x0e=\xe5\x9e\xd5lo\x05\xc1]4 \x1f\x11\x98*9z\x15{\xb1!H\x03\xcf\xc2\xa2\x91G\x80@\xe1\xb1\xbe\xec\xac\x17A)\xf0\x00A`\xc9\xc4wi\xe5:c\xcf\xa9\xd7z\x92"\xdb\x96/D\x12J\x125\x1f\ns\\\x83 \xb0V\xed]\xe5R/9\xa3\x0b1\xd7\xceD\xdfAW=\xb8\xf3a\xdc%\xbf\xd2\t\x17\xa7\xbaW@}T\xe3\xf2\xcc\xd0^w\xe1Q{\xcf\x8d\x1f\xc2\x82\xf1&a\xbe\xad4\x10}\x9aL\xad\x1e\x0cO\x1c\xdb_\xff\x8e\x05\xe6\x9e\xb0\x7f\xe611\x80P\x87aY>\x00\x02\x15%\x89?M\xdan\xf1h\xa2\xf2\x92\x17r>\x1d\x05\x11n"XPdF\x9c\xfc\xea\x10}\xcdd"\xcd\xfd\x10\x03\xe0ik\xa0\xd9\x86w\xf6\xa9c\x82\x08\xa10\x19\x18\x1e\x86)\xd3\x84\xda\x08\xb5\xa3\x80%\x17\x9fA\x9cBi,\xe0J\\\xf0\x1b\xaa\xe8<\xf98\xe8HX\x01h\x89/\xd8\xc0\xeda0B<\xbf\x00!@\x9f\xed\tjz\x12\xe7|\xbdcl\x80\xfb\xffIs\xe9\xb7\xd5=x\xf3pbP\xa8+\xd0~ \x99u\xf4\x98k\x92Z\x8a\x08\xd8i\xa8p\x00\x80\x90\x88-\x15~\x18\x80%=>l8\x9e\xef[\xac;]\xb6\x8f\xbd\xc9.\xa2\x12\x99\xb2J\x13i)\x12\xb3\xcdCm\xe5\x95\xa1\xe9\x05\x05t\xbcO\xc6\xe9\xec\x7f\x8fb\xb8\xcc\x06\x96\x92z\x10Zg\x9b\xf6hz\xe7\xf0\xcc\xf4(\x19\x84\x1d/0\x97@\xee\x0b\xa4\x13\x1dN\xe9=\xda\xd5\x92W\x04~6$-\xff\xf3vk\xae7\x93@\xa1\x91\x84\xbc\xfd\x0eyb\x0f.\xebI4\xa5\xb4\xf7s\xfe\xc3\x06\xf8,\xe1\xb1\xb6Z\xa3\xbb\xf5L\xc7a\xb9\x96\xb8\xf9\x1f\rd\xa9V!\xe9A$s\xa2(\x16\xf0\x03\x8a\xed\xbcA!\xc6* BZ\xd3tHDO\x8aK\x04\x9d\x88\xc0\xae\xcf#\xf8\xd2_\xfb\x93H\'\xa1\t\xf2vi_A"\xe3\xd9\xd6\x1a\xc5\x9f\xed\xc2\x84\x97\xd1\xf9\x19\x83]\xb7\xaa\x05;\x93\x9f\xa1{\t}y\x80{\xa3\xfc:\x0c6\xb6\xa6\xa6\xac\xa7<\xf3\x82\xef=\xd7{*\x9e\xc4\x04L\xe0\xaa\xa6\x9b\xb2\xd5\x91\xe1\xff\xc3\xa2\xea(L\xbaA~a\x06\xbe\xb80V\xd1N\x1f\x9bk\x91\xc4_0\xc8vFH\x91\x1c\xc5\xb2]\x1e\xcd\xd1;\xeaD\xd5\x94\xee\xb1\xbe\x05\xfa\xac\xfa\xf6\xa8\xf2\\\xe1h\xc0f\x8b\x03?[\xee\xae\xb6)\xc8\x15^\xc8\xae#\xae\x91\xafjAQU\xb4\x1e\x16\xbf\x05\x95\x85E\xa9\xa1\x10\xc5\xf7\xfbC\x8b\x00N\xbb\xee!q[\xd6r\x95\xbe\x8b\xfe\xc0A\xf2')
1
+ import xtlsapi
2
+ from hiddifypanel.models import *
3
+ def get_xray_client():
4
+ if hconfig(ConfigEnum.is_parent):
5
+ return
6
+ return xtlsapi.XrayClient('127.0.0.1', 10085)
7
+
8
+ def get_enabled_users():
9
+ if hconfig(ConfigEnum.is_parent):
10
+ return
11
+ xray_client=get_xray_client()
12
+ users=User.query.all()
13
+ t="xtls"
14
+ protocol="vless"
15
+ enabled={}
16
+ for u in users:
17
+ uuid=u.uuid
18
+ try:
19
+ xray_client.add_client(t,f'{uuid}', f'{uuid}@hiddify.com',protocol=protocol,flow='xtls-rprx-vision',alter_id=0,cipher='chacha20_poly1305')
20
+ xray_client.remove_client(t,f'{uuid}@hiddify.com')
21
+ enabled[uuid]=0
22
+ except xtlsapi.exceptions.EmailAlreadyExists as e:
23
+ enabled[uuid]=1
24
+ except Exception as e:
25
+ print(f"error {e}")
26
+ enabled[uuid]=e
27
+ return enabled
28
+
29
+ def get_inbound_tags():
30
+ if hconfig(ConfigEnum.is_parent):
31
+ return
32
+ try:
33
+ xray_client=get_xray_client()
34
+ inbounds= [inb.name.split(">>>")[1] for inb in xray_client.stats_query('inbound')]
35
+ print(f"Success in get inbound tags {inbounds}" )
36
+ except Exception as e:
37
+ print(f"error in get inbound tags {e}" )
38
+ inbounds=[]
39
+ return list(set(inbounds))
40
+ def add_client(uuid):
41
+ if hconfig(ConfigEnum.is_parent):
42
+ return
43
+ xray_client=get_xray_client()
44
+ tags=get_inbound_tags()
45
+ proto_map={
46
+ 'vless':'vless',
47
+ 'xtls':'vless',
48
+ 'quic':'vless',
49
+ 'trojan':'trojan',
50
+ 'vmess':'vmess',
51
+ 'ss':'shadowsocks',
52
+ 'v2ray':'shadowsocks',
53
+ 'kcp':'vless',
54
+ 'dispatcher':'trojan',
55
+ }
56
+ def proto(t):
57
+ res='',''
58
+ for p,protocol in proto_map.items():
59
+ if p in t:
60
+ res=p,protocol
61
+ break
62
+ return res
63
+ for t in tags:
64
+ try:
65
+ p,protocol =proto(t)
66
+ if not p:
67
+ continue
68
+ if protocol=="vless" and p!="xtls":
69
+ xray_client.add_client(t,f'{uuid}', f'{uuid}@hiddify.com',protocol=protocol,flow='\0',)
70
+ else:
71
+ xray_client.add_client(t,f'{uuid}', f'{uuid}@hiddify.com',protocol=protocol,flow='xtls-rprx-vision',alter_id=0,cipher='chacha20_poly1305')
72
+ print(f"Success add {uuid} {t}")
73
+ except Exception as e:
74
+ print(f"error in add {uuid} {t} {e}" )
75
+ pass
76
+
77
+ def remove_client(uuid):
78
+ if hconfig(ConfigEnum.is_parent):
79
+ return
80
+ xray_client=get_xray_client()
81
+ tags=get_inbound_tags()
82
+
83
+ for t in tags:
84
+ try:
85
+ xray_client.remove_client(t, f'{uuid}@hiddify.com')
86
+ print(f"Success remove {uuid} {t}")
87
+ except Exception as e:
88
+ print(f"error in remove {uuid} {t} {e}" )
89
+ pass
90
+
91
+ def get_usage(uuid,reset=False):
92
+ if hconfig(ConfigEnum.is_parent):
93
+ return
94
+ xray_client=get_xray_client()
95
+ d = xray_client.get_client_download_traffic(f'{uuid}@hiddify.com',reset=reset)
96
+ u = xray_client.get_client_upload_traffic(f'{uuid}@hiddify.com',reset=reset)
97
+ print(f"Success {uuid} d={d} u={u}" )
98
+ res=None
99
+ if d is None:
100
+ res= u
101
+ elif u is None:
102
+ res= d
103
+ else:
104
+ res= d+u
105
+ return res
106
+
107
+
108
+ def hconfig(a):
109
+ pass
4
110
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
111
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hiddifypanel
3
- Version: 3.0.0.dev63
3
+ Version: 3.0.0.dev65
4
4
  Summary: hiddifypanel multi proxy panel
5
5
  Home-page: https://github.com/hiddify/hiddify-config/
6
6
  Author: hiddify