hiddifypanel 3.0.0.dev64__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev66__cp39-cp39-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 (77) 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/clash_config.yml +1 -0
  58. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  59. hiddifypanel/panel/user/user.py +233 -3
  60. hiddifypanel/static/css/custom.css +6 -0
  61. hiddifypanel/templates/500.html +1 -1
  62. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  63. hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
  64. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  65. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
  66. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  67. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
  68. hiddifypanel/xray_api.py +109 -3
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
  71. hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
  72. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  73. pyarmor_runtime_000000/__init__.py +0 -4
  74. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  75. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
  76. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
  77. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,130 @@
1
- # 2023-04-08T16:23:20.878732
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x1b\x1e\x00\x00\x12\t\x04\x00\xa5?-\xc9\xe0\xef\xcf\xf6\xfd\xe5\xd4\xef\xa5S\xee\xf9\x00\x00\x00\x00\x00\x00\x00\x00\xb4\xde\x102<\xd1.\xb7\xa4.\x84\x95\x15\xf5\x0f\xcb\x16av--\xbc\x9a*3\x1b.\x0b\xa4\xdc\x1d\xfc\x9d\xe3\xaa\xbb\xc3Th\x9e\xf3\xec\xc7\t\x16\x9a\xc4{}KF\xdd\xe0\t\xdbHID\xa3\xefq\xa0\xee\xad+\'J\xd3\xecSg\xfa\x94\xd2\x14\xdb%\x8a\x88AVp\xa5v\x05\x8c\x1a\xae\xae\xa5\xef\x98\x1dB4F\x86XQVx\xe3V\xd9\xd3\xae\n\x1e\x9b\\\xfe\\V\xea.\xb7d\x84%7%7\xce\xb69t\xafb\xce\xc8\xb8\xc8\x0c\xfd%IL0\xbe\\\x8f\xd8\xfa\x99;\xf5\x15*aF\xc6\x81A=\xbe^+\xd6\xbc\xd4\x07\xce\xd9\x1f);\xe0\xbcrW\xdat\x92\xe2\xe0h\xe2\xc7"\xca\x12\xf0\xa9y\xbf\xa1\xc3J\xdd3\xfb\x0e\xba\x8c6Ov\xeb`\x17\xc63"\xb8\xebP\xf9\x00b\xf8]\x865\xcb\xe46O\x17\xf1 \x97\x83\xb2\xe3K\x8f\x0e\x04\xd3{tt\x0bX\xa8Pw\x1b\xcd\x8e#\xcf\xc0\xe4g\x1eh\x0c\xb1\xd5\xc1"\x98@&7\xc0\xe4W\xc6\xd7e\xe8\x10\xb5\x94\x87\xf4\x92v\xd6\x92pG\xf8\x125~\xda%\x04\xcb\xe6\xcb)\x16*{\x8c\xa7B\xee\x18\xa0G\xdac\xfd<C7?\xa8\x13LD\x87C\'\xa3\x07\x04\xb2\x90m\x17\x04\x01\xa8D\xac.\xd0\x1f\xbb"\xcb\xe19\xce\xe2\xaf+\xe5\xb6\xd1\x8d\x04fU\x0b\xa0@\xd1\x81\x9b:\xeb,\xd0\r\xfe\xe5\xaa\xc2[\xe6`s\xe6\xb1 \xe5F\xbdo\xb2\x95<\x07\xa3\xe3"\x8fC_SpT\xa8}\x1b\x95U\xc2\xb5E\xad\xfb\xfckx\xfa\xadHt\x8b\xdb\xd7Q\xe8>x*\x89\x8e\x0cP\xed\xbb\x124\xaeU\x8d\xc4\x01\xd9|\xac\xcd\x10\xd1z\x0cy\xa1\xb1Q\xe3\x8b\xb1<pv\xb6\xd9\x85K\xa6o\xf9\x98\xe3\x89\x83\xf2\xd8\xfe\x94\x0c\xf5\x0c\x80\x00\xbc\xae\xfe\xa4\xbc9\xf7\xd2\x9b\xc6@\x9a\xa1\x14\xf3\x19\x9d\x96>[ay}\xf4\xa3.\xf9\xb0\x9d8\xf1\x8a\xaa\x89]\xf4\x7f^\xae\x0cZ\xee1\x9b\xb8 \n\x98y\xd29e\xd1\xee\xf1[\xe3\xcd&`\xbf\xbe\xech\x97\x1e\xfat\xbf\xec?\xfa\x13\xa6\xcd\x9f\x00\x00\x01\xb2g\x1d*\r\x9aQ\xb3\\\x02)S\xf7O\x11\xbe\xf2Q2`\xcf\x05\x9f\x03\x16)\xa6\xae\x89g\xc1\x87?\xd0!\xcaJ\x88\xdb\xd9\xaf8\x805\xe8\x8d\xb5\x9cys6\x16`\xb9\x16b\xe8\xf4K\x10\xe6\xd1m\x90D\xd9\x9b\xb1\xcb?\xe6\xa3\xd6\x981\xb6{P\xc0\xfd\r\xedt\xe0~\'\xf6\x16f{\x87\x14\xda9\xb8;\x9a4\xfe\xf0\xba\xe7\xc8\xc4\x04E\xe6\xd9\xd9\xf60\xde\xcf\xaa\x9bO\xab\x80iO\x11\xa0\xca\x02TPl\xbd\x8d\xe7\xd1\x13\xb6\x9fW[\xd0\x11\x8c\xde\xef\x8e\xf8\x9bs\x02\x86\xfb\xa9\xd8\xaf@\xedCYk\x82\xba\x08\x9e\x0br\xd4\n\\dhb\x1a6\x1e\xa2=\xfb\xa4\xa0\xeb\x02&\x13\xea-$\xf7_\x96N\x87\xcc\x8c<\xb7\xa9\xd8\xdc\x96w=\xcd\r\xba\x14\x8bH\xa7$z\x05\x85\x8a|\xefC\xd43\x9c\xc5\xc2\xcc\xe22\xa2\x08\x05\xc7\xd3\xd8un[\xa5*h\xdc\xde\xb4a\x9az\xa4\x91L\x9d4\xb5\xac\xcc\xbe7\xce\x12I\x9e\xab\'\xe7l \x94\x06\xa9\xd2B\x89=\xe8\xf5\x9f\x85\xaf\xcc\n/eR^1\xbd\xfc4\x07\xd3\x08\xb4\x93\x84\xe6\xe9W\x85\xfe\x90\xa7!\xad=[\xae\xf6Xt\xf3\xef\x85\xd9\x9a\xb0c1\xc3\xf4\xe3\x10\xfa^WBE\x03\xca\xbe)\xdcY`\x91\x02\xc5e{\x96\x12Y\xc3\x84\xe5\xb6IBJ\x8d\x84\xfbSL\xaa\x9c0\x1e\xc2\xb1H\xb8y\xaa\xea\xd3\xf0\xaes7\x1e\xab=\xc2C\xbc\xfd\xa1^3\\\xb1\x1f\xaa\xf2z\xb3\xe2\x08\x05\xe6\x8a\x96b\x92\x87\x93r\xf0\x87Q~w\x7fq\xd01O\xaf\xc8\x96\x0e\xf6:\xbc\xf7=9I\x94\x1c8\x1d\xa6\xcdB[\xd3\x9bl\x93\x86\x1d+\x80\x13\xa7B\xa4\xf5\xbf-\\B\xc8\xda\xc5Ys\xda\x86\xded\xffv7\xfa\xf2\xea\x19\x97\xa6\xd8\x9f\x12x\xc9+\x1d\xcadO\xe3J\x89\xeb\xb1\xden\xf2\xdd\xd3:!\xa2(\x92\xdf>\xf1\xea\x08\xdb\x9e\x9dWf;Z7Q\xe0\x1a\xad\x0b\r\xea\xa8K\xdfB\xe9\x7f\\\xa3?\xe5\xb8n4\xd5\x80\x8f5E\x86\x95Z\xb2\x9a+\xdb|\x7f\xc9m\x97bj\x93\xba\xd8\x1c_\x0fp7;K\x85\xd4\x15qnG;[/`N7k\x8b\x03\xe8\x83\x85\x04i\xfa\x859\xea\x8b\xd0!.hdc\x80H&ul\xa6s\x86\'\xf3]IH\x00\xfe\x98n\xd7\xdeC\x92\x1f\x103}\xef\x8c\xe1<\xfc\x11\xa9\xab\xc1Z\xcaO*\x8a\x82\xee6\x03x9\x12\x12\xf9\x9f\xef\xe7\xc5\x1b\xe8K\xe0\xaf\xab\xb5P\x9e\x04E\x80\xd3\xb3\xdf\xb0\x90\xe9\x83\xcc\xee\x16a\x96\xc4\xe0\x0f\xab\xb6\xb1`.\xfe\xfa+\x8db\xcc\xdb+\x81\x91\xc9\xc0\x8f\x97\'o\xaf\xd1=XN\xd3\x83><e\xae\xc2\xdd\xc6\xf6o\xd9n\xb7\x97T\xe67\xc0\x9d\xf1h,\xaf\xd1\xa5\xc8\x83`h\x14M\xff5\xa3l\\\x03M\xb5M\xd8\xaa\xdb\xd6VT`\x83\xa8\x01\x95\xff-\x99\r\\\xb1\x15=\xf8~\x93\xb4bj\xf2\x1a\xfdp\xb3U\xe9)\xf4X\xaf\xccW/\xd1\xfc^\xecY\xb3\xa9\x1f\xfbH\x0b\xc0\xf0\xcb\xcf\xd1\x9a\xd9\x8f\x8dP\xa7\x8f\xf7\xa5\xd6\xb5\xd7*\xd1wX\x8f*\x19?\x13\x13\x8b\x94b\xef,\xf5Q\x9d\xbc\x12i\xa0\x1a\xfd\xc8a\x99e\xc9\xd0r\xf7bMy\x9e\xad\xe7H\x9e\x97\x04@MH\x17\x1a:G\x9b#\xe3j\x99}Z\x16\'\n\x8e\xd1\x8f\xb0u\x06"\xd73w\xa4\x1f\xd9\xa9\x94\x0bia\xfbHg\xc4+\x12\xbc\x1a\xa9\x1b\x9ck}1e\xa1\xa8+\xd5v%\xc2\xa2\xcd\x1b\x03\xb5k<\xdf\xdf|\x08K\xe8\x8f\x12\xb8\x18!W\x15\xfd\xad\xb7!\xf6D\'\xeaN\x91s\x9dif0\x9b\xb3\xcb 2\x9a8\xbe\xd8Z\xa3\xf8\t.\x02L\x8d/\x1dTe\xa4r\xd6D\xf2\x901\xf2 F]D\xa6+}\xcd\x9d\x94\xc2\x19\xb4:\xe9\xeb\xfa\x90U\xd3\xd0p\xc4\x82\x8f\xe1\xc8I\xf0\xba\xecHhL\xb7\xd8\t&\x19\x1d\xec\xf7Js\xbf\xd5\x1e\r\xaf\r\x92$\x97|A\x17\x9a\x18FOr7kI\xd4A=\x1des\xfd\xa3\xed\x8f\x80\xd3\xb2&F\xd2\xdd\x86~\x17)\xb1\xed\x89!,y\xb2\x885W0\xaa&\xa3\xf7\xd2\xaf\xe9E\xe8\xc2=\x19\x96|\x90gx\xf8\xef$F\xaa\x9c\x0f\xa3\xd2\x8d\x17\r\x02af#\xc4\xc06\xc4j\xe9[\x14L\x8cx\x98\x8b\xf0\xc1\xb3\xf1\xd9~\x19d\xad\xbf\xa5B\xb8\xd1\xa0\xbau\xeeiT\x82*Xd)\xa2\xd5\x10|g\xdd\xa5\xf1\\L\xbe@H\xfa<5C\x82\xf6bb\xb1<hn\xe6Y\xf2\x9a\xfeu"\xa3u\x7f\xab\xc9\xa3\x9a\x92\x8c\xc2\x88\xc9\xd7\x9d\xc4\xf8xF\x92\xc1\xa7\x1c\xfbr5:*K\xdf(\x04\x8a9\xday88\x91\xf2{\xd4\xdcn\x10\xeff\xc2\xef\xd3\xda\x99us\x83\xfb\xa3\x10\xc8\xad\x9d\x15\x9c\xd2\x16%<\x1bj\xfb\xacM\x9dPx\xdc\xe3\xa3\x96\xecy\x9b\xd5\xdcq\xc6\xe6\x8fVh\x0b\xe2\xef\r\xfbf\x0f\xb7! \xff\xf3\xc7\'\xa8\x0e\xd2dV\x14\x88@\x02MHE\xf6`\xcb.\xba7\xee(\xa7`\xcf\xaej\xbd\x80q-\xc49\xdf\xa7\x8e\xdd\xd8\x13\xec(\xe5\x9a\xa2\x17cI\xfeO\xe2\x82\xe4&I\x9c\x89M\x7f|cO1\xb4^O\xc2\xd5\xa8Y\x968\xb0u9\xc8D\xaf-\xf3\xf0\xe9"o\x05,kT\xe0\xd1D,\xc3G\x7f\x82\xed\x80\xce\x8a\xe04l\xb4\xeb\xa1\xb1\x90q\xd3\x86\xa3\x7f\xe6\x9f7\x08\xf3\xed\x17lGy->\xec\x89\x11\x82U\xb0L\xff\x8ez\x18H\xc4o\x12\x8a\xcd\x85\x7f\x9e\x99\xd5A\x95\xd4\xd7\xa7i\x9eJ\xc4\xd9\xd7\x99\x87\xc2\xdey\xe4\x0c \xac\x05\x16\x8a9\x83\xae\xe5\x96;\xb4k6a\x8fW>\xb7\xb8\xec&\xbd\x8f\x17\xaa!\xf9a\x14J\x1bT\xbd\xdd\x18!u\xf2F\xe8\xd7Y\xf0/\xec\xd5\'\xe6\x80\n6\x16\xc7Gi&LEY\xb1\xa2\x06\xb3\xd0\xd4\xaf\x00\xfd\xb1l`\xb83\x188\xffD\x9c\xb4\x96d\xcf\x85\xe4\xd9^\xcf~S1\xde\xf9\x0bl6\x92\x8dP\xa1\xed\xe4\xac\xa1U\x16\xb6\x1cY\x071\xe7\x05\x1d@\xab\x1d\x98E\xf2\xa2{\xbe\xb0\x96z\xebQ\xbe\xb3Qq\xc9\nT\r\x1e\xb4\xd7GD>\x8fL\x86F\xb5y\t\x82\xfb&y\xbe\x9b\x0e\x0f\xcf\xdc\nj\x03^B\xa9a\xd3\xa8/\xa8\xcd\x8b$\x8e\xc4\xaa{Fc\x9eK\r\x983\x16!po\x1a\xf3O\xcee\xd6],ZS\xc38\x08\x14u\x1d\x04Q\x8eu\xe0\xb8\x1dZ[`\x8c%%\x87K\xb0\x8f;\x9b\x88\x9b\xf3\x92\xf0\x07Ir\xdb\xd3A\x8b`\x01\x1b!\x18J\x04\xab\x86\xe5);\x1bw0\xde$\xe7Q\xf5\x1e\x10\xe5\x92\x92\xb4P\'N\x07:#h\xb6/\x8e\x9d\xf7\x1b\x08\xb8\xa1m\x95%\xda6\x8d\x96h\xf5l\xb8$\xf0!\x96P\xf9>\x96\xd7\xd1\xdd\xeb\x82\x9a\xd3\xd1\xb1\'uM\\hn\xc6\xcf\xad\xd4B\xb1<\xebs\x9a\xe5p\x048\xf5\x04\xb8\xfc\x19ag9\x85\x8d#\xc2cf\x7f\x00\xe7\x93\x8e\x1b\x9f\x07\x7f_\xff\xbe\x01\x83T\x8b\x19\xa1\'\xc2\xe5\x92l\xa4\x83\\\x05\xdd\xca\x9db\xefd\x14\x7fY\x13\x98\xb1\x1a+J\xcd]\x84u\x81\xac\x99\x04\x05\x8ct\'Z\xea\xcc\xf4\\\x91\t\xba]\xc3fU\xdb\x9c\xb5\xa5@\xec\xba\xc5\t)|\xd5\xe2\xf3\x01\xa5,\xdc`\x10\xd4}\x8f\xf7\xd1,\xf5\xd8&&\x96#N\x12R$v\xce\x80\x8d\xf9\n-\x94\xb0\x87a\xb6R\x86\xd59\xfe\x90N\xbf\xed\x80n#\xa3\xed\'\xd1R\xda\xb6#4/\xc9\x1b\x99K \rG\xe2\xfb5\xc6\x19\x07\xd2\x13\xe3\xaa*n\xbc$\x8d\x12C\x1a#\x05jS0\x89(\xfa\x88\x1c\x81\xb3\xfd\x08M\x86\t\x1e\xad\x7f7Q\xcf\x8am\xdc}\x023\xe3\xc5\x92\xd7\xc30!\xe6\x19\xbd\x8ciQ\x93\xf0\x17*\xbf\x90X\xf0\x08}\x11\xee\xeb\xca#\x1e\x01 Q\xb2\xc1\x1a%\xbb\xc6B<\xcf\xe3\xe0\xb5\x7f;\xc2\xbc<Z22\xf8C$\x030\xd4\xadyI0\xe4\xd7WM\xf5x\xcb:m\xe0\xb9x\x86\x1d8\x17`\xedL\xb8~\xad\x97\x8a\xebv\xae\xc3<\xf7+\xae*\x1b\x89\xd8\x1d\x9b\xb3R\xc40\x1c_`t\xa6\x9b\xb3\xd2\x8d\xac\xafn4a\xc8!\x84\x84{k\xf6\xd4\xbb<\xd2v,\x1b\xb5\xaf\x1do\x07\xc7\xce""W\x14&\xf8<L\x80\xa1@\x04\x17\xd3Hf\xb2\'\xcan\xa0\xab\xe7\x1d\x80\xc5j\xd1\x80\xa5\xe5\xec5\xe0\x86a\xd4\xbe\x86@|\xc92\x95\x06\xb8=a\xc9\x11\x9c\xd9R\x7fv\xf7\xef\xde\x7fX,p\xe9#\xae\xf19s0u\xc5\xd5g*7O\xb2\x03D\xcd\xac\xd7Y\x02\xe1\x91\xf6)\xa8\xf3\x83\xf7\x9f\xa2\xaf\xdd\xc3x\x8aA]\x96v\xb3ao\xd4W(@\xd5S^\xfc\x0e\xd1E\x87F\xb2=\x16\x1f\x15\xbd\x9d\xdc\xb3\xe1\x97Lb/JDt\xc4\x8c\x06!i\xaaa\xf9/\xe9a{9\x9e\x86@\x16\xaa\xde\xdd" "&\x8eZ%\xfef\x8c\xc18E\xc5\xaf\xf5:\xd2P[\x1f\x91\x05\xf47\xe5\xf8\xaa"+&\xf1\xf9T\x85T\x80!\x13\xe7Vq\xbax\xf6\xdc\xf3\xc9p1\xba\xd6R9\xed\x9eD\x12\xa1\xd5\xad&\xc5\x9c\xdd\x9f\x0c\x9a(\x12>\xec\xc7N\xe3\x12\x08\x1a\xfb\x9eR\x1a\x97\x1ey\x07]\x171*\xc3\xd3[\xf6\x9d\n\xf5f\x9c\x83\x91I\x1f\xa1\x96\xb4\xc6Ys\x8fV\xf4\xa4\xe70\x06\xdb\xf9\xa1\xa9\xe6+\xae\x8b\xfa\x87\xe7\x9f\xa3y\xf4w)\xceY\xd6\x80)~\xd9\'\xf3\x8c\x1b9\x08\xa7w\xed\x02\xb7\xc8\x1an\xf2\x9f\xa4\xc9\x05\x08v\x12\\\xe7\xac\xa4)\xfa\n\xebq\x04Y\x88\xc3|\xe6\x01!\x1b\x8a\xd3\x81\x7f\x1bf\x0b\x1d\x03e\x07\xdcf\x85\xd3\x9d.\x8a\x17\x9f%\x0e\x10\x16\'\x1b\x82\x18\x94!le\x8e~\x1944\xd6\xdc\xe9\x1a\xde\xe6\x95\xde\xc1\x10\x94\xed\xd1\xd1M\xbc\xa6\x87\x8ay\xa41\x86(\xfe)\xb7\x86\xb66\xf2\xc6*\xc4\xd2s\xcdY\x03\xbc\xfc\x92\x04\xde{6H\xb3J\xc5\xa3j\xae[\xf7\xf9xQ\xf7\xb7YF \x15E3k\xa1z\xde&R\xa8\x82\xc1j\xd3?~Y\xc2\xcb|\x13\r\xfb<\xe3\xc3r.8s\xa2\xcdq\xc6s\x0c)\xe2#\xa7\xec\x15\x9f\xc1\xb9\xf5\xdb\x0fOl\xf6%\xd7\xce\x96\xa7\xf1\xc3N\xce\x8aJk\xd2\xde5\xa2Q}\x14\xd1\xc5\xc51\xde\x94\xccg\xb6p4\x95\xdf\x97X{E\x87\x0f\x14m8\xb2:V\x06\xdd\x12\xc7\xb7\xb7\t\x1e\x90\x19\xf1\xc5\xf2\xf2/\x90\xdd\xe0\x9b\x00\x93\x18o\x9b@\x94\xe4\xea\xc4\xc0\xf3\x90\x88\x197b\xb2\xa2)r\x86U\xd8\t\x13\x9e\x1a\xf1\xf7X\x0f\xd7\x81\'\x05,\xba\x8c\xc8\x1d/\x8d\x1aYr\x9d\xfd\xed\x97\x91=0\xf8/\x00\x85\xf6\x0f\xad\xe1n1O\xcb\xbf\xdex/\xd5\x18ky\x88*\xf6\xc2\x1d8\x071\x99AC[5\xc0\xcb\xcd\xfb\t\xdd\xd9\x10\xf5<\xd3\x19\xba/Z\xe9\xd2\xe0\xed\x89\x11\xff\\\xa6\xe6w\xe2\xbem7]\x10\xbc\xd7oQ\xcd\x82{\xf5G\xca\xf3\xe9X\xe52\x16\xbc\xab\x96\xea\x7f\x7f\xbb\x8a\xb5\xb9:\x8a0Wj\xa9\x884Y\xc04\x1c\xfb\xdd\x18\x9e\xc3\x15\xd7\xb2O\xce\x12^\xa0:\x19\x9c\xda)\x15\xed\xebK\xc2\xfdO\xbe\x14\x83\xbb\xac(\x11\xd8a*\x93r\xbe\x06/\x1f\xf6x\xb9|A\xebX\xf8\x84\xb6=\'\xd1(\x13iwNs\x1e@\xc0>m\xe80\x9e\x06;\xf2N\x0c]\xe0\xc2\x97\x08\x9f\xb5\xe07\xaa\x04\xc8p/\xb4\x0e\xf9}\xb53\xd9^|x\xd3\x99\x07\x8f\xd3\xc1\xd8\xc7\xb8[\xc6\x1b\xaa&@\xe6\xa5\xb1\x9a0e\xf3-\x08\xe4\x07L\xc4\xda\x0c\x0e\rq\x1d\n\xbcE\x8e\x87\x9d&B4h8GY\x8e\x80\x7f\xd1\xb0/\xf9\\l\x02\xd2\xddB\x1b\xfe\xb7\x165\xc5I\x03\x9f\x0cn\x84\x8a0\xe4\t\xae\xa0\x84+\xca(\xb1\x14\xbd\xa7U\xde$\xcd\x9b\xd3\xf5M^\x15\xbc7r"\xa4Q&\xaf\r1\xc8\xa8\x96\x98\xf8\x8d\xc4.\x0b\x92\x1b\xf5\xa8F\x84h\x8a?t`=\xc4\xa7\x9d\x102\xbd$\xdcL_\xee\xf4\xde\x16d\x04\xbf\xbb\xdf/P\x13L\xaci?jP\x0b\x99`\xa5\xb3\xc6\xd6\xe3\x12z\x0b\xc1\xbc\xc0J\x99W\xf6\x8a\xccS\xfa\xee\xcfM\xde\xbbf\x01X \xc40\x1a\x99o\xe9_!\xc4\xcc7\xa2\xb1,\x8f\x1a\xb3z\x0f\xa1Z\t\x1d\x876\x85\x94\xcc\x12\xd1n\xdc\xa3\xc4%#\x1c\x1d\xc7*bk\xf3\xb5\x90\xc1\x86\xa51L#\x87\x18\xe2\x8dt\xf2\xbb\xc3V\xd12M)\xab\x86_\xe5\xcav\xec@\xa9v\xd3\x13\xea\xe1>\xba\xacZ\xb4\x85\xde\x7f\xd4\xa6\xb07\xcdTocD]\xc0\x9ca\xa2\xa7np\xf9\xd8\xb3\x9b\xb3Am\xadj\xb2@\xff\x9e\x15\x8bA\x18\xe8\xa1s\x04\xb3\xa1%\x18\xa0\xe3\xd1\xba\x9eP\x85\xa4!Q\x84\x948\xc3\xf0\x88\xbb\xb1\xe9\x08,\xcc\x1b^\x1b\xee\x9d\xd8["!\xb3}/\xc3\x94\xb1\xc9q>\x97ii\xd7\xf3\xdb\x93h\x8b\xa6\x89Q\x90t\xa6\xa6\xa1\xb2\xce\x07\xea\xab\x0bQ>\xf3\xf6\x9d\xe7\x0f \xb8\na\xe4w\xfd\xc9\xe30\x02\x95\xd2\x7f\x9a\x1cC<\xb5^\x9c\xbd\xab\xfal\xf2\xa6F\xa1\xb6\xb9=3\x06\xd90\xea\xa6\x02>oI\xb3\r\xba\x19]\xc74\xa2S\x8b)V%\xd6\xf9k\x0fl&g\x0cE\xed\xc2s\xe2\x19\xe9\x08z\xe7\xb6\xe4V\x82\x9a\x93s\xf33\xba \x98\xaad\x7f\x9a\xc8Yo\xd6l\x03\x8a]\xd5\xbdU\xcbm\xc3\x07\x86\xd5\xfc7\x80F?\xa4a\x0bH:\xfci\xa0M_h=\xaa\xa8\x0e"\x17\xc3\xb7{\x90\x02\xe3S\xcb\xa1\xe4\xabL+qoFmG\x06\x19\xa5Q\xd9\x81\xb0\x1e.\xfd:\xbd\x1f\xaa\xaa\x0c\xd4<\xfc\xbc\xf5D+\xb6@\x8a\x86\xd9#x\xba>o\xd5\xc9\x11|\xb8\xe9\xccG\x01\x01ge}\xf9\xcb!\xbfF\x11\xba\x19\x90\xf6\x8b\xaa\x11\x14++\x9a\xfeD\xc8\x08\x8c:\xf2\xc3\x95\xe4oc\xd0\xe9\x94\xcbEg\x93\x81Z\xe3\xff\xb3L?\xd6\x993\x04\xc5,b\xa6-\xf5\xf9O!\x19Yk\x03e\x96QlI|\x1f\xfd\x18\x15\xd5\x06\x1b\xa7\x9d\x95\xf6\xcf\xd2 }\xb7\xbd\x18+\x99\x9c\x1f6\x9b/h\xc5\xe7\x8fN0\x84q^\x9f\x9cI\xfe\x9d\xe8\x85\xfbb.T\xf5\xb2\xd2\xd2{\x15\xb4\\K\xc3\xbd\xf0\xb5\x190\x16\xbf\xc9\x9bj\xe8la +\xec/R\xac\x17N\xda\xf26\x9fu\xda\xc8\xaf8\xed^\xe5\xf4b\xa7M%\xa9\xa0\xb4\x1em\xb8\x14\xd2+\x94\x80pB>\xc2\xe9"\xab\x11\x9aD\xd2Yq\x04\xac8\xb3\xed\xd3 \xcb&\x92\x13\x8f\xd7J\x9d\xb9^(\x16G\x817\xc7\x15@\xf3e\xef\xa5\x89t\xa0\xa6\x9a\xd2aA\xe8\xef\x1a9\xc1#="t\xac\xe5.N\xa6\xf2ETt\xf6\xbd\xd0\xc1\xb0\x90\xc3\xd9\xa8N\x03*\x04\xd9\xf8\x03\xbduk\xe1\x90\xf8\x02\xf8q.\xf7\x0b\x886C\xb4!\t\xfd\xd7\xef\x9c\x87&\x885\xdb\xacK\xd4.\xf1+\xfb\xf6\x8c\x1a\xc1\x1b\xd0t7\xda\xd8\xc7Z\xc3\xb1\xb9v0\xa6\xc3\xf4a=\x1c\xecN4\xad\xb7i\x7fI|\x00\x87f\xe5\x97,\xc0\xfb\xae\x93Y\x13/\xc8\xbb\xf0\x81\xe4+4\xc6\x15\xc0=Q\x16>u\x14dQ_\xb6_8$\x15\x1cj\x9a]\xd3\xdcb\xd5\xfb\x7f\xa5\x05e\xa1aS\x7f\x05\xc2CL\x15\xa2E\r\xccIU\xfa$\xb4\xcb4\xd9\x902|W\x99\xda\xc98L\x98\xab\x9e\r\xc1lJv\xc4\xc84\xbbu\xf0R\xaa\x1aCIp\xd2\xb3\xb0\xdaC\xce\xe0m\xdc4\xff\x8f\xca\xf1;|\x1b\xbc\xc7<\x1c\xa3\x18\xec+\x14,\xe4i}\x05\xa0\xdbO\x05\xf3\x13\xd9\xc4JD\x87C9\xe7\xe2\x9f\x1bnz;\\\xd7\xcf9\xdc\xb4\xd7\xb90\xca\x01\xbd\x02\xc2H\x94\x9d\xceo\x1cf\xc7\xb5|^\xcb\xffK\x83\xe0N\x98\x0cJ\xe2Ei\xac?\xec\xb0l|\x03-\x89\xdd\xf8`a\xf6IX5CB%\x92\xfd\xd7;;\xf2\x05\xb4s\xf45\xec4\xdb\xf3{\xc1\x9c(8kt\xc1K\xc0\xa7\xac\x01\xeb\xc3\x08\xbf\xe6\xf7\xdd\x1by\x89\x86~\xcf\x0e\x990?w,\x05\xdbUj\x02%\x87\x8fKs\x85\x81\x10q\x82\x8f\xb4\xcf"\x80\x99]\xc3\xeaM\xb7\xe4\x90[\n\x06)D$\x8b\xfc\xd0\xa6\xe9\xffG\xd1\x02e|\xbd\x9f\xdc\xffH~\x9c\xd0\xb2\xa3t]\x1e\x95q\xff=\xf1\x03\xb6\x8d\xc0\xcf\xa4S\x1a\x06S#YH"\x83G\x8a\'\x13\x91\xff\x9b\'\x9d\xf8\x11\xca\xd5\x1e^^z\xf6\x8f9\xab\x03<US+\x86\x18\x19o\xfc\xe6\xab\xc4\x10\x91\xa9c0\xa0\x96\xe5\xcb5\xe8\xb6%y\xe4\xb4Y\xd0\xc1_\xf8\x1f\xd8r"\xee\xe0\xc1\x06S!\xd6\xb6d\x02\xdb\xfeh\x88+\xfd4\x0bf\xea\xac\x93\x8a\xcb;\xaa\x88\xd9\'\xf5\x96\x96\x8a\x0f\x18d\xc6\x87\x964W\xcaz\xbb\xf5\xef\xab\x95;\xe8tZ\xbae\x90\xac1\xe8\x15\x82\xfe\x10\xe2y\xce\x9a\xd8DC\x02\xd0\xd6\xb348\xb84\xef \xb5H\x9e\x12\xa2}=Q\xf0\xc3\x88ij\xb6\x1eN\xfc\xf3ZT\xda\x0cf\x19\x12E\xdc\xd9.\x07\x9e&\xe6\x8bRlu|\xafT\x14&X\xb9b^-\xcb2\xc1J\x03gB\xfe2F\x89\xc4\xad\x8d/\xef\xab(\x80\x17\xafD1\x8a{\x95o\x9b\x8aL\x0e\x0cQ/d\xc0\xbd\xf5k?o\x96\xd3\xe2\xf6\xcf;)[\xdc\xac\'\xf0\x15\xd7\xde\xb5\xa2q~\xca^!\xab\xf9\xadp\xc8\xfbG\xe9j\x1a0\x194\xf6n\xc4\xb0J0\x82\xfaN,`\xd4\xec\xf8\x97C\x99C\xfcr\xe0uL4P/\xae\xf7\x0e\xd31[BK\x14\xa4/\xda\xeb\\\xd5\xb0J\xb5\x14\xe4\x9bQ?\x95\xfe\xfeN\x05\x13\xbd\n2\x8e\x1f\xb3e\x90\xfa\xe9Q\xb1f\x00\xa6\x03t\xbc\x97\xe6\ni\xca_\xec-Ne\x86t\xedI01\xfa\x0b\x9d\xa21\xb4\xad\xb6Z\tt\x01e\x98t$\xa1\xf8\x0b\x01\xe2\xbf\xb9\xfd@\x1c\xd2\x17\xd1~\xcbu\xd1\x9d\xeb\xc0_$\xc8j{\xd2\xf21\x8cQLv\xfezY2c\xafhQ\xdc\xa0"\x98\'\xc23\xf2\xac\xe3\xf8\xb8+\x82\x06>\x1e+zv2\\\x13\xe9n\xb9z\xe0v\xb6\x8aA\r\xa8eS\x1eH\xd8\x81/\x18\xf8\xd9s"\x8cwH\x93\xe3\xbdSD\xdf\xb3\xed\xe4]j\x02`\xe8\xd5\\nGN\x1c4\xccD\xfc\x9br\xf8F\xa4s\x94\xdb@\xc3jM\x10\x8e\xa4\nf\xf6\xd5\x81g\x84\x84=`,\x8f\x01\xc2\x04\xa5Z[n@yyy\xb8\x0f\xc4v\xcd\x04\x86,}\x1fi\xdd\x89\x13)\xac\xa3\x13fT.SOx\xe9[\xbbb\x94M^\xdf\xf5\xcf7\xd9\xeeoZ\x87\xb6~\xa5\xc2EI\xc3\xb7\xbb\x08Z\xa3\x8e\x04\x98\xb1\xa9\xbd\xde\xc6\xe2\xbb^\x85\x81\xd5\x7f\xac\xfd;\xa3\xdfp\x00NM\x1c\xbaS$\x1b\t2\xd8\x96\xc5A@\x88\xb6\xca/\x98^6\x88\xe7\xe5\xd5\xef\xf1\xbf0\x8ck\x92LI0\xd7\xc5;L\x0f.\xec\xbfO(\x1c\xdeb\xf9\xd8\x92\xf7\xd1\xba\xe3\x89Jc\xf9\xdf\xbc\xdcM;\xfd\xd2a\x06\xdc\xf4&h\xe6\xb3H\x82\xbb\xf0@!$y\x84\xef@\x16\xb9\xf7\xa7\xf8Pp\xc2"\xea\xa6l\xba\xd5\xa4M\xc2&\xce\xcb\xa7\x8b\xe5\x97\xe8Z\x9b\xcf\x8eS\x8c\xdf5\xa9|{\xbete\xf0[\x92\xcd2\xd3T@\x10m\x02\xdf-\xee;\xdc!\x1e\xd7\x86l\xbc\xb4\xf0\x15:\xc4\x139\xad\xd8\x15\x1e\xf5\xec\\\xd9TM\xd0\xc9\xca\x8d?~$\xf2\xc4\xdbNb\xa9\xc2\xb9\xde\x8b\x88ST\xb8\xcbT]\xdb}\xbb\xd0\xc2`,"\xe2\xda\xa3W\xab\xdc\x8a\x90R\x8d\xc0kc:\x10\xd7E\xfa\xf6\x8a\x9fc\xe9\xe5\xc7\xc3\x18\xba\x01\xe9\xab\x9aSv\x8al\xac\xab\x12&\xba\x1aU\xffw\xe6\xe0\xd5\xa4JE\x02\xf6\x05@GH\xc1I\x8f\xac\x8e\xf2\xdd\x1ef\x8c\xf7*.Dx\xdd\xa4if/\xd7\xad\x0fq\xcdrV\xf6C\xbeN|\xb0f\x04\x1f\xb5\xa7zBl\xfc*}\xa9Z2*\x1e\xb8\x92&/j\x07\xba\xf2\xe2\x91\x00d\xab\xab\tn%\xca\xe0\xfa\t\xf4\xfdO\xed=\xae\x80 :Ohc\xb6h%\x14\x95\xdf\x95m\xd5\xdb\xdc\x03\xba\x08M-\xc2\xcb\xfeh\xffO\xfd\x05rx\x90\x18\x86\x0f\xbd\x05=\xe5\x0b~@,l\x80\x90\xcfk\xd4\x0f\xabXP\xab\xb3\xd2x29\xdax\xb5\xcb[\x03\x99\x00\xc6\x99\xfd\xf9\xd6\xb9\x86[V~\xbc\xads\x88\xce\xfe\n\n\xea\x9f\x88\xcb\xce\xb2\x87hB\xcb\x80b\x99(\xa1\x91\xf6\xf3&\x8e+\xd4Z\n\xcc\x8d\xbe\xeb\x85\xf5\xf5\x06QNA\xb2g\x9d\xc3\xaf\x13\xacb\xce\x88r`w&t\nf\xdf\xf3\x11\xfepz\x9a\x0c\x81Y\xe1\x90\xd0\x04T\xeb\x04\xf5\xa8\xb3\xf9:\x1b^;\x86D\xe2\x9e\x1e~\xa6\xb5\xc0\x0c\xc1\x1b\x8a\xe6\xf4K\x14i\xdb\xc1t\xaae\x06\x7f\xfb\xd4\xf7\xbf\xc3n\xdeC\x94\xbb\xa8cV\x80j\x917\xd1\x9f\x07\x06=\x88\xd6\t6\x0b\x16\xe7t\xe2\x12Xg\x85\x88P\x06=\xf4*g\xf2quOe\x89w\xb8\xe2X\x1c\x18K\xb3\x15\xe3\xba:\xf3\xadr\x0f>\xbc\xebw\xe4\xa9\xec\xc9\xdfeu?\x9c\x82o\xdb!+\xdc\xebN4\xc7\x81h-\x1dAO\xc5\xe3\xcc\x8e\xf6\xab\x8drt\xa73?!\x12\xa3FT\x86\x96\xfa\xef\x87\x92\xd8?\x93\xe4\x00zqDa,\x84\n\x80mT\xcca\xda\xd5\x1eJ\x10K\xcb;\x18\x00;\xb9\xd8\xd2\xad\xe7\xca\xb2\xf1\xb4\xe8\x96U\xae\xb2L\xddkx\x0e \xf23p\xa6_\x1b\xe3\\0IcT\xa7\xf2\x11\x92\xc6\xf2|\xd4\xfe\x0f\x81\xf5\x02\xac\x00mP\x835\xa3\xc3\x88\x17u\xc3\x84\xd8\x8c,\x9a\xe46\x1a~V\xe4\xc7\x85\x015\x04\xe6\xf2\xbc\xff\x06\xf4p\xfc\x92\xfd\x03\x1d\xb5jv\xe6\xbb\\\x0f\xe0\xcb\xee}k\x85\x8a\x05/9\xa2\xd3e14\xceqV\xfdd\xb7\x03\xf9\xa8\xa12f\xdf\xf7_\xfd\xa7\xf7Y0\x01\x9cP\x97;\x90HxN\xd6\xcc}\xb3R\xdf\xeeS\xca9"I\xa4z\t\x01)yG\xc7q\xcd\t\xdf\xads\xf3\xcf\x93\xd3\xd3\xd2\x9b\x96\xb7\xa9\xfc\xd2#U\xd7\xec_\x1d\xca\x00\x15\x1c\x00\x9d3\xbf\xd3\xb3\x90j\x0e\xf3\xcea=\xcee\n\x1b\xa00J\xd6\xf1G\x02\xb5\\\xdeV\xbe\x8c=\xad\xec\xcb\xf8\x0c2\x1b4\x9f\x91\xf8\x15&H\x9d_\x1c\xdc\xcb\xee\x14=P"\x0f\xfc\xef\xc2\x97\xd7K\xc6\xa6\x98Q\'\xed#\xd3\xad\x10W\x888\x12\xcf\xca\x07N\xf4\x9c,\xda\xe5 \x9a\xdf\x8b!\xeb\x12R\x10\x867\xe2\x13\xb6@bS\xc2\xf3t\xad\xbd\xfeE\xef\xd6`o\xa3?4\xb8\xa1\rF\xb8E,\x1e7U~\xb35\xc4\xab\x03\x94\xa1\xb3r\xd1d\xb5\xa0\x9e\xc1\xe5\x9c\xc7\x08\xa1\x1a\xd9\x98\xcf\x8d\xe6\x00\xef\x90F~\x97\x02c\xd5\xfd\xd6\xdd\xa1\x13\xa7Yrq\x8d7\xae\xde,\xd0\xaf-\xd5A}\xf8=f\x85\x0b\x0c|\xd5\x13\xc9`\xb1\xa9\xc2\x916\xe7\xa7\xc9\xed\xaf9\xd0S\xff\xa5V\xb5\xa1\xf3?ta\xc1\xb4$\x94\x9c[.g\xd6\xa3T\xed\xb7iK\xe8=\x0e\x85\x96l\xca\x93I2q\xf3\x07\xa5\x05\x0e\xceq\xf8\x05\x9eij\xfa\xf4\xa4j\x9b\xdc7\x88~\x88Q\xc1\xe5\x8d\x04\xec5\x82\x96\xc6\x03\x0f\xfa\xf1j\xad\xe5\x0b\xac\xab(\xe2fr|l\xc0\xa8{\xae\x07J\xde\xea\x9d\x14\x9e\xa4\xc6\xccn`\x15\'\x9a\xa3q\xe7\xad\xf1\xd0\xdf4\x05\x0c\x02\x02G\x9e\x81m\'\xdf\xd1\xd5\x00\x94y<_&\xc6\xd1p\x8a\xe8\xf8b\xf1\x99\xd9h\x94\xd5\x10,\x8fl\x10\xc4\x08\t\xbd\x98<#\xf2\xe1\x11\x8eR\xe0\xc4&\x8dM\xac0\x0f\xbc\xe4H4Bs\xe5\xa1\x05\xeda\xd6A\x16-\x15\xed\xb7\xf7\xd7\xb49}\x89\xf5\xaej\xa2A\x04l\xa6J\xbf\xd6\x16\xf3!\xd7p\x8b\xb3\xfa#\xa0T\xd69\xdcfS\x1b\xaf\x06\xb5\xd6\nrw\x87\x14\xf3\xd4\xcf\xdb=G\x88\xb0\x152_\xa1<\tR\\\xc8\xa8\xf2\xa6\x96\x9f\xae\x16\xd2\x98\x9f{R.\xa1\x89\r\x04\xe1\x13\xd0\xaeB\xc6\xd5TS\x1f\xeciG\x8bP\xe7\xff\x90rh0\xfe\x96\xcaZ\xe4i\xff\x11\xfc\xec\xe5\x14c2\xd6\xc5)\xfc\xeb9\x83\xc5f\xa7\xb9*\x04\xf1\xb1N\x87\x7fF5v\xaa\xa76A~\xee\xca\xd4\xe9{ha<\xc4\x8b`\xbf\xc3I\xb0\x0f\xa9\x93\xcf\xb2\n\x16\x94\xb0`*\x07\x10\x90H\xf9$~\xf5U,\xea\xbc\xf3\xa0\xf2t\x84\xb8\xac\x05\x11v\xa00&\x06\x08\xa0\xc1 \xa9X\xa4\x99\x05\x80\xe9\xb8\x92\xc4\xa9NT\x1e\x04wI\xa2U{\xd3\xc2\xb9fl#|k\x80\xed\\\x07\x97k\xa1\x92\x06\xa9u\xd0\xd3b\x9a\x19\x93\xadA\x03\xe6\xcf\x1d\xf1vd\xf4\xb8\x1c\xa9\xa0)\xf9\nc\x1a\xca\x1cc\x87G\xc9;\xdeP~l\xea\x7f!^X\xe4\xa2\x13\xc5\xee\xef\xe6Y~I\x88\xe9&\xe6\xb3\xef\x17>\x0f\x8f}\x8d\xc7G\xd1\x9e\xf5\xca\xa1wq\xafDE\x91\x82\x89\xc5\xc1y?k\xf7\x0b\x89b1C@\x81\xf5\xc1\xec\xa4\n@\xe2\xafK\x95g/\'\xd3\xce\x8dRb\xa0xY(\x0f\n\xed#\xe1\x17\xe0\xf3\xfc#v\xdf\x0e\x96c\xf6`[0\xa8\xb5\xb7o9!\xd5.O\x9aL\'\xa9\xa4\xe8\x01Gf&\xb8\xa6\xb1\x80\xdd\xf0<\x03h\xe6\x0fq\xef\xf0\xd3\xb4\xee\xb5\xcf\xd8o1oP\xeb\xfbyG\x93\xa71\x96y\xe0\x12\xb1\xd2Y\x1fe\xd6\x173\xab\x88X\x06\x9ag\xae\x98\xae\x1c\xc1C\xa1\x00b\x9f;\x8c\x92\xca\xb6\xa8\x8b\xdbD\xe0l6.\xbf\x08\xd6\xe6l\xde\xe5\xb8b\x0e\x03\x97\xd9S\x16\x99\x0bp\xcc\xdb\xec\xc8\xfe\t\x88r\x14\xa0\xb8\xa9`\xb3 \xfd;\xb5E\nE;{\x0f\xe4\x1b\xd2p\x17G\xc2\xd0>\xa4\xe5\x1c\xf6\x83R7\xb7V\xee\xaa\xa5LV\x1f\xa1QO./=t\xb6Z\xc7\xc5\x04\xfe\x95\x04Z\xf7\x03\x9a\xd5h=\x99\xb2\xa0\xbb\xb9\'l\x95\x82\xa0\xc9\xfe\xb9\xecw\x9c\xb8\xd7\xa7\xb2\xda\xeaf*\xc5\'\xbf\x89J\xf9\x00\xe8`\x1a\x1fe\r\x87/O\xac\xbd\x0f\xdd\xd2q\xb0<\x8b\xc5;\xb9]\xcdn\xc9\xaa\xe8\x0c\x88\xae\x86\x04o{*igN\xd5gp\xdc\x15\x9d\xbbQ\xa3\xf47\xfd\xeaj\x7fKs\xdc\x826n\xa9\xe7\xaf\xfe\xccN\xb04\x1e\x14\xed\xa7U:\xe8a\xe6\xa5\x01\x0ckX\xa0\xe8\x02\'\n\xe3\x84\xf0/\x99\xea\xf0<\xb3\xcd9 kwYi\\rd&\xe3\xd1\xc3u\xdb\x8c\xbcm\x06\xd5:Qa\x9a\xe4r\xabA\xdaQn9M\xe0\xe3\xd6\x95\x15V\x94\x1c4"\xaf\xfe_\x87\xfc0\x88\xce\xff`\xe0\xeb\x0cK\x03\x03\x95V\x92\xdfe\x9f\xc7A"\xde\x9d\xb17\x16\x91\xb5MF\x00\x89Q\x06\x08\xa1;\xe0\x8a\xe9\xe4J\xd0\xfc\x9do\xdd,\xc8\xec\xe7\xf1b1]\x88\xc0\xeb\x9f\xad\xce\xba\x9d\x8d\\&\x1cMN\x0ciM\xb56\xc7$\x10h$I\r\xf2\xd9\xfdjx\xc4\xe7q\xf0\nX\xd4\x96N\xc6\xa9\x9e\xb4\xd9\xf2i\xd2\xe3\xc0\x95\x1e\x94T\x7f\x9b\x08\x03\xc5q\x04gyX\xa8\xc1\xa5\xf8/\xcb[\xb5h\xc9\x0e\x04>\xb8\x989=\x161x\xa7\x90\x91\x00\x06i4\xc8.\xe4=\x87K~k\x0c\x88\xd6\x1fG"@\'\x0e\xb6RV\xb1df\xf2m\xc4\xdbA\xf3\xc0\x1a\xa02\xb2+\x91\xefOB\xfb\x81\xc9oN\xc7\xb1\x84\x8d\xedi\xd5\x1b\x0f_%\xc1\t\xb6\xed\xc3z\xe4\xb7\x060\xa9\x04&\xaa3\x18\x91\x8d\xabL\xce\xebv\xabx_\x07q\xb9\x00Y\xc8\x8f\xf56x\xdds=x\x11pF~\xce\xf9\xa1V\xf3\xc3n\xbb\x9c\x90oi\x94\xf8w\x17k\xfa\x9dYb\x16\xae%\xa8\x8e\xcen\xe3\xc8\xfa\xeblV\x97\xe2|\xba8\xbd\xa5\xe9\x9a\x1a\xcbFbL\xd8U\x89\xab\xba\x88+\xe9e\x9dq\xf5\xff\xd8B\xe4o\xb3,\xfa\x82x\xc2\xf0A\x1adT0\x88R\x01\xa8\xbaI\xd9\xb0\x82\x83\x16\xc8\xba\xc8K\xb8\xa1\x10\xec\x87\xa8\x11\xe0\x8e\x88\xe2\xd107\xc7\xece\xf1,\x86\xf3&<\xf1\xff\xca\xa1\x82$z<\xff\x98CA.B\xfc\xcf\x92VE\x9b\xf5\xfaWw5\x82\x91\x92}\xe7\xf3\x01\xc8|v\xdb\xc3\xfc\x90\x05\xcd>\xad\x03N=FO%\xf9\xdf\x80\xb0\x88\x03+\xc1\xc42JN\xd2\xf6o\xe0 ^\xe5]\x7f\x96j\xcf\xccN)\x15\x9fW\\\x0f\x05[~\xfd\x85t\xafT\x8d\x17_Rm.\x03\xb3\x1a\xe6hwT\xea\xf5\xd7\x80\x94\xef\xe7\x1a\xf1\xc1v\xf3\xdf\xfb\xdb40;\x1f\xa3\x99\xbe\x08/\xe7Y\xffv\xb84\x1d\x14:\xf6\xe8\xadK\xffT\x85\xe6\xbbn\xad\x97\xb3\xd2P\x9fto]\x06\x8e\xc3\xd6]')
1
+ from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,Proxy
2
+ # from flask_babelex import lazy_gettext as __
3
+ from flask_babelex import gettext as _
4
+ import wtforms as wtf
5
+ from flask_wtf import FlaskForm
6
+ from flask_bootstrap import SwitchField
7
+
8
+ from flask_admin.base import expose
9
+ # from gettext import gettext as _
10
+ from hiddifypanel.panel import hiddify,hiddify_api
11
+
12
+
13
+ import re
14
+ from flask import render_template,current_app, Markup,url_for
15
+ from hiddifypanel.panel.hiddify import flash
16
+ from hiddifypanel.models import User,Domain,DomainType,StrConfig,ConfigEnum,get_hconfigs
17
+ from hiddifypanel.panel.database import db
18
+ from wtforms.fields import *
19
+ from hiddifypanel.panel import hiddify
20
+ from flask_classful import FlaskView
21
+ from hiddifypanel.panel.hiddify import flash
22
+ class ProxyAdmin(FlaskView):
23
+
24
+ def index(self):
25
+
26
+ return render_template('proxy.html',global_config_form=get_global_config_form(), detailed_config_form=get_all_proxy_form() )
27
+
28
+ def post(self):
29
+ global_config_form=get_global_config_form()
30
+ all_proxy_form=get_all_proxy_form()
31
+
32
+ if global_config_form.submit_global.data and global_config_form.validate_on_submit():
33
+ old_configs=get_hconfigs()
34
+ for k,vs in global_config_form.data.items():
35
+ if k in [c for c in ConfigEnum]:
36
+ BoolConfig.query.filter(BoolConfig.key==k).first().value=vs
37
+ if vs and k in [ConfigEnum.domain_fronting_http_enable, ConfigEnum.domain_fronting_tls_enable] and hconfig(ConfigEnum.domain_fronting_domain)=="":
38
+ flash((_('config.domain-fronting-notsetup-error')), 'danger')
39
+
40
+
41
+ # print(cat,vs)
42
+ db.session.commit()
43
+ hiddify.check_need_reset(old_configs)
44
+ all_proxy_form=get_all_proxy_form(True)
45
+
46
+
47
+ elif all_proxy_form.submit_detail.data and all_proxy_form.validate_on_submit():
48
+
49
+ for cdn,vs in all_proxy_form.data.items():#[c for c in ConfigEnum]:
50
+ if type(vs) is not dict:continue
51
+ for proto,v in vs.items():#[c for c in ConfigEnum]:
52
+ if type(v) is not dict:continue
53
+ for proxy_id,enable in v.items():
54
+ if not proxy_id.startswith("p_"):continue
55
+ id=int(proxy_id.split('_')[-1])
56
+ Proxy.query.filter(Proxy.id==id).first().enable=enable
57
+
58
+
59
+ # print(cat,vs)
60
+ db.session.commit()
61
+ hiddify.flash_config_success(restart_mode='apply',domain_changed=False)
62
+ if hconfig(ConfigEnum.parent_panel):
63
+ hiddify_api.sync_child_to_parent()
64
+ global_config_form= get_global_config_form(True)
65
+ else:
66
+ flash((_('config.validation-error')), 'danger')
67
+
68
+ return render_template('proxy.html', global_config_form=global_config_form, detailed_config_form=all_proxy_form)
69
+
70
+
71
+
72
+ import flask_babelex
73
+
74
+
75
+ # form=HelloForm()
76
+ # # return render('config.html',form=form)
77
+ # return render_template('config.html',form=HelloForm())
78
+ form=get_config_form()
79
+ return render_template('config.html',form=form)
80
+
81
+
82
+
83
+ def get_global_config_form(empty=False):
84
+ boolconfigs=BoolConfig.query.all()
85
+
86
+ class DynamicForm(FlaskForm):
87
+ pass
88
+
89
+ for cf in boolconfigs:
90
+ if cf.key.category()=='hidden':continue
91
+ if not cf.key.endswith("_enable"):continue
92
+ field= SwitchField(_(f'config.{cf.key}.label'), default=cf.value,description=_(f'config.{cf.key}.description'))
93
+ setattr(DynamicForm, cf.key, field)
94
+ setattr(DynamicForm,"submit_global",wtf.fields.SubmitField(_('Submit')))
95
+ if empty:
96
+ return DynamicForm(None)
97
+ return DynamicForm()
98
+
99
+
100
+ def get_all_proxy_form(empty=False):
101
+ proxies=hiddify.get_available_proxies(0)
102
+ categories1=sorted([ c for c in {c.cdn:1 for c in proxies}])
103
+ class DynamicForm(FlaskForm):
104
+ pass
105
+
106
+ for cdn in categories1:
107
+ class CDNForm(FlaskForm):
108
+ pass
109
+ cdn_proxies=[c for c in proxies if c.cdn==cdn]
110
+ protos=sorted([ c for c in {c.proto:1 for c in cdn_proxies}])
111
+ for proto in protos:
112
+ class ProtoForm(FlaskForm):
113
+ pass
114
+ proto_proxies=[c for c in cdn_proxies if c.proto==proto]
115
+ for proxy in proto_proxies:
116
+ field= SwitchField(proxy.name, default=proxy.enable,description=f"l3:{proxy.l3} transport:{proxy.transport}")
117
+ setattr(ProtoForm, f"p_{proxy.id}", field)
118
+
119
+ multifield=wtf.fields.FormField(ProtoForm,proto)
120
+ setattr(CDNForm, proto, multifield)
121
+ field_name=cdn if cdn!="Fake" else _('config.domain_fronting.label')
122
+ multifield=wtf.fields.FormField(CDNForm,field_name)
123
+ setattr(DynamicForm, cdn, multifield)
124
+ setattr(DynamicForm,"submit_detail",wtf.fields.SubmitField(_('Submit')))
125
+ if empty:
126
+ return DynamicForm(None)
127
+ return DynamicForm()
128
+
4
129
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
130
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,128 @@
1
- # 2023-04-08T16:23:20.818374
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x9e"\x00\x00\x12\t\x04\x00\x1c\x9d&y\n\xc1\x7f\x84\xe0J\x08\x1a(\xcf\x14x\x00\x00\x00\x00\x00\x00\x00\x004b\x95\xe4\xc2\xf2{\xb2\x9dtj]_\xee\xcd\x88\xa9`:3\xd8\x1a\xb91]VY\xfa\x12\x1a\xb9\xabz.\x04\x86\xe43\x01\xf5\xf2\x87\xd5\t\xe2T=t\xd8\xfd\x9b\xc9\x1c\xdc\x00\x8es\xe9\xaf\x88\'\x01\xde^\x0f\xea\x8b"\xfcj\x89\\\xee\x18\xce1\t\xaf\xc4\xbe\xc8u?=\xc8\x81_\xc1\x8f\xdc\xd4\x7f\x82\xa1s\xfb\xbe\x91\xc3WIX[\xfe\xd1\xa1\x81\x9f\x07Q\x1b\x1b\xbeR\x98=\xc1\x06\xac\xc2I\x1e\xd3\xd6rj\xe9O8\x16\x80A\xa7<r2\xa1\x18\xfc\xf5\xb7\x94\x984`\xde}\x96\x9f+V\x82u\x02n\t\x9f\xc7\x8b\xd5\xe2z-\xbe\x9cG\xd6\xda\x80\x0f^W\x8d\xec\xd8D\x8fyM\x08\xd6\x06\x1b\xcf+\xf7\x9f\xbd2\x1e\xf8\xb75Y6\x04\xe6\x19\x07G \xed\x8d\xe4_[\xae\xbb<\x0c\xb7\xcc\xb2\xcd\xd6\x1e\xcf^\xf3\x01\xd6K/\xca$\xa09b\x9e7\xe8\x80\x13p\xfd\x17t1\xe9\xa6E\x0f\x9e<\n\xadH\xde\xf5\xf0I\x15\x1c\xa1Z\x98\x87\x89\x8c\xd1\xcb|#\x97+\xc6\x99\xe6_\xf4Y\x94\xb3r\x9e\xdc5G\xcb\x8fE\x18\xde\xa9o\x15[\xb6.\xdb\xb4o\x9e\xec\xf0\xd2\x1b\xaf>\xb6&\x9f\x8b\xba\xbb\xb8\xa2\x16\xbb\x12\xf9D\x11\xaa\x19\xffy\n8i\x87\xdf\t\x12\x0b.O\xc8\xb6N\x81Ia\x83\xf4\x8et\xd7]%\\\xfe|\x88\xf8\xae:f\x98\xab"\xb8\xa1\xcf\xc4\xe6\xc3.>\xac\x15,\x80{\xd9\x87\x0696\x9d4\xf0 0U\x87\x03\xd9\xc3~ei\xcfN\xcf\x8d\x857\xcd\xa6.:\x9e\xb5\xf3\xdb\x01\xdf:?Df(\x8e\'\xe8\x91\xc0\x1f\xb2\xf0\xe2\xcdC\xa9\x16bS\x9eh8DS$zg\xf1\x87J\x7f8=\xe4]\x85\xa3\x07\x15\x80\x1b\x85\xebe\xfaE\x08\x06<\xf2SN\xb1\x83\x8evm\xe7\xfdR\xa2 \xa2\x1f\xb7(nN6\xd4\x0e\x91\xf3\xf4\xfb\xd1\x04\x8f?\xa1{\x90*\xab\xed*\\\xf1*\xe0\xdbt\x1fs\xfbz\xd2;\xacrk\xc72\x18\xa1\x9eP\xadnA?\x03\xfb\x8e\x12b\x9b\xd8M\xd8\xb0h\xa4G\x9e8\x1d\x14\xcd\x91-D\xca\x87\xb0\xa1#hZK0zI\xf7\xb9Q\xdc@\xb9\x83QF\xa3\x1c\xf8>\xc4\x14\xebCa\xbaI8\x8e\x866y\xff]S\xd3\x16\x05kF\x06\x01\x0bi\x8cg\xa8\xe9\x0f\x8fl\xca\x9b\xd1\x01\x19\xc8X\xe52\x0e\xe8Sh\n\xac\xc7u\xd0\xa4R\x1c\x1dW\x17f\x04n\xf8=\xe0\x01\xd9\'\x8ai\xb64.\xa5\xcd\xc2\x82I\xbc\xe1\xe8\x16%\xd5\xce\xe6\x94%\xd8R\x89Xl\xc3wj%\xd7\xd4\xe1\x87\xfa\xd0\xe2\x97\xdc\x0c"f\x12\xcb\xc9\xa88\x8e\x87\x1b\x0f\x1f\xe8\xac\x8dH\x85\xe5\xf0\xae\x1e\x99a/\x12*t"\xf75H\xcf\xf8\x0f\x84\x7f\x98\xb4|\xd3\x1b\xc2\x1e\xd7Al\xdb\xf1[\xb4\xc7\xea\x8b\x89\xbe\xdf\xcb\xb1\xf5,\x9f\x1e\xc6`\xbb\xb4\x060v\x0e\x99sw\x85\xf3\x04[\x04\x944\xc1G\x90\xb4\x1a\x998\xa3i\xb0Me\x83zx~>\xdd)\xa9\xc1\x06U/N\xa5\x07\xec\xf0\xd9\x9e\xdb\'Y\xc9jU\xaf\xa2\x16H?u\x1a\xfd\x9a\x8a\xfbAqZ\x02p(}\xb5\x89*\xbc,\x03\xfe\xba\xf8\xb1aF\x009\xb5{\x18\xbd=n6l\x83\xcej\xb4\x9a\xadg\xa3\xf7\xe3\xa2\xe9U\x8c\xb0$\xb9\x9a\xa4J6,H\xc2\xc4?\xd8\xd7mc\xa4 \x1c6\x0f\x04\x188@\x14\xee\xf1\xc8jzo\x17\xb0&Y\x13\xf4q;\xf6\x0bR\xcbd\x8d\xaf\xfe\xe5\xbf\xb6\xc5v\xe7/\xb5\xa8\xf5\xb3\x89z\xd3O\xb00\xfa\x06\xf0g\xb0\x8dzs\x0e\x17\x9e\xa8\xc1\x07\xd1p\xe9\\\x92G8\xc2Q\xf2\xb16\x8b\x96k\xd8\x1b\x9c\xc7\x03V\xdc\x87P\xda\xf7nt\xf9\xda\xd4\xe0\xf2\x9d\xb3\xf9F\x11F\'\xe5\x13rE3\x94\x99Fi\xa5\xf8\x8f$\x86\x130\xb5\xc7\xc2}\x16\xd3%\xa9\x17\xa6\xed\xb5m\x04k\xd9~\xdb\xd7\xc9\xd7\x95R"e\xe9\'{\x01,7w\xe4?J\xd4\xf1\xb0k\xd3\x85!Uw}\'G{\xf9\xff\xa20:\xc4\xd6\xde\xdf\xd1\x81$\xadJ8\xb8\xc4\x0b\xba\xe8C\xc3\xe3d\x00(^\x9fh\xeaj\xff\xf0e\xbcc\xae\x88p\xd1\xd4\x1c3%I\x14\xfajP\xab=\x8b\x9e\'\x81\xc8+a4\x9c\x8eGb5X\x06\x07\x9c\xca\xcc\xdfo\xf7=\x1e\xda\x17\xf4\xa8F\x8f\xa4\xd6\xd6Yu\x9d \xa9\x90Tc\xf1\x11\x8d\x7fu\xc2\x8d\x8d\x88N\xf8\xfd\xac\x19\xe9\xb6 >\x89\xc2\xef\x0bM\xeb\x19\xea\xb1\xe2\x13h)--\xde\x1f\xd8\xea\xc3Uo\x8a\x82]\x17ys\xb8U\x91x\xfc\x0b\xd7\xcc\x91<pw>\xbe\x86\xdb\xee\xe3\xbc\xdeR`"\x1b\t\x8c\x05\xb3\xd6\xb2\t\x1e\x0b\xf8\x08\xdb\xfd{\x9e\xa0\xf4\x07\xed\xa2\x122\x87\xe0\xd3 \xe9\xc3\xe2\xb8Lo-@\xfc\xb1\xa2\xc8Y\xe7\xce\x8a\xed\xc7}q=H\x02\x98\xfc\x06\x1c\n\xc5,\x86c\xaa\x98t\xeb\xa8\xe6i\xf2P\x0ciJ\xac\xc4\xbb\x8a\xfe\x19\xbe\xca\xaaJND$\xaf\xb3D\xf7\xce\xf7\x92\x04e\xf5\xd1\xc1 \x01`\xf6]\xdd\xe5\xf0N\xe8A\xa6D@T)m\xe8\n\xf7\xe1?I\x8eC\xdb\xa3q}\xf2\xcd~\x07\x96\x85[G\x99\xde\xa9\xb4\x9e\xbc\xb5X\x96i\xd5\xca*\x88\x86\xf2\xa8R\\\x93.\x1ee\xc32\x9bm\xb4+7\x0f\xf0\xe8\xc8\xa5;%R\xec\x11\xca\x0f\xee\xe1\x06\xdf`\xee<,\x16\xc7\xd5\x1b\x1fS\x04/aX\x94@\x89Fa\'\xdd\xd4G\x83F\xcc\xa8\xbf%\xab\xd7\x14\x05)\x90:j\xfa\xe5WD\xa5\x98_\xf4\xfd\xf7\x7fv\xff}~n3\xb3\nA\x90yC\xd0r\xf51\x91\xff\x96b\xcf\xbd\xeeU\x89\xb2\xe1\xcfq\xc7Z\xa4\x0bH\xc7N\xde\x92\xad_h\x939\x04\\\x86e\xaa\xdcJ\x03\x15o\x97\x7f\x85\xc7\xc55\xdfAW\xfa\x8d\xad!&?[\x8b\xa5)\xe5Ho\x8a\x81\xa2\x7f\x0cpy\x8e\x98\xa3\xa63\x0b\x08\x17\x10I\x9a\xc4^\xa0!\x1e\t2\xa7OH\x02\xa1\x82\x11\xc3\xcc\x00\t\x94\x8b)\x8b\xa3> S\x96\xf9\xcd\xdf\x88\xc8P\xc8^\xbbZ\xa6\xa7d\xeb\xe5G\xdb\x8c\xed1\x0bs\xad\x83\x07\xc9\xf1\xc6]2\x91\xac\x8f\n\rj\x83\xbb\x08\xd3\x01\xdeq\xd1\xe3\xcfn\xfa\x89\xc5\\\x1f o{\x89\x1a\x8b\xce\x9ax9-Gd\x02\xfe\x8e\xe5c\xe7liNs\xd5/D\x81;\xa8J\x94\xfb\x8f\x83B:\xa0\xe4\xda\xfe:\xd1\xe5\x13Rd\x9a\x9b{\xa0w\x86\x11rA\xca\x1a\xd2M;}W~\xde\x18\t-\x1d9m\xcc\xc2\x9a:{v\x0e\x8dJ\x93\xa5\xc7\x8d\x0f\xf1\xf0c8\xd9\x11\x8a\n\xedJ\x8a\x07\xc0\xd2\xca\xfc\x04\x0f\xaa\x89\x83\x8883b0\x9dV\xb3\xa9\x9aIa\xf2\x95\x15\xbb$\x85\x0f\x13\x11Us\xad\xabs\xc4\x1b\xac\x82\xec\xe8\x90\x08\x9b\xd5\xcf1ar\xe1H\xa7\xe4^\xfbQ\xb4\xf8\x8fB\xe7h\xab\xf6\xba\xc5h\xfb(\xcf\x95\x1f\xc4\xee\xae\xf8\x06\xd1)\x0e\xdc\xdf\xe4t\xd4\xe9\t\x1fET\x0f\x85\xfa6\x14\nE\x07H\x06\x81\x9a\xf8\xac\xb5\xd2H\xf0\xeb\x91\x8a\x13\xed\xc6\xd6F\x86j9\xc7tUM\x90\x0f\x1b2\x1e\xb3\xdcQ\xed=/6#\x94\x10i\xa9\x03@\xafM\xf2\x95qa\x191\x18w\xe1v\xae=7\xfa\x86yo\xde\xb7\xdcL=SP]W_%^%Y\xab\xbb\xcd\xf60-\xa9\x08b\xa3;\xff\xb0W\xabd\x02a\xabL$K\xa4\x85\xa1bs\xf3\x15|-\xd9,\x1b:\x16\xa8\xaapI\\\x1d\x10^\x86p\xb9IK\xa8\xbb\xc8\t\xc1V\n\xafB&\x0e\x9a0\xd8\x0c\x10\xa3W\xdf\xa5\x9e\xa1\x9f\x07\xb9hUe\xb7\x85\xe7\xee\'l\xc4/y\x0f\x0cL\x11\x9d\xe4\xfeGlZ\xc4\x03\xcd\xad\xb3\xe0\xb9\xedn\x85J\x03+\x1cL\xf3\x0f\x15`\x0b\xd1\xbe\xe3)%\x9c\x9a~\xdf\xadXXC\x81\x85\x98GZ\xe3{\xd5\xfc\x14\xd12\xad00A\xffD\xd5\x95N\xbc=T\x0e\xc6\xfc~x\x02\x9f\xda8\xed<\x01\xaf\xfes\xe9H<k\xbf\x84\x81L\x17\x05\x0f|\x85$\xe2 \xe3\xd7KNl\x07\xdeA\x89\xea(\xfa\x84C\x8e\xb9O\xd7\xfc]\n]a\xc5D\x19%4\t\xc53l\xf5\xa6KG\'\x7f\x1e\xe9\x18\xfd\xde\xe1\x00\x9a$c\x023#S\x1dd\xba\xe8\xdf\x9dQ\x0c\x8c\xfd5\xfdy3\xe8\x08\xefN\xbc\xa0\xa1\'\x1c\x1d&\xda\x16\x02\xb4\xf1\xbaw~\xfb\x1cP\xc9\xe0\xfd$\xa0q\xe6\x98\xbbx\xb44\x8aG\xb3$\\\xa6\xdc\xed \xf1\xee\xa5n\xbcP\x9d\x90D\t\xbd\x1a\xb5\xd8\xa777\xa7\x90\xd7\x1f\xf1\x1f\x81\x19\xb2\x8cn\x14\xce\x83\xc1R&\xd5\x06\x0c\x9e\xeb=u!b\xd5\xe9\xee\x8b)\xb4\xa6\xc7f\xd7Q\xf9\xee\x81\xb4\x8a\xc5\xffAu\xbdz\x91SF\x1ds\x16\tPi|q\xcby\xe7\xfa\xa2\x16\xf8W2BR}Y\xf4\x19\xa4\xdc\xbc(l|@\xf1\xad\x1b\x1c!\x02\xf5v$\xf2\xb3\xafy\x00\x14j\xb0%\x05x \xe9\xc4v.O\x1d\xd5X\xa6\x85p\xc0K\xbd\xe2<\xd8\x8e]\xa7\x19t\xe1\x91\xec\xc0\x9e\xa4G\x1b\x1d\x139\xbd\xe2\x07jiD\xd3.g\xea7\xa18\xfe\xa8\xe3\xf8\xa9+\xe2\x86\xd2.\xb9i\x1d\x89=\x17\x18\xe2#E\x93\x92xO\x99\xb6s\xcck\xd4\xdfHT\xff\x95b\xd7\xd9X\x87\xd0)\xe8>\xfa\x13\xc2\x8e2]=D\x91\x9e\xfe`.f\xce\xd6\x84gO<\xe3\x9cv\xd02\xda\xe5\xbcV\xf5\xfbI\xed\x9f%%{-}\xaaZKVM\xd6\xe0P\x93\xe4\x13\xa9\x80XI\x15\xc34\xae\xb5u\xcc\xd4\xdc\xe0\xe6\xd2\xf7T\xfd\xdaM\xaf\xf2\xcah\xe1\x13Y[BT\x00\xe7\x02\xc2\xf7\xef\xab\\\xae\xea\x88\xfb\x112Gl\t\xf5\x9e:\xf6\xafc\x89p\xc2\x82i^%\x9f\xc6F\xa6~\xbck!\x0c\x92\x0cz\xf1\xb5MR\n\x9a\x98kN\x94\n\x88\xa0\xd2\x1aw,(\xca\xd0G\xc7y~\x05\x809/caL\xff\xe6ek\'\xe3\xa5\xdc\xbcF\x06\xae^?.X\xea]\xdc\tT\x0b\x88\x87;\x00XL\xefo\xf5\xb5\xf3\x13\xc3\xf5\xd5\xce03\xc3\x93h\x87\xad~bW\xa0Vn;\xfcy\x06M3n\xa8JL\x05&r\x0c\xdbQ\x0b-\xc8\xca\xeblfj&Y\x05\xbd\xd0\xb8\xf9\xb1A\xb1\xb4\x04\x8a<_\xbb<\x93\xf1(\xd4\x99\xb7e\x99\xa5\x9c\'\xf8\x82\x0fO\xccps\xc3f\xa8I\x0b\xb1|+\xe6\xdc\xf3\xf1\x8f\xea@\xf3\x01\xf3\xf7\x1d\xcag\xfaz\x90\xa4\x919tE)\xa2\x8f1\xaaL\xb4\x03\x9b\xb9\xfd\xd6\xcb\x96\x7f\x9f|\xa8P\xdb"\xee|\x84"\xe3\xc7\xb4\xda\xac\xc6ir\x11\xc6\xce\xbc\xe5bd\xb6\x92< ;n\x15\x8f#\xe8M\xe6\x11\x83MQ\x9d\xba\x91\x963\x1fp\tl@\xe5\xcc\x9b\x06\x16\xa4%\xc4\x80\xcb9cWY\xc1\xde\x91\xe3\xb73q\xf2\xad\x1e\x94\x04wsi/\xf0\xb0$\x1d\x9a\xf8\x0b\x80yi\x13p\xbc:\x8f\xd6\x02\xbd\xcekt\xa0\xf4\x9f)\xa8\xbbr|\xb4VY\x00\xff\xb0\xac2\x058\xf8[\'\x8c\xd0\x8d\x1c,\x87w\x11|\xe5\x13Edj\xab\xd1\xfb\xa2\xc7yK)^\xea\xc6g\xa4\xd3\x05h\xc2]&F\xc6\x9a\xd4\xbd>_v\x0cr3\xca\xe8\xfbh\x82\xe1t\xcd\x8a\xf78\xc62>E\xf4\xc4\xa3A"\xa1\xc7f\x90\x1f`\xec\x0f\x91+[Q\xc1\x97\xf6M\xf1=\xa9\xbe\x8a\xbf\xb3h\xac%\x97\x08\x00\xd2\xbchc*\xb4\x80\x89J\xb7\xd1\xfdQ\xac\x8c\r\x13#\x86$L\xe2\x9a\xe2\xcb\x1d|\xd7\x11\xe9\xc5\x97\xd8\xd9\x97\xc2\x95\x8c\x0b\xa1\x9fq)\xba}\xc04\x12\x9a\xd5\xe7\x13\xabvI\xe5"_\xf5;\x1dShO\xdd\xd2B\xdfp\xe9B]\x0b\x9frn\xd8\x99\x89\x01\xd2\xe1:\xad\xe0\x9b\x1d/\x99\xb5\x107/\x85\xdc\xf5_\xb9\xf7L\x8d\x0c<\x8b\xa8 ZB\x83\xc0\x12>\x0e|F\xa3\x1e5\xa8\x02\x00b=\xbd\xbe-\x0f\xd2\xcfv\xa8\x03:~\x7f\xb2\x98\x94\xca\x87\xe6\x8f\x84k\xdd\xe1\x99\x96xB\xffbq\x0f\xf9g\x8a:\xd6\xa0\x1d\x94`\x0c\xd2\xfeyY}\t\xcc\x9c\xd7\x11\xa2{&Hi\x0eR\xecg\xac\xa7\'\xe4\xdc\x9bQ\xf1r&\xf9P\xdc\xce\xf93\xa9F\xb8\x95?KD\xb2\x85%\x99-\xabP\xd0\xcb\xc2}\xf0\x19\xfa\xfe\x03O:\x9c\xe1\xf2\xbbo\xbb1\x94\xbe\xb4*b\xff\x8a2\xfbc:\r\xf5\xa8\xdd4\xdaAW\xb6N~0\x8e\xba\xc7\xc8D\xec\xdbl\xe2\xdd\xa0\xdbY\xadu\xbc]\xdc\x1f\xba?\xb1%p\x10 \xea\xeev\t\x9e\x15\r\xb7.\x97)\x84\x8f OV\xce\xbfrGl\xbf\xe4D3\xff\x93\xab\x1d\xbc\x82\xe5\xa5\xb4\xb9\xf2*;q\x8b"\x04\xbd\xe9@6SM\xfb\xf93\xdb*\xc7\xc4Q\xb79\xdd~wb\xfcC\x06\x82\x07\xf7\x83\xca\xbd\xaf\x17OY\xbb\xf1c\x83\xcc\x1fG\xb7y\n\x9e\x92\xe3f\xcd\x11g\xd7\xe4<\xb1\xbe-\xafl\xdf\xb9\x92\xf9\x8c\xdf*\xb6\x84\xf3\xf0/&!r\x01\xf0\xe3\x9f"\x1f\xf3\x02,\xcbCm[v \x89\x800n\x04\xf5\xe8\x99\xaf\xc6\x02\xb5\xc2\xe0F\xc0\xa0\x85\xb5#\xc1\x85b\xc5V\xd9\x9a\n\x92\xfe\x1b\xbd\x90\xc85y\xae\xbcv\x17Sl\x13\xb9Q8\x02\x86ilt\xd2hyA0v\x1c\x83\x1ai\xe5\xc2"\xb1\xd79o\'\x1b\x9eR\xf3m\x01\xf2eE\xcb\xb2)\xc6\xf2\xf7\xb8tF\xabm^\x88\x99J\x03\x16\xe7\x1e;\xe2\\\xc2\xbf\x91\xf8\xde\xaeB\x19\xf5\xc7\x8dJ\x85y\x1f|d\x92\xaa\x7fPcn\x12\x99Y4=\x98\x94B\xb3\xfc\x8cC\x04?Q\xc2\t\xca\x8a\xdcA\xf3GlS1\x9cZ\xf5S\xf6\xf6\xc7\xbe\x8d\x9bq\xdf\x08\xde\xd0/\xad\xa4\xc6|[S6\xd4\xcbI\x0c\xefG?\x00\x9e\xe0j/7\x0f\\\xdc\xcd\xf79\x8c\xd5$\x8a\x08\xc3\xd5\x11\xeeS\xbfx\x1b\xc2\xff \xaaY\x0f\xde\x8f\xe3\x89\x8f\x888Ds\xe8}NM\x9d\x88\x05\xfa\xcb\x93\xcb\xd5\xfa\xdb\x96\xf70jf\xc8=\xec;\xc69\x81\xe3\x195\xadn\x81\xa0\xbfs\xed\xf9Q\\\x14\x99\x9c\xda\xaa[\xe9S\xdb@\xce\xaa\xe6\x14\xd5\xa3j\xf1\xae\x1fpi\xe3\xde\x852\xde\xaa\xa2-\xa3pO}\xa8\xcb\x88\xc0\xadh)\xfd\x92P\x0b\xd4!?*\xdaAO\xdd\xbb\x81L\xe7\xa3\xb0B{\x9d\xb82\xed\xde\xa8\xdd\x80\x13?\x12\x10A?\x10\xa3J\xaa\x90f\xec \xe9P\xe9\x12\xea\x13\xc9\xf6\xe3\xb0\x19\xb0\x1c\x9d\xc5\xc3\xae+\xa7\x9a\x07\xd2--\xe206DU\xca\xdc\x19\xca\x9d\nU\x80\xbf\xae%\xd6\x86% \xf8\x1cV\xa3wc\xc7\xb9`\xf1!\xb1\xde\x05\x83\xe1\xec\x0e\xa9\xbef\xb71TBv\x93\xbd9\x0e\x91s\xca\x96\x8f\xe5xL8r\x98\x05\xf6\x92,VK\xb2o[\x92\xcb\x13\x861\x17 ,\xc5\xae\xa9\x18\xdeT\xb2\x05\xedo\xe4\xdbu\x8e\xb66\xc7\x0c~\xed\xd2\xdd\x91\'\xc7\x83\xec(9TM\xb0\x81\xec\x9b\x8aos\xd4\x81\xaa\xf6\x9d\xeb\xfd\x9du\x07\x19ghX\xe9\x0f\xfd\xfa\xb3\x01$\xffo$\x92\xb6\xb6\xce?\xa3?\xdfF\xdeH\x15\x96\xe7\xf9\xd7V\xc2\x8e+\xe7\xb7\xd2\xa3\x1e\x86t\x8d\xa8+\x16b\xa0\xee\xab\x16\xd25\xef\xd1\xc6\x04e\x0f\x88|\x83\xb9jE;\xe9\r_\x8b\xda-V\xd4\xf1\xd3\x80{)\x0f7\x04\x8dJ\x98\x1e\x1c\xb4H\x19\x9e\x15Hr\xb2Pz\x8e\xff\xbdx\xbb\xe9\xd7\x86tX\x93\xb8\xa7\x0c\x99\x81H\xd4\xdb\xce\xff\xf2\xb0-\xb4\xd2L\x1bvY\x95\x9e\x90\x8c;\x8ai\x17*A\x8d\x83>T\xad/\'\x9e\x1b\xf49\xdb\x82e\xe1\xb4\xc1\x89\xc8\xf4\xf7V\x05\xd7\xb0\x04\x9b\x87\x83\xc9\x8b\xd4\x99BU\xbapV\xc03W\xdc6\xfa^Y\xeb!\x13\xd4#g\xdeh,2y\x87\x92G_\xb2SK\xd7s\xf0}\x19\x8b\x08gE\xf5Z\xf4L\xb9`\x98\x80+^H\xack\x03`\xb2uC\x95E\xec\xf3?D<\r\xb4\xe8o\xf9\x0bRW\x02Q\xd7\xc6by\xb2d\xba\xbd\x94\xaex\x87#\xcb\x90\x9cs\xa4\xe7n\xc0\xd6\r\xe7\x8b.\x93\xf6<\r\xc0u\x0b\xaf&z\x08vp\xe3:\xb2\xb7H8pL\xb4A/\xcd\xa1\x8eg9\xb6\x83\xcea\x18\xa4\n\x11y"\t\x1fNm\xb1\x832\x03\xd6a^7d\\\xcf;\xff\xb2\x10 \xf1\xa7h`BR\xc2`y\xf3\ry\xc2\x87Vn\xf0\xad&\x0f\xc4\xbacIVs\xc2\xe7t\xa5u\xf9\x1f\xc6 OX\x1b~\xbd-\xe9\xfb\x9f\xe0\x8d\xf3\x01\x8cL\xbdwb\x95\xac\xfd\xac\x86\x07@\xcd\x98\xc0\n\xfcH]\xf7\x8bs\xb5\xb2j\x0c\xdd\x17\xcc9\xe3?\xc9\x84l+\x979\x1b\xfa\x9d\xbc\xefMI\xad\x1a\xaf\xd3\r>xA_\x91\xb0I\xb7\x0f\xee\xbc\xa8\xb1\x1e\xa6+\xa4\xfa/\xda\xa8\x86f\xa8[4\xe9x\x9d\x94~xA@\xcb\xe5(\x07=\x00:]\xc8\xcc,\xb1<\xb1\x93#\x1d\x16\\ZA\xa3\xf0\xa4\xc0[A\x8f\xf3\xa1\xf4\x0f\xae}\xd2\xd8\xa0\x866`tgn\xfd\xff\xd610\xea\x0f\x0b\xdf;\x81T.\xeb6p\xdb!B\xdd\x8bj\xcf\x80xh\x8ex\xc9_\x1a{\x8b\xee)3xZ5\x1b2\x19^\x0fW\xe9.\xcb\xf1~\xbf\xbc\xdf\x1c{\xda|\xcc\x03\xf5\xf0=\xe2\xa0\'\xd8\xa2\xa9\x0fQP\xef\xff\n$\xec\xa7l\x94V\xeb\xcb\xad\x95VmC\xb1\xc5?\xec\x80+\x81\x95\xf6\xae\xdd<\x8f$\xde\x05\xdf\x85\x00\xcf\xcaS\x16\xb9\x9au%*Z>\xccg\xa6\x13\xf4\xa5:.\xf6\x16[hA\xb7\x14:Jm\xfae\x0bZ\xa7B\x10\x0c\x18\xcd?\t}\x1b\xd8u\x0be\xf7\x89\x82\xc3Q\xe4\x91\x90\'!\xa8tsI0\xf5\xb7\xc3\x16\xb7\x17u.\x9a\xf1\x17\xb7\xdd>\x19?D\x89\xca\xd8e\xccSH,C\x83\xd7\x1eE\xe7\xfa\x81\x98\xbaF\xbd\x9a\x8c\x84\xebN\x8e\xfe\xd6\xbal\xf7\xba|\x10\\JUNq\xf5\xe1\xca\xa3\x8b\xa7\x84PK\'awi\x7f\x1e\xa3\x8c\xb6\x9d\xea\x96\xca|_\x03\xf4\xc3h\xe4\x18Hf\x99\xa7\x93\xef\x12\xd0\x07\xd7\x95\x99\x1e\x10Rfm%n\xf5d}8\xed)j\xad\xa2u\x93xp\x04\xfa\x80\xab\xff\xcepK\xb5\x93\xfc~_~\xfd&\x80Zb\xb1A\xf7\xa8yX\xaf\xbc7\x98\xc3\x9e9\x8c\x88\x87:S/\x8e9\xe7\x0f\xec_Q2\x0e\xe3\xd1o\xc6T\xd2\x12\x00\x80\xd9\x9dW\xb0\x9f\xd5\xe8\xad+\xa2\xbb\x02\xb3\xba-\x04\x92\x81\xad\xe8\x95$#\xdfA[\xd3\x9e\x80\xbc\xb1\x9e\xad\xdc\x98q\x9d\xe4\xe3\xa2&\x11\x9c\xce\xd7V\xe0g\xe8\xa3+\xcb\xd5\xf8\xaf\xac\xec?Y\x8e0\x87\xb8U\x07\x02B3H\r\xc1<\x18\xc1\x98q\'\xa1\xd9\xbe\x1fKX\xd6\x06\xe8\x91\xc9$\x12\xb7\xb0\x87\xe68\xe2\xfc\xdeQ\xc1N\x8d?\x80\xf8\xf7\xdff\x05\xb5\xe3PeT\xd8\xdf\xab\x8a\xbcl\xe2%:\xaciq\xd2\xe0\xee@z\xed\x84e\x94.\xa1\xe1\x93]Do7\xca\x97\xaf\x19\xeaZ\xe1\xea\xbc\xf9D\x91\xf4\x12\x8c\x0b\x82\xb3Z\x94\xdbm\x10\x8dEM\ro\x9a%\x06\x10\xa2:\x90\xa3f\xb3\xcae\x19\xa4\xa4<\xccdd\xdb\xd4\xd9\x9d|\x90\xd8s\x9d\x8b\xc3\xa5z\xd7\xf6\x9e 3=\xd2\xbf*\xf93\xce\xadW\x85\x89l\xa9\xec\x92\xbf\xf7;\xd9\xfdx|j\x0e\xdf\x058r\xb9\\\xf6\xaf\xb5\x0c\x84\xf6\xc6\xeav\x8f\xf5:\t\xa1\xb7\x7f\xd3\x9a\r\xff\xc35\xf6\x13,\x95\x83\xbc:\x83\xcf=\xa4_S/\xb5\xa71\xb3;\xe1\xb3O|2T&@\x93\xd9ig\xb4\xca\xc1\xafn@\tJ\xf0d\xb3\xc4\x01\x0f;/n\xe1\x82gn\xe4\x1eM\xad\xe8\xa4\xe7\x84\x8b2\xf9e6\xe9V\xeb/\x87\xef\tr9\xbc\x15\xe1a\x9b\x02\x86\x02o\xe9a\x98\xf4"\xd9]\xde-A\xc3J\xb1\xba"\x0f\xb6\x99\x06\x16m!4\xeb\xfd\x13\xfc\x00:g\r\xedmz\x06\xd9\xae\xb5rw\xe4N\xbd\x12YIm\xa8\xdd\xff\xab:\x1c\xb8\xb0\xd4\xb4\x19Ml\x9c\xf0z\xd3L\x13jx\xc1\xc4\x9e\xea\xe4\x9d\xd1\xd9\x8e\x05\x85\xe3\x81kB\xa57\xf2\x03\x0c\x1e\x89\xc6R\x0c\x8e*\x8c\n\x8a\x99\x05\xef:\n\xcf\xbd\x8a,~=\xdf\xdc\xbab/jB\xb9_>\xdf\xe5;N\x05\x18DE\xef-\x14\xcbc\xedM\x94\r6Z\x8aJ,)\xb2\xd2\xd8#\x97:2\xd2\x14\x0eS\x0e3\xfe\xdfV\x81\xdfm\xad\xd1\'Q\x0f\xefw\xb7\xa1a2\x13\xcd/)#\x9b\xe8\x86\x00\x0b%\xe1\xd2\xfb,\x97=Q\x92\xdf;\x16\x8f\x0c\x9f+\xf2\xc1\x9e\x1ck\x04\xa1u\xfc\xc5\x9b2\xfe\xff\x01o\x8c"o,\x8aZAY,1\xe9t\x98"q\x19\x8b<\x95\xc1\'\xb9T\x94\xe5\xc9v\x02 JaX8/\x00l\x9c\xe7\xab\x08\r\xe2%GU\xf9\xb6\x7f\x1a\xaay\x12\xddP\xf92\xfd_\x00\xd5}D\xd0\xb3\x10\x91S\xc9C\x0c\xc7\xb7rY\xe5\xdb\x97\xe4\xe4\xa7P\x8c\xb5\xb01m?\xe5s,\xa0\xe9y\x99\xbdh\xce\xe9\xc8\nC\x8d\x11\xfe\x07\x89\xf3\x0c6\x10?\xd6\xeb\xb3\x06A\xba\x19`\x7fT\xe7D\xc4\x90Z\x8dV\n\xff\xbe\xe0m;k\x19\xaeR\x08\xa5}\xfe\xedUoDn\x8a\xdc9\xcf\x8b\x1e\x10\x97\xc6\xa6\xba{\x93\xae\x87*\x92X\xc8n\xa3!\xf2\xde\xc9(\xad\x95d\x16\xbb\xc5\xbc^V\r\x97\xfa!\x0fE\x87\xd4\xfbK\x9bZX\xc9\xb4\xbe\x92\x14\xc8Y\xf6\xb7\xe6\x07\x81g\xc2\x9c\x9d\x96\xa0\xbb\xfc-\xc6Y\x1c\xb7\xc0;\xba/$\xe2H\xe1e\xf7\x14\x03\'\xc3\x18\xe2\x92\x82^\x87s\x84\x1d\xfcf\xac|\xdc\xba\xf3uk\xef\x0c q-\x1a\xe2\x85\xd5\x1e\xd8u\x88{\xd3\xfc7\xaf\x82\xf0\x92|\xf4Y\x02*h\x02vw\xd5r\x02\xafO\x82\xa0\x9b\xe0h\x8d\xc0\xd2\x8esB\xb0@>1\xb8\xc9\xed$f\xc3\xec\xdc:\x15\x93]\xda\x9a\x15f\xca\xb9\x99\x80\x9b\xe0\x15\xf3\x0c\x80\x05\xffx\xd0B>\xb9v\xc4\x03\x1c\x07\x9aI\x00\xda\nj38\x01\x12\xc8\xcb\x9f\xca[\xd2\x10\xa9\xb5\x15\xda\xe2L\xc3?\x95\x85\x18\xc6\xf8q\\\xa0\x1et\xdcn\xd1{\xf9P1K\xfc\xf6\xc4H\xb4\xaa\xa2q\xc5\xcd\x83?\xaacJ\xc6\\F\x93?:G0\x92\xdb\x1dA&rC\xcf\xdc\xf0\xbb\x12\x94\x1c\x12e\xe9\x86\xaec8@>M\xbb\x89\x15\x02\x02\xe5,\x98\xde\xb8\xd0\xf7t[\xbe\x82!\xddx\x92\x102\xe2\xfd\xe7\xd8:\xe1\xed\xdc\xeai\x96\xbf\xa5S1\x01\xc68\xf3\xd1\xab\x0b\xa2\x80\x84YI\x86F\x96\x04\x00\x98\xcc\xab\xb1d5{\x85\xb22j\xaf\xac\xdd\x18z\xed\x0bi>\xddE\xc7*\xbc\xce|\xcc\xe7\xfd\xfd\xfa>5UB\xc9|\xbbq=bH\xfe\xad\x1cL&\x0c\xf0\x8b\x95:\x9a\x851l?e\xd0\xef\xc3\x91\t\xd2\xc6e4\xf4o\x8f\xb2\xdf(c9q\xb1|q4G[6J\x0f\x7f\x1e\x12\x13nCl\xd0\xb4m\xed\x90)\x1e\x96[\xc1\xba\xad<\x18N\xd5W\x1eBh\'j7\x97|G]6\xf6\xec\x0e\x1bV\xdc\xa1d\x85\x8f\xc7\x9c\x06\xfc\x16\x99\xd2p\xc7\xf1\x97r\t[o\xd9\xdc\xecx}Q\x8b\xb1\xbc\xd7\xbd\xe2G\xfc\xca\x97\x0fZDzg~\xc0KJ\xb4\xde\xee\xa8l\xafnR^;\xf56\xbe\r\xa3.\x04\xcf7\x81\xf8\x12\xb1\xfb\xd0\xfc\xdf\xf7\x8d4\xbb\xe4]X\xd8\xa1\x86%3\x96\x89\x950\\\x11D\x18\xd3"\xeaG\x0f6\xa6\xd8\xef\xc6\x9f\xb0\xec\x12\xdbH\\\xb1\x95?\xde\xf1\x83\x18\x89^\xa0?\xb6\xabTm\xe3\xd8\x02\xfd\xb8\x87Tpi[\x8a\xc0\x8d\xdc\xea\x19,\x183C\xd1R\x16n\'\x82\xf9\xcbd\xf1_Y\x88\x81\x12\xdbj\x93q\xb4\xa7<\xaa\xad\xcc\xba\xc0\xfc\x87nL\xc1\x15-t\xcd\x11\xc4\x14\xf6&nA\x8c\xa4\t\xccc\xc6\xcc\x10\xc5A\xa1\xa1{r\x8a9\x04M\xbajPM\xec\xedM\xbd$\xdc\xcbY\x9d,\x0eO\xe8\x1cY\xfa\x87\x95\xddM>\xe8u\xee\xc1\xa0i\xe2He\xdc\xc8}Z\xa256\xc8c7\xf7\xf5\x02\xe5\xb6\xbbq*\x93Z\x1c\xe9\xb1$>\xe7\x12\xd6i%\x1e\xad)H1\xf0M\x13\xc3|\xe2M\x1d\xa39\xb2\x82Z\x17\x83\xbc\xe3\xf5\x1a\xd7\x0e/,\xedz\xebt\x058\x1d\xbc@h;k\xd9\xd7\xe9\xdaG\x9aCm\xd3\x8a\x89\x86\xa3\x96I\x1a\x02\x9a\x1c\x86\xa5#xK\x13`\x10\x1fU\xccF>u\xa9dK\'\xfe9k\xdd\x83Bs\x9e\xef\x9d~\x07}\xd6\xd0\xe0]\xd3\tG-\x01\x00v`\xdc5Z;\xf0\x95\x9c\xa7\xe8\xba\x9f%\xb5\'[\x07\x85\x91\x08\xcc\xd5\x86^S\xee\x81\x9b\x03\x7f7&D\xb8\x9f-.2V\x8dw\xd5I\x04\x95\xeb\x12.]/V\xe5*\xfa/\xa6\xf5\x8f\xa1\x10\x8a\xc0\x10<2\xc9\xab\x10\xd9\xe9H\xd4\xdd\xcb8\xfd\xaf\x12\x89\x1d\x8d"7w\xbf\x93\xe8aG\x99wz\xda\x03\xf7*\xb1.X9\x1c=\x87 \xcb\x9c\xc6\xf6\x17\xc0M\x10\xef\xcc;kZ\x9d\x84\xa3\xdc\x8a\xfabgB\x14QS!EMD\xb1\x13\xbc\x80<\x1b\xa0\xa3\x0f\xb5\xeaGy\xee\x1e\xd6\xe9\\\xe98&b\xff\xc0\xa1s\x93\xf0\xd6\xf0d\x9d\x99\x1d\xe6\x9b([\xa4\x1a\x1d/\xea$\x10F`\xcc\x04\xee\xe3\x8a\x98F\x84\xb26\x12\x0f\xee#\xe3c\x88\xaek\x85M\xc1Ch\xab\xfb\x98\x91\x94\xdbk\xc8\xed(t\t\x12\xd2G7\xf6\xdd\xf9\xeb&\x03\xb96B\xea[r;^Z\xf3\xc3n\x16\xd8`\x03\xa1\xaa\xb8L[A\xac\x1emB\xd8S\x16\x96\xffc\x9a\x7f\xe5\xf8\xee\xba(\xb8v\xd9\xc6pvs\xbf\xd1\x14\xa46\x81\xac,[\x97\x96\xa6\xff\x0f\xe6\xa7<\t\x10\xb8\x81\x8dT\x89\'Ej\xa0t*\xc5\xf2\x05\xccG\x94\\u\xd3\xb8\x19J\xb8"-\x85b\x9c(\xdb6\xaa\x7fz\xeb\xc2$L>3\xb4/\xc8\x94\xe0\x00\x85]z\x86\xc4\x06\xcf\x0c\x94\x7f \x90\xd5\x91\x18\xe40\x0f)\xc3\xe8\x1e\xe4\x7f\xf8\xc6\x8c\x02;\xd1\xde\x8e\xdc\x9a\xcb\x05\xe7\xcdh\xcdCj\x97\x9c\x8a\xedm\xc5\x8a\xdem\xccJ,\x8c\x8f=a\x9c{\x1b%\xa65\xc5r\xa3\xef?vq\xba\x85\xc8J\xba|~\xe8-d\x95\xbb\x1e\'\xc7\x9b\xcd%\x16xP\x9a\x82\xb5\xbbC\x15\'3~\x86\x964\xf2\x12\x82Vw\xb7\x81\t}\xc8\x81\x01V\xea\r{\xbf\xd1-\x03\xb9\xae\x14Du\xe3\x1d\xe3\x08\xa2\xad\xc1\x9a>Z)\xaf8\x10\xdd\xc6"\xef\xda\x81\x7f\x05b\xe5H\x13\n\xb2\xe5dX\xd3\xed\\\x15\xe2Zc\xef)q@?\xe7"/\x13\xb7\xb0\xddo\xc0\xc3\xe8\xdc\xe80\xb4Sb\xdaj)\xcf\xcc\xb8#q\xdfR\t\xadSgX,l\x06\x85}\xae\x93l\xedk\xf1\x05\xd3x\xbd\xa86\xbc\xce\x8a\xa9\x1b}4??\xfa$\x8f\xe7\x9e\x99\xd5z\x00a\xe2hY\xd7\x1dU\xc6\x8f\x13<\x94\xec\xe8D`\x16 \xfbA\xb9\xa8{\x1f}U\xf6g\xa6\x8eA\xb9\xef\x88\xd9\xdee\xc9e@\x80\x8ep$\xa49\x12\xcbUw\xfd\x83>Y\xc1\xc9\x7f]ZpDP3\xac\xa2P+\x92lb\x85\xb1\\\xfd\\\xe1"\x1b2~\x8e?\xee}\xc0{\xd5\x0f\x83\xd5\xd5\xfc\xe4\xf8?x\xad\xa6Bk\xad\xccWl_+\xe8[\xb1\xe3\x91G\x92\xa2\xdf\xd7)&\xa4\xc3\xbbP\xaa\nT\xf8J\xf1\x04\xc2a\xb4\xbeBH\xbf;\xfeiek\xe5\xe0T\x01\xe1\xd6\x8a\xd0\xf0\x98\xe2\xa3P\x0c\x0f\x8e\xa2;\xa4mB\xda\x1c\xab\x06\xc6\xb7\x8ed\xcbH\x8c[\x0f\xbe\xf9)\x12>H\x97+\x06\xc8\x9c\x1b\x86\x8c|\xc7\xd7\x05\x7f\xffz\'\x8d\x18\x85?\xe5\xd4\x86\x17\xa7\xc4K\xcb\r\xc2\x88\xdaX\x8f\xedJ\x16\xfc\x8c\x91bC.moN\x10EDH6\xba\x8e\xef\xbe\x84\xd2Y\xf4\xe6\xa2\x0f6\xaf\xde\xad\x9a\xe2\xe9\xe4\x1d\xf4\xc8\x82S\x10|\xcdR\x87\x8b>J#^\xb2\xc1|\xbe\xb3\xa0\xd3\xf8\x86\xef\'\xdbg;\xd6:T\x10\xd99;\x1dS\x18\xccJ\x82\xee\xe5(\xfa\x9f\xc22\x08\xfe\xe3Y\x8c\xa0\x81\x8f\xcc\xb8\xb9\xb0\xe3\x12\xac\xc4\x89=\x07\x1eKx.\xd2,\xc1\x80\xaa)\xb1l\x03)\x90Ss\xc5\xc3\xa5\x11\x85\xf1P\xeb\xf82\xa2\xaf\x04&\xafWU`[\xbaV^Y\xb0+\xcac\x18\xc8\xfeH\x82P\\0\x8a\x91)\xdc\x9e\xb2gb\xe5\xdd<\xe7=\xd7\xc4\xef\xd6\x90\xc2\xb2\xf4\xcdD\x05\xe3\x7f*\xdf\xb7\xb9\x9d/\x95\xc1\x90\xd0\xe0c3\x19\xc8\xb3\xc9\x05[\xa1\xae\xc1\xebZ\xa8\x1a\x9a\x18\x9c\xc7\xd7\xf6\n\'\xff\xbdKQCr\xd3\x99O\xaa\xa5c\xae%8\x85\xb9\xc2X\xf6\x89\x8f\x16y<7\xb6\xf0\xefOU\xffx\xb8\x93\x11\xddL\x95jz\x9e\xc4{\x1d\xc9\x9f]\x8e\xa0!A\xcc"U@X\xc7C\x92\xaee\xaa\x90\xa5\xbf<\xdc\xb4C\x1b=\xab\xa6\xf9P6?\x18\xd9\x8a\xa5\x0bZ\xc0J\xb2h\xcb\xa1j\x9d\x01^\xc8z!\x80\xe9G\x1eC\xabA_\xb6\xf6\xf1mn)\x16C\x98\xb6\xf0dq\xf7\xeb\x067\x1fy\xb1f\x15~g\x1e\xd5\xbbc\x91\xe7\xcd\xb9\x9d\t8O\xb2z\x89\x91\xaa\x1c\x90\x12\xba\x13%\xbc\x8f\xa7^\x87\xc0\xfae\xa0\x17\x02\x8c\xae\xb2 \x99\xb0\x17[\xe0\x85\x8b\x19\xdd\xb9K69\xe0\xb5\xef\x00\xf6\xea\x84\x94\xf4\xc9{YH\xbc\\\xda\xa5\xbc\x1eO0\x16\x0ca\x05s\xb1\xae\xec\r\xbb\xa2\xd6\x04\xc0\xd7\xbb8\xf4\x05]q\x0e\xa9w\x88\x10H\n\xca\xd1\xf3\xc1\x02\xcf\r\xad;\xb3}}\xc6\xedT\xc0\xe7\xac\xe1\xc2\xa0\xf2\x1a5\xa1\xef\x92#\xa9\xe68\x9c\xbf&M\x196\xc0\xb5\x9a\xd6\xae\xe9\xb0t\xe9\x181R\xc5J\x82Y\x98\x11\xa7G\xc2\xa4\xade\x0f\xe9\xd5{\x083\xa0|\x0e ;\x13-\x03=h\x8d\xee]\xb6\xf9\x9d=\\\xfc}\xc7<7+\xa49\xbc\x06fm:V\x14\xacs\x100\xe3\xe8%*\x15\xe4\x0e\x06\x06a6\xa1\xc4\x83\x05\x15\x87\x1a\x9f\x0cR\xf97\xdd\x8b*=o\x0c\x87\xfbr\xd8\xcf\x82V\\)\xaaY\xdd\xad\xa4\x84\x87\xa3@\xe1f\xe8Y\x1bMNX\r\x9e\xd4\xe8\xc4@\xd4<9\xe6\x8c\xb2\xc4\xa5\x17b^\x85j[.\xe8pzn\x17R\xd2\x80o\xb2G*w\xf6\xb8b\xb2BJ\x84\x98\x1b\x00\x0c\x12\xa6\xdd\xcc\xc0:\x8a\xc1\x86b=\xca\xd4\xc0(u\xfb\xdc\'\xb9\xff\xc0g\xcb\xc4\t\xce9\xd3\xd7\xe5u\xee"\xce,j9\xa1d\x9a\x7f\x1c\xee\xb7\xf9\xb9\\\xf7\xb8\xf8\x11\xfeX+\xfb]\xfcQ\x8d\x06)\x10\xd5\xf3\xf9\xe8\xc1J\xf9\xb8\x95\xcb\xc5\x0eK|$\xac\xbc\x13>,\xd1\xceo\x00\xf1\x90%v\xbcz>4\xa5{\xd2\xd3\xf8%d`\xb8\xdc\x95M#\xfb\xf7\\O\xf8\x04\xfc\xcc\xbf\xa3H\xc1\xa2R\xce\xdb\xb5\x9e\xd3h\x1dU\x1d{\x84\xd6\xec\x95:\xc0\xa1\x1f\xfb\'\xc2\x83\xdbP\x14rH\x10r\xd6AaqR\xa5T\xc5&\x19\xf6\xd3\xa5\x9a\xc4~J+\xb9]\xe7\xaf\xbfx\xfb\xbet\xbeu\x9b\xf1\xcc\x18S\xac\xbd\xf9\x0c\x05\xfe\x01\xc6\x03=\xf2\xbaX\xffq\xc0l(\xc4-\xa4/\xfe\xb8q\xb9\xbf\xf5ra\xe6\x15\xdf\xc8 \xa1\xfb\xbc\x17\xda\xb6\xbeT,\xf1\x7fO\t\xe2\x05>T\x9f\x02\xb0\x9b}"\xf6\xaeC\xdf\xc7C\xdfO\xf4\xe4\x1c\x17\xdbD\x7f\x8e(_\xe3E\xb5\x02G\xf7\xd43\xfa\x82\xabf\xef\xb8\xac\x91Qh\x18\x1e\xc8\x87\x91.\x92k\xe3\xea\xbeq\xfd\xaa\xc6O\xf9{h\xaaj\xedW\xf5\xfcB\x89\x8f\x96`\x910\x11\xbc\xb7\xeb\x93\xb0\x0e/ \xde0^\xe8z~ol\xbc\xe7W\x07M\xe5m\xcf\x1aTY\xbfQ\x9e\xc0\xdd\x14\xbdB\xae\xc7\xdb\x18\x13\xf0`\xd7\xa9\x80\xfaM\xf2\x16\xba"\xd4\x0bz \xe7\xe9\x11\xb6\xbd\x93_*\x9d\x9b\xb3\x88\x89\x01L\xcd\xbd\x9ait)\xd86\xb4MW\x83\x88\x92\x92E\xf0\xc7U\xec\x81\xff\n\x13\x8f\xe7A\x94\x82\x85zFj\xde\xf0\xae\xf8\xa3\x03\x0c\xdc"\x1a\'u\x15V\x88\xb2C\\E\xb5\x12\x84\xf0\xb8\xa4z\xe51\x94O-[}Q\xfe\x07;\xa9\x95{\x15|\xd3\xa8\xdc\x9d\xd9`py\x9e&-\\IE\x95\x97\xa9\xe7\x9b\xf1\xf8\x95\x8bo\x9b!Q\x00#\x88\x13q\x85\xfe\x08\x9d\xa3\x0c\xb9\x01\x80\x01I9(\xc2\xd8\x1c\xb0P\xf7\xb6*\xf9\xad\xe2/\xbd+(\xac\xd0*6\xc4\xd1\x13\x1fKg\xbd\xc3\x82\x87\xfd \xe8\xbf\xa7\x13~\xedYLo\x1f\'\xfa\xc0D\xc8\xa2\x18\xe2\xde\x80nGoA\x81\xffq\xaer+>W/2\x0f\xda\xab\xf5\xc2h\x12\x06\x87b\xc7\xcaIy\xa4Z\xd0?\x87&\x05\xd3Y\xe40h\x899\xf3\xe1\xe7\xd9\x91r\xebH\xfd^(\x07\x99V\x13\xac\xf5\xcbi\xa89\xcd$H\x06l&\x99\xa6\x0e\xea\xacc*6\xdb\xd7\xe4\x86Y\xa2\xeb?)\x1d\x9a&\x8bL\xd4\x8e\xb4\x02*<\xb6r\xbd\x98\xcc\x82\'~\xabmd\xc8\x8b\xfb;l(\x9b\xbf\xdcpNV\xa7b\xd4H\xb3_\xd0A\xc3\xc6l\x07\xa4#\x94\x17\xb1\xd5\x96\xa1\xb0<\xd0d\xc3\xef\xd8\xf3\x95T\xce\x03L\xc18#\xe7e"\xb0\xff\xb4\xc2\'\x1f\xccl\x85\x13\x01\xc8\xf9\xd7\xb9 \x99V\xa0\xf7\xe4i\x1au\xc5\xe4\xe5x\xbc\x0e\xb5\xbf\x93\x96#\xb4\x80\xb5\x15L\xd2\xfcC\x04\xeb4?6\x1e\x1d\xf2\xb3\xd5z5\xbd\x01"\x98\xe0\x07\x94s\x07:3\xd6\x1e0ziT\xe0WG\xcei\xa9\x11\xbb\x80\x1f6T ns\xd3\xba\xa0\xc0v\x05`5\xf5\x9d\x80<\xd8\xf3\xd6\x91{\xec\xe8MU\xba\r\x1c?\xebo/^i\x10\xc9\xc81\x95\xbe\x19\xf1\xb2\x11%\xe8\x1b\xa2+Xu\x81\x9b\xaa\x03\xd4\xa3\x8e\xce]\t\xeb\x1f{l\x0f\x83\xa599&i\x86MI\xc1\xd9\xf4$\xc5\xee\'MRL\xeb\xbd4t3\xee\xe3\x8e4\t\xd0\xc4d\x0eY)\x8a\xfaV\x8d\x02\xdf\xdegoM\xf4\x83?\xcb-\x04\xc8\x90\xb4V\xa4\xc3\xb48\xb7\xa8\xc9\'\x0b\xfd\x11\xaf,\xb0\xac\xa9\xc1\\\xbc\x16Hz\xa4\x07\x91\x08s\x8ep\x12\xb8\xd8\x8d\xc7-\xd7\xfd\r\x14\x86]\xad\x8bI\x9d\x860\x8e"\x82\xb1\x191\xb5\xd4\xbc\x8a\x16_}\xe7\xc0#Q\xb6\xa6\xccW\x04\xefM\xf8\xe4\'x\x14\xefr+L-\xed\xcaE9\xf4\x9b4\xce\xdf\xc7\xda\'\xc4\xcb\xb0\xcb\x9f\xa5\x83\xef\x02\x0b\xb2\xb5\x16\xdb\x84\xb0\xa8/\xe6Q\x8dI\xab[U \xe9P\xfcx\x96\xd24\xdb\xd8\\\xfe\x02\xa5!\xb4\xd9\xc4\xc0\x01\xa8\xe7\x16\x0f\xae\xc5\xce\xb8\xcc\xe2\x1a6\xb1\x08Um\x18?/<F")\xb9\xb0\xa1\x02\xf3ad\xb1n\x95_\xdf\xc9\x1d\x9a\xab\xe8\xafp\x93\x0f\xc3m\x17\x19\x02\xc5o\xa3\xfb$\xc9\x10\xed\x9e#\xa2\xcd\xb6\x0c\xbf\x18=\x14=\xcc\xe9\xd6\xbd\xea\xe7\x8dwG\xef\x95\x06Rk\x1b1\xccj\xf7\xbd\x97\x1d\xaem\xa5\xd7\x80g\xa3%\x0b\xeb\xb8\x12\n\x910\xafK\xa1C4\xecn+\x00[\x12\xd5\xa3v~\xd2\x1e\xe0\x86V;\xd9\xbc\xbf\xa8\xffdm*\xd6Fn\x8d\xaa\x19}\x98\xc9\xafgU\x11 y\xa3\xd5C5z\x7f\x86\x85w1\xba$\x10]\x90\xedQt7\x9b\xce\xdd\tk\x8d\xc4\xb1vZ\xa4l\xd1\xf6\x81\xe0\xca\xceP\x1b;\xb6\xda\xe3\xb6\xfc+\x10\xc2\xc3c\xa1\x85R0\xf7\xa4a\xd4\xd7\'$\x0eff')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from hiddifypanel.models import *
2
+ import flask_babel,flask_babelex
3
+
4
+ # from flask_babelex import lazy_gettext as _
5
+ from flask_babelex import gettext as _
6
+ import wtforms as wtf
7
+ from flask_wtf import FlaskForm
8
+ from flask_bootstrap import SwitchField
9
+ from hiddifypanel.panel import hiddify
10
+ from flask_admin.base import expose
11
+ # from gettext import gettext as _
12
+ from wtforms.validators import Regexp,ValidationError
13
+
14
+ import re
15
+ from flask import render_template,current_app, Markup,redirect,url_for
16
+ from hiddifypanel.models import User,Domain,DomainType,StrConfig,ConfigEnum,get_hconfigs
17
+ from hiddifypanel.panel.database import db
18
+ from wtforms.fields import *
19
+
20
+ from hiddifypanel.panel.hiddify import flash
21
+ from flask_classful import FlaskView
22
+
23
+ class QuickSetup(FlaskView):
24
+
25
+ def index(self):
26
+ return render_template('quick_setup.html', lang_form=get_lang_form(), form=get_quick_setup_form(),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),admin_link=admin_link(),show_domain_info=True)
27
+
28
+ def post(self):
29
+ quick_form=get_quick_setup_form()
30
+ lang_form=get_lang_form()
31
+ if lang_form.lang_submit.data:
32
+ if lang_form.validate_on_submit():
33
+ StrConfig.query.filter(StrConfig.key==ConfigEnum.lang,StrConfig.child_id==0).first().value=lang_form.admin_lang.data
34
+ StrConfig.query.filter(StrConfig.key==ConfigEnum.admin_lang,StrConfig.child_id==0).first().value=lang_form.admin_lang.data
35
+ StrConfig.query.filter(StrConfig.key==ConfigEnum.country,StrConfig.child_id==0).first().value=lang_form.country.data
36
+ db.session.commit()
37
+
38
+ flask_babel.refresh()
39
+ flask_babelex.refresh()
40
+ # with flask_babel.force_locale(lang_form.admin_lang.data):
41
+ # flask_babel.refresh()
42
+ # flask_babelex.refresh()
43
+ flash((_('quicksetup.setlang.success')), 'success')
44
+ else:
45
+ flash((_('quicksetup.setlang.error')), 'danger')
46
+
47
+ return render_template('quick_setup.html', form=get_quick_setup_form(True),lang_form=get_lang_form(),admin_link=admin_link(),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),show_domain_info=False)
48
+
49
+ if quick_form.validate_on_submit():
50
+ sslip_dm=Domain.query.filter(Domain.domain==f'{hiddify.get_ip(4)}.sslip.io').delete()
51
+ db.session.add(Domain(domain=quick_form.domain.data.lower(),mode=DomainType.direct))
52
+ hiddify.bulk_register_configs([
53
+ {"key":ConfigEnum.telegram_enable,"value":quick_form.enable_telegram.data},
54
+ {"key":ConfigEnum.vmess_enable,"value":quick_form.enable_vmess.data},
55
+ {"key":ConfigEnum.firewall,"value":quick_form.enable_firewall.data},
56
+ {"key":ConfigEnum.block_iran_sites,"value":quick_form.block_iran_sites.data},
57
+ {"key":ConfigEnum.decoy_domain,"value":quick_form.decoy_domain.data}
58
+ ])
59
+
60
+
61
+ db.session.commit()
62
+ # hiddify.flash_config_success()
63
+ proxy_path=hconfig(ConfigEnum.proxy_path)
64
+ # uuid=User.query.first().uuid
65
+ # userlink=f"<a class='btn btn-secondary share-link' target='_blank' href='https://{quick_form.domain.data}/{proxy_path}/{uuid}/'>{_('default user link')}</a>"
66
+ # flash((_('The default user link is %(link)s. To add or edit more users, please visit users from menu.',link=userlink)),'info')
67
+
68
+ from . import Actions
69
+ action=Actions()
70
+ return action.reinstall(domain_changed=True)
71
+ else:
72
+ flash(_('config.validation-error'), 'danger')
73
+ return render_template('quick_setup.html', form=quick_form,lang_form=get_lang_form(True),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),admin_link=admin_link() ,show_domain_info=False)
74
+
75
+ def get_lang_form(empty=False):
76
+ class LangForm(FlaskForm):
77
+ admin_lang=wtf.fields.SelectField(_("config.admin_lang.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa"))],description=_("config.admin_lang.description"),default=hconfig(ConfigEnum.admin_lang))
78
+ # lang=wtf.fields.SelectField(_("config.lang.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa"))],description=_("config.lang.description"),default=hconfig(ConfigEnum.lang))
79
+ country=wtf.fields.SelectField(_("config.country.label"),choices=[("ir",_("Iran")),("zh",_("China")),("other","Others")],description=_("config.country.description"),default=hconfig(ConfigEnum.country))
80
+ lang_submit=wtf.fields.SubmitField(_('Submit'))
81
+
82
+ return LangForm(None)if empty else LangForm()
83
+ def get_quick_setup_form(empty=False):
84
+ def get_used_domains():
85
+ configs=get_hconfigs()
86
+ domains=[]
87
+ for c in configs:
88
+ if "domain" in c:
89
+ domains.append(configs[c])
90
+ for d in Domain.query.all():
91
+ domains.append(d.domain)
92
+ return domains
93
+ class QuickSetupForm(FlaskForm):
94
+ domain_regex="^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$"
95
+
96
+ domain_validators=[wtf.validators.Regexp(domain_regex,re.IGNORECASE,_("config.Invalid domain")),
97
+ validate_domain,
98
+ wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")),
99
+ wtf.validators.NoneOf([c.value.lower() for c in StrConfig.query.all() if "fakedomain" in c.key and c.key!=ConfigEnum.decoy_domain],_("config.Domain already used"))
100
+ ]
101
+ domain=wtf.fields.StringField(_("domain.domain"),domain_validators,description=_("domain.description"),render_kw={"class":"ltr", "pattern":domain_validators[0].regex.pattern,"title":domain_validators[0].message,"required":"","placeholder":"sub.domain.com"})
102
+ enable_telegram=SwitchField(_("config.telegram_enable.label"),description=_("config.telegram_enable.description"),default=hconfig(ConfigEnum.telegram_enable))
103
+ enable_firewall=SwitchField(_("config.firewall.label"),description=_("config.firewall.description"),default=hconfig(ConfigEnum.firewall))
104
+ block_iran_sites=SwitchField(_("config.block_iran_sites.label"),description=_("config.block_iran_sites.description"),default=hconfig(ConfigEnum.block_iran_sites))
105
+ enable_vmess=SwitchField(_("config.vmess_enable.label"),description=_("config.vmess_enable.description"),default=hconfig(ConfigEnum.vmess_enable))
106
+ decoy_domain=wtf.fields.StringField(_("config.decoy_domain.label"),description=_("config.decoy_domain.description"),default=hconfig(ConfigEnum.decoy_domain),validators=[wtf.validators.Regexp(domain_regex,re.IGNORECASE,_("config.Invalid domain")),hiddify.validate_domain_exist])
107
+ submit=wtf.fields.SubmitField(_('Submit'))
108
+
109
+
110
+
111
+ return QuickSetupForm(None) if empty else QuickSetupForm()
112
+
113
+ def validate_domain(form,field):
114
+ domain=field.data
115
+ dip=hiddify.get_domain_ip(domain)
116
+ if dip==None:
117
+ raise ValidationError(_("Domain can not be resolved! there is a problem in your domain"))
118
+
119
+ myip=hiddify.get_ip(4)
120
+ if dip and myip!=dip:
121
+ raise ValidationError(_("Domain (%(domain)s)-> IP=%(domain_ip)s is not matched with your ip=%(server_ip)s which is required in direct mode",server_ip=myip,domain_ip=dip,domain=domain))
122
+ def admin_link():
123
+ domains=get_panel_domains()
124
+ if len(domains):
125
+ return "https://"+domains[0].domain+hiddify.get_admin_path()
126
+ else:
127
+ return "https://"+hiddify.get_ip(4)+hiddify.get_admin_path()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
128
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product