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,130 @@
1
- # 2023-04-08T15:11:14.158922
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\xf7\x1d\x00\x00\x12\t\x04\x00sR\x13\xcb2o-Q59\x0ec\x14d\x0e\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\xf9\n\x94\xea\x12J\x08\x12\\\x9c\x1a\x1b\x91\x1f>\x1cg\xe2\xe9\xfdiE\x96\x11YxBm\xcc\x8d\xe4\x8e\x1d\x1d\xbbO\x91\xd6W\n\x16\x05\xf0\x86\x9f\x9c\x0c?nnl4H\xc8\x90YD\xafM\xa49\xae\x15\xd9\xe7\xaa\x02=$\x03\xf33\xea\n\xe0\xb2\xae\xd74\x9b\xfe\x0cN\x1c\xb2\xe4}\xc7\xfe\xb3z\xc5\x8b\x7f\xbbj\xb9O\xca\xc4\x82\x0e\xff\xb1+\xf4\xd0\x8b^.\x91{\xb3\xdc^vI\xa2\xd2\xe1z\xe2\xb3\x8e\xe9C\xb8\x8e\xe5\xb7\xa7\xb3\x81\xa7\xfeW\xb2-\xf6\x90\xef\xc0\xd7=\xb8{\xea\xe1*\xd4\xa0\xef\xc0\x82\xa0\x99\xcb\x17P\xf5\x06;\x92\n\xb4\'\xbcD^\xfd\xa5E\xc0,\xe5r(k7\x03+\x10\xcagZ\n\xb3\xe0O\x92\x9b\x10\xcd\xd1W:\x10y\xde#\xfeB>]r\xf6\xc7 \xe6\xc3\xaa\xc2\tz#\xc2\xf8\x92N\xf3\xefW\x17\xf2\xfc\xaf\xeb\xd4\xc4\x9a$\x9f!.\xa4J\x08+\x87\nB\xa0\x87<H\xb7\xf3Ne5\xbc\x91\x1b\x99\xe0\xc8O\x8d\xb1\xbc\xd2Y\xf5h$\xdfc\xbaNV\xc97^\x85\x7f\xacY\xeb\xda\xde\xd7\'}\x8f\xca\r\xbcY\xbe+\xd6\x18\x96\x00\xdcWm\xe5\xcf\x95\x06\xf1" \x06aNE\x18\xf4\xbe\xee~\xb1\x11\xe5\xde%\xdea1>\xe7\x04;A\xfeT\xd9@\xa3\xb5\xc3\xea\xff\x89\x89\t9\xa9\x96\xd3\x80\x84\xca\xf2\x1cK\x11\x87\xb9\r\x97\xf2\x81\x92\x11\xdar\xce\x13\xb0\x90\x100\xb9\xc8\xc4CFK1\xd1\x914^\x99\xd7*\xac\xd6U\x8e[\xde\x94gK\x19\xa0\x98q.\x9dl\x8d\xbf}\xb0\x9a\xeaJ\xa2\xf86\xe0}N\x01\xa9\xc0>\x1as\x08\x88\xbf?\x17\xae\x1a\x8b3\nK@e\x0b\x9d\xc1n\n\x12S\r\xeb,\xf8\xd9\xe0c\xb0\x86\xeb\xf8\xb4\xb2s|\x0e\xd4\xf4\xbd\x87\xe4l\x1f\xfb=\xe0\xf3f\x93\xc6%\xa5\xfe|Bv\xda\x88*\xee\x8bn#\x960\xf4S\x1f\x01\x85\x14\x18\x8d)\xdc\xbe\xe7(\xba<\xd0\xbc\xa2\xbb\x13\xc3\xe4)\xbc\xb2\xd1\xa31\x18F\xd0m\xd3C\xc4{H\x1d\xd2\\\x14(\xe3\xf04\x1d\xac\xca\xbe>(\xa1:B\xd2I\xc5\x83\xf1\xe85\xc6|\x8a\x81\xd3\xd2\x94Vt\x07%\xd6(}/`\xb7\xbed\x13\xb0\xb6\x06\xe0\x8a\xf5u\xdf\x9dVd;\xa1\xc4Fm[\xfb"\xa5\x9e\xaf\x90\xae\xfa\xa8\xd8\x18y\xe4R\xd2\x93\x95\xf5\x87\x1d\xba\xef\x9e\xb4\xab\xd2\x11\xcc\xfc\x1a[t\xf7r\x90\xd3\x8c\x974\xb0\xc0\x19\xcd\x07\xd1\x08\x16\xe9t\xb1\x86\xc4\x02\xe3e/\xad\x04\xcf\xce\xb8\xd6\xccP&\xdd\xfb\xc4\xc8\xef0L\xc3PV\x88A\x87\xe8\xa3`\x9d\x1d-\xea\xcb\x9c\x11J\xb0c\xa9\xe9#\xea\x92x\xec\xab\x199\xdde\xc1\xba\x8b\x96\x11\xd2\xcc\xc1\xcb\r\xb7X\xd1\xe2\xaf=\xb2\x00\x87?hZ\xcf.\xe4\xaa\xd8\x9cYf9\xdd\xe8\xc8\x15\xb4\xaf\r\x8eC\xc8\x0e\xe4N\x81\x9c\xedKm\x19\xcc9\x00f\xb1\xa4b\x99\x0c\x9b\xdb|--I\xcd\xa0\xe2\xb4\x0c~\xf7\xec~^;\x83\xb1\x02*|\xabvv\xf8KJ\xa8\x8dK\xf9\x9f\xe4\x13I5*\xec\x98\xc1n\xff9\xf5b\xc7\xa7/\xa0\x1d\xe5\xe3\x1etL\xb9\r\xb1\xdc\x9a\xda\x89\xc6\xfe\x84\x8a\x99\xb0\xec\r\x97\x14/\xcc\xe4\xe0\xc1M\xd2\xe9\xc8ka\x18\xca\xd2\x9e\xafX\xc9zeJBLD\xa3kV\xc8uN\x99\xdc\x87\x99\x9a\xa9\x85\x1e\xbd\x03E\x04\xfd\xcc\xb61y>y\x97r8\x8a\xdd\xe6\xa1\x92\xef\x8b\n\xcb\xf9\xdf:s\xb1\x0b\x89a\xe5\\\xc9\xa7\x0cQ\xcbB\x04\xc7\xe1\x86`65f\xee\x9c+\xb7\xe6\x0c\x9b\x10\x97\x07\xb2L\xc4\xc7\xf8\xfb\x14\x03\xb9s\xf2\xfd\xd7J\x84\x8c{\xefx\x11\xbe-\xe2\xd9\xb4^c\xbeJ\xfd,\x02\x0e\xd5,\x14*7p\xad="\x18mT\xaf\xb3\x00\x10K\xd5*I\x0e\xa2]\xf1\xec\xcf\xb5\xea\xfc\xfc\xebk\x13c=F\xac\xe6\xa5\x83\x19[\x8d/\x12\x8f\xd3\x85\xe5\x9d\xdc\xc2\xe8\xc4\xa3\xab\xe7\xbc\xd0\xc7\x0b\xd7\x1a\x02<.\xca\x84\xf4\'?_\x19\xca~7\xef\x0e\xc3\xe8?,rC\xa8\x01};\x03\xc4\x06\xe7\xce\xbf\x184\xdde\x8a\x1aQy\x8c\xdf\xf1\xfe\xc4n}\xa6\xec 4@q\xf4\xc3\x7fr\xad\x1f\xca\xde\xe2\xb6%+f\xf3\x0fB$m\x8c\xdc\x89\xf7\xa9\x14\x1f\xf4\x7f\xaaz\x17!\x97\x87W,\xa5\x89\xee\xdb\xe0L_L^\x14?\xc5\xa0\x0c#\xa9\xdb\xb7\xb13t\xd4l\xb3\x8dF\xe33\xd5\x83\xeb\xd5k\x15\x8e\x81\xd9\xf0\x90\xcb\xcckB\x02\x96\x98b\xe9\xa8\x0fF5\x84Mc\xeb\x03\xa1}\xd4[\xd4=\x17\xac\x08V\x8e\x14\x0b\xa1\x1dB\xf0\x91\x96\xb8\xd1\xd7B\x10E\xfe\x8d\xea}<\xa7)\xd3\xb0\x9cW;\x1d\xc1\xcd\xd3h\xfe\x0e\x12\x02p\xe8\x0eP4h\xb7\x02v\xe5jR\xc0 \x9a\xdb\x1c\xa75G|\xdcQbk\xbc"\xbf\xfa@C\xc2+\xc6\xbd0\x9b|\nV\x14\xbe$$\n\x8f\xbc\xca\x88\x05\x07\xa6\xff\x0b\xc2\xe1\xec\xb1\xb0Ob#\xa9_\xcb\xc9\xed\xfb\x82|(Y\xb1\xa2\xe5\x17j\xa7O\xc9q\xaa$\x11\xe5_\xc0\r\xa6\xd5#\xb4L\'G\x04T\x9a\xae\x90\x1de\x13J\xd7\x80\xdd\xe3\xb9\xad\xdfE\x0c\xd1\xb9\x13\x84W6\x0bUp\x01|\x14|\xea,\xc5\xcb\x07\xaa&S\xf1\x01\x7f-\x84\x18\xd6\xce\xa5\x99X\xd9\xb2\x06\xc9\x81P\x96\xa8 \xa6JP\xd0\xc1\x83\xd2\xd4\xd3.\x00\xfb\xef\x15qs\x17\xeb\xf2\xc7\xea\xa9\xcc\x8e\x16\xa8\x93\xb1\xc6%D\xd7t\xdcU\r\x04JH\xb4\x1d\xc5\xb4\xc0\x15\x08\x93\xc7E\x99\xfd|C\x16\x98X\x06R0F\xde\x97P\xac\xe4\x1a\x04\xe2qL\xe2\x1a?\xd2B\xce\x9dh\xbaP\x18l\x9au\x97p\xad\xcf\x9f\x94\x98?\xe5\xde\x97\xf0#\xcb\xa6(\x7fu\x8d\x16V\xd0\x96\xa6\x0f\xde\xc6\x91\xe0\xfdL\xf2\x9f\x9f\x86\x88B\xbb\xb9&\x08z)\xd9<\xd4I\xf5j\x1d\x02\xd3z\x80m\t7\xfcj\xe9\xdc\xd98\xae\xb2\xb3\x97\xd2n&\xae\x8dM\x1f\xa2\x80\xcdV-o\xe0V&\x83\x87|:\xb9\xfb\x83e\x94\xb8P\xa9q\xf6\xf60u|\xacW\xadw\x85\x1a\xae\x12~K\xe7\x93Mf\x16\x9d\xc3:\xf6\x92`\xb1\xdcg\xbe\x1e=\xec\x8f\xba"\xcf\x19\xb2\xa7\xf9U\xeaWo7u=\xfb\xc9\xe3\xa8S\x16\xbdq\x15\x80=\x89\x1aF\x10\xf5\x9dy\xc5-\xfb\x0ce\x11\xab\xf1\x18`^\xf7\xf6\x85\xacE\xc0\x99k6]\xc3P\x81\x9cI\xb8\x13\x8c\xd6Gzn\xc4\xd0\x944\x83\x8f\x19\x05F\xac\x87\xe8Jf!x\x05\x1c\x870\x85\xf0\x9f\x0c\x90I\xc9\xca\xdc!#K\x93\xc6\xa0LL\x87\xfe\x0c\xd9j[\xe5\xe8EC\xd4fSV\xd2\x9f\x1ay\x13\\Y\x89\xf7\'\x1b\xda\x01VW\xa5\xcf\xb9L\xb4>3\x0e\xd1"\xcd\xd0\xec|\x15\xbe\xaa\xb0=D\xf5\x9e\xd9\x8bR\x8b[\x0b\xc8\xf0\x8f&\xe1\xf4\xc3Q\xed\x1c\x02\xba\xff$\x98w\x08\xfe\x19\xfa\xdc"\xab\xd5\xf9\xd6N0\xb9X\t\x18\x0b\xbbN\xb1^\x10\x13\x0b5q\xa8\x11U\xf48g@r\xcf\x1a \xca\xdf\xb7\x08y6\x7f\x1a\xf42wn\x94\xd1\xb5/\x99\x86t\x7f\x02U\xb7\xb7\x04\xfb\xbch\x89\x04b\xdf\x99SS\xa0\xcd\x03\x05\x0b\x86\x9e?\x1c\x00[\xee\xa4\xe1\xdd0\xd83\'\xbb\x08\x00\xa1\xe7\xe1I\x90k\xc6\xafG\xea\xea\x97\xbd\x93p\x19w\xf3\x9a\xa0\xde\xa8\x84\x1fS6\xb5\x1e|\x99a\xf5\xc9\x005\x965\xe3\x97\xbb\xc9v\xc7\xf1\xabi\x13\x00H\xce\x14\xa3\xdez\x99\xf4\x18\xd3"\x16\xfd5\xba\x7f\xee\x85\xe1\x812\xf0\x04\xd5\xc0\xd2\x91\x10\x1bH\xc4{\x81\xac\xe4\xc1k \xc0\xe6$02\x87\xf9\xc9\xb2B:\xe9\xca\xed\xa3\xbe \xfc8hN\x1a\x9bl~(\xfb/\xa6\xbf@:\x11\xb8\x80\xd3e@\xc3Vl\xffw\xd3)]%np|$)\xed,\x1c\xe8\xbdt\x8b\xeb\xc3\xc2a(\x17\xf6\xa2\x9bO1\x91Z\xc3\x85E\x18~\xe7\x145\xfcT~\x07\x0c\x7fI\xb2\\\xdbX\xc5F\xb0\x99\xe2\x9a\xdd\r\x01L\xfb\xf2\xcf]\xdd\xa0\xf3\x0f\x00\xa8\x8a^`L\xc4\xb5\xd7\x83N*~\xe2\x90\x97N\xe6\xbd\xaf!F\x83\x06O\x8fo\xb8O\xed\xc1dk?\xb8\x06\xda\xc2Gw\xbc\xe7t\x86\x9a\x9d\xda\xda\x08\x9d\x07\\fs\x95Oe\xc5\xed\xcbek\x11\xcc9\xfb\xa8t\xbf\xa6\x81\xcaw\xc3\xf0\xf9\x84\xe7\'\xbd9\xf7\xa8\xc3\xde:\x99Q\x96\x94\x7f\xdd\xb0\t\xf1p3\x98\xd9\x95#\xa6\xd4\x08n\xd3-W*~<t\xfa\xe2\xc1\xf4\x8dW\xb1\x94c\xec\xb8\x15;\x02\xa1\xd0\xa7\x01\xf5\xd9z\x0f\x1aASf\x81Q\x99\xbfJ3p\x00\x88\x80\x9cF\x8b\xae^\x9f\xc3T]\xb8\xa1;;\x1b\xe6\x0b\xd3(k\n\x00\'(l\xf6\n\xa8)<b\xacX2\'\xf1\x92\xbei\xeb}\xc9\xa8{!}*.\x12\xe2\xc3Nx\xcd\xf6Q\xb7\x95Q\x86]p*iwf\xb4=\xc1\x9auB ox\x08 \x1f\x8a\x82\x13s\x94z\xd8D\xc9\xa4+\xa0SJ\x9cO\x8b6\x94\xc1\xc9\xe7\xd3\xb3\x14\xa8)Ia+Y\xbf\xac/\xa4\xa7\xa724\x97\xd1\x0ci\x8d\xaeR6S\x0fClP\xb9\xc2\x9c\x11\xc6\xb9\xd9\xe5\xbe\xee\xe9\x15\x94\xd3\xad/\\(\x03\xb5\xec+\x07\xa6\x08a\x18E\x95v\x93\xef\xed\xf55xl\xf6F\x9a\x8f\x93zf^\xfe<\x91|\xe7&k\xd8\xdb`l\xf7\r\xc4\xd11\xd1.\x9d\'\xd1\xdb\xf0!\x98bA\xac\xf5\x19\xe9\xe6-\\\xae\\\x1c\xdf\xcd\x14\x02\xd0\xc7O,\xd9\x0c\x02\x0c\xfb\xd2\xa6\xdf\x82\xc5_ED2wgK0a7<\xfb_q\x99\xe0K`\xf48/3\xa1\xd9\xd3\xec\xfbp\x9e\x8e\xde\xe8\xef\x86?\x87\xa2\xe2A[\xebzJ\xbd\x89\xad\xb1]`\xfep\xbe\x0e\xb4fb\x03\xd15t/\xba\xb3\xf4\xb0\x0b;\x81\xa7\x97Q\x96\x16J\n\xe7K\xbaV\xbc\x13\x9f3\xe0"C\x1a\x97\x81s\xc0\xb0\xe2\x80\x07B@\x92\xb5z\xc1PVd\x18\xba\x9a\x0c\xb6Pv\xa2\xf7\x9e\x81\xf9,A\xd8\xe0@(\xb3\x07\xe5\xe8`\x84\xdaq\xd6N\xa3\x8d)\x07\x1aa\x04l]\xa1S\xf9&J\xbd~\xa0\xbb\xde\xbaF\xd7n F\xe2\x91I\xf5\x13\xe9R\x9c\x1a\x9c`\x80=\x13;f\\T\xa7\xc6$]\xac;\xce\xa8\x92\xea\x08\xe7\xf8\xf4q\xac\x15\x93_;\xbb/\xe0&\xfa\xcfc\xc7\xd1\x9ej\xc5\xd8O\x8f\x8f\x1f\x1c\x10\x04C\xde%\x92\xac\x97%\xcaX\x8e\x01\x95\x12V\xc8\x81\xef\x9a\x12jKr\xbb\xca\xa8d\xc9\xf7n07\xde\xe2v\xd4\xecd\xbaG\x1bp\x9a\xa7\xd3u\x10\x0f\x8dp\xee\xbb\xf9?~D\'%\x1d\x90$%\xc3\xd8\x87\xd2>y\xfd\x12qGj\nl\xc3\xec\x080\x0c\xe4\x9b\xde\xd2\x8bRB\xc8\x16\xd7\xe0G`\xf6\xa4\x0f^\t\xf0\xdd\x9c\xfc"C\xef#4z\xf4~\xfe\x81\x96\x1b\x04\x92K\xffU\xc7O\x83\xb9\xe7H\x19\xbe\xed\x89\xa7Pl\xe7w\xb6o\xd3\xb9\xd4\x16K\xe9\xa4\x01\xbeAD\xd1pw\x11:$l\xbd$W\xc8\xe2b:2\x9b\xea 5\xbe\xaf\xc4\xcfi9W+7xL\xa3`\x7fo\x95\xfcJ%m\xc8h\x89\x97\x15\xe0\xd8\x1d9T\xa8\x1e\xce\xa5\xa5\x1bk\xdb\xf2P\xac\x91P\x1d\xf9\xe2p\xe1&\x04\xe2\xf0]\x81\xab\xc7\x86\xe9\x9f\xa8\xa5\xcf\xa4\xdc*\x97\xb8ch\xe6\xc0\xcf\xe1\xd3\x1e\xbe\xa0\xac\xefy\x83`\x17\xe8\'\xfe2\xbd\xe9:fl\xe7\xc3\xc8L\x98u\xbc\xa0-\x1b\xc3nK\xcb\xe7Sb\x07\x1f%3\xe18{\x1b\xcb(|\xbc\xc6z\xec\x95\xf7#g.%\xd0K+\xde\xaa\xe1\xf9\xe6"\xee\xa8A+\x82Wl\xfe(\xbf\xa5\'\xc0\x15\xe9\x94\xd5O\xc2\x0fY_w\x0e\xb3\xb3\xc5\xb5K\xdc\xaa$~u\xad*\x8d\x83JB\xbe\xb0v\x81\xb1\x07\xfaq\x82\x10~\xfe\x9b\x94\xf64e{\xb4\xfaSM/U\xff\xcf\xddk\xa3\xc6>\xe7\xf5\xf1\xf3\xa3\n\x93\xe2c:\x91\xb6\x0f\x0c${\x18\xd2\x02S<\x19\xb2\xd6\xbf-l\xe1\xb77!\xbf&\xdb\xc6\xf2\x96\xf3\x13\x84\xc5Y\x97(\xe8N\xf9|\xbdg\xdb\x9ee:\xc6\xb7\x96\x91\x0elT\x84\xc4\xd8\x01\xe1\xf7\x9cM\x84Q\x9fk\xac\xfb\xec\xbb!VqX\x93&/<\xbf:`n\xc4.\xe3DJ\xcc\x9a\xbb:\xf8\xe2\xcb{8\xdd\x81\x1a3C\x0e\xe1\x8ed\x80wa\xc0\xc8\xf5\xackh\xc2:\xd1\xd3~rX|sYO\xc8K\xaf\xf16\xfe\x8f\xed\xb7\xea1\xd4\xfcj\xc2-^\x9e\xa6\xb2Re3\x0c\x16\xcfjU\x104\xd1\xb9Z&\xba\xb4\xb9\xdeB\xdf\x8e\xe1\xd9p\x9d\xd5\xd8+\xcc\x90\x18\x0e\x87\xcc\x0c!z\x19\x0cV\xbd\x9a\xb3w\xb0J\xa835=\x0b\x17;\xe8\x0cy#\xc4-\xc7\x1b\xa9\x86nf\x90H\xddGE}\x85\\\xa8 \x83\xc3s-\r*Cnl\xc1\xdb\x1e\xc7\xef^\xd9\x82pJ\x83\xa1\xf9\xb2\x83\xfe\x05\xca\xb0\x1d\x9b\xb9\xe0\xf6\x9bM\x05`\xa9\'\xf1\x18\xba\x10\xc4\x16\xe8\x87C\x89=E\x13\x037\xb1\xd8m\xca\x19=\xd5}E/\xae\xbf\xc2\x81\x96\xc5\xc8\x16T\xaf!8\xc1\xdf9\xfb\xd4\xe2a\x90\xf0\xb4\x90vy6y\xba\xef\x97Y*\x99\xd0o\xf5{\xa0\xb8\xd4Q\x1eW\x08\x1f\x98\x88\x92b\x88\x8f\xb9\x0b\xe2\xe7>_:Ay\xbc\xa9\x9d\xffH\xa4\x9f:\x11or)6\xa1c?\x05\x85\xb0V@\xcf\x04\x8c1\xc5\x9e%\x0f\xdb\x83\x86\xd5Z.\xe7C\x89\xcev\x85\x8c\x18\xe3\xcd\xad\xbb\xc1\xa1\x81\xa3\x00\xd7\xe1\x1e\xd2\x02~*2\xcd\xae\xf4OX\x81\xf1fc~\xc9?n\x1c#\xc4\x8b\xf1\xf0\xaa\x11\x95\xb1>8\x96q\xd5v\xad\xb3\xa8u2s\x9bB*\x9e4{\x103\'\xa8\x16D\x07\xfe]\xe0H}\xe0-q_\xf9\xfe:,\x06A%$\xb9\xa6\xcf\xcam\xfe\xedu\xfb\xf1S\xb1\x13eX\xda\x81\xabvm"\xc90\x1d\xd7H\xce\xe3\t\xe2\x92\xb2\xe5j8a\x93B\xf9\xe0~i\xff)\x82\xb4}\xd0\x89\xc1\xe9!]\x11(\xf3#\xe3j\x98@\xa1Z\xd5?V\xe0\xc2Et\xde\xd1\xa6\xfc\xf1(\xb3\x0e\xc7j&\x7f\xf3\x8d\xd7\x10m\xa9\xf4\xdd\xba8v\xcd\x7f\x1e#^\xe5\x1c\xf4>v\xc4\xe8\x93\xc5+\xc5\xb6\xaf\x1c+\x15\xcbK\xf7\\\xd24\xd30\xe4\xfe\x16\xac/\xbd\xcczl\xf0\x13ZU\xb0\x8c\xe7\xa2o\x00\x7f\x82\xa4\xf9\xf9\x11Tq.B\xb6Sg\xb8\xc9\xb2G\xd0R~H\xce\xa0V\xeb\xf1^\xec\xa0\x07\x8eH\x0f\xdf\xcfi\xb8{O\xca\x1e\x18N\xabX\'.\xf2\xe9\xbd\xf42\xf1\xacBPj@O,\x14\xf5\xa1\xc3\x9a\xe1M`zqu\xd5\xbb\xa8n\xa3{\xbb\xe3\x8f\xde\xc5\xee\x85\xcb\x8a}\xcd,{*\xf4\x06\xfa\xf7\x1ee\xe6\x17\xfb\x91\x19\x18W\x06\xf5d\xff90\xf2\xf0I\x830\xf3\x05\xaaz\xef\\B\xe1K\x06\xd1\xebt\xeb\x9e@\xf8\xd4hq"`F\xdc\xabu/\xc2\xeb\xf5\x12\xd2\\\xf1\x98\x95+\xd9\x86M\xeero\xe9\x83\r\x95\xc23\xc0\xe0ZP\x82v\xc5s\x93\xbc\xdd\xce\xd5v\x80\xb5\xa2\x9c\xb1e^\x86\xf5FA\xbad"G\x17\xf8\x85CC\xd1\xb3Y\xf5\xc4V\x93\xba{8\x1bd\xe1H:j\x96x\xcb\xfd<\xb3\xc6\x18\xc8\xbc\xf4\x8b\xd1\xc4\xdd\xa1\x08\xaf\x86\x83:\x9a0\x83\xa4\xe4\x0e\xdc!\x08;#>\x92Hm\x0eRm\xc7\xae\x8b9S\xb6\xc1\x02& )\xf53\xac\xf05\xcc\x8fd\x85{\xa9x\xd8k)\x08y\xd4\xfe\xd1\x8e\xa7)y\x0c\x0f>\xb2\x9b\x16T\xe1\xf5v\xca\x96;\xe8\xffK\xf0\xea\xb5\xb5\x018\xe2\xc4\x92\x0c.\xdeL\xa4R2m\x1e^ci\x08+;\xb7T$b{yS#\xa4\x8d]\x9b\xf5\xeaD\xcf6\x05Z\x14\x8b\x883x\xab\xf7\xe3\xdd=\x16\t\xbfR\x08n\n\xe4\x8e\xdc!\x1e\x1c%\xb9\x98-G)\x99\xd9\x19\xd0\xe0/\xf4\xa7G\xa0(^\xe5\xcf\x1d\xdd\x88oN\x89\xf5\x00#\xd6wt\xc1m\xbe\xdd\x12\xac\xad\xda\x888\xd66\x1b\xc5\x9bL\xa0U\x9ac\x08|\xf6+2@\x13\xf8\xa1\x99\xab\x19?\x98;B\x01\x05\xd2\xb45\x13\x18\xedk\xfb^\xf18\xf6\x9d\xe3\x92\xb6\x81\xaf*\x1b\xf1\xec\x0bo\x95/\xde\xadL\xc4\x9d\xf1\xe8\xf5J\x8a\xeac\xa8S\xf0\xe3\xe2\xcfx^\xe1\xda\xc2\xd6{\xa3P\x9a\x1f\xc3)6\xa3\x9d\xa0\x00\xe4lip\xda\xf8\x959\xad\xc7\xf0a\x8d\x8d\xae\nn\x1c)\xaf6sX\xfb\x9c\x95\x82@dw\x0e\xeb@\xdd\xb4]s\xb04=J7\xec\x0c5/T\x00\x19\xa6b\'{\xe5375`0\xaf\xbet\xdeO*\xba\xf8\xc6\xc360\x86/g\x8a\xb1\xbe\xf1\xee\x03Tf\xd4\x9cX\x7f\xfer\xd4\x03\xa3\x1a~P\xa9\xda\x8b\x0c\xb6\xe1G\xd1\xe56\xf04\x86?\x04\xa7\xf1\x11\\)\xd1\xed*R\x1dL\xcf-\xa4(#\xc3\x1cu{\xc6\xb3\x9a\xbb\xb7%\x82\x00%\x94Bw\x8b\xee\xf16\xb0i7\x18l\x07:\xd0\x11\x86\x85F9\x04\x1a\x15\xde&\xef\xc7\x04\x0b\xe7\x00\'\x0f\x1d\t\xa3\x13h},o\xc6\xecW\x90\xd3\x82r@\xa8\xc0E\x95\xa4`\x95\xbf.z3\xf2H\xd9r)\xff\xbc/\xe7[\xe5\xbd\xfb\xf3\x93G\xb4\r\xd1\x14\x1e\xb8;\xf9\xd5\xd0\xd9\xb0\x1e\xd0J\xb7\x95.~c\xad\x0eK\xa9\xc7:b\x15\x12\xe2\x0c\x05\xcea\\\xe5\xc5\xd3\xd2[\x07\xe2\xaa\x16\xfc\xc4\xcam\xc5\xae\xfb\x05\xf2\xa0\xab\xa5\x8af\xa7`\xa4R\xb7p\xab\xbf\x1f\x1eq4E#\xc0,\x964\x05\xef\xa7\xc3\xbbWB\x80\xda\x16\xc9r\xd5\xe4\x8b&\x1c\x08{\xc1}\x1fL\xa9\xdaJ\xf3\'\xb5\\\xd7+\x8c\xe3\x1b\x84\xa3\xb9\xe4\xf2{N\xd2*\xea\xae\x91\x1b\xb1\x8cLE)\x19\xdc\xa4\x9c\xd3\xfa\xa4p\x81\xce\xda\x17VZ\xf2q\x80d\xb3\x92\xcd\xd4\xaa+\xa1\xe6\xa7\xbc\x1a\x96n\xf6>\x1c\x89\x16_\x05.\x9c\xe6,\x9d\xfe\xc6\xad}z_\xca|\xc1\xca\xb2\xfbf\xf7\xeez\x1a\x9b\x84\x93\r\\\xaa\xd1\x8c\x99`\xfd;J*4\xd1z\x8b\xa3\xd7\xca\xadz\x07\xd5x39\xfcS"\xc1\xfa<\x93\xfc\xa0\x93\x9e\x18\x95\xdcG2l\xfa\x1f\xc3\x91"\xfe\x01\xcf5Ue<\xeem\xf3kQ\x93\x8e2u\xf7\xe6\xe0\xad\x97\xf6@U\xe3\x83\xd8H_\x86\xfdZ{\x01\x9f\xe2\xf7\x0c\x1a\xe7\xe3\'\xd5\xb4\xce\xda\x0f\xf5\x0e\xfd\xc3\x8a\x03z\xdd^@@\xb4V\'\x94\xe0^\xbfE\xaeU\x10\xd8(F\x06\x0e\x9a\xe1\x18\x90\xeb\xc3\xe1\xb7\xfa\t;.\x1b/3di\x06\x9e\xdc\xe95F|\xff\xa5\xce\xb0\xb1\xdf\xb8\xb0\x9f:\x8f\xa6\xa7\x0714a\x85l\xa8\xff\x97\x9dS|\xda\x0b\t\xd6\x02Mv4\x98$\x83$Q\xe7\xd2$C\xed\x93\x92AD\xb2\xbcUh S\xa2/<gnB5\xb9\xaa\x9a\x16\x08\xc7\xf3a\x9cj\xf20\xd6\x05#\x17k\x9d\x13\xd0\xfe\x86E\x0f\xe8\x0bO\xf4\xec(\xc4\xdf\x97oj\xc9Csr$\xc3\x80\x99\xb4\x0f\xba\xe0\x15\xeb\x15\xc6#P\x92\x1dC\nM\naF\xfdD_\xb6\xc4M\xaf\x12\xf4C\x9c\x8b\x80Pb\x7f\xa8<\xab\\\x8e;\x9dp\xf8\x00%-\xa7Ep\x9f\xce\x10n+\xd0 \xb3\xeb\xdf\xec\xab\xbf7\xeb\xb2s}\xc7\xf4\xf4\xa1S\xec\x90\xc6\xab\x95\xfe{\x18\xec\x80\xa5\x80\xa8\xac3ME\xad\x81p\xfe\xc2x\x97r\xc5f^-\x16E\xfd\n\x14\x8f\x9f~\xb3\x16\x15#[\xe5Q]\xf8\x8b\xb5\xbe*\xa3\x06\xcb\x1cE-]\x80\x18-\xd3\x81\xf6\xcc\xf5^a\x9a*\xc8\xa3%\x9dt\xdd\xad]\xab\xf2wAG\xf4\xc3\xf1\xfb7\xdfV\xb3w\xc3\x96{\xc1\xa1\xb0\xa9\x13\xc5\xd1\x0b\xfa\xda\x07\xa1\xa5,\xc8,-r\xb5\xe4tS\xfa\x8f\xb8\xed\x90F\xc2\xad+z\xae\xb8\xf7\x83{\xbe\x1eUP\x8e1\x12C\x10\xb0P\xc2\xc5A\x98\xa7\x0e\xf86\x8a\xe8\xa0[|\xb8d\x80{^\x0e7\x1d\x8d\x1c\x06B\x9c\x8dXF][\'\x01-\xd0e}\x98\xf1\x98iV\xf7\xec\xea\xb0\x7f\xb6\x0f\xc9a\xe2\x841\xbe\r\xa6\x8c!P\x8e\xde\xa6\xbb\x8d\x1dp\x96\x12\xc1?W\x8cP\xf7\xbc)\xfb\xab\x1a\xb7\xe0z<\xf8.<\x03a;K\xae\xf2\xd3\x04\ns\xe2O\xf8\x13\xb2(\xe2\xf6\xa4\xe9\xb4u\xaf\x12\xa5\xf3\xdd:\xc1\xc1\xb0H1\x1a\xe9*B[9\xd3J\xff\xc2r6\xcbO\x96\x99\xd4\xcd\x0fT\x9e\x0b\x1a\x83Z9\xfe\x8c&D\x0b\xfb\xb2[\xfd\xcb\x98V]\xa4\xf6\xa9\x8eu\xd6)e\xfaE\x0e\xbe\\\xf4\xd6\x1a\x93,\xdf\xd9\xa7\xb7G\x97\x1d8\x9a\x18\rFr\x17\xbfoD\xd3\xfd\xcfYo\xfe\x1f\xfc"\xff\'\xac\x15\x83\xc5\x93\xa5\x12\x10s\x9518\xb7\xaf\xcf\x1eeG\x89\xeaLq\x90\\cK$K<\\w1ZT\xf6*\x9a\x06\x89\t\x96\xb0\xe8I\x0c}\xba\x80\x84\xfeP\x9c\xc8\xd1\xbds\x0e\xc9\xe3\x9f\xf9\xb1\xf3\xe2u\xdf\xfc\xb1cZ\xece\xa0Q,z\xc9R\xd6\xd1\xb4\xe1\xb7\x8d\xdbp\xd6\xce\x07D\xd0\x80\x95\x15\xf5\xa2G\xde\x97M\xebT\xf5\xcf\x81G\x01\x18L\\=\x8cG\x9c%WU\xc9v=\xdeW\x19\xd2\xd9\x85\x9fq\x0e\xe4\xc2No\xb9}\n\xd0\xcb\x14\xb2\xcd\x98\xf3\x81EE\xb3U\x83\xbc\xc4\x1e\x94\x9d >\xdc\x9dg\x86|\xfbt\x95~\x9f\xae\xe3\x89s\xab]\xa0\x84j\x1e\x17-u\xc4\xc7\x01=\xda\x1a\x9d6\x84\xc7H\xe2\xc3?\x99\xe0\xea;\xd1\xb32\xa4\x90<\xa4\xafTZ\x1f\x987\x90\x9a)?\x81\xb2y\xdb\xaaJ\x95\xb4_f\x9f\xe9\xaa\xddj\x06\x0f\x11\x83\xd7\xe7k\xa4\xeeQ\xb36`\x9f\xfd\x15lMw_\xad\xe1`b\x1f\xaa\xdb\x9cz\xc2\xca\x06k\xa1\xc6LZ\x1f)\xdd\x86\xe7\xf1|\xa0X\x93\x06\xc3\xd5<{[\xb5c\x7f\xda\xb4t\x82\xa3\xf6J\xb2\x19\x16\x83L\xb3\xe1\xf7Py\x0f\xad\x9a\x9a\x03=\xa5> \x14\xf0\xec\xd9\xb9\xd0\xb8\xdeD\x11\x98\x10\xa7"\\59\x8e\xf3\xe9\x0f\x1bP\xd9\x95nc\xa6\xe36\x9dN\xf8Ln\x89/r\xc7\x0bj$vH\xb6n\xfa\xe6\x13H9\xea\xae\xe7q\x17\xe02\xc0\x138S\x1d\x05g\xe3O\xa1\x84;\x04G\xf5\xfb\x92\x16\x9a>\x98\nQ)\x15\xf8]n\xc0\xb9\xfai\xf9\xed\x8d\xff\xff\x05$\x0ft{\x89\xbbQ\x17I\xaa\xe3V~Jo\xb5\xde8\xb0\xab\x95 {\xe7\xef{\xe9\xe8\x92\x13/\xaa7`v\xcavk\xe4\xfb]\xd4\xe4\xb8n\x02\x9c\xc6\xcb\xb2,*\x8a\rW\xb7\xd1P\x07Q\xd5E\xe2\n\x1a\xdf\xb53l$\x84\xd1\xe8\x8e\xe0\x84\xf0l\x9cK\\\x7f\x8av)\xd7s?\x93\x03nK\x06\x95O\xd4$\x18\xb2H|#\xaa\x1e\xad\x1c\xa5\xcf\x8e\x12\xb2\xd7TP\xb80\xdc\xc1\xe8pr.\xf6f\xec\xdf\xd9M\xfa`\xe8\x8b2{\x7f\x1f@9\xa6#zp3\xe9B\x89,\xbc\xd2\x8b\x12\xa5n\xa9]L\xc7\xfb\x1f~[\xf0\xa3\x06\xd6c\x07\xb1\xd2\xb5\r\xdd0\xd7\x19a\xe1\x94y\xb4C\x1e|[$4\x95\xba\xf3\xdb\xf4\xfd\x08m?\x1d/v\xe5(c\xda\xbc\xc7WB#p\xd5\x01\x8fT/\x0b\xb6\xfb\xccO\x8e\x10\x16V\x19\x9eFF\xeb\x88_\xbc2\xf7\xfc\xda\x11\x01\x99\x8dZ\x81\x98(\xaa 4\xff\xdb\xe99m\x8d\xf6\xe8 \xa1\xdd~\r\x19?\xca\xdd\xeao\xf8P\xdd\x19\xd5\xd8\xaa\xd8\x83Ay\r^\x10\xa9\x04\xf6i\xbb\xa2\x1eB\xf3(\xed\xca\x10\xe57\xb9h\xdc\xa7q\xcc\xf5\x824c\x18!*\x98\xc4\x8fw\xda\xfc\x7f\x18\x82\xa1r\x87`\x13\x04\\d0\t&\x8bB\xc7\x9f\x8c\xc2\xdc\x1ft.@o\xbe;_w:.-\x0c\x8bS\xdf\xdd3^\xf8\x8a\xca\x8b\x0c\x8c\xc3\xc0S2\x02^jw(XW\xfe\t\x99q\xe6~m\xfdKr\xb5\x9a\xe36 \x91\x121\xe00\x19\xcej\xd9\xae\x1bI\xa8\xb1\xd3\xd7!\x1e\xfa]\xb1\x1b\t\xac\xe3\x8f\x1a\xb9cq\x96\xbf\x03\xe6\xd1\x8e\xb1\x04\x9d\xc1\x96\xed\xb7\xe25.\xba5\x07\'\xd8\x8d\x9e\x9bVY\xd9\xb3y\xa9_\xb0\xd9\xef"\x90\xe0\xe9\x84O\xb1\x88\xfc\x10\x94\x8d\xc06\xa5\x91\xc6|\x85&\xdb\x0b\xec\x98\xda\x03\xc0b\xa1#WX\xcc\xa5\xa5\xe1ix\xb1\xb4\x8e\xf3\xd4\\\x8f\n\xf3\xa7&\xc9\t\xa6\xfe\x97\xc9|\xca]\xda\xe66gJ\x00\xf5\xc9\xd0\xe2*\xbf\x9f\xdf\x18Y\xfd\xceWE>\xe1f\xf8&\t(\x7f:n\xe1\x93\xa6\xb3\x84\xae>\xd6\x88\xdb,]\x91\xacb\x98\n\x9b$\xb8\x81\xb2\xcd\x131\xe5\x0f!\xa33\x8f\xb5\xeefUB\x89\xd7C\xfeb\xcf\x90\x05s\xd8\x15\xf4\x8f\x9c\x9do\x19\xa0\t\x9c\xbaNk\xa7\xa2\x96\xe6.\xc0$a\x96\x0f9\xe4\x9b\x95\xc96&\xa9 }y\xb6\xa5\xbc\xa4l&`\xa0,\nj\x94\xe9\xf9!\xc4Rry7\xaf\x9b\xf1J\xe1\xdf\xe3\x03\x90\xad\xdb<l>w\xd8\x86\x00}\xbcG\xc2\x0f\xbf\xd6\xe2\xf9\x9b\xf3~\x13\rc/\x8a\xd0Z\x97\xd4\x14\x07K\x93\x83\xee%!\xadWl-\xdb\xdc\xa3\x0c\xe9\x108\xf35Z7[\xba\xc0\x0c\xeeXr*a\xf2\x1e\x1b\x1a,\xd4\xafV\xda\xc4\xe3\x94\xd5\xbdJA>\x9cM\xcd\xbd\x89}$@\xbe \x0c\xc9\xb1\xd0\xac\xe3@\xd4Wg\x87%\xd0V\x0b\x9d\xed\xfdD\xbaf\x16\x8b\xfe\xd8\xc3\x07k#\xbc\xda\x18?wt\xd7\xd7\x9b\x02\xa5\xc4\x9aB\x18\xfc\x02\xcb\xaaw\x97Y\t\x82`\x1e\x1b\xbf\x82"ME\x7f\x9f+}\xd8c[\xf1>C.`\xefty\xe8\x00\x94\x82\xa9\xc0Q\x97\xedB\x14\xc6\x90sTI\x1c\xf5.\xe2\xe0x\x81/4\xe3\x88\xf3\x1e\x83\xdd\xbcG GyBIin\xef#\xd0\xbe/.\xeb\xd8\xd3.P\xf2\xa7\xde \x0cd9\xaf\xada\x01\xe2\xd9\x912\x91?\xd7\x91z\x16\xbeI\xf0\x99\xca\x9b\xf0\x01\xb2P\x0eQ\x16\xbf\xdcZ\xc2\xae\x1f\nm)\x0e[\x88\'r\x1f\xfap\xbb]\x1d\xa7\x80\xfa\x04\x8c+\x9b\xe1;\x83\x8f7\xaa#\x92\xf1.\xe6[\xe5\xfb\x9f\xda\x92\xb5\x9d\xb2\x8e\x85\x7f+EE\x83\x8cm%\x1e\xd3\xa7W\xb4\x14\xdcQ\xfe\x11+\xf6\xf0\xe1\xd0\x8c\xabH\xe5\xfa\xe3\x18\x97\x9a_:~\xbc\x88\xf3Uk> (\xb2\xd9L}Rh\x8c{\xb9\xf4h\xa6DKB?\x9f\xc9\x84\xfb`+\xad\xdf\xca\x84.\x84\x9a\xb7\x06\xae\xb0\xba\x19\x17\n\xe0\xba\x9f\xfc\xb4J.\x17`\x9f\xf1_H5\x17\x82*\xd9m\xacm\x10\xee\xd8t\xdd\xd4\x84\tX\xee)\xc7k\x1amtR\xfe\xccA\x93\x97\x00\xafp\xa9#N(\xe7an.\x0e\x86[\x1b\xea\xd4\'\xa9A\x97u\xe1\xa8\xb3\x1cX\x9a\xfc\xdb\xdf\x88\x13x\xbf\'\xe1\xb4\xbf\x1e\xc6\x9daWzD\xbc\xaf\x96\xf5\xf7$\xdc\xccb\x82\x87\x92\xe5Z%mF<\x94\xb1\x9c\x10\x9ed\x9f\x97\xc0\x89Q\xb2U\x9d\xceZE\xc2\xe2\\\xfd\xde\t\'\xeasByJ\x84\xa4\xe7_o\x88\x02\xa7k\xa6\xda\x0b<C3\xd9o\x00\xc9m\x0c\xd5\x9e`fW\xce\x9a\x8b\x0b\xe1\x1f\x07y\xcf\x99\xd22e\x0e\xd4\xfd/Wu\x11W\x02\xa2N\xbb\x113dg\xb6\xa5\xfbQ\x91\xb4\x92\xd1\x83?%\xe9\xf2\xc4\xb3\xb9;\x86\xa1\xe3\xea,`\xca\x80aa\xbdc\xee\xb5/wPA\xb9(\xe2F\x9dRg&\x06\xc2/^\x192\x04\xfa\xf4\xa5\x0f\x0e\x1cV\xec[\xdf\x90V\xd25\xc2\xb9>7\x9ee\xac\xdc\x18\xc0\x13\xc7{w\xe2.\xe9\xf7\xde\xa4\xf2"\x9f\x99\xfff\xcc.\x07\x16\x1e^\x96\xf7W#\x11\'!\'\xc3\xdfr\x83\x19\xdb\x0c\xe3N\x80\xd8!\xd1\xe0J\xe4\xea\x08\x8b\x85\xd2\xe3\x80Sdq\xfe,:@YC\x02\x1e\xb7K\xfbV\x8c\xe4u\xba \xd3\xcf\xa4\xc4\xd3\x19\xc2\x90\xd5x\xd1\xae\x18\x9c\xf0\xe2\xd8S\xbc?\xd4\xc0\xb2\xe1\n{\xfa\xcd\x13\x82$\xb8\xe7\xee$67B-o\xe3D8}\xd2\x1c\xe3\xee\xe09\xb5c\xe3\xbe\x1f\xad\xfe9\x11\xee8\x85\x9d\x02\xa9\x17%\xb1`w\x19u\xb84\r-\xd1\xd8\x91U8\xc8_\xf5GAB\xffV\xe4Ww\xbb\x96\x03\xd6\xe1\xce\xd4N\xdc\x1a{\xb5I\r\x13\r\xeex\xcat\x1fj\xcb\x89![C\xc0\xe9h\xfb\x03\x15\x021],\x0b\x91\xe2J\xfd\xcb\x0b\xe5\xdbzL\xb5`\xce\xb4\nb\xe6r\xe8\xadV:_\xca_C\xaa\x9c\x0e\xd8\xba\x13\xff\x81\xcb\x17\x95\x00O\xf7\x10\x0c\xc2\xeb\xff\xc69\x83K\x88k\xde\x9c/\xc4\xe2\xd0\xeb\x7f\xa5\x17}$\x0c\xad\xbdU\xbd\x906\xce\x06\xed\x82wS\x8fsW\x99$\xf0m\xed\x16\'\xd1\x1d\x94\x12S\xd2\xb2\xfc\x80\xaaDC\xa2H9g\x9a\x84\xfc\xac\x1e\xa7\x00\xd1\xddU\xe3\xe7\x06\x03\x18\xfe\x88]\x80l\x818\x04\xa5\x15r\xfa\xe6\x15S\x0b\xba\x0b\xc6\x9f\x16\xf7\xe6\xd0\x1a\xafE|5\x05\x9f\xde]\xb6xq?\xd8\xd0\x94\x13\xc7\xba5\x96\xed\xac\xb0\xbc\xa8\x80\xfa\xd8{.\xa4\xf0cg\x11\x1a_\x1a\xf7\x9f\xa15\xd6r\x08km\xd9.\xcfR\xb2\xbboiz|\xfd\xb2>\xf5\nS&:i]\xa4\xa6h\xdbH\x18\xb9\x0c\x9eD^\x15\xd2\xd062M@\xbd3\xc5\xda\xa3;\xdf\xbc]\xdej9\xbf^w7\xc1\xca\x05\xb7\x85q!jn\xaf\xd5;vi\xbc\xa6\xaby\x0bb\x01\'\xad\x14\xd8\xd7I*8\xfd\xb1\xfc\xe6\xa4\x87H\x0e\xd3\x9d\xb1\x9dw\x15\xb4\xd0\x19\xbb0\xbf3\x0c\xa9O\x90}(N\x92\x7fprv\xca\xe7\'gP\xf5O\x18\x86H\x96\xa0\xbd\xa5\xe6,W!\xc6w=\xf3\x1d_a\x9dM+:\xdd|Gg\x86ruf\xa4\xa4\xce\x9b\xfa\xf8\xe5E\xd6\xbaJj\xa0.S\x16\x94\xda\x8a:)^\xe7\x10A\x16*g\x1fd\xdf\x17\xa9\xc3 \x1b\x02{=,\x19=\xb6\x87\xcdc\x92\xad\xb9\x84z[\xd7A\xe4\xf0e s.\x97G\x8a"\xa7icpK#\n\x98(\xe1\xce\xcd\x18\x84X"\xb7\x9c\xd4&\x16\x82\xed(\x85\xde\x9d\xb0\x98\x10\xadc\xf6\x1e\xdd#\xcc+\xe9\xaf\x1cS>\x1bRd\xc3\x0bG\xee\x18n\x03\x94\'\xefK\xdc\x1c\x0bX\xc6\xd0\xce\xa2\x00\x86\x03:\x01\xd5\x82E\x93\xfb\x07J\x13`\r\xa9?\xaaC\xb5@\xce\xaf\xf3y\x1c\xdc\xd3\xa8\x0f\xc8\x10\xc3\xf7N\xfeE\xb3D\xec\xd0\x80q\x9e\xd5\x02D\x82\xf3\xfc\xa7?;\x85\xdc\xc7/\x02\x9b\xe76\x18\x00a_M(\x89\x04pm\x06\x93\xda\xb8\r\xc3\x89/\x8b\x8c\x9c?\x11y\xe6\x91\xdbW\xd7\xabx\x07\xf7\xb6\x0f\x19\x7f\xda\x86+2\xff\x0f\xdb\xa2\x1a\xfd\x83\x10\x87\x9e\xa0 \x16')
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-08T15:11:14.102805
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\x005"\x00\x00\x12\t\x04\x00\x86\xcf\x894\xe6\xb9\xba\x8a\xe6\x8ae\xdd$\xe6\xf9\x95\x00\x00\x00\x00\x00\x00\x00\x00P\xe5\xdazv\xba\x1c\x88\xf6oO\x91\xe2gy\x89\x84}\xbe\xe7\xea?\xb7m\xe2k\x8e\x12-q2R\xbf\xce\x8a\xa96}\xbea\x0c\xe9\x8d\xf9Z\x17\xe6VS\xdcI\x05i\x94VH\xcc\xf4\xa8\xf1P\x02\xa2\xce\xbd\xdbq\x99\xc5\xb6{\xa73\xa0\x91\xc2p*\xdc?PO\xc6+\xd3S;*v\x00\xcd\xca\t\x1fU\xc4\x8e\x9c\x9ag:R\xaf\x92\xe0\xacL\x87\x1e\xe8L\x9d[\xe3/\xd3\xba\xfc>I\x80\x9a2\xff\xe2\x0b\x12\xee\xe8\xe5E\x0b\xa8GN\xaa \x1c\'~\xeb\x12\xedp\x9e\x14}K\x080cVZ\xdc"\x9c@\xaa83\x87~+[Q#\x90\x0f2\xd2\x12\x82\xfc\xf3x\xf5\xd9\xa2\xc8o=\xdc$\xf8\xe1\xa9\x04\x1f\x13\x17\xb1\x08\x9d\x96/{bkTC\xf6\x97\x85t\xb6o\xac\x81\x97Fm\xc1Z\xea{\x80\xed\xb1xa\xeb\xe2\x1b\xe3\x0c\x0e\x9f\xdfx\xcf\xcb\x8c\xdb\x84y\xff\x9fD\xa5\x08s\xd1\x0bh\xf1U\x03\xf8\x87\xcf\x0bRn\xfe\xa9\x91\x1b\xf0\xe7\xed\xd6k\x90\xa6\xefoY5\xc7\x81^\x1bSbW\xcc\x06\x99\xa5\x06W\xb2U\n\xc3\xa6\xa0\xc2\xf3\xc5z\x95\xbc_{\xffD\xcd\xdf\xe1\xb2aD\xc6!\xfb\xd8\x11\xb4\rP<\xe0!\xb3\x15\x96\xd1P\x02[\x92=\x1a\xda|\xb7\x95\xef\xa1t\xbd\x80i\x17\x8b$\x05\x94+Z\xa4\xc9\xb8 \x1f\xae+\x85\xa2U\xad\xae\xd7\x83\xc4\xb7\x9b\xd1\xbf\xd5\rH\xa0\x19\x7f\xb1\xd5B\xbd\t\xe7\x98CB?\x90\xf1\x95\x88\x8fE\xad\xb0H\x10\xaeh\xc5\x02 [\xbc(m\nP\x11\xa9K=\xeb\x87\xbe\xe1,\x93=\\:\xea|\xc2\xa1\\\xbd\xab\xb7\x10\xab\x9e\xa4\xfde\x1e"\xaa9\xec\xf0\xe0\xe2\xf3\xde\x8b\xeb\x10\x87\x12\xffv\x88\x14\xcf\xe2\xd3\xf7?58d\xd4\xceg\xf8Dq\xe2\xba\xbaVJ\xc2W\x94#\xc3]\xa1\xb3\xb1Lw\xee\xe4\x15g\xa2)}Fi*~\x97\xcc\xf7Ibk\x05\xf9\xd3\xa1\xe9z\x18\x1d\xf8\xf4\x0b\x98@\xba\x8eH\xae\xbb\x89{#\x82v\xda\xa2\xda\x9f\x8bP\x1f/\xf1&\xf7\xe7\xf5\x0f\x14\xda:A/\xe5\x14-[\x19\xc4\xe7\xcb\x93)\xc9\x02\x99l\xbd\xa8\x88&76\x92\xe2E\x9f&\xe4`n=^^\xefz<\x89^\ryqt\xd6}\xab\xc1\xd7\x95@\x1d"}n\xe0f\xfc\xaap\xbfu\x9cJ\xf4O\xc4A\xd9uQ\xa2]\\\xf4\xc0\xe0\x9dZ\xce\x8f\xc8\xf5\xaf\x08\x91\t\xef\x10\xec\xddv\xc9L \x07\xd1\xd8"\xb2q\x93z\x9a\xb5\xb2\xe9?\x00\xffr\xfc,0R\xd3\xd7]\xedY\x7f\x17\xe1"f\xf5p\xd9\xa8 \xe7\xdcp\xa2\xf7\xf7\xe2}\x99\x15Ga\'\xf3\x07\x0b\x90K>\x89\xf8\x0f\x98\xd3\xe8;\x99\x03\xe3}\x8e\x06_xm\xa1\xf9\x10H\xb6%o\x9bTo>z\r\xff\n\x8e|l!\xcf\xdaS7\xa3\x1f\x97\xa2\x8a\xbfi\xcf\'\xc1\xc5\xcd\xa6z\x11v`\xd9;\xe1\xf1-"1p\xa2\x8f\xae\xa1\x99\xb1\n\xf8p\x17\x8e!\x1eS\r\xdcr\x9f=1\xd3,}\xe9\x0f\xc9r{\x06)\xa0\xc9/w\x96\x00\x9e\x0b\xd36\x14H\xae2n\x18\x1e\x15\xd3\x98\x1d2\'\x90\xc9\xae\xec\xa9@c^#ty\xa4\xcb\xc8\x8a\x90dY\xca\x88\xce\\\x9d\x82X\xd0\x95\xb8\xf0\xba,\xa0M\x17^\xea\xc7-;y:|y\xc0x{\xc8\xa1\xf9\xd8!$5X\xdc\x95%b\x9b\xe7\xf3\xc2\x1f\xb8M\x03o\xb4rz8"\xe1>}\xd9\xfb\xca}\x7f>\xa8\xc1\xff\xfd\xc2!\xd7\x82\xf3\x08\xf7\xa0D[\xb4\xfd\xe5|rS\xe1To\xe9b\xc3\xf8\xf9x\x89"\x08\xc18\xfeE\xe6n\xde\xc2\xf3qRD\xc0\x18\xb5N\xd3\x85\x1f\x81\xa6\xff\xc3\xa6\x8avlX\xd0\xa0G\xb5\x0c5w\x87@\xd4\xa5^\x16s\xa1\xb1u4\xfa\x05\xcf\xd5\x80\xc8\xf5B\x8f1\x1d\xa2\xba\xdc\x14\xe1\x14gm\x9c"K\x04k\x19W9}\xfd\x9e\xc8\xac\xf9^\x9b\x8d\xc65\xa8\xdc\x1a1\xfa\r\xd3\xec\xf3wii\xcb\xba\x8ep\xc4K<H\xaeKA~\xdc\x95\xa3\xff-\xf2\xbbV{~a\xaeJ%{p\xb4j\xcd\xeb\xd2\x9b\x9f\xab1\x12\xaa\xc8\x1d\xaa\xfd\xaeP\xcfL\x8b\xc7-jH^\x88\x9d\xa4\x07\x819x\x01]\xb0zL\xc8\x19\xba\xb6\xf2\xb8\xe3~\x1a\xbd\x1d\xddBMq\xe8\xb9-;\x9a(\x12n?*\x02\x83\xf2vp\xff@\xb9\xf8=\x91\x9d\xa6\x86\'\xaa\xb0D\xfagO\x12\x9f~\xc6\xafd\xc3G\xb1\x06\x95{QUjn<R\xe5\x8c\x7f\xf8\x99p\xbe\x88l\xdbV/\x16\xac\xcdMX(\xdf\xf8\xd1\xf8\xda\xe1\xac\x16=PS3\x12\'[II\xfa~\x14M\xa7\xde\xde1\x06\xf3\xca\xc0\x8eh\x19p\x1ctO\t;\xc8\xb1\x11\xe9\xe2\xfb\xb5 \xfa\xae\x0e@(D-,\xef\xca\xbb\x9f\xf6\x1a\xe9\xe7\xd3\r\\\x15\xe96\xc0\xed\x04\xaa\x0b\x85\xf0F-\xc0\xab\xcb\xf8\xb6AN\xfb\xebv\x9eo8\xf1\x9b\xf4M\xad\xd4wK^\x0e\xe0\x1a\xbd^,,\x9c\xc4V\xfd\x98\xc0j\x14?\xe7\xa3\xaer\x95:\x14,\x80\xf9&\xfcM\xb28zJLjW\xda\x87\x89J\'\xc6w~\x1b1\xad\\+\xd5:\xc8%\xff)&\xf3H\x00\xab\xca|\xad\xb8\x97P\xda\xb0\x134\xe8\x80\xd7w\x1f\x11\xf5\x90\xde\xc0\xacQC\xda\x82\xa6\x9cy\xf7\xe9t\x9dd\x0e\xce\xa3\x82o\x8b\x7f\xa0Pi"\x84|\x08\xef\x01H\n\xb5\xf3}L}\xdeb\x8d\x98)\xc9\xec\xcf\x8a\x1c\xbd\x856?\x86\x12\xe0xbk\xf3\xda\xc1\xc3\xe0\xd6\xbf\xd5\x1d=\xe5i\x9c\x19\x9f\x0f\x8e\xd2\xc5\xa8\xeb\xd8b^\xcd\n\x1e3\x96M\x15\x9a\xbf\xfe\xac\xb4\x86Zce5\xca\xd6\xc3\x89h\xd2\xd7V\x8e8d\x99\x00\xfa\xc0\xfa\xd4W\x88\xb6\xbb[\x87r\xac\xfe\xe85<\xac\xd06\x93\xc7\xec\x19T:\xa9\xc3\x8a8\xff\xc3\xc5\xc5i\xce\xc1\xb7?r|+\xaf\x8b\xbd\xce\xb3\x7f+|W\x1d\xcd\x87R\x84o\x88\x8a\x1dIpdY\xf0\x9f\x1ce\xefVh\x1c\xf8f\x1f\x8b\xdf/\x15c\xec\x9f\xab\x1c\xfb\x83\xa2G\xf8\\\xfd\x07\xcb\xb6\x10\x95/\xc7^rfvKQ\xe1\xdf\xbf\x06\x01.=\x87f\xdft\xc3\xce\xb3*qb\xd5mog*\xe6\xbc\xd1\x87q\x82\x95\n<\xf8\x84\xa6\xbc\x99Hb\x1a\xb0\xbd\x94\x88\xd9\xb5/J\xf2\x04W\x1e\xca\xd5fq\xdc\x84\xcd\x8f`\x07\xff\xa0<\x8aj\xfb\xa3\x86b\x00ce\\Xl\x8f\x80\x068\xd6\xca\x87G\xf3\xf4\xf2\xd1\x1b\x15\x85O9\x7f6\x141\n\x1e\xe2\xab%%\xc6\xb8&c\xb7\x93\xfbmS8T\x07OIA\xa2\xc0\x83s!\xd6P\xea\x89\x0f\xb32\x02\xf4\x11\xf7\x10\xb7\xc5\xd3\x127\xda\xbe]W?)\xfaLE\x9eS\x85\xa2}-yp\xfay\x17\x10\xe7W)\xc7\xdf\xd7\xf9\xadme\xf0\x94?r\xb8\x03\xb44R\x10\xaeq\x03\xf7\xda\xbf\xd3\x0c\x88\xcdw~\xd4\x03\xd3\x82\x12\xef6\xe3\x8fGE\xaa\x8e\xe3\xcaK\xbf?\x10\xe8,\xc8\xb0\xa3O\xad\xc4\x06\xac\xb17\xb6\xb9\xd1\x04D_v\x9d\xd6mc\xb2\x82\xb9\xa0On\xef\xf4\xc8\\\xf7\x8c;\x9d\xa2\xa8\xb6\xa8\xe7\x02\x9c\x97\x11\x03\x02\x1e\xed\xb1O\xe5\xba0\xc4\xaf\xf0}X4\xc4\x1f<6\xf4fn(Z\xac\xe7\xf4\x9ef\xfe\n8Xj\n\x0em\x0fx\xcfF\xf6XEm\x03\x02\xe9\x0f\x98\x89\xb0\t(\xfa\x99\\\xed\xfaj\xc2^_2=V:\x9919\xe5\x91\xfaL^\xdd\x15\x02g\x0e\xbfs\xffR\x1e3Q\xde"\x11p\x19N\x8fE!\xab\xe0\xd3`\x7f\xf7V\x9b*kcv$\xdb\xfe\xf6\xd7h\x94\xcb\xect\xd1(\x95\xdf)\xfd\x89\x9d=-\xd29v*\x902\xde\xe9\xe6\xc5m\xa7\xear\r\xd9\xec\xea\xc3\x9dF\x15?YW\x8dz\xb0\x10\x86\x0c\xed \\\x8dD\xd3\xffj,]\x10tUVE?\xf4\x7f\xe2*7\xb5\xf9\x1aUh(\x05`\x99\x85\x069\x87\x05\xd04\xde5\x10\xaa\x9b\xa5kR\x8f\xafN\xafM\xc1"\x1f\x84,\xc5\xdd0\x08J\n\x9f\x1f<\xa1BD|\xd2\xed\x80r\xd7\xf5\xef\xf3edjC\x18\x019/S+\x8f\xf3GuM\xb9\x82\xf9\xbf\xa8\xae\x1f^\xc1\xc4\x1eMK\xd9\xbe\x02\x1d\xf0"\x08\x8d\x83\x9eo?\x99n\x03;\x92\xc5\xf2\xd1\x87\x14K\xcfj\xcb\xad1\x85\x01\xf5>j\xf5E\xd9\xe3\x95\xcfiZ];\xda\x03\xcf\xd7\xf2\x8c\xf7\x96\x95\t\xb8j.\xae\xc9\xe5\xdfJO\xb1\xba\xc1\xc8\xc3\xb9!?\xf4\x9f\xdd\x07"1\rW\xb3\x96]h\x14\xa7#:\x1a\xdek\xd3b9}\x17\x91h>6uI7\x8c:/a\xb9\xf4\xf3RO\xab\xbc\x97\xe3[-\x0f\xae;\xa46\xb1\xfbq\x9c\xef\xbfm\xee\x1f\x90\xb8\xab\xa9\x8fU\x03\x89\xc4\xee\x95g\xa38\x8d\x8f\xca\xcaGj\xd6\x17\xfb\x05\xcf\xa7e\xe2k\xd9\xc5\x8f\x9c\xfc[Ke|\xb3\xdd&\x0eH\xdcx\x8cO\x9d\x8b\x16\x1b\x95<\xcdj1m+\x1f\xad?\xf78l\x13\xbc\x11\xfb_WfI\xb9%$\x91\x87\xf5R\xf0\x03\xed\x1d\xf3\xf5\xc2<\xe8\xaa\n\x06=\x05\xba\xac\xee\xa2\x13g\xc3\x9a\xb9\x8b\x84\xd1\xf3[1\x04\xacP+\xb5Y\xd7\n\xeb\xab8\x19\xa8\xbe-d\x17\x92\x10\x9a\x12\xdf\x05\xa5&\xe2|}L\xa1\xeb@\xd5\xce\xf8_\xec\x98\xa2^\xea]\x17\xf4\xdd"\x02Z_\xe8\x82\x8bLFB9^\x0bD\x99\xf7\x1a\xad\xd3\x9f[a\x84$\xec\x11\xde\xc1\xd0\xe5,\xb5\xab\x8a\xafU\x11\x13\xe7\x8a/\xc1\xea\x91\xe9A\x80\x0b\x164\x1a3!H\xb8v\t()\xd2\x07\xd7\xe1"6haU\x923j\x16U\xdb\xac\x9b\x17(U107;\xa7\xcez_\xee\xc5\xfb\x88<\xb3\xa5\xae\x14e\x9a\x88\x99W\x99M\x02\x7f\x08yk\xbb\x84\xa7_\x1a\x8c\xf2Ge\x8e)\xc3@\x8e\'\x8b!\xfbu\xe5\xe5\x82\x84\x07\xe7QR\r\xfc,H\x92\xacyt\x9f\x9f\x96\x19a^\x97\x13"\x07\x98e\x0b\xa5\xf4\xfd\n\xa8\xec\xc7\x99\xdd\xc3o\xe5\xc3\x8a\x87\xab\xe4\x13<\x95\x97+\xee\xf3\xd6\x99t\xd0\xfc\xa4[)\xfaC\x83\x9ee\xc0\x99M\x91\x9e\xc8\xc1\'Z)\xceo\x0b\xc2\x80\xbd\x07?\xa3\xef\xca\xb3\x19ByOn\xc6\x1cp^\x05-\x94\x7f\x90\xc4\xc8\xb6&M`Tx\xba\xae\x13{\x87@\xd0\x88\xc9\xa8A\xd1\x13_\xc6\x1d\xf5~\xcf\x0c\xd6\x83\x86\x8b\x1b\xd1\xf8x\xc27F%\x1c\xd3\x0c\x9e\xe4\xf3\xce\x12)E\xe3\'\xeb\xc1\x90l\x9e\xdc\x8e\xe9\xa2\t\x14\xb0(\xbb&=\xb8\x96v\x18z\xcd`<H\xb5C\n\xaay\xaeV\xca\xe4\x00\xbdfO\xba\xce\xa1v\xa1\xef\xd8Bx\xf0\xde\x058\xdb\x03\x1b\xca\x80\x17?\xb4\x97\xe2n\x14{\x17\x8f\xb5\xcb\xf9\x80\xd2\x9e|\xc2\x19\x14\x8f&Up\xd7\xdb\x92\xcc\xc9Wg\xf8\xbf\xad\xfb\xee[\xfe,\xa1O\xd1\xad\xd9\x17k\xb9\\B\x19!\xdb\x9e\xbc\x84>B\x14\xbbN\x80\x16\x00\xd1\x8e?O6^\x16i\xc0^^\x94\x15\x95w\x95\xcez\x94\xa5\x94p\x82B\x9c\x15\xa7\xb5\x93\xb8p.l\xf2h9g\x8bJ\xec4\xa9\x1c\x12G4\xb6\xd5h`\xfa\xaa\xd45\xfc\xf0\x18\x9e\x16D\xcf\xedXw\x0b\x99q\xa8\xe5,P\xf6x:\x81\xee}}fc\xd0S\xb0\xdbyu\xdcM\xe3e5\xac\xd7[\xeft\xd6\xc0|\x15\x1e\xac\xa8_\xb5T\xbd\xe7\xc5J\xaej\xd4[i\xb2\xf2\rU\x84\x08\x85\xddS9?\x9e\xd7\xe1#9PQ\xb0v\x1c\x91\xdf\xe5\xc8\xdc\x919\xee\xd6\x9c\xb0\xbe\xb3\x0fj6h\x10\xe6\x18z\xbe\xf9\xe4\xb5b\xa7\x84J\xea\xdeC3\xaa%M\t;\x05\xf1\x11\x0f~Va\xcb\x1d#Dm@s\x92gG\x9a\xcc<\x0e]e\xfd\r\xf0\xd4\x92\xb3q\xc5\x05\xc7\xea\xdd\x89\xb5_\xc9\x0bbM\xf9e\x89\xa5B\xcbr\'\x8by\xc1\xe7\xb5\xd5\x9e(\x92\x82z7\x82\xd5-\xe5\x95\xdee\xd0\xa3\xd14#\x83\xc8\xde6\x8dP\xd12\xdd\xf34DBN>\x0f\xf9\x87Hu\xf9\x86\x93ahr\xdd\xbd\x96Y\x12B\xd2<\xd9\x84i\xa7@L\xecs\x85\x1a\x86\xeek\x86\xb0%D\x93\xdd\'\xa0\xa7]Z\xf3!n\x01\xff\xdb\xaedu\x18\xb2\x1a\xbaUMx\xd1\xe4\xf7\xcb$\x90\x1e\x1ck\x07\xd2\xb7\xabQ\xf3\xde\x08\xca\x92\xa7j\x8b"\xe7\x7f\x1foL%\x84\xd1\xb1\xa9p\xa4\xa76/\xf3$\n\xfc6,Z\x86\xec\x17_\xf3\x95g\x01\xcb\x1e\x11\xb9\xea\xf3\x07\x13\xc1\xb9\xf5\xd7\xe9\xb4>\xfe\x02 \x97\xed\xfe\x9a\xb8\x02\xd9\xea\xee\xd3P\xeeJ-J\xa7\xbc\xa8v\xb8\x85u\xb5DT\xc8\reWx\x91\n[TH[O\xeb{\xf0\xa2\xe3\x0e\x04\r\xa3CO\xbe\xb7E\xf4\x04\xa8\xf5\x94&\xe3\x86\xf9\x0c\xda!gO\xa6\xac\x8d\xc6\xd7!\x8a\r\xeaL0O\xf5m\'+(hJ;,\xccO\x9c7\xc5\xe3-"\xd3\xd4f\xad\x07Q?+\x8d\xa3 /*A%B9f2U\xb8kh\x1f?\xbbR\xc6\x9ee^\x15=\xc8}4;\\\x18\xaf\xcf\x86\xe9\x01\xd8\x04AQu\x84T3\x91t\xed\x14\x7f5&d\xf9\xffv\x11+\xe8\x12\xb7T\xc2@8\x1d\xdf\x0f\\\xed!\x1b@\xed\x9f\xc2\xa6i\xd6\xac\xbaA,/a\xe6\x8aC\xc1\xfa\xa1nQ\x08\xd8\xab\x08,\xd1\xd3E#S3I\xc3\x81e\xfb\xd4p&\xfcw\xb7\xa1p\x0f[Ra\x8d\x9a\xa8G\xf9\xc4\xd2/l\x06\xc5\x02\xa1\x0c\x11\xfe\xe0qT[&Y\xbbl\xa9eQ\xfdQ-8\x9e\xa4;\xbdb\x99&\xf39m=\x06\xb1d\x8d\xf2B\xca%\xcd\xd7\xd6GmXY\xbc\x19ZPJ][\xc9E\x16\xc7\xe3\x01?\xb8\x13]\xcd-\xc0\'>\xe7z\x95c\xbc\xb0\x0b,\xe1\x85\x82\xbbS\x15e\xd2\xb7\x96X\x95\xac\x07\x05\xb0\xa7\xb4\xad^\xb3\xc6\xe6N:N\x08\xf0VX\x82<\x15\x91\x8b\x9c\x98.A\xdco\xbb\x84\x88\x17\xaea\x9b\xbch^\xecC\xc4y\x97g\x87\x9c\xd4\xfa\x04\x1aX\xf4g\xc8\xbb\xb5\xa4\xfe\xf4\x05\x80\x0c\x1bU\xca\xa1-7a\x82M\xdc\xbeO5z\x99\xb0\xc3h\xc8I9D\xe8\x006\xdd\x06\xc8\x15\x8c\xe1\x7f\x16Q\xcd\x80\x19\xaeQ\x95\xe3\x18\x9f\x88\xffP\xa8\xdd4\x0f\xe9S6\xcb\x871NF\xfa@\xc0f\x15#\x04\x10\xd3\xf1\xb6\x1f\xe7a\xd9\x86\xf9@\x1e6\x8c\xc2\xb2*\xc4{\xaeU\x1f\xc5ZI\xfc\x1d\xba\xb4N\x94\xa5\x84@\xfb8\xb9\x8a\xb6\xaa\xf6#\x8e\x01\xd3wSX\xde\xba(ygred\x86\x88\xe1\xf6?\r\xd8\x08Ui8\x1c\x1a\xf0T"\xe7\x9d6\x0fB{\xec\xb3Xo\xeb\x9fI\xc3\xccG\xa8\xc6\xbc5\x97Ce~\xb5\x03\xdc\xbc\xda@\xec3\xee\xaaa\xe8vK\xb2J\xba\x00\x15c\x7f\x04\xda\xe2o3{\xaa\xba\xfa"\xed\xdfU\xd4\x96\xb7\xda\xf0\xbc{\x98;\xef\x8a9\x04\xdf\xb0\x98\x1fm\x84VP\x82\x90\x91\xcbz\xb2r\xab\x17rZ\xf3\x9d\xab\x95b\x99\xc9\xc8\xd8K\xbf\xda\xf9\x9b\x00\xd1\xc7\xda\xbeQ\xef\xa9@q\xc2\x13\x80\xf3\xe7\xdd\x9c\x8d~,J\x85\xf8M{\xa9\xf8Q\x90eD\x95\xdd\x91t\xaeR\x18\x8d\xb8Soia\x82\x93\x9b\xb1}\xe9S\x1e\x12!;Hs\xba\x96G\xdc{CQ\xa9C\xc1\xc9y\xa8\x867\xb5\x01NN7Z8\xb81f\xb4y&\xbb\xe7%e\x005\x04\xaa\xce\xab\xc8FK\xc7_q\xc7\xa6=}b\xf3\x88\xfe\xefI\xe3\xed_\xc4\x90\x1e\xb0\xc9\xe2\xb2\xaa\x9f\x14\xcc\xffms\xef\xde)\x9e\xc0H\xed\x87\xa0\xf8\x98\xe5xO\xdbi\xe3\xcf\x89\xd1^E\xd3\x7fU\xd1\xb6t\x7f\x8d)\xb8\xcd\x18\xa3l\x04R\xbbPm\xd9\x0bG.\x91\xb1\xf3\xdbv\x9c\xd1\xb4\x8c\xf0qc\xcf\x00\xa9\xab\x9fO\x82\xeee,l\xce(\xd2\x11\xab\xc5\xa18r\\Eo\xc9\xce\xacG?d7O\xa9\xc8$\xa8_\x10\x08\xce/\xcaK\x7f\xf1"\xc1\x9d=\xed\x0f\xdb\xf6\xccB\xb4\xfb\x07\xa6;\xda\xff\xa7g\x0c\xe8W>j\xaa\x13\xef\x9aP\xe4e\xaa2\xb7\xd6\xc54r\x02\x9e\xae>\x16`g\x92\x19\x19\x1b\x08\xf1\'(\x12\x01\xd0D\xa11\x18*9+\xbd\xe3\xd9_\x11j)\xf1c3S+\x1e\x16\xe5\xd9<\xf3*\xae\xc8\x92{\x99\xda\xdb\xd3\x07\xa0\xb5z\x1a\xd8!\xf6z\xc6\x19(\xd7\x18\xf3\xf6\x06|\x04\x0e"\x9c{\x8f\x96\x0b5\x0f\xce\xb8XU\xe8\xa6\x94\x02*h\xd0q\x9f\xd3\xceA\xd4I\x0fL\xe8\xcf\xb4\x0e\xec\xdb\xebq\xbcwqL\xb7bo\xd8\x01\xc37\xae\xfe\x9d,\nU\xdd\x12E\\eQ\x81,\xa5\xec+k\xfd;\x9f\xc2\x8e\x06h:\xef\x80E\xc2\xf7\xfe\x1d\xd4v\xa6\x8a\xb1\xea\x00\xe0\x01&WB\xd75\x15u$\n\xe4\xdef\x80x\x13\xd0TX^\x89\xe5\x9e\x97\xc6\xfd\xad7(\xcc^W\xc2\xae\xcb\x06B\xfa\xc57\x11\xd7"\x9e\xd5\xfe\x9d\x9al:Rz\xc8$.l\xa3\xc1_xL\x12!\x05m^\xd5G\xdf\x87\xe4\xbd\xfd?\xa9\xfeF\x06\xa8\xd8\t\xd1\xf2\xdc.\xec4\x16\xd8\xe8\\\x1a\x00\xefV\xb1\xc4`\x93\xc7\xc4M*\xe8\xe1\x7f\xe1\x1d\x1f\x89\xe4I1\xa0\x80\xd9\xa0\x18\xf7X\x8f\xeb\xc8<y\xc9S\xfa\xd4Z\xdf\x95\xc5\x18<F\x9d\xb9<\\!*\xa2\x07\x94\xd0\x96\xefcp\xb3\x10\x07x\xd8k],X\xb2\xcb\x87\x0b\xb3K5\xfe\xd5R\x1a\xd3\x83F\xd5\xe1\xed\xa1\x83\xfe"\xdd\xa5\xb6N\xc9?\xcc\xfb\xaf\xfbc\x7f\x117H\xdb\xf7\x1e\x05\x86\xdc\xc8\xe4\xb3?wV|\xf0\x0fH\x0cEG\x8a\xcc\xc2\x8b\x98\x11\xea,\x92\xab+`\xcd\xedJD,2\x07:!qp\xd3\xf6v\xf2,\xc9\xd3?+\xbfP,S/_ \x97\xcd\xda\xeb\xff\xd7q$\xb4\xb5\xe2\x08\xe9.q\xbd\x8f\xd9\x036\xb8\xad9S\xa8p"\xdbu\x08\xbd\x9a#\x1a\xd9a\xa0\xdd*\xb2\x13%\x0c\x1ci"\x08\x81\xa8^\xaa\xf4Z\xa4\xc6\xc6\xb6\xe6\x08\xf7\xad^\x11\x81\x1a\'\xba\xdc<L\xacL\xff\xe8\xc2\xf2\xd9\xbf\xda\x12\x8e\x15]\x99\xa71am\xa8\xf5\x15\xb2\xef"\xe1>Q\xdc\xc7<\xabK\\\xa90\x9f\x89\xbf\x97\xb3~\x98\x91*\x8b\x13\xd0\xb09\xb9YO\x13A\xd7\xd7\xdc\x94\xdb\xb7%\xf4@*\xc0\xbf\xdf\xf8[6N\xad\xaa"\xb7j+qvO\xe5\xb4\xd5D\xb8\xfdr\xe3\x1f\xda\xef\xa6[\x80\\m\xd0\xe6k\xc9IE\'\xe4\xf7\xe8"\xc06\xd6\xb1#\x05\xf6\xaf\xe1\x13?\x84Y\xe8\xed\xb3\xcaZ\xc1\x17\xf1\xd9;\x14\xa8\xc6\xce~z\x91\xecV5\xf5\x95\xaf\x9d\xe6\xad\xb5\n\xd2\x18\x04R\x8c\x02wT,\x7f\xf21<\xf7\xb7\xd2\x87E\xc9\x14\xf3\x8d\x98Pw\xb8\x96\xccRh!\xd9\xee|w\x048xX\x9c9\x9a7\x955\x16\x01\x12\xb1y\x99C\xfd\x89\x94\xfa[\x1e\xaa\x1d\xc9\xb5wMx\x912\x0ed\xc9\xed\xb5/f@D3\xec"5\xac\n\x88\x96\x9b\xef\x15\xf6\xc2\xa7Rw\x80\x08\x05\xec\x1em\x18\rG,g\x8e3\xce\xf4\xecG\x80tXZ\xa5/s\xd3d\x99\x9a\nx>\xc5\'.\xae/y=*C\x0c\x94\x7f\xcc\xec\x9a\xeah\xf0\xefJ\xe4\xb5I\x88\x0bOT;\xf2\xe5+\xdc\x8c\\%Wi\xa8Zu\xf8uZ\x85-\xa8\xe8\xdf=\x90U\xc5<\xef\xd8\xd1\tf\x86=\x97\x94\xdeM\x7f\xd0\xe9\xf8\x95\xf8\x04\xb9\xd2\xe5xV\x04\x9d\xf6#\x9cd\xdeR\x10\xbc\xe6\xe8\xac\x04\xeaK\xdf\xb1\xe3.\xb6\xd8\xd6<\xe0[\xa7t\xef\x02P\xc1{\xf7\xc4"\xbe\x9b\xfch/:\x82\x9b\xe1h\x05\x99T\xeb\x13\x17\x17\xe5&\x89\x01>\x96\xa7\x0cR\xfa\x80\x7f\x07)\xd4\xa4\x033x\xdcS:\xffv\xb5\xac\xd7\xf4\xad8>\x0e\x7f\xc8\x13\x17\xe9\xceW\xe6\x00\x86\x86CIh\x06\xc0\x9e\x0fK\x1e\xc5o\xe0O\xf8\'\x8bw\xf1\xb3\xf76I\xe3d\x85\xb2\xba\x85\x8aZM\x80\x98\xdbuF x\xdf\xf8\x14$\xf9\xbc)T\x8e\x93\xbb\xfajD\xda\x9a\xecv12\xdb\xb3}a\x0bt\x04i\xed\x87~\xf0\xd21\xa1\x92\xb9\xad\x19\n\x11\xa1\x8c$\xbb\x14\xcc,U}& W\'\x9e\x9e\xb9\xc9\xfei\xd0\x19\x9a\x80W\x9d\\\x92U\xa6\x8dwM\xf1P\x872\tL\x9e\x82\xa5\x0c\x04\xc3\xd0wKY\x89[8o\n\x08f\xf8\xb5\xc4W\x82\xcfF,)\xa1^\x92\xc5\xebIDJ`\xf8\x8aqm\xc2+J\x08d\x8do\x82\xe4\x81\x02?:k\xe8\xb29%\xd4B(\xd9?\xac\xcc\x0c\x06\xcai\xd9\xb5+]2\xe6\x9c\xa3\xcf\xf9\xec)<\xa9\xb6\x02\xff\xb6Ok*\x16 \xaa\x11T7W\xf6Ib)\x13j\xf5\xc28W\xd4\x07\xcc\x7f\xec\xab\x07\n\xe8\xb1\x14\x06\xff\xfa\xa1\xa3\xfe\x8f\xa5\t\xaf@G\xa2\n;Nih\xdcL\xf7f\x80\xc2\x7f,\xa7\x81T\xa2\\`\x18\xcd\xfd@\x7f\xb2kc3M\xe7\xa4\xd3\x7f\x16\xc1\xeb\xb3\x9e3\xea\xc4\nH\xdc\x06\xea\x1d\xd5i\x92\xbb#\xf2\xc3+[zy\x8a*\'\x91t\xa1B.\x0f\xc8w\x08\x17\x18\n\xc4\xe5p\xb0\x87\x91-\xa7\xb1\xb4\xa0}\xb0\xa9\x96\xd6_5+\xb0t\xb4\xaf!x\x0b\xdcB~<K\x0f\xb1\xa3\xb2$,b\x97\x80\x9f\x05\\9;wC\x8e\xc4\x9dD\xe5\xd2<\xde\x19\x89!\x94\x03u\'\xcd\x89\xa3\x04\x8d\n\xd8\n\x02\xb4\x89\xb3\xe4\xa7\xc3\x03\xa4\x94\x124\xde\x1c\x98?\xf2\xc9\xa2\x9c \xaa\xd1\xcb\xd5\x9a\xd9\x07b\xb8\xb7\xda\x83\x981Z\xea\xe8Anw]\xaa\xf633Zv\xb1x\xd0\xa8@AYP\xa0Zu\xc1Lh\x19f\xe6\x90\xa5I\x0e\xce\xa8u\xfd]pIE}\xdc\x961\x19\xc3&V\xc0\x18\xb4\xb2\xf3\xb4\x06f\xc1\x81\r\xd3\xc1Q.\x91\xf7\xa6\n\xa2\x83\rv\xf8"\xb6\xfb\x8d\xe1\xae\xe7\xean!(]q\xc6\x045m\x82\x1e\xc6\xa83\x87\xb2l|\x05\x00\xb4\xd6u\x02l\xc9\x96\xb7o\x00\x1axP\xaa_h2h\x85\xb9\xea\xd7\xbbkG\xb9\xce\x8c]\xdb\x84z7\xd0\x06\xd8\x154B*T\xbe\x85\xb8\x83\xd7\xd1\xa2y\xb6}-\xd0+\xa7&\x9a\xfa\n\xbf\x8d\xf9g\xcd\x1e]\x8d"\x1d8\xcbB<\xae\xcek\x07\x8d\xc5\xdf1W\xd6Q\x9fw\xdb=@\xd19$\xa5\x85\x87igOFB\xecTw\x18\xa7g\xcb\x8aY#z`\x83\xc3\x96\xebW{-3v\xd6#\xb0\xb6\tP\x19\xc1\x8a\x94\xfb0\x1e0\x96\x00\x1a\x9aV"\xff\xc6\xebr\x88\\e\x9af\x10V\x8fcZ\xafJ\xdd\x91\x1b~\x08RX\xd8UmsT\xf7r\xd7\xa5"\xc7\x1d^\x97\xc2_Z\xe0\x12\x99\x95\x1f.\x82\xa2\xc4I\xd3\xaap\xe9\xa3.\xf3\'TL;\x1a\xf5\x7f\x1b=\xb9n&\xaa\xa0\x8d\xff\xbf\xd7\xa9_\xb3\x05Q\xb3\xdb\x0c=:\x01\xae\xd6\xf75\xed[\x9c\x00\x91E,\xf1lh:\xeb\xfa\xd7\xec\x0b\xbf\xff&\xf1\x8793\xac\xf2\x0cIL\xba\xd4\xac\xd7Q%\xe4\x1b\x01\x1f\'a\xf8\xb6\xeef\x05\x9c\nK{4\xcb\xcc\xca\x82\x90\xe0\xa945$G\xc9\xd6\xdf\xcfd~\xac\xf8\x97F\xde}\xb2\xba\xd2\x88\x1a\x82\x1e\xf6\x08 \xf0K\xf8\x180AT\xa3\x95\x07\xc7\xbe)\xee\x9e79\xfeh\x82\x1a],\xbb|[\x96\x00t\x81\xd8\xc7n\xa1yv\xe3Q\x08\xd9`\x1f\r\xea\x1b\x1f6\xf6\x18\xd9\xf4G\x00\xc0\xfaFX\xe7\xc2\xe0\xf4<\xf1\xf6D\xb9T\xb1\x80\xdbwM\x7f\xcf\x96\xfe-$So\x91\xe7me\x88\xea\x8bn\xbb\x90\x07\xe6\xf1,\xd6\x95\xdc\xf0\x99c\xe8\xa8\xf9\xe9\x8e\x12\xb8\x17b&\x8c\x80\x84\x0c\xfc{\xafU\x02E\xc6\xd2\xfe!>\xc1\xf2\xbc\xb2\xaczc\xfd\xb3\xc1\x00\xc7\x1c\x91E\xb6\x04\x8aA\x08\x88\xbbz\xb1\x16\x0f\xbaj\xabg\xb5\x11\xc7.\x93\xe3Z\xc9\xe4\xb6\xc6\x92\xbc=P0\xf5\xfc\xd9\xe4\x90\xb52T\xfbK\xc6(\x9ej+;\xc9j\x02\x02\x97m\xaeF\x9f\x189\x98\xe8\xa8\xe8\xd4c\xe1\xc3\x19 z-\xcf\x15\xd8`_\xaa\x03\x8a\x07\xe6\\9O\xfb\x1d\xd5\'&\x1e\xdf\xc8\x1e:+uJ>\xee/\xef\xf7\x8a\x1d\x1f\x9e\x97\xe5<9<DZ\x9d\xac\x1c+\xd0\xc9\xed\xdf(\x91\x16"n\xfe\xd6A\x06\x84\xcf\xe8\xe8\xaf\x9f\xdb\xf1/\xf4\xbb;p\xdf`\xa9\x08\xe9G\t\xf6C\xc3\r\x13?\x90\xae\xec\x83\x95\x1c\x9d\x81\xaf\xb1\xa0{\xc4|h#_\xc4\xa5R\x17>v\xca=n\xaf\x93\xd4\xdb@`7\xa9e\xfe\xde\xcb\xfb\xec\xec\x0e\xa18\xbb:\xae\xaf\xb4\x8e\x99\xb3W\x85*\x89\xd83\xdf\xb6\xb1br\x00\xc2\xc5\x05\xe5)\xa4\xb1\xaf\xce8\x96\x05\xa4KR,2\x95\x8d\xaa\xad\xa6\xb2+\xb2\xc9\x8d\x95\xdf\xca4\xf8\xe7E>\'\xb4^\xc4\x8f\xfejS\xbe\xa4^i\xb0\xa0\xb1\x81\xf8\xbd\x8e\x0c\xe1|eD\x15\xcb\xec\x02\x91\x0ft\x89\xd6=\xdd\xb45\x0f\xc2#=i\xa2)\xbe\x99\xbc\xd2_#%\xaa\x84\x80\xbb\xcf\xbbO}\x9d\\\xfe\x8f\xf1\xde\x9f8\xf4z\xad\x84V\xcc\xa9[\xb8\xb8\xd2K\xb5\x98\x82\xc2\xf68\xb5\x9b\x17\xcb\xd1c\xa9|1"\xd8\x13\x1a\xa5B\xca\x08\n\xd6v\x94t*\x05\x8b\x88\x1b\x08)\x81\xb6\x8eH\x1f@5m\xd6v\xad\xd7\x19\xd7!\xc4\x99W\xb4\xc8\x152\xec`\x84\x8c\xbd\x1f\x1c\xd4\xe8\x02\x0f\x12\xa6\xcd\xf4\xc1\xc84\xb7\xae\x93d\xef\xfb\x0c$0#\xdb\xe6\x02\xff\x8d\xe1\xe6\x8c\xf7\xc4\x13\x06M\xb4\xd88\xc9\tZ8-\xbe\xb5\xa1\x8a%\xd09M\xe7\xf4G+M\x88\xadC\xfb\xa8\x89}\x0b\xceg\xbe!A\x1dO\xfeg\xf9\xba\xd56\x05\x84\x87j\xc0\xfc(\xb9\x98\xf3Y\x8e\x89V$\xdfe\x8b"^\xd3X\x8a\'|f\xcfJFss\xe4\xd1\x9c\x94oj\xdf\xb9\xd2\x04\x87WUyQe\x06GD\xd9"pQ\xccc\x18N\xc2\x92\xcf\xf7\xfa[\x8a\x96O\x84a\xebS\xc6\xe7\xd5V\xbb \xba9\x8d\xe7\xf1\xb68\x18\xccW\xe2\xa5\x00\xde%\x9ai7\x80\xc3Dc\xd3\xa45\xdb%\xf6\x0b~\x08\xbcn\x92yj\xf2\xce\xf2\xdc7\xf5\xd3\xc3\xf57\xab\xf4O\xe5~\x95?\x8a\xa4iP\xe1d\x8a\r9j\x88\xef\xe0\xde\xb7d\x1c|\xd2x\x12W\xa9\x01t\xbdRU\',\x11\r\xc3\x10\x9a\xb1\xa3\x93\x1a\x16\x98\xd3\xe8\xf9\xedM\xcbY8-\x03\xb4\xaa\xa1\xc2\x8c\xf9\xe9\x00cm\xbd\xe6\xe0\xf7\xc1/\xbc\x89x\x0be\xf9\x1e\xc4\x1eW\xaa\xd5\x0bA\xbd\x14DEJ{\xd3\x85o\xca*|\x9de)k\x96\x9a\xed\x86|\xb2o\xc3"\xb5\xf6\x92_\x07\x96\x14\x0c\xd3W\\\x07\rhKj\x1c\x93\xb0c0\xf7\xb5\xcc\xfd\x0f\x95\xaf^ls\xfb\xf2m\x88\x1b\xd5a\x14Q\xff\t@\x8a\x17\xf1,GBYX\xd5\x14`\x83\x08\xd2\xb9W\x9e\xcaW\xdd\xe2\x80\xbe\x89\x9e\xd4\x95\xf6x\xd43\xech\x1c\xd4\xa88*D\xf6\rh\xc5\x9f\xcf\xbc\xb3\xd9?\xe7XT\xb9b\xcc\x8c\x96\xec\x84h\xcdVi\x03,\x0c\xcbC\x1c\xb8\x9b(Uf\xc9\xed.\xa6\x98\xe1m\x1e\xf6\xa3\x97Ds\x0625<*\x8eP\xc9\'\xfco\xf0N\x9c\x9b\x95\xa6,\\\xd8\xf3\xd9!\xf4\xb5A\xc0\xcf\xaa\xf4\x00\x16-\xcf\xe5\xdb\xbb\x17\x9b\xa8\xfd\x98\xc1\xcbQ>pO\xd2K\xec\x00\\\xfc\xaea\xda\xec\xa1\xa7\'\xcf\xbddK\x05\xc7\xacl\xec!Q\x0e\x04\x15[\x88\x1cu\xf7\xcb\xcaV\x04\x9d\xc9\x9b\x9d\xbf\xb0y\x1e\x19\n\x0fn\xfe\xe6xx\xabB\xa3C\x0eH\xda\xbc\xe6P\xc3\xa1Cx\xfb\xfb\x0eH\x9c\xa9\x1eIE\xa4ZE\xae%@\xcf\xca\x06y\xeb\xc6\x8b\x18Ef\x11\xff\xe5\xc9w\xfb\x97\xf4\xe7x|Z\xab3\xf4\x8fF\xaf\xa5\xeb\xa9\xa7S*\xa7\x12\x8a\xfd\x16q\x1b\xa42I\xa9\xde<\xd13%\xaf\xb8\x1d\x9c_3\x1a\x03\x0eB\x90\xb8Uo\xe0\x1eg.\x17\xf7\x80\xad\\\xe0F\xe5s\x1b\x0b\xcdr;\nK\xd9N\xb8\x9a4\xf5;\xd7\x9e\xbdb\x03#losR\x91u[\xda\xad5,\x16\xdek\xad\x9c\x87M\xe6\xcaqH\x0e,\xe6\xfc\xd2\xe2\x9b\xeb\x9a\x979\x9f\xa65\xe5\xb3q\x16\x86\x9f\xdd\x14a;\x17j]D_\xee\xdf\x16\xb5\xc0e\x9c\xfd\xf01\x16\xa7jX\xea\x93w\xc2h\x18D{\x84-0+\xea\xbb\xf7\x04\x02\xf6)\xc7\xbe\xc9.gQ\x08\x04\x94\xbf\xe8\x10P\xe5\xd1\xbe\xe5\x92M\xe8J-\x8b%\xafU\x1d\x04\x7f\xd8R\xe0q\xecx\xa2\x14\xa979hh\xa0z{e:#\xb6\xd4\xa2\xed\x824EP\xa7)\xe7\xc3\x086\xee\xa5.\n\x90\xe6\xba\x8bV\xaf\x07\xa9\x1d\xba0w\x9e\x96\x9d\x9f\x8fW\xc5E\xa3\x80X\x8d\x84\xd1\x11N!6\xa3>X~\x1c\x98\x8a\x94\xccB\x13U\x89\xb2b\x02\xb2\x8aQ\xfb\xd0\x9bJ\xdes\xb5\x1d\x02\x90\xf3\xeb\xd0\x16\x18QK*\xee\xc7nG\xf6\xc9\x93\x84`Q\x9alF\x14p\xe6\x87\x92\x8e\xbcG+\xf7\x81\x0f\xde\xd2?,ut\xe2\x10b\xe5\xb4\x86z\x9b\xef\xd3\xdb\x8b\x96\x07@\xc2M\xdc\xee6\xe4Jr0l;\xef7-\xcf\xa8U\xda\x11\xd4\xe0\xe0\xeb\xa8$W\xcd7`^\x8cf)3\x99\xb0\xb2\xc0$\x1eM\x15\xcd\x0c.\xb0\xfa;\x1bZ\xc7\x18 z^\xafYl\x85\x8c\x0e)x\xa7\x18\x82\xb8C\n\xe2E\xd1\x8e\xbd\xdfXl\xba1\x92q\xe0\x8f\x0e\n\xce\x8c\xf7m0\xeb)\x8f\xd32|\x96%Y|{\xfd\x9b\xda\xads\x96\n\x0fz\xcdR\xce\xff\x8c\xf5\x03=\xbc\xcd,\xff0\xe8\xf8\x85\x12?\xa2~\x8f\x08\xffz1$M\x1c\x92\xd7\xaeg\xba\x99hM\xc0b6\xf0\x8fYM\x1a\xf0\x02\xef1V4\xc1\x98\x9d\xf4\xce&\x1bf\x0c\xbb\xe8I\xba\x9ah\xdc\xdfm\x12)\\\xd1\xdb\x12\r\xa8\x10L\x85\xe5y\x1c\xc3v\x8c\xa4^\xb3\x82u\xf1\xfdk*\x10.p\xe4\xa1\x11\x96N\xa1\x8eD\xd5$\x05c2\x9d|w\xd4\x85\xd3ZE\x02\x99\xaf\xd5D\x0bd\xc4\xc2d?\x84\xe8\r\xd4qd\xe3\xc0\x98\x9f\x01U\xe9-\r\x9e\x01\xfb\x985q\xd7\xe2S\xdd\xc5\xd4\xbb\xcev\xcc\xc3\xef\xb2\xa5\x90P;\xea\xfa\xca\x88\xceh4\xa9zQ\xc2\x9d\x82\xa5.\xe4O\xa9\xd3t\r\xcf\x80\x96\x85\xaa\x9e\xbc\xf2O\xab\xce!\xb5\xed\xa55w9\xc8\xbc?\xa3\xfe\xd9\xdd\t\x0f\xd3"\xb4Z \x94\xd2\xfbs\x10\'\xc4p\x888,\xbe\xd8\xdc\x01#/\xd1\xf8\xf4I\xe3\x98\x83a\x98\x8a\xe3\xce\t\xe7o5~\x11\xbbp\xbd<D\xeeQ\xb2}xO\xa2/\x96G\x8a\x8b\x08\xcf\x98\x80\xf5\xe8\x1b\x0b\x88\xfc\x11$\xf4\xb3\x94m<l-\xb5\xf9\xe6?\x9c\r\x1c\x10P\xcb\x97rte<\x9a\xe6Yok\x0f\xf1\xdf\x96\x8e\x03\x93O\xb1w\xf2\\\x7fE&\x15C\xa1b\x98\xb9\xd3]=U\x07hq\xf4W:B\xd0\x15_D\xf9b5veU\xf8\xa4dm\x0e\xfaCq{\xe33C\xf4#\xaa\xa3\xe8O\x8c\x0b\xcb\xbb\x97\xa7\x94\xff\x80T\xa1m\x88\xc0\x96\x96\xcdPjlU\xdf\x80\xa7\xeb\xf2\x83\x04x\xff\xe0\xa1\x85\xfc\xf2\x85\x1aC\xfa\x11\x9f\xc3\x9eM\xcdX\xd9L\xa6\x86\x12MxkR\x14\xact\xbbU2q\x08P\xc2\xb5S\x17w;\xad\xad\xa7\x05\x90\xa7\\\xae\xa2a\x93\xd0\xae=\xd2\x99\x9b\xc3\xa8\x871h\x03\xa4\xc1Z\xa3="\x19\xed\x86k\xc5\x9a~QD\xa0]\xaf\x7fhM9\xe9#\x04hQ\xc2e\\\xa29^\x96\xa9\xc7!\xf7\xe3\x87n\x83\n%~g\xff\x08i\xfa\x84\xf0\x13\x8b\xb4,\x03G\x95\xa0g\xec@\xd8+3\xfe\xa1p\xc7\xde\xdex\xc3\x08[\xdb\x941\xfc\xee\xe0\xb3\x06\xdd\xaf\xea\xc6v\x88\x1f\xafm&\x0f~\x9c\xca\xdd\x17\xce\x0eN\x03\xe4!\x9d\xc3\x8d\xa2\xa2``\x90T\x8bw\xed\x7f\x99\xe9\xfb\xbb\xf3/\xafUi\xbe9\x14\xe2\x9dL\x81\xb1\xe5\x1d\xbb7\xfe\xaf|a\xe2\t\xc8C8v\x03\x18\x17\x1a\xc6)\xd7\x012\xbd\xd3\x05\x1c*4!*\xb1Z\xff\xc94v=\xf2\xf9i\xeb>\xa0Y\xa9\xe7\xe0\xb9\xab\xe0q2A5\x10\x14\xf2Z\x03\x92C\x9c\xd6N\x89H\xe1+e0\x97\x8f\x19\t\xc5\xd7n\xf1\xde\x87\xa1I;\xedC\x88\xb8\xd2\xa1\xe3\xf3f$\xcd\x98\n\xf8\x97Cg=e\x1c\xa1\x93\xd7z;v#\x8dgu\x17\x9f\x1b\xa0\xd5\x05f\x8d/?\xb9\xe3a\xb1\xd3\x9f\xcb\xac=A{\xcb\xedQ\x99P\xe9\x1c\x98\xa6n\xcb\x1ew\xbbC\x89\x9e\xd2\x96\xc0\xb9v\x0e\xae\x86u\xa57[\xcd\x0f\xebS\x0c\x1f"\x83\xb5\xceMP*O\x13\xc6mm\xe2\xb5\xfd\xf9\xa85\x93/\xef\xf0\xfb\'\xe5\x01\t\xf2OA`\xfe\xacu\xd8\x01_\x01\xf26Ko\xfc,\x0b\xccP\xda|V\xeeWT\x90H\x92\xf3;\x80\xdbX\x88\xb5qSmn]l:K\xab\x89\xf2\x99I\xa2\xb5\xadK\x00n\x18%\xd4\x06\xf0\xe2\xf2b\xaf\xde.\x1d)\\\x03\'\x96\x96\xf1\xaa\x91\xa4k\xec\x0c\x9bHH\x86\xa9\xf8W\xe5N\xe3\x08\xd2\x9bK\xf5\t\xd3u\x1a\xc7\xebs[\x85\x12\xd9K;\xf8\xa6\npM\x8c\x18\x82\x06\x02\xdc\xa8t\x08;\xaa\x90\x11I\xce\x15\x00U\xe6Hm>\x86\t\xb2wp\x060\x9d\xb8^\x03\xef\xb6\x9e\xe9\x8dnl\x86\x00\xfe\x1d\xa2\x9bk6\x15F\x9f\xd4\xf3\xed\xedvm\xc3V\x05\x0f\x15\xef\xbf\xe9&59\xd8\x1d\xd9C\x85E\xaf\xf8\xb9\xcb\xbf\x84b%\r\xf00<\xc8\x8f\xe9*\x1ay7!n,\xa0\xba\xe1N\x7f\xe2\xba\xa3QnkvP\x83\x81N,i\xe7\x85\xb2Mw\xa5%\xedz\xc1P\xb8[\xb1-2\x19d\xa1\xa5w\xbe9$\xe4\xf8\xe2wu%\xa1\xc7\x92.\xcf\xb7\xd1\x02\x0c#J!)\xd0\x9d\xda\t\xce\xfc\xc6\xbeR\xf9\xa6\xd2\xfa\x0e\x14\xb2\xb8\x8c\'/\x14<X\xb8U\xf3\xe3\x91\xac\xe2\xb7^!\x19\x00e\x10{\xa2\x01\x16i\x02\xd1K\xaa\xbc\nI\x8a\xac\x08\xbd\x94\xdf)\xdc\x93\xe6\x7f\xe8\xcd\x18,N3\xea\x80\x8b=&z2\xee\xb0\x07\xb1\xa2\x05O%\x9e{\xf5&3Cn\x97\x0b\xf5\xc9\xb3\xedC\xc6;w\xdem\xb9\xec\xaf\xbe\x88\x8e\'\xf2\x8dQf\x9a\xd6\x0bw\x8eF\x9f,tf\x0eU\x00\xc6\xdb\xa3$\x8e\xceo\xcf\x1e\x1bZ\x85\x90L\xe5\x05\xb1\xa4\xb8 \x063g\xf3\x81\xc0g.\x8b\xc4\xf8\xd7\x0c\xcd\xfb\xf5i\xd2\xb4%A!\xffa\x834\xe5\xd7\xc2E\x9e*\xa2s\xe5>\x8c\x89\x0cu"\xb96\x82\xbcM\x11\xaf\x17H\xd1\xec\x1b\xa7\xb6kn\xa9\xe4\x11a\xb3\xa0@\x84\xd2\x1e/F\x9a\x06\x80\xfbwdf\x89@\x052\xe5\xdd\xbb1\xb2\x14N\x9c\xcdU\xd7F\xf9*\x17\x13\xb1\xab\xec\x13\xcf\x85\xfd\x9e\r\xdad\x8cu\xc3\xb0\x88\x80\xf7\xd3\\\x0c\xe5<\x96X\xfa\xc7aKP\x9dK\xdf\xa2\xb9\x81<J`4\x00\x00\xf2\xd8!\xa7k\x06\x9f\x93MT\xd8\xf6\xffb\x83\xdf\x9e\x15JP&\x1eSt\xfb!\xdf\x87*n!\x84')
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