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.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/templates/config.html +1 -1
- hiddifypanel/panel/admin/templates/proxy.html +2 -2
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +11 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,208 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x93\x1c\x00\x00\x12\t\x04\x00O\xeb,\xdd?\xd0\x81\xaf\x8c\xbe`\xd2\xbeyI\xfb\x00\x00\x00\x00\x00\x00\x00\x00)\xb1\'\xa5\xc5GW\tVIH\x1c\xb3VV!\xf3\xed>\xbe\xc8\x12\x8f\x9d\x1f\x9a"\x9e\xeb\xd7\xd9\xee]\x00\xb8\xb0\xe0.\xd5R\xc8\xcb\xe0w!\x90\xd8\xf8\x85\xa1\x8f\x1au\xd9\x03\xd3\x8b\xcd\xcf\xc5\x10\x91~\xd6\n\xe9\xeb\xe0I\x1c\x04"\xc8\xe7\xa8u>\x04KW\xfd\xd6:\xff\x8c\x92\x9c\xea\xba \x94F\x1b\x96\xf9a\x8e\x99T\xdb\xdbk\x05\x17\xea\x83\xab\x8cA\x1d\x96\xf1\xc7O.t\x18\xe5ou\xc3_\xa0$\xb2r/\xbd+\xd3\xfd\n\xf4@uO\xbc(\x9c0\x7f\xfc$\xacL\xe8\xbd\xaf\x0b\xef\xd72\x80\x1d\xcd\xe9\xdd\xac:\xc6(\xb36@\xa5\x01~q\xd13\x0bN\x17\x10p\x88\xc9\xf7\x05y\x10\xecI\x9eU\xae\xea\x97\xe4u\xf3\xb7[\xe5^T\xa8\x9dc\x8e\x90\xb5\xb5\xc0\xbd\xc7O9g\x80(\x1f\xde\x074l\xddY\x96\xbbx\xc0Q8\x8e\\\xb9A3\x97!s\xec\x808\\ESi\xc4\x1c\xff\xa8\xe3!H\x10/\xb2(\x83\xeb,R4\xbfF\xaa@%_W\x025\xbe\xec\xec[W\xc6\x9c\xf9>`\x93z<v\xb8\xe0\xb0\n\x12\x13:\x9fER\xdbH\x9b\xa6~\x80\x92\xc1\x1eC\x01\x9a\x1a\xfa\x18\xa1\x93\xa51\xea\xbb\x9d\x9d\xa1\xfa\xb4\xd8k\xa8&\xd2DR\x9d\x04\xe0\x94s~\xb9\xb9\x19\xf9o+\x06\x81\xc6\xa8Hsk\xb1\x00/\xfc\xf0\xb9\x12b\x9d\xf0\x1c\xbf\xd4\xdb\x0c\xaf\xc3\xd3\xe3Q\xdag\xef>\x8099\x1c\xf1\xd0\xbd\xf9\x8a\xb3\xd1\xb9\xfb\t\x1a\xff\x9ei\xdec\x8b\x8a9\xd1\x04\xf0\r\x0f:\xbd^\x91\xb2\xbf\x08\x7f\xce\xb0\x9dZ\x8e\\Xy\x0c(oS\xd7: \xf9\x9b\xfd%"j\xf3\xc6\xf6)\xcaK\xeem\x1b\xe7\x9fo\x19[\xfb\xa5m\xeb\x92\x1a\xff\'\x84\xcd?q\xb4\xc3(B]\'\x94U\xfb#\x08\xd2/\x1e\x19y\x1clrd\xc6\x0ej\xd7c89|q%\xad\x15s\xf2"\x13\xbbWr\xeb\x98\x81\xa8\xf3o\xbe\xdamY\xb8\x08\xeb\x02\xa7\x8a\xf7\xad\x03\x063sy\xcdui\xb73\xf5o]\xf3\x1c\xfd-\x949\xb3\xca\x82\x99]\xde\x8e\x89\xdc\x9c\x8e\x81t\x8a\xc4\xf9u\xb9G\xf6D\x8d\x85\x0c\xca;%v\xba3l\xc0\xa2\xe6\x05^J\x8a\x9aM7\x8fS\x16\xc3\xc4\xd6K\x1c1B\x85\x9e\x93\xa9-\x85s;\x14[\x02kZ%\x17\x99P{\xec\xfe\x11\xd0A\x17\xfdQ\xcc\x17E~\x95a\x11\xeb\x98g\xdb\x94|\x98-\xa9\x1c<)\xf3\xc3\x9b\x7f0\x99\xe3[\x13\xe3uW\xa9S\x04\x7f\xed\x9eb\x14}\xd3\xc4\xbc$\xc5\xc0\x93f\xcd\xda\tk?\x1a\xbe\xb5Se\x9c\x92.b\xfd\xe5\x12\x19\xbf\x02\x8a^\xd0\xf9\x17\xc16z\xbbr\xcd\xc3\xeb\xcbJ\t\x0b\xa2\x94\xf3;a&L\x0c\nGX\xdf(:|\x1c\xd6R#Z(\x1a\xd1\xff\xb2\x08Q\xfaOL \xeb\xfbn[\x8dQ;V\xfbIh\x94;E\xcb\xb6\xcb\xad\xc2\x80y\x99;\xd1t\xd2\x84\x8elm1h\xc3\x05d\xbd\xfc\x13_\x84\x1e\x1a\xda-\xfa\xf3\xb3a\x1f\xb1?\x19\xfe^\xd3\x07\xe4/\x80&\xcc\xaeN\x19\xbc<\x0e\x81\x15J\x9d\xe0\xa9\x97\x94%3\xf9X\xbe\xda<\xdc\x94z\xba\x18)\xbd\x83\xf2;?\xf2u\x12\xdc\xf3\x1e+\xf7z\xb3\x12\xd9,cK+\x12U2\x93\x82`\xae4\xaa\xb3"\xc6\x9b\x0c\xd9\x03\xfa\xfb\x8d\x02|h\xf4\xb7\x057\xe3\xce\x89\xf5\xd6\xb7\x84*0*Vs\xa7\xfd\xaf\x06\xef<(\x82#{\x1b\x1c9\xfb\x18x\xbbsXg\xa3<\xce\\\xf2\xac\xfer@\xb5\x9cq\xbd\x8c\xd9\xbf\x07x5Ymx"\xfd\xd7T\xc19y\xe3\x9cw\x80\xa0\xa9[\x8a\x9b\xbd\x00\xbd\xb9e\nT\xa6\x90\x7f\x10\xdb\xc4\x9f\xf0\xaf\'\xf8.\x8d\x15\x97F\x84c\x81!\xddV\x9aF\x10\xf0\xe0nH\xbd\x9fJ\x1b\xfa]\xc0\xf1\xbeCj\xd4\xf1\xf6EC\x90Jqy#\x84\xe0l\x0f\xdd\xae<3v\x97%\xd0\xee\x11\xb4\x08\t\xf1\xf6\x11\x95\xc3\xf4\xec\xd5\x87JB\xee\x96\xe3V\x11\x8f^\xdf\x02&\xed\xb9(\xfd\xa6\x9e\x9ey3\xa1\xb7\xc3\x86R&\xdcx#\x8d\x8b\xae\xd6eB\xaa\xa4\xeb5a\x9e\x9f0\xee\xd9\x8cY!\xfd\xeep\xcf\xcf\xce\x0c\x03G\xff\xec&UC\xf2\x18?\xc8\xf4\x95\x05\xf2\xd8\xa5\x98\x08\xca\x17\xe9\x91Xo\x19\xa4\xda\xb4\xea\xabV\xab\x7f\xd8/g@\xbalj\xde\x81\xc0\x08K)\x98\x7f\xcd\xfc\xdd:\xa1\xe3]\xc9\xf9DV\x91I>\x9f\xa3\x82\xbf\xd0c\x0bk\xb6\x1d\xb4\x0ex2\x00\xce\x19U$\x83\'\xb9\xd4\x97\xf4Y\x00\xdb\xd2\xe0OnSj1\xd4P\xd4T\x95\xf4\x01\xf8\xfc\xc7o\xdc\xcex{)J\t\x99\xfdL\xa7\xfe\xc86\x7f\xe8Dq\xe0(N\xc3\xa0\xbe\x8c\xce~[|j{\x91\x14\xa9\xfbg\x81u\xbdz\x85~\xa6\x98\x1e\xa6\x05#\x16I&hJf\x8c\x89\x060&\xbd\xcb\xc09\xdc\xa8bP\xe9F\x80"\xf2\xc9)\n\xc2\xf8.\xe561\xe1+\r\xf6/\xe7\xca\xad\xc9M6`\x19|-6\xed!v\xe3\xe6\x87\t\xf9d}\x14[!|\xf0\x8c\xdb\x8fz-\x99A\xe1\xdb\xf3@\rG\xa99HO\xd8\xc1\x01\x9f\x8c\xb3\x0c\xd8\xfdZ\xa2Q\x10\xed\xc1\xdc_\x83\xd7\xee{\x12u\x83\x11\xfe\xc8\xa9g\x7f\x82#\x80\xa5O\xf7\xb0]8\xea\xfb\x05\xb4x\xe9\xc3\x0e\xdd\xa6U\xa9\xfd\xdbg}\x88X\x93h\x8f\x95=\xa7\xe6\xe2\xf3\n*\x96\xe0\xc8\x1cw\x80\xccJ\xadg\xe0\x05LO\xfe\xcb_/\x86\xb5/\xef\xb9\x99\xa4Ex\xf0\xe5\x99\x8f\x19\x9f[\xffR\x18\xd7\xe5\x00\njH8l\xda;\x14\x88C\x9d\xe9\xb00\n\xbe\xa9x|\xe5C\x9f\x1a\xa2\xc9\'nJ\xdd\xf5\xe8Q\xc2ZxCc-\x85b\n\xdfe\xe5\xb4\xd9Y0\xd6\xb7T0\x82\x12\xddq\x9f\x95z\xddil\xdf\xed\x80z\xf8GG\xc4_-b\xd1\xe9\x0c\xf1\x93uwU\x87\xac\\\xe8\re\xc82\xf4\x01\xd8A\x8e\xd9z\xa7S\xc1G\xe3f\xa5\xe7\xfb?+\x9e\xb9\xcc\xb8\x97\x8f\x95O\x9d\x07\xf1\xb8\xe1\xb9r6\x177&\xf4$E\x0f\x83\x87\xd4\xadiu\x1a5\x8a\xedJP\xff\xa6%\xda\x9d\x99\xc6\x9f\xeb\xc8\xf4\x19\xcen0\xdf\x13\xc3\xdc\xdf\xc2\xbc\xcd\xd4m\xd3\xd0[v\x84t\x8e\xc9ujX\xcc~K6\x83\xc1\x97\xd0\xed\x0b\xbd\xb3\xc4<W\r\x8cPA\xcb\xb2\xbf\xae\x16\xd1\x10\xf6\xf5z\xac\x03\xa2N\xad\x82\xec\x079L\x0e1?2\x16\x1e\x87\xb3\xf7\xbc\xff\xa3\xcd\x1c\xc1\xeb\xbf\x89y\xcd\xca\xf8>\x89\x837S\x94\x87\x19\xa1hU[\xd5,\x1f\xa4c\x94\xd4]&\x88r\xd7L\xd1\xef\x97%\xb2\x90\x0c\xec\xd5\x83-\x83$\xff\xfbNq;\\\xee\xf2\xec\xb7\xfe\x1cj$\x19\xd3\xe4\xa7\x1a.\xa7\x1a\xd5/\xd4\xb6V\x06\x02\xf7`\x81!\x0e\xb9\xcf\xb1\x13\x12\x05\x8f\x8d\'P\x050\x7f\xfeay\x06\xcd\\\xd6`\x84]x\xb8\x83N\xa3;\xa0\xd4\xbf\xb6h}\x88,\x11\x82\x84\x96\xd2MIl\xba^#\xa4\x04\x9f\x1b\xdc\x1d@ z\xd3,\xe8\xbazj\x05p\xa3\x16\x1bc\xf1\xdc\x90#\xf2m\xf7\xd3\x05\xb0j\x10\xb5\xc0\x1a)%H\xb7\x87\x86\xe4^x\x05\x01\xd3\x7fU\x8c7be"\x95J\xf8"\xc7~\x0b\xa7\x1b\xa5\xc6\x05\x91.\xe6\x85D\x99\x10kCDj\xdf\x15\x1f\x95a\xe9\xd8\xbdy\x99\xb9\x05\xd4J\xe0z\xb5CR\xcckQ\xcf7\xb4\xb7&\xa6\x05\x1d\x17\x1bL\x92n\xa1\x83wl\xe5\x7fV>k\xd5\x0e\xd6\xc7gl\xc0+\xf5\xb8\x10\xb8q\xb8\xf5\xbfj\r\xd9\x9d<\xa0\x01\xd2\xfa5Z(\xa1\x06-a\x87\xf8H\x91\xd9\xe4\\3\x1a\x1b&\xc4D\x8b;\x1d\xe4`qU)\x07\xfb\x13;=\x84\x86\x96\x0e\xe5\x14\x17\x1e\xfd\xe4\xf1\xb47\x18\xc2+Y\xa8\x95\xd3\x89f\xf6d\xc4Y*8\x9c\xe4\xb3\xa8\xe0j\x12\x8f\xa2]-\xfe,Pi!\x1fO\x96\x8d\xae\x0e\xd3z\xc0GyH#\xc4\x980\'\xae\xb9\r\xc6D\x0c\xfab\xc7\t\xad\x947^v\xc0\x92\n4\r\xec,\xfb\'|\xe6\xe8\x7f\x94+\x9e\xd4,D\xf4C\x93\xc2\xc99\xac\xcf\x19\xd0\xb4$(n\x02\x13\x87+\r\xf6\xd0ZF\xdci\xc9\xa4\x94\x10\xd1\xcc\xe6\xd4\xf2f\xf3\xc0\xb6\x81\xb9Y\x9cz7~\xd3W\xf5\x1e\xda\xcdy\x1e\x8c\x9c\xbb\xd8I\xfeI\x0b\x06U\xb8\xfftH\x00?\xcf\xe1|\xba\\q\xc2o.\xed\xeen0\x0eD\xae\x9d\xf6"\xd7\xc6\xe8:\x89\t~\xd6\xc6\x9ac\xfc\xcd\x1a\x8b\xa6o\xaf\x1f\xd6\x80\xb4{J-\xf0\t\xc7\xc7J\xdb.3\x11\xf8[\xd2T\xa4T\xb6{w\x9f\xc2%+\x17\x18=\x94\xcb\xc5\xb7Z\'\x99yn\xc6cu\xa3\x03\x0e\xa4L\xe3\xd2.\'%\x1e\xb1\x94\xaa\xcf0D\xe3&\x9c(9K|\xfd\xc6\x83\x1c\x86\xad`\xd4\x1b\x10w\xc6\x02vw\x98\xa6\x05\x81k\x10dk\x1f\x90\xfd\xcf%z\xae\x1f\xb5\x7f\x08\xfc\xe2\xb8\xf5\x14C\x13\xe3\xef\xd4\xe9\x86\x1d4\xb3\x8f\xdb\xbc\xaa\x81\x7f\xae\xc0\xab\xa2\xd6*Eg=\xfd/\xd4[\xf2-\xf2.#+\r\x13\x8d.\xf1\xfb|\xc1\xfe\xee\x15\x19\xb1PtW\x01\xef*\xff\xfa\x98A1\xe3\x8e\x92\xc5\t|y\x06\xf6\x12\xb7g\xbd\xff\xe4?;=\xf8\xbc\x8e\xae,S\xc6\x1b\x8b\xf8\x1c\xbb\xa2\xc2}QoZ\xff\xdc\xd7\xfb{\x1d\xb1\x88\xa6K[\xa8\xca\xf2\xc2R\xd7\xc4\x8dl\x1f\xado7\x9c\x13\xd1\xcf\xd8\xb3\x8cK\x11\x05va\x14\xe0Y\xd3W\xc2\x05\xbd\x02\xbf1\x8df\x91\x90P\xb3\x9b\xd9t\xd1\xa1\xa9\xbd\x8e\x97\xec\'\x9b\xc3\xdf\x95\xea\xb9\xe4\xf4\xe6\x16\xc3\xbc\xf0\x0c\x97G\xbc\x15\xdb\xa2)4]\x9c/\x92\xba\x1e\xc6 \xb0\xed\xd3<\xf8\xb5\xdeL\xcd1se\xfe\xbb/\x8a\r\xd8\xbc\xbaY\xa1\xb6\x97\xff\xd8^"\xac;[\xfa\xe8\xd081,n/\xcayh\\T\x84\x9f$\xd5D\xd7]\xb8[Nw1\xa1+.R\x19\xd4\x8c<\xb2\xb3\x00\xad6\x08\xbd\xf2;\xdcFI\x02\x0e7\xa7\xbb\x1bR\xb0\xbfU2\xb0(:6\x89\xb8#:*\x93^\xdd\xf6\xa9E\'~\xd8\x9d\xd6\xfc\x0b\x87\xb3r6)d\x19\xe5\x06\xd3\x0e\xcaQ\xdcX-=\x80\xadGM\x0co\xff\xaf\x9e\x01\xa8*\xc3\x9c&z9\xbf\xab\xe4\x08D\xbb@4\xf0&_\xde\xf2A#L%\x00\x93\x00X\x855\x1d)Z\xd4\xab\xcdR`eB\xc1\x92,:\x061]g\x1d\xdb\x0e*\xef\xf1!\n\x85\xf2\x1a\xf7,\xb6h\xe12PRX\x1e\x1a#\x07\xc9Y\xd9w\x11\x7f0\xf8Y\xb9\x85\r\xa0\xae.\x18\x0fom\x93\xd3!\xaf\xf8\xa3\xf4\xba\xff\xba3\xa1\x95\x8d\xe5l\xefI0/\x83%\xe5s\xa4\x97\x06~\xa3mC\xcd\xe7\x9be\xd9\xb6H\x8evX\xe8snv;Aq\x89\r\x10d\xa5>\xa6\xa2\x011\x88\xb4\xbb\x02_\xf0\xa87A<&\xd46\n\x98\xa1xZ\xc9\x83%\xbbN\x94t\xfd\x8fC\x87\xef\x1b\x0f6\xd4O\xa2\xa5\x1aU\x98(\xd8\x1b\xd2\xc8\xcf\xec}\xbbE}\x08t_Q"\x7f)\xd1\xa6\x925\xe5d\xa3\x94d\xd3K\xd8\xcb1&\xe0\x81\x81W\x87V\x07\x13\xbc\x89\x95\xd62\x01s\x16\x1d\x02"pFT\xc8\t\tw9\xbb>\xc7\x89\x02\xaa\xac\x94\xbb\xcd\xd3k\xed\x82\xeaV\x00\x7f\x86\xb9\xb0\xd8\xfe\x8a\xa5\x10\xcb\xd9cEDg\xa5\x1e\x82\xc5]\'\x00Ym\xe6#](xG\xd3tnKX\x1f\xc1+\x11dX\xf4\xb2\x03N\xf7\x15\xc5\x1d\xe6y<\xd73\x15\x87&\x08`\x1c\xd6U\x08\xadu\xd9\xe1\x88\xcaA\xd2_f\xa1R\xdbE\x12=V\xe3\xce\xe8\x1f\xe5\xd3\xf4\x93\xdc\x11\x08\x11\x13\x81[5Z\xac`\x90\xc3]D-3\xc0\xb4\xe2\x13\xbe\xa9.<\x91\xbds\xd7\x1c\xa0E\x02b\xbd\x1c9\xb7\xa1\x18\xb5!\x12K\x96\x99@@\xf9\x91\xe2\xd12~\x85\x98O\x1f\x94o\xdf\xe1\xf8\x1d4\xfe\xad\xbe\xb3\x00\xbdd\xe4\xa3\x10_\xa6\xde\xe3i\x05\xaf:\xc8\x02y\xf3\xeeO*|3\xac\x07\xa5\xc6\xf9\x9a\xf7\xb7N\xf6Sz\x93\x85\x1eI\xa4 t\xd3\x16\xefOsL\x11~\x9d:\x14\x80\x043\xb7\xb86w\x1f\x8b\xb0\t\x96\x83\xa0\xfc_\xed\xf4\xd1\xeb!\xda\x96_*\xa8\x8f\xbd\x08\x81\x9da\x8f\x80\x7fCl[\xc3\xf2\x10}.e7\x98\xecw\xdcR[?\x8f\x01\xe7+jO\x0eAK\x14\xb5\xe7\x9f\xe1\x8c\xeePZ\x90V\xbd\xc1\xd6\x16\xca\xda\x9cE&\x0f=N\x07M\xd1\xe6\\\x08\x1d{2\xff\xff.w(\x87_;[\xcc\x9d\xa6G\xa4t%\xa7\x00\x8a\xa8\x15\xbd\xfc\x168<r\xeb\xd5\x95s)i\xc90\x87M=@\xfd~\x97\xbb\x14\xc9Y\xb0\x10\xca\xb0\xb8\xe0\xbc\xf5\xb4!Z\x1f\x9a\xad.\xb3B\xa3\xdc\x1b]r\x96k*\xb0\x90`\xe01\xdc\xe3\xa5\x1b_p/|\xbfE\x9d\x81\xde\xe9K\x06-\xf2O\x17\x13\xc3\x0eZ%\x17\xbbV\xb9\r\xda}\xb2\xb59]00\xa7n\xc3.\xc7\x0b\xcf\xd0[f\x85]\xe3\x1f\xf6E}\x95\xf7\x8a\xeb\x98\xff\xd3\x1cq\xdd\xde\xe8\x141\xc9B\xad\x06\xa9C&\xf6\xc0\xf2\x9a@\x8d\xed\xc2\x97\xea\xc3\xde\xc5\x84\xeas\xa2\x95V\x11\xfbuU\x06\x80.W\x19\xa84\x10\xdd\x88\xa7\xf0\xc4S\xd55\x00KLI4\x1ap>}"\x9f\xf0"l\xc3\x82\xf6\xbd\xb7\xe4?\xa5\x82\xdb\rM!\xc2\xda8\x0c\xf6\x9a_\x8d\xf7\x10\xd7\x8d)\x9e\n\x97A\x0eL\xe2Z\xb6\x00\x08\x1aM\x1e\xd9i\x98\xaf{?\xacf\x08lkse\xa9aO\xb6\xfd1\xb7\x0f\x9cp\xcf=\x04\xa9\xe6\xc6;\x1a\xf6M\xda\xad\xe6\xb9\x81\xf5$\x8cBY\xd2O"\xc6(\xfbZ\xbaH\xa5\x15<2\xcc\xa1\x88\x89\xec\xd0\xb3)/\xf9^\xdd\x1c&\xb3f\x000p\xdf\xff\x8e\x8besa\xc4#\x89\xcbT^\xfc\xdf\xf6\xdd\x95l\x05%F)\x05\x1d\xafS;\xb0Ro\xdc\xc7\xddi?\xf1\x1c\nP\r<(\x1aEMQ\x00x,\x07\xf5\xb5A\xd1\x90\xc7\xa4%\x80*n Ln\xc1Hc\xcb<5\xf2\xc7r\xcbmp\xf5\x1d\x1el\xf4>\x8c\t\x13u\xa9\xf9\x96X\xe1\xd0t\x81G\xc6\xc8\x12\xab;\xdb5G\x06(\xce7\xac\xf2\xe8\xbf\x80\xb7!:z;\x12%\xd7\xd7W\xca:\x8aO\xf2\xd7\xbf6\x16 6_\xb1\xfb`\x93\x9d\xeaa\x95\xfaM\x14\x04Jbk\xdbQh\xe6\xf7\xce`=\xf1\xe1fAb*\xd2\x0bcvVB\xbe8\xa2\xf9=\x11y8\xb5WV\x83+1\x8a\xf1\x14\xb5\x91l\x1d\xd2\x17\x19\x8fxz\xda\xe4\x82\x90\xf4\x052g\x84d\x1f\x0b\xab\x1a\xda#\x93\x83R\x13d\xfb\xb1\x00\xa1\x80^p]\x91:&\xaa$DBF\xd5=c\x08y\x9c\xc5\x8a\x07\x1e\xa7m/\x01\x1f\'\xba4\x83\'\xc9R\x8c\x1dj\x02r\x85\x93\x9b\x10Um\xe9?\x07W2\xa7\xa0\xf4,\x8f\xc8\x8e\x9f`\xdb\x84\xaf\xe7\xfb\x03t\xac2\xd2T\xe6\x85\x9e\x0f\x94\x85l\xeer\x86\x8av,\x8a\xfaL\xf4\xcdh\xbeA\x8f\xc6\x91<\xc1\xfd\xc13K{g\xda\x84\xea\xbfP\t\x84\nL\x99X\x01\xb3\xd9\x07Wt\x06\xab\x02m\xac\xa1\xfcG\x95i\xb8\x9d#\xd4\xf30\x0e+7\xda\xe3\xb1\xdd\xe4\xc0,a\x15\xcf\x11*\xb3W\x03\xf6)\xa5\xbclum6\xd6L\x91>S+X\x84\x849/\xd8\xcc\x87\xf8\xa0\\L1d\xbdN\x12\x8f\x01\xd4\x8f\xe3< \xa4J\xfd[\xbaih\xf2\xe4\xbb\xd2\x95\x07f\xbe\xf1\xb5\xb7gnb`\\\x1a\xf4\n\xd9u\x8d\xe2\xca\x10\x9bs\xcf\x8f\xf6>\x95\x96\x87W\xaa4\xde,\xab\x17\xbe\xdc\x1c\x8e\x91=\xe4x]\xa7+\xcf9\xc7\x82(%\xban\x15)u\xf7\x1eS\x08y\x81\xde\xdb\xccw\xd2l\xeff\xb3\x195>x\xe6\x8d\xf2\x87M]\x85\x90\xfb\xc7A\xc6\xa0\x91\xd5ca\xd4\x0b\xf3\xe4\x0f\xafR\xa17R\xdb#(JG\'\xec\xef\x13.,\xc7\xbd\xc4\xe9/|\x8dw\xc7\xb5\x01\xef2\x7f\xc4\xcd\xbd\xc7\xe2`Q\x90x.\xc1\xaevp\xb5\xb8\x05l`\x01^\xfc\xec\x865x\x03\xcd\x1b\xbaK2\xe8\x7f\xac\xa5y\xac\xf0\x9f\x01\xb0\'\xa9\x9cK\xa66(\xc3\x87@\x8b\x93Q\x87\x17C/\xc7\x83\xcf2\xe0p\x07\xce\xd7K\xa1\xac\x13V\x12\x1a}Z\xed\x80O\xd9\xbf\xa0\x8b\xc2\xff\xd3\xce\xb5\x01\xf3\xb6\xc1\x17W\x94x\xe6O\x00\x9a\x93\x99\x1f\xe9\xc3W$\xd2Nc\xa3l\xfdbjB;\xf2\xc9\xba\x19jg\xae|\x9bs\xd7+M\x0f&\x83\xebS\xf7\xc5\xda\x14_\xea\xe0\xc3\xa2\x87\x0bhi[\xacj)\x04E\x05\xf4\xef\xe9woy#k\xbd\xacD[G\r\x97\x7f \x8f-\xcc\xa8eXP\x0c\x9a[4\xe6\xd1\xdc\xc5l\xf4_\xf2/@\x0b\xfe`,\xcf\xd1\xee^q\xe4\xa9\n\x84u\xe3|FA\xc5\xcfZ\xe4F\xd5\xa2\xe0$t\x96\xdb"\xc1\x99-\x9c\xe0\xce/\x87\xef|{L\x01Q\xb3_\xc7\x1d\xcb\xc1\x07\'F\x8f9\x86\xfd\x04\xf5\x8dUDq\'R\x03\x19\x8b\x17\xdf\x844\xa9\xbdo\x9cXS\xa4\xb9\xa7\x0c)\x16\x92x\x86\xed\xd4\xact\x9d\xad\xd6t\xd8\x9e\xd7\xea\xdc\xaf\x0ed\xcf\xad\x9f9Q\xa9"\x1af\xc8}jm#"\x8a\x83T<tE*\xb0\xc4|\x12\xd6\xbb\xf1-NJ?\xfd\xc4\x94\xda\x9dH\x172\x19\x9aiZ\x8c\xb0\x12\x11\xa6\x0e\xe7\x1e`gM\xa5\xe5\x88V\xc2I\x08\xfa\x91\x04Dk\xb1\x10\xc3#\x8c{\xdb}\xed\x14\xda\xf7o\xfbgww\xdd\x963n\x90\x02b\x08$\xa7]>\xce\x9ax\x13|\xae^\xde\x8c\x96\x1a\x86J\xadF\xfe\xde\x84\x0f\x04\xb7\x96,\xe9M\x95^\xa6I\xe4P!"\x97\xc6*\xc3%jv\xf6\xcbwv`\xb2D\xe5$\xc9\xf7\xca\xa9\xb5\xbb\x8c\x93u\xb6\x16P\xeeD\x04q\x87v\xc7\\\x83O\xa7\xbb\x98~\xbb\x8d\xd9K<\x02\xad\x91\xc8\xde\xfc\xb5\xf2\xf1\xfdY\xfd\'o\xd9\t;H\xd1\xe9\x9f^\xb4\xc0\x81\x14\x9b\x92$\x90O\x84M\xbce\tn\xd4\xfc\xd9\x19\xbe\x12ia\xb94\xb0\xe9\xe0\xb1\xba\xcd.~%\xeaM\xd8\xfc\x17{\x1d\xe6Gs\xfc_\x99\xa3\xc5\x12\x90\r\x16\x15\xdf\xa3\x8bn\xf0\xe8+\xe7Ir\x7f\t-)\xfc\xfc\xf1\xd39O\xac|\xee\xbf\xe5T\xd6\xca\xe2D\x00\xdf\xd9\xa5+\x99eX\xb6\xee\xaecT=)\x86(O\x92\xe7\x056p\x8fw\xd1B\\\x06\xdc\x1e!\xac8}50=h\xba\t\x82\xeb5\xe4\xfd\xd4\x13\x08Z5\xd1\xb5\xa1\xb70\x11\xa4\xc8\x95\xbe\xf1\xa6R`\x17\xc0\x053\xde\xd5j\x96d\xb0\x8f\xea\xe2\xa4\xda,\x87\xc2\x90\xb6\xca\x04%D\x95\xb7\x9d\xce\x05H\xec\xfa\xbcbL1\xfd2(Tz\xf6T\xa2"\x9dY\xa0\xe7&\x12\x97mm\x07\xb6\x14c\xd0or\xd2\x0bT\xb7\x04\xe4%\x82\x95#i`k?m\x13\xef:\xab=\xed\xfa\x9c\xbd\x0f\xc6r\xc2\xc74R\xc3\xdf\xd8X\x08?\t$\xe4rt\x1bkdwF{Kj\xdc\xe6K\xeb\xe5\xdea@\x946}\xb6hp\xbd\x95\xcd \xa5\xd8\xf1\x86\xf4\xd4\xb5\x9b\xe8\xc6\xd9\xc4\xef\xb1\xea\xa2\xb0\x8eUf\xa5\x1a?\xcdfVzZ3I\x95L\x19\xd1*\\\x14\x0e\xd5lSNs/\xbc\x1c\xcf\xae>\x8b{b\xc7\xcah\x01\x19\xe2\x9a\xea\xe3\x12\xb54\x02\xed\xc96k\xd7%\r\xb4c\xf3\xfa\x0b\xa7\x01\x9e3\xc6\x8b!\xf3\xe2\xac\xbe\x10;E\t\xbfk\x07\xf4\x1a\xe3C\xea\x7f\x88\x8e\xf5\xebQ@Vr\x08\xd7y\x97\x02\xf3\xee\xe6\xda\xb1\xdc\x81\x980r\x1f?\x19\xd3\\\xcf\xa3\x99\xbbg\xe6\xc5nB\xb5K=\xb4I]:\xfa\xbcBHE@UQ\xaba\x83\xe7\xe0\x1e->t\r\xe8\xb2\xfd\xf2\xb9\x9c;~H\xba\x89[}\x80\x10\xf9\xe8\x8eh\x9c<\x19\xd3j\xc1PF\xea"\x8b\x0b\x10\xb3\x89\x8dE@\r\xf5\xd4*\xea\x96\xdc\xb9e\x9e\x170\x84\xc9\x90\xee\x9aq\xc6\xb2 \xfb/\xb002+I\x88)>\x8a\x92\x87\xf6\r\xa4J\xde)\xef\xaf\xda5d\x86\xd0\xb1`?C7\xc4\xb8\x19e=\xef\xd6\xd8\xb9\xfdz\x1c\xa4G\xb1\xf9\xd1\xe8\x1fP\x00\x18a\xf3\x1d\xab\xb3\xb4\xc4\x11\xf30\x05\xe3\xac\x81\xa5\xab\xf1b\xf8\xa3\xde\xae\xf7+)}\xdf\xdf\xbf@i\x89\xceq\x0f\xb0~\x89\x02\xce\x1c>b\xf2\xad\x9b0\xa8\xd9\xc7\xf2\xd7\xf8e\xd3g\xf8\xa1\x9d\xbd\x1d\xf8\xa4\xc7ge_O\xfaJ\xd53\xef^\xad\xa2/\x95j\xfa\xfc\x8d\xfa\xf3(\xf0\xcb\xbd\xb5.q\x7f\xa1\x1dp?\xa8\xbb\xc5b7\x93mxS\xcf\xd7Az\x97.\xbe\x9a\xe1\xc6\x1dq\xc4#v\xfa\xcd.\x81\xfb\xd0:R\x14\x1c^\x1d\xd4]\x80\xcd9\x89r\xb19\xa1\xdd\x8f\xcb\x0c\xf1w\x16\x1e(\xbc\xcd\x90\xce\xaf\xccf\x84=\xa6\x1bS\x92jy\xf6\xad +\xd5\x07Y1\xad\xb2y=\xa7X\x81\xdb\xec\x1d\x92\xb5\xdee=c@\x9c\x16o\xba\xaeXON\xea\xd5\x15\xca\xe4\xec\xc9]B\x19\xffS\x0f\x1d\xeb+\xf1\xcd\xa8Z\xb1\xac\xee\x01>\xd4\x8fMH\x9c.J\x1f\xa64\xd1\x89\xf6\x88\xebuMm\xe9D5\xfaA\xe2&\xcbL\x1d\x9bh\xf7\xd2\x8d\x99fc$C\x0c\xf9\xd5X\x9b\xda\x10\xf2\xdf_\x9d\x92=\x84B/_\xf1\xb9V\x04N\xe2\xed\x88\xe8\xb4\xca\xa1\x0bZ\xf3-!\xe3:\x82gGO$f\xa1\xef6\xa2\x84F\xba1\xe5yF\x12\xa3q\x97\xbf\xcaK\xb4\xf9\x0c\x82\x0f.\x8e\x80\x126\x0b\xf0\x17\x89\x08Y\xd1y<#\xfa\x88\x848.\xd71\r\xdb\x1c[oVsQ\x08\xe9f\xf9Ui\x1fm\xeaW\xda+\xf1 \xb4\xd8\xed\x1d\x00\x91\xad\xbe\xe0U\xc6#\x96\xcf\xb2\t\xc0\x9a\xa6\x1f]\x06=\xdf"\x8a=\x0e\xa5\xdd\xc5\xfa\x90$;\x1c\xa9}oV\xa1\xfd\xccn\xb7q\x94P\'e\xb7#\x05n\x9eI\xf5\xff\xc9}\xc4m\xed\xc1\xdd\xba"\xca&\xc1\x04\x19\x1cOf\xa9eRJ\xfb\xda\xe5\xde\'G>\xfe\rhS\xfb\xa3\xfb\xe4\xcfRQ\xbb\xbc<\x8e\xd9\x96\xade\xb6Y\xb8\x1e\xb7\x13S\x0b\x86W\x00\xe4\xeabN4\xb1\x159:\xe2&0\xbd%p\x85\x10=\x86\xd2\xa5\'\x11s\xdc?\x0b\x9a*\xf5`O\xe9\xda\x88\xc4r\xb2\xa57\xd7g4\xb8\xd6\x1b\xa9+4Vk\xaed\x92\xe0\x9c\xd5\x04[M\x06)\x92\x8b\xcd(\xd8g8\r\x98VB\xac\xfe\x9c\x8c\xaa\xe6&q^5\xd7\xaa&\x04aRv\xf1\xb1\xc4\xd2a\xfe\xb1)d\xdf\xd0|9t\xac\x82\xf2C\xfd\x05%\xd3Zm\x86\x97\xcf}\n\x1e\x0c\xe7\xa4\x1d\x9a\xea\xa2DKX\x81\xa3\xd8G\xd7\xef\xddS6\x83Z\x90G>\xbc\xd4\xacH\x8cW\x10\x0f\x07\x9e\xd0\xf8\xach\x94R\xa6,M\xb2\xbdL\xc7\xba,}\r\x1c\xcd\xea\xa2vh\xedx=\x12\xa4\x9a\x82\xa0A\xba\x12\xb9m\x03:\x95\x1e+\x18yG\x88\xc9\x99\x8e\xa9\n\xf5\x00Ac\x1a\x8b\x80CB\xd5\xcb\xd5\x9cb\x85\xd4\xf3\xac\x9b\x18\xbf\x92\xb2fY;\x89:\x8e\x0c6\x04\xa9g\xe8u7\x9d\xf5\xad\xa18\xa6\xfdh\xcc<\xd0\x07\x82N?l30\xc5\x10\x8bY\x91\x14\r\xcedV\x87\x03[\xa3\xed\xf2x\xf5$<\x7f;\x9c\x06\xd8\xb3\xfe\xbb\t\xd5\xba\x18\x9294\xb4\xbaiVO\xb1\xc1w-\xf7#\xfa\xf9\xd2\xe3\xe6b\xc8\x068\xb9\xa2L2M\xaau,`\x99\xa5sO\xda}/$n\x82R\xe8\xf6\x0c0\x840J\xbdU\xed\x8e\xcb\xc1\xe9\x1f\xbb\xa9\x00\xca\xb1\xc55\x12r\x89\xbcR1/E\xf1\x90\x06\xfd\xa2o\xa1:U\xbbX\xc8\xfc\x82\x94\xdb\xb1\n\xef\xa5\xc4\x96b\xb4th\xfb\xeaX\xb8\xc3\xea[\x91\xff&\x037\x89\xedqM\xe5\x85r\xd5\xdb\xb5\x0f\xf0\xa5\xcbqa\x86\xac\xa7\x1e\xbf\x03\x10g\xe8\xd3zk\x19\xf2u\xb2}\x86\xe2ic\x0fw7G\x829\x88qS\x15\xf3y4\xfd\x13\x11\xa6\x03\xbfb\xc34"\x96\x069\x8b\x07\xc9A\xc9\x07\xc9>\xa6pK\xf95\x11\xb8\x19\x85\x0eLf?\xea\xb3\xaa\x00\xd2\xf4i\x0f\x1f&\x86\xabl\xf9^\x1bg<Q3\xad\x8b\xb9\t\x0b\xebJ\x05O@\xf5\xe2\xd5\x07P\xc0Z\x80@\'\x8c\x9c#\xcc\x14SI\x01\xae\xcef\xdefZk\x8b\xfd\xd9\xecV\x8d\x17\xb9<>\xad=-\xa9f\xe4p\x8a\xedA\xab\xb4\xfex?\xd9\x8d\xdb\xd6rs\x14P\'w\xffu\x10\x88\xeb5\xe4\x9a\xc2\x1a#\x16\xf7\x9c\xacg\xfb\xd7\xb6\x93M"\xb3cPqIJ]\x98\x8e\x04\x1cTld\xb4\n\x9f\xb4\xe9\xd4\xeaZ]\xe3`suzCo(\x8fl\'k\x93\xa4\x85M\xe5\xca\x13\xf2lW\xcd\x06\x94\x84/}\xbb\xbb>\x88\xd3\x05t\x8e\xd2\xf9\xbb\x87\x96\x7fcF\x134\xca<\x95\xfb\x10\x88\xa3\xa9!\x12\x15\xb6\x07\xd1H\x1b\xa2-N\xbd4\x9c\xec\xe5G`&\xa7\x91L:\xa2\x9e\xd2^h\xeb\xf9\xc4\x16\xc2\xc1O\x18\xc5\xfb6\xae\xca\x95\x1f\xaa\xbeZ|\x95\xd5aV4\xbb%\xc3\xa9\xf9\x04\x8f\xddQz\xfe\x17\xbdo\x1eE\x07tl\xcaD\x08\xfb\x8e\x82\xec\x12\xd4\x8fU\xe5\xfd\xfd5\xb1w\x81\xca\xdc\x8dj^\xbb\xe5\x12\xc0\x03?\xdb`\x06\x02\xa2\xf8\x8e\xda\x9ap\xe95\xff,\x9e\x031\xc0:Zf\xe2\x08\xb4\x88\xab0\xfd.\xda\x1fL\x9f\xa8?.(2\xd1W\x96\xeb\xecB\x0c\x9d\xe4\xd6P\xc1j\x11\xd7"\xf4\xaeS\x1bq1\xe3\xf7\xdd\xfeT!5%\xea\x8aX\xe3\x16\xfaA\xa4dO\x8bh\x94r\xe4\x80\xa3&\xbf\x97B\x9aM\xac~\x14oR\xa2\xc1\x04o#\xf2\xf3\x8fYi\x02\xf3<\xee\t\xe51\xddn"\x8b\xe0S\x17\xf8\xe8\xe9\xecE\x8ewE\xea\x1dh\xd2\xa6\x19~\x1f\'\xb6;\x89K\xe8\xf8D\x88&\x93?-a\x97db\xca\x87\xef^+fHE\x03\xabC\xf3\x8ac\xf1\xcfy\x87A\xec\x128S\x19\x19\xf9\xb1\xa2k\xcd\xdc\xf0R\xb5\x007\xaf\x04#\xfc\xfc\x05\xfa\xe0\x9c\xff\xa0\xd9\xbe\x11\xcb\x07o,\x89\xb4\xec\xe5\xc9\x12S\xfct:\x11\xc3\xac\x8c-\xdc\x02^W\xe2\xce\xa4\xac\x8c@\xf6]\xec\xbd\xff\x91~\xa4\x86\x85\xa8\xf7\x1b\xbc\xaeg\xe9\x97G\xac\xbcx\xec\xe8\xafcU\xe3\xca\xd1$ \xbd\x05\xae\xf7\xda\xf6l7\xd3\x88\xbf\x9d\x1a4\xc1E\x97\x02?}\xa9\x87\xfa\n\x99\xdc\x1b\x89\xbf\xec\x99\x8b{V\xf7\xabr\x9a\xbd5\xc9\xc3,\x91\x92|L3*\x85\xfe\x80\xe0\xf0:]\xee#\xbfA\xf7\xfeG\x8f\xca\xb0\xbc\x94`\xc9t\xca\xe8O\xda\xfa\xbd\xce8\x1d&\xd7_\xee_\xac\x93]\xbb\xec\xd0>\xbe\x98lK#\x95{\x0f\x03U\xa1XA\x82|eTj-U\xd8\xab@\xda/\xd1\xfd\xfd\x19\xe0\x0b\x94\xa2qM\x13\xaa\xdd\x18\xaaN\x13\xef\xb9\xd7\x9bX\xbd\x93yY\x83\td\x07\xafJ\x13\x8c&x\x8b\x1b\xa3\x02\xfb\x84M>\x07\x8e\xd9\x97g)\xa9\x84n\x07\xecX\x82m\xfc\x12\xf2\x0c\x0c"\x0c\xc6\x1a\xda\x81\xaa\xfa\xecNy+b>\x9b\x18N\xaf\xe8~2\xab+\r\x87L]\xc1E\xfaB\x06\xd5\xe4\x02\x9b\x99\x93\xb4\x9eT\xdfA\xd8\x1b\x0e\x14\x85\xb8\xe3s \xdff\x81\x15\x90\xf2{\xd3(\xecJ\x0e\x893\x07\xdb\x1b\xfb\xb5\x1aD\x00\x96\x9eSA\xd4\xd1\xfc\x7f\xf9\x14\x0ci\xa56U%;oV\x1f\x89\x94\x8d\x04\x1e\xd4\xca\xc1\x9e\xbav\x8f\x1e\xec-\xfa\xe5\xd01\xb8\xd5\xfa\tx\xb5A\x01\x80\xc4\xd3b\xd8\x95\x87\xd2j\x1eEB\xf0Uz\xe0\xcf?\xdc\xdf\xb6x\x83\x04-\x9a&16\xa5\xc1\xc9\x86\xdb\xb8\xd4[\x90>\xf0\'\x90\x9f\xb1\xbaR\xe5j\x979V\x83\x00\xe0\x98\xca\x13\x17\x8e@\xbf;\x9e\xe1\xbaK-\xa0\x9ek;"0\x95\x9b\xa8\xa9^\xccL\xc4&$!\xba\xea\x1b\x8f\xac\x92K\xc2\xa4eq\x1f\xe4\x89\xcf\\yXdVrx\xad\xc4\xdc\xe6\xccl,\x8c\xf5\xf1\xfe\\|\x1e1\xba\x8ek\xf3wn\xc6o\xc5.\x9c\n\xb10\x05\xde\x0e\xd9\x16)\xd4\xb7)\xa3MP$\x8c\xf7\xb6\x1a)\x9f`1\\\xed,4\xf4k)\xa0\x13\xeaTi/\x84\xf6\x8f\xc1\x0e\xb5vq\xeb\x9ff\x1d\x12\xd3W\x8e\xb5\xf7%\xf8a\xc3\x81\x0f\xe4\xf6\x88\x89\x92H0\xfc\x14\x8f\x8dt3\r\x11\x8b\xc88q\xd4@\xdb7\x81\xb9\xc9\xb8X\x16\x80\x98y4\x9eG\xf4#h\xa3N\xd2\x1bK\x86\xee\xae<\x00\xaf\xb0K$\x11\xdd\xa8\x0f\xcb.Ts\x8b\xbf\xb4g\xbfE\x1c\x0b\xd3\x04}g\xab\xaf(\xa43h9J\xbd\x91\xadj\x87J\xf9^T)\\\x83\xe0e\x9f\xa3-\xcb!\xd2UC?\x06v\x1e\xae1\xc8z\xaed\x17\x91\x05\xbfb\xd9\xab1\xe6\xfci\x14\x9f\xbdd\xa9N\x1e\x80R\xc4\xe8\x8a\xddU\x83\x96fe5\xc4\xb7y@\xdc\x80\' +\xc4\xea(\x85H\x9a\x16c\x8c\xcbv\x14\x19\xd9Gg\xdf]\xff^\x84\xa4lL\xcd\x80\xea\xea\x1a\xeah\x93\xd3\x86\x9e{6\xd4\xd7\xcd\xd9\xda#\xddm\xad\xd3\xce=\xd5\xae\xef\x1a=\x08(P\x83\x9b\xd4q\xdf\xdd\'a\xe7\n\xc5l\xe5}\xe7\xb26')
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
|
19
|
+
class ConfigCategory(StrEnum):
|
20
|
+
admin=auto()
|
21
|
+
branding=auto()
|
22
|
+
general=auto()
|
23
|
+
proxies=auto()
|
24
|
+
domain_fronting=auto()
|
25
|
+
telegram=auto()
|
26
|
+
http=auto()
|
27
|
+
tls=auto()
|
28
|
+
ssfaketls=auto()
|
29
|
+
shadowtls=auto()
|
30
|
+
tuic=auto()
|
31
|
+
ssr=auto()
|
32
|
+
kcp=auto()
|
33
|
+
hidden=auto()
|
34
|
+
advanced=auto()
|
35
|
+
too_advanced=auto()
|
36
|
+
|
37
|
+
class ConfigEnum(StrEnum):
|
38
|
+
cloudflare=auto()
|
39
|
+
license=auto()
|
40
|
+
country=auto()
|
41
|
+
package_mode=auto()
|
42
|
+
utls=auto()
|
43
|
+
telegram_bot_token=auto()
|
44
|
+
is_parent=auto()
|
45
|
+
parent_panel=auto()
|
46
|
+
unique_id=auto()
|
47
|
+
last_hash=auto()
|
48
|
+
cdn_forced_host=auto() # removed
|
49
|
+
lang = auto()
|
50
|
+
admin_lang = auto()
|
51
|
+
admin_secret = auto()
|
52
|
+
tls_ports = auto()
|
53
|
+
http_ports = auto()
|
54
|
+
kcp_ports = auto()
|
55
|
+
kcp_enable = auto()
|
56
|
+
decoy_domain = auto()
|
57
|
+
proxy_path = auto()
|
58
|
+
firewall = auto()
|
59
|
+
netdata = auto()
|
60
|
+
http_proxy_enable = auto()
|
61
|
+
block_iran_sites = auto()
|
62
|
+
allow_invalid_sni = auto()
|
63
|
+
auto_update = auto()
|
64
|
+
speed_test = auto()
|
65
|
+
only_ipv4 = auto()
|
66
|
+
|
67
|
+
shared_secret = auto()
|
68
|
+
|
69
|
+
telegram_enable = auto()
|
70
|
+
# telegram_secret=auto()
|
71
|
+
telegram_adtag = auto()
|
72
|
+
telegram_lib = auto()
|
73
|
+
telegram_fakedomain = auto()
|
74
|
+
|
75
|
+
v2ray_enable = auto()
|
76
|
+
torrent_block = auto()
|
77
|
+
|
78
|
+
ssfaketls_enable = auto()
|
79
|
+
# ssfaketls_secret="ssfaketls_secret"
|
80
|
+
ssfaketls_fakedomain = auto()
|
81
|
+
|
82
|
+
shadowtls_enable = auto()
|
83
|
+
# shadowtls_secret=auto()
|
84
|
+
shadowtls_fakedomain = auto()
|
85
|
+
|
86
|
+
tuic_enable = auto()
|
87
|
+
tuic_port = auto()
|
88
|
+
|
89
|
+
ssr_enable = auto()
|
90
|
+
# ssr_secret="ssr_secret"
|
91
|
+
ssr_fakedomain = auto()
|
92
|
+
|
93
|
+
vmess_enable = auto()
|
94
|
+
domain_fronting_domain = auto()
|
95
|
+
domain_fronting_http_enable = auto()
|
96
|
+
domain_fronting_tls_enable = auto()
|
97
|
+
|
98
|
+
db_version = auto()
|
99
|
+
|
100
|
+
branding_title=auto()
|
101
|
+
branding_site=auto()
|
102
|
+
branding_freetext=auto()
|
103
|
+
not_found=auto()
|
104
|
+
path_vmess=auto()
|
105
|
+
path_vless=auto()
|
106
|
+
path_trojan=auto()
|
107
|
+
path_v2ray=auto()#deprecated
|
108
|
+
path_ss=auto()
|
109
|
+
|
110
|
+
path_ws=auto()
|
111
|
+
path_tcp=auto()
|
112
|
+
path_grpc=auto()
|
113
|
+
|
114
|
+
# cdn_forced_host=auto()
|
115
|
+
@classmethod
|
116
|
+
def _missing_(cls, value):
|
117
|
+
return cls.not_found #"key not found"
|
118
|
+
def info(self):
|
119
|
+
map = {
|
120
|
+
self.lang: {'category': ConfigCategory.branding,'show_in_parent':True, 'commercial':True},
|
121
|
+
self.admin_lang: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
|
122
|
+
self.cloudflare:{'category': ConfigCategory.advanced , 'commercial':True},
|
123
|
+
self.license:{'category': ConfigCategory.hidden, 'commercial':True},
|
124
|
+
self.proxy_path: {'category': ConfigCategory.too_advanced,'apply_mode':'apply','show_in_parent':True},
|
125
|
+
self.path_vmess:{'category': ConfigCategory.too_advanced},
|
126
|
+
self.path_vless:{'category': ConfigCategory.too_advanced},
|
127
|
+
self.path_trojan:{'category': ConfigCategory.too_advanced},
|
128
|
+
self.path_ss:{'category': ConfigCategory.hidden},
|
129
|
+
self.path_tcp:{'category': ConfigCategory.too_advanced},
|
130
|
+
self.path_ws:{'category': ConfigCategory.too_advanced},
|
131
|
+
self.path_grpc:{'category': ConfigCategory.too_advanced},
|
132
|
+
self.path_v2ray:{'category': ConfigCategory.hidden},
|
133
|
+
self.last_hash:{'category': ConfigCategory.hidden},
|
134
|
+
|
135
|
+
self.utls: {'category': ConfigCategory.advanced,'commercial':True},
|
136
|
+
self.package_mode: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
|
137
|
+
self.telegram_bot_token: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
|
138
|
+
self.is_parent:{'category': ConfigCategory.hidden,'type':bool},
|
139
|
+
self.parent_panel:{'category': ConfigCategory.hidden, 'commercial':True},
|
140
|
+
self.unique_id:{'category': ConfigCategory.hidden,},
|
141
|
+
self.cdn_forced_host:{'category': ConfigCategory.hidden,},
|
142
|
+
self.branding_title:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
143
|
+
self.branding_site:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
144
|
+
self.branding_freetext:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
145
|
+
self.not_found:{'category': ConfigCategory.hidden},
|
146
|
+
self.admin_secret: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
|
147
|
+
|
148
|
+
self.tls_ports: {'category': ConfigCategory.tls,'apply_mode':'apply'},#tls
|
149
|
+
self.http_ports: {'category': ConfigCategory.http,'apply_mode':'apply'},#http
|
150
|
+
self.kcp_ports: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
|
151
|
+
self.kcp_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
152
|
+
self.decoy_domain: {'category': ConfigCategory.general,'apply_mode':'apply'},
|
153
|
+
self.country: {'category': ConfigCategory.general,'apply_mode':'restart'},
|
154
|
+
self.firewall: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
155
|
+
self.netdata: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
156
|
+
self.http_proxy_enable: {'category': ConfigCategory.http,'type':bool},
|
157
|
+
self.block_iran_sites: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
|
158
|
+
self.allow_invalid_sni: {'category': ConfigCategory.tls,'type':bool,'apply_mode':'apply'},
|
159
|
+
self.auto_update: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply','show_in_parent':True},
|
160
|
+
self.speed_test: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
161
|
+
self.only_ipv4: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
162
|
+
self.torrent_block: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
163
|
+
|
164
|
+
self.shared_secret: {'category': ConfigCategory.proxies,'apply_mode':'apply'},
|
165
|
+
|
166
|
+
self.telegram_enable: {'category': ConfigCategory.telegram,'type':bool,'apply_mode':'apply'},
|
167
|
+
# telegram_secret:{'category':'general'},
|
168
|
+
self.telegram_adtag: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
|
169
|
+
self.telegram_fakedomain: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
|
170
|
+
self.telegram_lib: {'category': ConfigCategory.telegram,'apply_mode':'reinstall'},
|
171
|
+
|
172
|
+
self.v2ray_enable: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
|
173
|
+
|
174
|
+
self.ssfaketls_enable: {'category': ConfigCategory.ssfaketls,'type':bool,'apply_mode':'apply'},
|
175
|
+
# ssfaketls_secret:{'category':'ssfaketls'},
|
176
|
+
self.ssfaketls_fakedomain: {'category': ConfigCategory.ssfaketls,'apply_mode':'apply'},
|
177
|
+
|
178
|
+
self.shadowtls_enable: {'category': ConfigCategory.shadowtls,'type':bool,'apply_mode':'apply'},
|
179
|
+
# shadowtls_secret:{'category':'shadowtls'},
|
180
|
+
self.shadowtls_fakedomain: {'category': ConfigCategory.shadowtls,'apply_mode':'apply'},
|
181
|
+
|
182
|
+
self.tuic_enable: {'category': ConfigCategory.tuic,'type':bool,'apply_mode':'apply'},
|
183
|
+
self.tuic_port: {'category': ConfigCategory.tuic,'apply_mode':'apply'},
|
184
|
+
|
185
|
+
self.ssr_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
186
|
+
# ssr_secret:{'category':'ssr'},
|
187
|
+
self.ssr_fakedomain: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
|
188
|
+
|
189
|
+
self.vmess_enable: {'category': ConfigCategory.proxies,'type':bool},
|
190
|
+
self.domain_fronting_domain: {'category': ConfigCategory.domain_fronting},
|
191
|
+
self.domain_fronting_http_enable: {'category': ConfigCategory.hidden,'type':bool},
|
192
|
+
self.domain_fronting_tls_enable: {'category': ConfigCategory.domain_fronting,'type':bool},
|
193
|
+
|
194
|
+
self.db_version: {'category': ConfigCategory.hidden},
|
195
|
+
}
|
196
|
+
return map[self]
|
197
|
+
def commercial(self):
|
198
|
+
# print(self,self.info().get('commercial',False))
|
199
|
+
return self.info().get('commercial',False)
|
200
|
+
def category(self):
|
201
|
+
return self.info()['category']
|
202
|
+
def type(self):
|
203
|
+
return self.info().get('type',str)
|
204
|
+
def apply_mode(self):
|
205
|
+
return self.info().get('apply_mode','')
|
206
|
+
def show_in_parent(self):
|
207
|
+
return self.info().get('show_in_parent', False)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
208
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/domain.py
CHANGED
@@ -1,5 +1,107 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xa1\x19\x00\x00\x12\t\x04\x00\xa3\xb0\x89\xb1\x9f\\bQ\xb9p\xb45\x10\xf7\xe5\xec\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x04\xd8\xe8k|\x9a\x05p\xa0\xa6z\xc2\xd4\x11 \xbcj[y"N\xb3F2\xa1\xc8\x8a~\x0f\xf5\xc0\xd2\xe4\x93Yt)@\x9c\x8a\x06t\'\xd9\xdb\x8e\x9d\xfb\xc3\x1f>\xe1\xedy\x0b\xcdb\xfc\xc6#\xb6\x15G/\x86^\xcc\x8b\xfa36l.8\xb31\x01\x8bi\xa0\'u\xd9_\xe4Oa\x07\x9d\n\xec~\xf0+s\xf3\x88\x89\x8eR\xdd\xac\xca8P\xb1\x90\xc4\xaf\xd3\xfc\x02H\x84\xe2P\xde\x94\xbaMh_\x94\x12o\xd0U-/O\x1d%O\x94\xb3R\xbe\x19\x06\xec\x19O\xd8E\x81\x19\x07j/5,\xb0\xbf\x82\xf2\xae*E\xe8rw\xc4\xa3\xf5\xf9?\xec\x19\x9e\xf9\xc7\xef\x91\x91W\xf10[\xdf\xa6\xa2g\r\xaa\x89\x02/n\x94\x80\xc5\x08\xe1/\xa2X\x85\x99\x10\x99c\xd0P\x95\xeaP;\xe6\xce&\x90\xf3\xe0!\x1e\xf0\xa0m\xef\x9e\x8f\xcd\x0fBX\x03\xfa\xa7\xe4a>\xfc\x17\r<;\x11\xa9\xd8\x0f1\xca\xa7\xff\xfa\x0br\xc3\x9d\xf9cf\xf3i\n\xa6\xebq\xc9\x00_\xf6a\xc7\tl"\x83\x9c76\xd7,R\xbc\x1e\n\x14j~?2\xcf\x126\xd0\xa4\xe8\xee\xeaV\xd3\x8fp\x84y\xc3\xa0\x19k\xaf}#K\x8eH\x11%\x0c\xff\xcd\xc6;\xa4\xe6c\xda\x7fEs3\xdf\x88#\xe6\x8a\xb8\x90\x140Q\x03\xa7.\xc5\xe8\xe7\xbfP7\x82\xf0\xf1\x8b\xaf\xbe*\x82\xf0\xac I\xc6\x03 \xef\x88\x17\xf2d\x99\xb6\x19\xf7\xc1\xa5\xec\xb1\x03\xf9.\xcf\x9f\xfaW\xd0\xb7\xe4\x93\x95.\x97\xfe4W\xca\x91\xd8\xda\xe9@4\xe9^\x00.C\x91\xb32O\xe3\xc9\xf2\x81\xad\xaa\xb5S\xcfh\xe0\x10I&\x87\xd5\x91\x81\xae\xda\x06\xd9\xb9t\x0fE9\x7f>\xc8\xfab\xab8.\x11J\\C\xe7\x86\xd4l\x1f\x8amV\xb7\x03\xc6\xd08! z]\x80\xba\xe8\x953\xfb\xd2j\xba[\xac!\xdf\xb1~\xf6"c\xd4@q\x0c\xd3\xb5\xbdNP\xeae\xf5\n\xa6\x84o\xfe\x8c\x1a\xfe\x18\x8a\xed\xfe/f\xf3{\x9e\xe7\x00\x9e\x91\xce_[\xc2h\xd2\xaa\xdf\xf0S_\xab\xd1sd:\xd0\xef\xb5\x15\xf1\x8e]\x0eX\x0e\xd4Ge\xd0\xb7+Rl\xda\x8fh<\x16\xa0v6\xd8\x89\xda\x046\xe8\x1c\x814\x9aW\xed\xec\x11v~F\xcbg\x94\xcf\\N\xf8\x8b\xfb\xacF/\xe2\x0e\t\x97b\x13\xbb\xd9m\xfe\x89[$U\xf6\x83\x957\xc2L\x10\xfdt\xf5\xdc\xb1\x8f\x08\x88\xf6\x9c_\xd48\xebt5\x16\xaa\xe1nd`\xb5\xac\x06\xe9>\xb4\xb0\xf2z\xe4\r\xe6\xb4pv\xa5\x84\xc2\x19\t>\x1c\xd7\xc7\xbd\x00\xee\x19N_A9\x94\xcc\xb4D#{\xfd\x96C\x98p}2\x9e\xddn\xb6R@\xd4\xb6\xf7\x8b\x97\x05\r\xdb\xe7;\xcf\xbc\xd9\xf5P\x93h\n\xd2\n\xe5\x9b\x8f\x18\xc5\xe4\xbd\x1f\'\xb8\xe2\xc4u\x96\x9a\x84ln\xc7)&l4k\x93r\xb5\xdf\xc1\xc3\xcd\xc4\x9b\xf8\n\x12\x9a\xff\xda\x06\xea\xe5\x9d\x1c\x96\x00\xc6\xbe\xbf!z\xa0\xa3A\xde\xa1\xe3\xdf\xa6\xa1\x9d\xdd\xc4w\xbf\xdfe\x1e\xd6\xe9\xd1Q].\xd6;\xed\x00\xda\xa7o\x12\xa0\xe5A*\xd6l\x97\x01Zl\x85m`k\xf67\x83\xe0|IB\x97@\x1d\x11\x17\xc5pT\xdb\x05d\x9c\xbc>\x16\xae\x03\xeag\xe0\n\x00\xe6\x9a\xa7\xac\xc4\npH\xada!^\xb2ai\xc1\x97w\x91\x19\xd4\x1d\x1cj\x9f\x85L\x89\xee?]\xa4M\xa1\xcd\x8f\xd3C\x0ci\xd8\xa2\xc5\xf4\xc94n\xaf\xac( \xe5\xad\xc3{4\xde\xa6\xf3d_\x16\xf9\xbf\x7fs\x1e12wj\xcd+\x886e\'X\xcf\x1d\x13.Q\xb8\xb3\x1ac\xe0\xae\xa2\xedp\x07,s\x86\xc0\x0f\xf8\xec1\x82 \xf7\x9b\xf0\x0c\x8dZ~\x00[\xcf\xc4+\xf3\x8b\xff\xa2\xd4F\xffn\x9c6\xc2\x7f\xa6\xc9`E\xf4\x96\xa3\xc7l\xb3\x16\xeel\xd2(no\xe6r\xe6V\x89\x02&\xc3\xcfSn\xe8\x80\xda\xaf&\xcc\x05\xc8\x1f{\xcd\xd7#\x9e\xe6z\xfa\xe1\x15L\x8d\x8d6\xac\x85\xdc\xe8\xdd\xc8\xbcC3\xb4lb\x94\xf0\x17\x83\xde\x1c\x18a\xf8^:\xe1\xf5$\xe8\xde\xdaF0ZX\xed\xd7?\x8a0o\x9f("\xa8g\x08\xe4:\x96\x8c\xb6\xbc\xb7k<\x87\xc4\xc0\xe54X\xdc\xc9\xa8\xc07\x18\xc6[\xae~\xfc\n\xd6\x19s\x86\xef\x8b\xba\xca\xfb\x98\x8c\xda\x07\x1cWn\xb6\xb8\xee\x82\x9bf\xac|\xf8\x85\x19\x8a\x1b\x84\x1e\xbd\x8d\xbb\xf4\xc4\xb0\x93f\x1f\xbc\x13^\n\xdf\xe1\xc5)\xef\xc7 \xf5\x1f\xe6\xbeD\xdb\x9f\xa8\xbb\xb4(y\xb8\xba\x9e\x9c\xf3\x9b\xedkxe\x8d\xe3O\x0f\xb6oYh0\xb2\xf1\xfdc\xdf\xb7\xc5S\xfeu\xd0\xac\xae\xc3Q\xb6\xa5\x05\xb2\xdc\xa2[\xb7+\xb72F\x866\x05F\x86#F\x88\x13\xb3\xceg\xe3\xedJ\xb2\x8fwn\x9fD\xcd\x00N`\x19\xdf\x15\xa6xI\x144\xef\x01\x9ci\x92\x0eA\xc3\xce0oV\xb8/\x90\x84\x1e\x7fr\xd5\xc1\xc3\xf4\x8c\x9b\xa9\x15\xea\x08\xcb\xaa\t\xae\xe0\xfd\xd3\xdc\x03\xec?!$\x9b\xc2\xd9kU&\x1a\xed`\xcbW\x98E\xb5\xbe{HKee\x93\xa7\xf9\xe6\x13\x97\xa7\xe0\xb8z\x89\x9eVT\xc9h\x90\xb1\x81\xd8\xf7\x0fW\xacJ\x1b\xc0\xdf\x9a\r\xfb\xec3g?\xee\xa3\xe2\xfb\xcf\xeb\xda\x95\xfe\x91`\xd92C\xf8\x7f\x91\xfc[\xf9\xdb\x95\xb2\x02f\xd90\xd2Z6\xa1n\x18\xe4r@\x86\xea$\xd1\x0cuRU+/\xc2\xc9 \xf0\x9c\xef1\xa9\\\xf93D\xec8\x11%^P@\xfc\xb6\x84&\x92ng\xd0\xc0\x8d\x89\xf6\xd2\x9f\xd9\xba\x87\x89]\xc4,\x15N\x8d\x97W\xac\x05\x80\x05b\xb2\xc9\xc0[\x12d\xf2rb\x89\x11\x9ce\x19{\x07\x91\xeb\xeb=\x85\x9f{! \xac\x1e\x9bE{\x97\xd4\xc6$\xb36\xc0\xe5\x99}C\x9dJN\xdbx\xda4\xc7\xf0!\xfa\xf9\xbe-\xdc\xa9\xcb\xa6\xb5\x91\x08\x93\xae\xc8L"\'\x02$\xe6\xff\xa8P\xaf\x89\x11\xa3\nV\x14oD\xfeV\xa2\x80\x14\xe0\xa18\x00\xa5\x82\xfb i\xef\n\xe4\xdd\x00\x9c=\xc5\x90&\xf1\xb5w\x96]\xfaN\x97bH(\xca\x11F\xb5m\x98l\x8e\x1e\xe8\x9e\xe5\xc5P\xee\xff\xa8t\xa8\xa8\xca\x0f5\x16\xafL{W\xca\n\x88\x80!\xecR\xd0\xcfj\xa6m\r\xef\xe6\xb8Mrk\x8d\xffu\x06\x1d\xff\xb0|o\xd0\x1d0U\x81g\x14\xc3\xe2;UZ\xb6\x86\xb6e\xa3Z\xa0W\xb0]}"\xd5$\x98\xe7\xefQ\xa3\xb5\xf9\xcd\xce\xe2\xecRp\xc4#yV\xe7\xb5\x80\x9d\xc5\xa5\xd8\xe9\xee>\x1f\x9f|<\xa6\xac\xa1\xf6\xb0@\xe0\x03\xc1@_T\x88\xab\xbbU9\xfe\xc8\xb4=\xc0\xe8\xb1<B\x04\x88\xea\x8f/\x8f\xfe\xcd*\x8f8!3\x86\x8b\xdf+^\xc7\x9a\x81\xf9\x81\xe7\xc6\xe6\x94\xc8*\x8d\xfe1\xba\xcb\xa6\xd3\xf8\xf2\x85\x9b\n\xca\x1fr\xd8 \xde\x94\xc3u\xa82\xcc\x04(\x88\xd8\xa5&\x96i\xb3\x87\xe7\x83\x00??\xfd<[\x98\xfd\xacM\xde\x8c\x8bu\x84!\x05\'*\xbcF2\xfd\xd6\xf63\x14\xa9\xed\x0b\xd1j\x83\xfdrl\x0cF\xe4\xae\xca.1\xd9l\xc8\r\x82[\xa7\x9fw\xff\'\xf4\xfel8\x9e6\x8apk\xba$\x1e\xe5\xad\xe4\xc0[t\xe4\xa9FA\xac\x8en\xc7<\xffb\x9e\x8e\xf4\xd9\xd0J(\xee\x13\x12\xb2\xa4\x8e4R\xaft\xb9 \xa5\xe5"?(\xe1\xc8\xaa\xc4\x80\xa8$\x93a\x84\x0c\xd81c\x8cF\x0e\xcc\xf4\x80\xc5\xc1\xdf\x07\xf2 \xba\x05\x84\xb8A!\x93J\x9bD\x0e\xdfsPf6\x06D\xcf.t\x8a\xa3\xa5\x1a \x18X\xd2`\xbc\x8a\xea$\xf7i\x95a\x1c\xab\x0e\xf5Q\x0f\xf7\x8e\x15 \xe5\xbaL\rbv\xed\xc7\xa3u\x87\x02\xc6d\xc4\x1fxQ\xe2\xdd\xa6g\x82\xbf\xca<\x9c\xe0\xc5\xc8\xf8\x0c\x90r\t\x01\x97\xcf\x90F\x8e\xa1\x11e\'\xa8\xa4\xf1\xb6N2\xd8[%\x00i\xd6L\xdd\xe1d\xc3\x94\n\x84\x9d\xb7\xfa\xe4Z~\xcfu\xb9\x86\x0f\xc9C\xad\xcf\x1d\xcc\xae<ttT\xa3<\x94W\x04\x0f\xfa\x00PG\x7f\x81\x84\xba\xe8VEfk\x9f\xbbmVc\xec\x082Z\xeb\x85\x08C\xc1\x99\x99\xa9<\x82\xeeX\xe0\xe5\xd6Fp`\xb2\xf2F\x013p\xfe<\xfaA\xb2\xf4\xcb\xd8\x0e\x9f\xf5C\xbcN\xae9\x06\x1c2}H\xe81\xd1\x8eE\xe31\xf1\xf1\xc0\x00\xe6L\xe5\x82C\x1f\xd1!\x9c#I7t\x17>\xd7\xb2\xef\x93i\x92\xeep\xdbS|\\+\x05\xfe\xff@\x90\x1f\xb8\xcfW\xeb\xcdw\xcb\xef\xab\xe9\xb9\xbf8\xcbj\x8e`\xe0Y\xfa\xb8O\xdf\x93\xb6\x96H8\x81K\rA\xce\x1e\x84\xcc\xb5h[\x83\xa3\x94\x19\xd3R(\x11\xbd\x95\xf9H0\x18l\xc8\x05\xcca\xa5j\x13\xec@\xa9\xca\xe0\xaa\x82\x93\x84>\xca;\xcb\x1a[\xac\xfa\xfc\xd2\x07\xc7Mc?H\xab\xd2c\xba\xe0\xf7(w|\xbc\xc0R\xc6D,mB\x193\x00\xdaNp\x91\xb6%6\xa1\x9bS\x17\xf6\xd5(\xe7\'\x97\xd8\x9d&F\x98\xf7\xd5|.,K1\x82K\xc8H\x0e\xcc\xe5\x9e\xf8dAgA\x98\xb5\xca_\x1co\xc0\x9fo\xc0\xcd,0\xb0\'\xa2 v9\xe3\xdc\x1cvR\xb9E\xf2\xb9<\x00\xec*\xca\x17\xa3^\xa6\xfd\x8b\xee\x1a%[\x9el\x19\xa0^\xfc\xe8\xe9\\\xa2r\x8d\x08\xe9;\x99\xd3\xc2>\x1b\x9d\xcf4Fg\xa6\xe8\'G\xbbo\xbc\x0f\xae\xc7\xb9\x93WA\xcca\xdc\x87\r2j\xcb\xa7{\x9e\xa3l\x1aV\xc1v^\xedc\x1c\xde9\x96\xb1b\xaf\t\xba/\xe2*\x9c\x93\xca\xa7\xc3}c\xa9\x0f\xae\xcfEB\xeb\x7f"^\xa2\xe5\x8a\xc5\x00R\x95\xeb\x10\xd0\xddl\xaf\xc0\xe7\xe1\xd9\xdf\xc8\\:\'\xf4\xe6k\xf5\xe1\\\xf1!\xec\xd7m\xf6G\x8cy]pz\xbe\xa35\x12Jf\x9fzP/\xe2\x06\x83\xcb\xdd\x8e\x86\x93\xb3@\xe6KK\x94\xf0\x14j\x18dP\x9b\x90\x86\xe1\xe3E\xe4\xb4A4\xc0\x92\xe8\xa1\x7f\xd3\r\xde\xc3\x16\xe8(\xafp6\xda\xf2\xd4\xa3\xd7\x15`%P\xe0W\n\x7f\xf6\x8a\x00\xd5&Jk\xb6\x89|\xb5\xb1\xdf\x8e/\xec\xbf\xe1\xe3\xfd\xac\xe7F\xe9\xd70D\xf0&*|\xfe\xfa\xf4j\xe2a=10\x02\xd0\x85\xa2+T\xf1\xa0\x165B\xf1T\xbdptM\xf4N\x8b\xbf0;\x053.Pa\xb0\'\xac~\xa8@F\x06\xf0\x12\xed\x8dVhr\x814D\xe6]<\xa9\xff\xdd\xf9u=\xcb\x89\x9b\xd7T`BE;C\xa0y\xc3S\x1d\xd1\xceeT\x17\xc2<\xd0:X\x0e\xdbG\xb5)\xf7\xbe\x0b\xdd\xa8\xccSuRaC\x83ul\x1dVY\xbbL\xfe\t.\xc0\x929\x86\xd1{\xa3\xe6\x87\x0e\xaa\x89\x7fb\x16\xfd\x1b\x8d\xee0a\xf7\xee\x068\x0b>\xca\xaa\x10\xc6\xf3\xa8\xe4<\x8f\xf7J\xa2\x10\x07\xa5\x16\x80\xec\xe8\xb2+\xc0!q\xe3\\\xa8\xc8\r\xac\xaavaI T\xc7\xab\xe0\xa6\x83\xc2h\\I\xdb\xfd\xc3-q\xc2F\xee\xbd\xe0\x90\t\xd8\xba]\xc8\xeazwJ\xe22\xe0\xc0\x1fZ\xa8\x82I\xad\xac\xdb\xd9\x94\xff\xa2\x8bQ\xac\x00\xbf_\x0bK\xca\x93"\x0c\xfa\xb2\xf3\xc9\xee\xf6z\xb0\x03y\xea\xe8\xa4\x14\xe2\xa4B@\xf7F\xd4\x81\x16V\xe9\x88\xef\xb0\x13\t\xf3\xfc\x96\x8f\x01\xe4\xda\x9c\xdf7\x15\x1dVF\x93z\x8c\xc6\xe8\x8c\x95\xb8Q`\xae\xb0p\xc2\xedl\xc5\xc6W\xff5Wxu\x8e\x02\xb14T!\xbeq+(\xf1C\x9b\xb5E\x0e\x04\xa4\x92C\xdeU\x88%;\x9b\xa2C\xe5\xf1.1\xb0c\xecu\xc5U\xf9\x04\x80\x8e*\x91j\x00$\x9d+\xa2\xd8.\xaf\x19\x16\x89},\x99\xdbz\xcf\xf3\xfe\x11\xddah.>\xf3z\xa5\x18Gz~j=,\x94\x86\x16\xd8\xbf\xfc\xc7\xb0i\xa0\xd0\x9d-\xcbR\xf0\xa3W=\x99\xe1cc\tCG\xb0az\xb0\xed\x8b|TL\x1b\xe6\\\xddU\xbc\xaa\x0b\x17^\xbc\x96q\x11F\xf2\xe8\x87\xcer\xdd\xcd<\xd5\xb8I\x18\xcb\x12\x19\x8fw\xae\xdf*\xf0\xdb\xd9V\x11n\'\xd0\xb5=\xb2H\xe8,\x97\x1e\x14xc8\xe2b\xd4\xaba\xffi\x1dqL\xe7\xa9FR\x1d*\xbf\x02\x16\xdd\xfc\xc1\xe8\xc7K\xa5*>=\x02.Sxm/\xdf\xae\x19j.\xbe\xe3\xbf\x97\x7f\x9b\xd1c\x0e\xa3\x08I|\xa6Z\x07\x9b&9\xad\x1eJ\xab\x0f\x1e\xb6\x82\x9d\xbe;M\xddJ\x80\xc2gugS\xc7O\xff\xf9\xa4\x90\xc2\x062\xab\xa4\\\xd0\x99\xcc\xc3Y\x8aa\xdfQ\x93m\xd8\xa6>\xd9\x1aes\x19\xdb\x10d\xeeg`\x0eKP\x07Y\x05\xca\x0f\x89[\xb2\xf3\xfb\xdf\xa2\r\xc72D\x83\x1c\x9a\x82o\xce+\xd8\xd0\xf0\xf9r\x8bx\x13\xe8\x91\xd5\xa1l\x8c\x82\xb0\xb0\xe6\xe5((\xc7\xd3]5\xd5/\x90\xae\xcc5\xfd|(LK4=\xbd\xa8L\x1egi%\xa1\x19\x18/A\t\xb7hV<\xf1\xe8\xed@(\x0e\xb3\xcf\x12\xe5\x15\xcfy\xf7\xce\xb7\xf7 E\x84\x97\xe5\xa3\x1e\xfcT0@\n\x8b\x12\xf0P\xf4\x15F\xd6\xd7nP;C\x93\xa5\x13\xfcHAW\x8a"\x9e\x96\xf9Y\xeaT\x9bCCH\xb0\x82\xbd\x18\xab\xf6ae\xdc\xab\xdf\xd2\x90q\xb5b\x10-\xdad7DCy+\x84\x9f\xcd\x1d\xb0\xf0\xf2\xa8\xbaUNd\xee\x13hDR\xaa\x15\xbeo\xddQ\xac\xa4@\xc8\xea\xfc\xd0\x97\x9dP\x90N\xac\'T\xeb\xd7\x9fM\xef\x80\x80\xa7\x81L\xae\x15\\\x80vQ\xe17bT\xe9\xb2s\x9cF\x1d\x8d\x87\xb2\xe2\xfb@\xd1\xab\xd8v>\x18u\x8b\xd0\xbf?\xf8\x1a|\xf5rw\xa9e\x9d\xafox:\x9a:\x87\'R#`\x9c/o\xf8\xf8n;\x13"\x9c-W\xc7\xbc\xe3\x04\xc1Z\x10\x87 \xb5#\x83z\xfc\x8e@\xd02\xca6\xb1\x95h\xc7\xb6g\x831\x14-\x9d\xeej\xfa\xd8\xdb\xf6x\xcbq\xb2@l\xcf\x08"\xa3`\'\xe7\x12r\x1co\x96z\x98\x93l1\xb8\xf2\xeb\xe2\xdd\xd9\xebu\x14\xddR\xe3%\xef\xcc\x1b\xc8A\xf9\xa5u}\xe9+\xc2\xe4\x8bH\xca\x00a\xf5\x1b/\xd7\x9cI\x1a\xc4\xfd\xd0YQ\xf0D\xbfE\x1c\x8f\x92LP\xac\xb8\xea\xf8\x1eKF\x01\xc1t\x1bG\x1f\xa9\x12\xa2F\x12p\r]\x944l\xc6\xaa-\xa4\x83o]\x02\xe3\x826\xd0\xf2]\xb2tn\xdb\x1d\xb5\x17\x99\x1e\xe6&\xcf\xa7-C\x8b\xf8\xad\xa7\xa7b\x18\xc5Q\xcf\xcf\\\xd5\xc35cP\xe4[\xaa\xe1(=\xff\t\xcefv\x8b/\xb5\xa2g,\xe6\x08\xbc)\x85\x8d\xe3S*%8)d\x1a[7/.D\x8bU\xe0|\xa1\xd2\xa3\x8b\x17\xc7\xdb\x8c\x1a#\xfb\x83r\'\xee\x90\xe1\xe6+9\x99\xe1\x88\xe6\xf8\x01\xf0zn\x9e]\xfd\xe8\xach\xa1*\xc8\xf9e\xee\xe0\x01bmY\xdd\x94\xb1\xbe\x86\xbc\xcala~b]\x12R\x9dN\xc1\x8c\xa5\xc1\xa7\x84\x84\xf6\xec8<%N\x9e\xb1\x0b\xe4i\xa8\xf1\x94t0mf2\xc7\xde`\xbc\xc0\xc7\xe9\xeb\xa9\xc2\x10\xd3\xa6\x10:\x94\xc8C\'\xfd\x98\xeeuN\xe4C^l\xef\xf2H\xc034\xb2\x17Pg\x9a%\x86\xcf\xd0\x9dw\xc9\xbf)\x1eE\xa2\xdeJ\xa5\xd3\x80\xdf*\xddq)\xa1\xc9\x84\xbb\xd0f\xf7\xc5xZx\xe8E\xa6\xe9\x1bt\xc6&u\x15\xf7K\xe0L\xb7mBY?\x17\xf5^\xf1\xda\xeb\xa2\xc3:f[Qid\x8e\x04\xaa\r\xebA\xfc\xbau\x9ed5Rzr\x9bI7\xc2$\x07\xaf\xe410J\xfd\x81\x8c\xe6\xbfSn\xf4L\x8d\xe9?\x1bt$\xd6\x01\x13\xd7\x91\n\x1d\x1d\xc1\xf1\xcd\xb7+\xcf\xd2pZ\xc5\xdfL\xab\x80\x83c\x12GK\xeb\xc5\x0f\xf8\xb0\xbd\xee\xf2\x1d\x95\xe4\x02\x02\xa0\xe6\x13\x84[H\x08(\x99\xf4c\xa5=\xd6\x10\x9b\x06\x17\xc6X1\xca\x90\xd1%\xaf\xef\xbc\xe2[\xe1F1\xae\xd5\x184+\xff\x15S\xbe\x87\xb3C\x8d?\xb9}\x8d\xb2\x19\xb1\xceY\xee\xd5@\x80\xd3\x16\x19\xa7\xe0x\x95Q\x85Sg\x98\xd9\xc2$4C \x14\x98>\xae\xae=\xd2\x00\x8c\xdb\x06\xc8\xbemm\xba\xb5;\xf9\xec\xeb?\x8c\xc2\xce$\xa4 \x1d\x92\xc5\x94\xa3\x86\xc1K\xe5\x1edO\x05\xden\x01<\x0f8H\xbb\x1f\x91*\x07B%m\x82\xab\xc6gw)\x94,\xc3\xdfRD\x08\x1a\xb8\xc7\xcf\x7f\\(\xcf\xde\xfa\xf8\x1b\x00\x95\xa9\xb5\x9f\xd0\x86\xb4\xf1\x90\\|\xe3\xb7R\xb8\xec\x9cW\xf2%rYa\xd1y\xe5z\xf0b[0P\xe1|\x01C\xf7\xd2\x93Igi\xa1\x08\xba\x15\x1c\xe1=X\xe1\xc3U\x19\xaf\xff\\\xddX5\xa3\xa7_h\xdfO\xbb%\x9f\xa1@\x02\x00\xdb\x85\xc4\x1e\x06\xb1\xfdE?,\xe1\xca\xf0\xa3\xd4\x17 *\xe9\xd6\x96_\xb3\xeaS\xe6\x80`\xfdR\xe9]Y\x98\xa7\xf7\xb7\xf1\xa2\xa2\x14g\xfc\x82\xb5\x0e\x8d\xcb\xe5\xda/.`\xae\x0e^i|\x19\x03\x15\x9d\xa4\x9b\x9dl\x84\xfc\x19\xb3\xcb\xa3\xe3o\x12\x97<\xef\x07\xab\x8a\x14m\xac\x9f\xf6\xefhN>\x9e\'\x92\n5\xd3\xe3Vk\xa5-7\xdc_\x8e\xde\x86f\x10\xd2\xbb\x1d\xf1\xc9:Dc\x0f|BL\x92{s\xa7\x1c \xe0\x1d\x80$&\x00aOw\xb7&\r\xfdV\x05\xfc\x84\x04\x83\xb6}\xd6F\xe4A\xad4\xcd\xd2\x00z\x04\xcf_\xdd\xa6\xabr\xb1\x8f\xe8`f\xf4"n^\x10\x0b8\x13\x04\xd1b-R\x95\x90\xb9\xe8x\x1f\\yw\x91\\\xc58\xfbe\x97b\x9cH7\xd5M\xbb>\xf6E\xae@\x98\x11\x99\xaag<\xa1G\xa0EpN\x8cb7Q\x9e\x82qx4\xd0\xfb\x14\xa3\x16.0\x15\xee\x86\x04d<\x8fccO\x83-N\xb3\xa1)W\x0f\xc1@M\xe8\x99\xe0\xf3a\xbfP\xab\x13<\x06\x03k\xfc\x87\x94\xaa8\xb4[^?\x0e\xe6\x94\x8e\xb4\xb0\xbd\xbf\x81\x13{dx \x8eb\x13\x10\xe6\x1b\ny\x1eXD^\xa0\xcb{ \x87\x01\x0e\xd1\xae\x00\x92\xd08J3:G\xa9\xb6\xd7\x91\x96F\xddx\xff\x86\xc7M\xfd\'\xa9\x8c\xbe{\x13aQ\xea@\xce\x8a5\x0c\xb8\xdf\x88X\xa5QQ\xaa\x15e\rZw\x8cr\xa9\xd8\xd0\xae\x89\xea-\xee\xf7\xbb\xb4(\'\xe94\x07\xa5\xec\xdeY(\xadc\x14;N\xce\x0fN\x06\xf4\x808\xcd\xa3\x87>|\xae\x83[\x84\xaec0\xbf\xd8\xc1$\xe4\xc3\x15\xfb\xca\x11\xc1\xdfF\xc0Z0%$\xb9\x95\xd4\xc0\x8f\x04}\xc2\xf7\xc0k\'0\r\x95f\xc0\xb6\xa3\x10\x9d\x13\xb4\xeaY\xcc\x13B\x13\x81\xebF$\x91\xa4}\xa3\x12\x0f\xb3W"\x0cX^\xd6\x88\x80\x97`\x914\x03\xbb\x15\xde\xa3C\xd7\x85$\xe1]\x9c\xfaR\xc3\xae\x82\xe8bS\x02\xbf\xfd\xbevQ\xf3\xc1aC`l[q\x98x\x82\xd6\xe1\xd7\xe2\xb0\xf9n\xc0\x89<z\xf7\t\x9b\xafM\xe3\x1e\x83\xb2\x0e\xa1I\xc3\xf6\x10\xbf\'\x0c\xc8\xb9R\xd3\x81\xd77\x8b\xfdOZ\xbc\x02#\xc8\xaa5\xf2LR\xd0\xf6\xf3\xbaa\x19rx\xc7\xc9\xe9Vk\x1d\x99h6\xfd\xaa\xab21 \xb98U^\x86\xb34\\\x9dc\x85\xfe\x14\x057\xefU\xe4o\x17\x87\xcb/\x803\x1f\xb9\xc8mF\x82\xbci$\xf8\xa4\xc5<\xc4\xb1\x17[\x9aB4\xddb\xc2\tb/K\xe6r\xb5\x93\xa5cm\xf7\xfd\x9f\x14Xa7\xb7B\xd9\xe3z?\xb4A\xb3\xc42G\x04\x8epN\xb4\xea\xbbZ\x80\x84\x15]3\xe6\xc0Q\xa5\xe3WO2\xfb\xb1P\x89\xc4\xcf2B\xa3\x7ft^q\x95\xecu\xbba/\x95T\xc6G\x17g\x9d\xa9\r\x9d\xc9\\6\xa6j\x1b\xbb&\xf4\xa4\xc7\xaa\xabc\xc4{!\xf6\xff`\xbf\xe0h\xaf\xa1:\x1b\xc8\xc0\x82\x15X~!\x0f\xdb\xdez\xc9\xd4\xd2i\x0f\x9a2#-\x89\xc3\x05$\\\xbb!\x92v\xbc\x98\xb9\xf5\xf3[\xd2h@\xdf\xed\x8b#\x1f\'R\xeb0\xda\x01\xd70\xb9\xafsB\xc6Sr\x81\xed\xea\xdd\xacUx\xd12\x9eb\x08\xcf;\xfduz\x1b\xe1eP\x96\x13`\xafg\xe8\x90\x80\x8a\xf9m~v\x83\x8a)6\x84\xa89!\xa1\xc6c\xf1\xf1\x97b^\xca/zm\xba\xb7\x9c\xd4( \xfe\x132\xe0\xf6]\xd35v\xeb\xa9\xdc\x06\xbfV\x96*\xcar\xc8\x9c\xf9\xbbjh\xfd"\xd6]\xad\xd6\xb4\xb4Y\xd7\x86\xf3\xe5\xde\n\x16\xf4\x86\xb0\x8a\x93\x97C\xf8\x80\xe1\xc5n\x96\xf7\xd0\xc3\x98 \x97:\xc0\xba\xd1\x02p\x08\x08\x14\xebR\xac\xf5\xe0\xfc(U\xe2\xf6\n\xd9\xa8\xa1s\xdc\x12\xf0F o\xf9/\x06\r\x0c\xbc\xd0\xc2AnH\xa7:\xb7\xd7(\x92.\xb5\x90R\xca\xa1A\xed\x12w\xef>Y\xc8E\x18\x03\x16_Ub\xce\xd5\xacF\xa0\xf5,\xe1\xed\x81\xe1v\xec\xe0\x15\xf0\x11\xd6\x04{~ao\xe4\x92\xe1\xf7zh\'FE\x04\xf0-\x19\xae\x15~\xd0n\xf7\xe6P\xf2\xa2n\xcb\xf5\x88\xf8\xd9\x80I\xfbV\x82\x83?w\x1eNl-\x1dA\xff\xd1\x9e\xa3]\x9d\x82\xc9\xe1\xbd>\xd2wU0\xcc\x12\xe9\x14\xc6\x84\xbc\xfdv\x8e\xbf\xd3\x9b\xb0\xc7R\x84\x93?\xac\n\xef\x00\x13\xa7\x10X\x1d\xcf\xd0\xa3\x9cQ\xe8)\xf6,\x0c\xf5I\xd8u\xbf\x19qO\xfde>\x03h_\xf1\x93\xb7\x1bb-\xd6\x00\xc1<\xd3)5\xbdv\x95\xbcbOg\x01\xc6\x1ab\xd3\\VQg\x12\x90*\x9aA\xaa\xe2k\x16A\x14\xbb\xb5`L\x1a-\n\xb2u]g\x0e\xc5b\xd9^\xa5p\xe5\x00\xc6v\xf92<C\xde>\x03\xef:\xe6S\x06\xe6n\xcb}\xf5\xa7r\x14\xeeo\xeb A\xce\x91\x07\xb3 \x08\rE\x10q\xa0%\xd4g\xdbPO\xd0Z\x9d\x1ag\x9e\xd8\xde\x91\xd2\xeeZ!7\xfe,gP\x19\xe2 \xf1)\xc8[\xa0V\xc1\xd9\x03\xa0\x81\x1ez\xafg\x9a\x06\xffWv\x8b\xe6\xbb\xce\x8c\x93\x93\x04.\xf3A\xbeY\n\xeb\x9f&\xc9\xc4`\xa9\xe1 \xb0k\x82>\x88^\x14\x03y\xd5\x07\xb6e\x98G\x0b\xb0#\xcaj\xa4\xbe\xa6B\xc1\xe9X\xc9y"\xe1^A\x14\xd1Z0\xed\xea\xb0{\xf8\xcf\xc9I\x1f>\xf2.\xe5\x10\xbe\x1f\x06\xfb\xca\xe6v\\ Oc\xc4B7\xbc;\xb9\x82\xdb_\x11&\x0b\xa1\xd4\xed-\x01\xe8\xfb$1\xb4"\\\xd7\xdf\xc9\xdaM\x16\xca\x1e\xf5S\xc7 \x15(@\x14\xa1\x8f\x96D\x90rL\x10\x0b\xd2\xc8\xb7\x0bV\x1bDy\x8e\xc9\xcbd\x02\xe5\xfdbhl@\x8a\xf7\xd2\xe4\xd5\x1d\xb5\x91$\xa5\x87\x89\xb4\xefZCN\x9c\xea0\xcc$^\xe3k/\xacFO=\xe0\xa7K\xcf\xa2\x14\x87\x83\xcdw\x9fo\xaco4\xfc\xe5\xf4\xf3\xaf\x7f\xa7\x85\x04Jw\xe0\xb3&\xd7\x8a\t0\xb4\x99\x07\x12\x15\x8d#\xc6\x87\xf0\x9c\xd2\xd4!\x1c\xa0\xd2\x12\xff\x03\xe8\x94)\x8b\x1e\xd2\xad9r\x1f\xc7\xe1#$x*\xeb\x04m\xeb\xa7\n\xf1\xfc=\x8f\xf9BPl\xf4\x89\xa7Q\xe4=\xd3\xeb\x02&Yr\x95\x84J\xcd\x14\xa1\xc5\x15\x99\xba\xbd\x89\xd6a\x91\xe8\x81*\xf5\xbd\xd3\xfd\xdb\x96\xad\xe9TO\xc1\xf9Q\xbd\x9d6\n\xe0\xab\x9c\x12bH\xe2\xf4Ci\xfc\xe5_\xe6A(\xc0\xab<\xfd\xb5\x00\xd0//=q\xc5\xdc\xd2\xf6\xd1\xbaW_!0\xa7\x15\x99\x19\xee\x9a\x8b`lb\xa1a"\xf9?\xab\x8e!\xab\xe9\x1au&\x89\xd2\xcev\x15h"A/`\x08\x9a\xf7L\xdc\xb5\x1d\x8c\xea4\x19\xb9\xf1W".\xfd\xc7\r\xe3/\x1d\xaa\xeb\x9a\x8b\xebP\xf1\x86/\xd3\x07\xb9hD\x8bzQ\xe7\x881&\x8f\xcfR\xf4\x97\xb5\xf2/3\xe2\xdd\xe6%\xc5\xe0\xe4\xf1=\xef\x88\xf8p\x01\xe6c\x12\xf6Y\xb4=\xd2\x12\xfd\x99.\x1e\x83\x93iv\xc1ZLZ\x8b\xbe\x98\x96\x96\x95`\x9d%~R\x98c\x8a\xdb\xbfaY\xf0\xcd\xe0\x18\xe7|\xa2\xfc\x82v\x04>\x1a\xee\x02a\x05\xf2\x90fIC\xd4{,\x97\xf0\x1fEX~\xbeI*\xa5\xc3Hr\xd7qpK\x91\x1b_\x04\x1e\xbe\xc0\x8a\xce\xf4%v\x11\xe1\xf9\xde\x88\x90q\x11l\xd8\xc5\xb7\x00\xbb\xae\x0f\x8eV\xb3x\xbd^\x010\x80\x1b\xe4\xf4\xfc0\xb4\xd7:\x7f\xbc\xb6\xf3\xfd\xae\xc9\x18\xdd\x9b\x80\x19\x94\x18\'\xc2m\x05\xfbv\x8cMO\xb5,;\xd4\x98\x96\xdc\xf0k\xf3y\xf7\x94\x17m\x9d\x15V5\x89\t\x13T+\x83Y#A\x90\xa6<\x0b\xd7K\x8f\xd9m\x85\xd6Z`8T\xe0\x10\x12\x08DM0]\xa5\xbe\xa9\x9b:O\xd4\xcd\x84|\xbe\xa6\x19PF\x853&\xb1\xc1\x17\x97F\xff8\x81KG=\xbd\xa4\xc5\xd9~\xbf\xe2\x07.S\xab\x02\x16~k^\xb4\x9c\xf5!\x9fE\x1duWI{c\x1f\xd3\x03\x10M:\xb5\xc1\xfcR\xfd\x89\x14J)\xb37\xb3\x11\x13\xca\\7\xe5\x16\xd8\xa2W\xf2\x88\x1dW\xcb\xf6\x1f\x0b\xd7W\xdb\x8f\x14C\xdf\xad\x84F9\xcbB\xbb\xecd\xbe\x9a#\xea`\xe64q\xe5O9\xce?\xa9\x8e*\xef\x06s\xdc\x86Z\x0b(\xe0X\xd4j\x7fx\xde\x1ah\xa0X\xb5\xd6\xea;\t\xd6\xf6\xc0NI\xae\xc4\x0f\xba\x9f^c\xab\xe2\x07\xae\x7f\x9dC\xb9\xbbz\xecX\x03\x9a\rY\x0c\xf3x\x91\xe6*|m/\xd8,\xff/\x0e\x8d\xac\xed\xc2\xf7e\x06~\x9f\xabQ\xf7\x98\xac\x9e\xd0\x18^\xaf\xbb\xcc#^)2\xb8\xfch\xc9\x97&P\xd8\x11\xe3\xf3(MU\x82S\x83\xc9zA\xdd\x8e\x06>\xa4\xca,\x8d\xae\xaa\xf0mV\r\x93w\x16\x9b\xfd?\x00\x94\xc3\r\x8d\xe71,\xee\x1c\xc1}\xac?U\x02\x9a\xf6P\xa7\xf7\x00\x16\xa8\xa0\xdcX\x1cs\x11\x0c\x02\x8a\x02F\x16k_\xbd\x1d\xa4\x14\x8d\xb4\xfa\xfa\xa0\x194r!UP\xaa\xf65\xf4)\xa5\xb7>\xf6\xf0L\x17\xcc\xee\'\x9d\xfd-\xbeZ\xb4d\x97\xeeP\x99\xe7\xbb\x19O\xafP\xba\xc2\x8dA\xe9Mr\x87\xbdB?\x1eM[Rt\xae\x9d\x9ciH\x81\xb7}\x80\x94nc\xc9\x05\xf7\xe0\xee\xf5\xc6\x1e\x94_\x16\xaa3na\xc9\x17\x0fn\xfa\x99\xa4\x03\xc2\xbdQ\x9ar)O\xbc\x00\xb1\xff\xb7\xe7\x0e\xdc\xb0L\xe1l\xa1\xa3@|!s\xba\xfc\xb2\x0b2\x1e\xc2\x9c\x95y\xac\xfb\x14\xcb\xd1`\x10\xff\xcc\x7f\xfa$\xab\x91\xcd\x95\x1d\x8cQ\xaf\x80\x14\x8b|\x0e\xc7\xddr\x95J\xa7fD\x93\xe8\xd6\xa0\x8c\xdf\xe7S\xe3d+w\x85\x1a\x85H\x0c\xc7H\xa1TpO\xe3\xc36\xc5\xb1\xd4S\xf6_\x11\x1e\x9a\x0e\x8c\xe1{\x91Kz\xb6[\x9c\x0c\xedV\xde/N\x89j\x7f')
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask,flash,request
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
from urllib.parse import urlparse
|
8
|
+
from .config_enum import ConfigEnum,ConfigCategory
|
9
|
+
from .config import hconfig
|
10
|
+
|
11
|
+
from sqlalchemy.orm import backref
|
12
|
+
|
13
|
+
from flask import Markup
|
14
|
+
from dateutil import relativedelta
|
15
|
+
from hiddifypanel.panel.database import db
|
16
|
+
import enum
|
17
|
+
import datetime
|
18
|
+
import uuid as uuid_mod
|
19
|
+
from enum import auto
|
20
|
+
from strenum import StrEnum
|
21
|
+
|
22
|
+
class DomainType(StrEnum):
|
23
|
+
direct = auto()
|
24
|
+
cdn = auto()
|
25
|
+
auto_cdn_ip = auto()
|
26
|
+
relay = auto()
|
27
|
+
fake = auto()
|
28
|
+
|
29
|
+
# fake_cdn = "fake_cdn"
|
30
|
+
# telegram_faketls = "telegram_faketls"
|
31
|
+
# ss_faketls = "ss_faketls"
|
32
|
+
|
33
|
+
|
34
|
+
ShowDomain = db.Table('show_domain',
|
35
|
+
db.Column('domain_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True),
|
36
|
+
db.Column('related_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True)
|
37
|
+
)
|
38
|
+
|
39
|
+
class Domain(db.Model, SerializerMixin):
|
40
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
41
|
+
child_id= db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
|
42
|
+
domain = db.Column(db.String(200), nullable=False, unique=True)
|
43
|
+
alias = db.Column(db.String(200))
|
44
|
+
mode = db.Column(db.Enum(DomainType), nullable=False)
|
45
|
+
cdn_ip = db.Column(db.Text(2000), nullable=True)
|
46
|
+
# show_all=db.Column(db.Boolean, nullable=True)
|
47
|
+
show_domains = db.relationship('Domain', secondary=ShowDomain,
|
48
|
+
primaryjoin=id==ShowDomain.c.domain_id,
|
49
|
+
secondaryjoin=id==ShowDomain.c.related_id,
|
50
|
+
# backref=backref('show_domains', lazy='dynamic')
|
51
|
+
)
|
52
|
+
def __repr__(self):
|
53
|
+
return f'{self.domain}'
|
54
|
+
|
55
|
+
|
56
|
+
def hdomains(mode):
|
57
|
+
domains = Domain.query.filter(Domain.mode == mode).all()
|
58
|
+
if domains:
|
59
|
+
return [d.domain for d in domains]
|
60
|
+
return []
|
61
|
+
|
62
|
+
|
63
|
+
def hdomain(mode):
|
64
|
+
domains = hdomains(mode)
|
65
|
+
if domains:
|
66
|
+
return domains[0]
|
67
|
+
return None
|
68
|
+
|
69
|
+
|
70
|
+
def get_hdomains():
|
71
|
+
return {mode: hdomains(mode) for mode in DomainType}
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
def get_domain(domain):
|
76
|
+
return Domain.query.filter(Domain.domain==domain).first()
|
77
|
+
|
78
|
+
def get_panel_domains():
|
79
|
+
if hconfig(ConfigEnum.is_parent):
|
80
|
+
from hiddifypanel.commercial.parent_domain import ParentDomain
|
81
|
+
return ParentDomain.query.all()
|
82
|
+
return Domain.query.filter(Domain.mode!=DomainType.fake).all()
|
83
|
+
|
84
|
+
def get_proxy_domains(domain):
|
85
|
+
if hconfig(ConfigEnum.is_parent):
|
86
|
+
from hiddifypanel.commercial.parent_domain import ParentDomain
|
87
|
+
db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
|
88
|
+
else:
|
89
|
+
db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
|
90
|
+
return get_proxy_domains_db(db_domain)
|
91
|
+
|
92
|
+
def get_proxy_domains_db(db_domain):
|
93
|
+
if not db_domain:
|
94
|
+
domain=urlparse(request.base_url).hostname
|
95
|
+
db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
|
96
|
+
print("no domain")
|
97
|
+
flash(_("This domain does not exist in the panel!" + domain))
|
98
|
+
|
99
|
+
return db_domain.show_domains or Domain.query.all()
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
def get_current_proxy_domains(force_domain=None):
|
105
|
+
domain=force_domain or urlparse(request.base_url).hostname
|
106
|
+
return get_proxy_domains(domain)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
107
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/proxy.py
CHANGED
@@ -1,5 +1,57 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
|
19
|
+
|
20
|
+
class ProxyTransport(StrEnum):
|
21
|
+
grpc=auto()
|
22
|
+
XTLS=auto()
|
23
|
+
faketls=auto()
|
24
|
+
shadowtls=auto()
|
25
|
+
# h1=auto()
|
26
|
+
WS=auto()
|
27
|
+
tcp=auto()
|
28
|
+
|
29
|
+
class ProxyCDN(StrEnum):
|
30
|
+
CDN=auto()
|
31
|
+
direct=auto()
|
32
|
+
Fake=auto()
|
33
|
+
class ProxyProto(StrEnum):
|
34
|
+
vless=auto()
|
35
|
+
trojan=auto()
|
36
|
+
vmess=auto()
|
37
|
+
ss=auto()
|
38
|
+
v2ray=auto()
|
39
|
+
ssr=auto()
|
40
|
+
class ProxyL3(StrEnum):
|
41
|
+
tls=auto()
|
42
|
+
tls_h2=auto()
|
43
|
+
tls_h2_h1=auto()
|
44
|
+
http=auto()
|
45
|
+
kcp=auto()
|
46
|
+
|
47
|
+
class Proxy(db.Model, SerializerMixin):
|
48
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
49
|
+
child_id = db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
|
50
|
+
name = db.Column(db.String(200), nullable=False, unique=True)
|
51
|
+
enable = db.Column(db.Boolean, nullable=False)
|
52
|
+
proto = db.Column(db.Enum(ProxyProto), nullable=False)
|
53
|
+
l3 = db.Column(db.Enum(ProxyL3), nullable=False)
|
54
|
+
transport = db.Column(db.Enum(ProxyTransport), nullable=False)
|
55
|
+
cdn = db.Column(db.Enum(ProxyCDN), nullable=False)
|
4
56
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
57
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/usage.py
CHANGED
@@ -1,5 +1,60 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from flask_sqlalchemy import SQLAlchemy
|
2
|
+
from sqlalchemy import func, column
|
3
|
+
|
4
|
+
import datetime
|
5
|
+
from flask import Flask
|
6
|
+
from datetime import timedelta, date
|
7
|
+
from hiddifypanel.panel.database import db
|
8
|
+
from sqlalchemy_serializer import SerializerMixin
|
9
|
+
|
10
|
+
class DailyUsage(db.Model, SerializerMixin):
|
11
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
12
|
+
date = db.Column(db.Date, default=datetime.date.today())
|
13
|
+
usage = db.Column(db.BigInteger, default=0, nullable=False)
|
14
|
+
online = db.Column(db.Integer, default=0, nullable=False)
|
15
|
+
|
16
|
+
from sqlalchemy import column
|
17
|
+
|
18
|
+
def get_daily_usage_stats():
|
19
|
+
from .user import User
|
20
|
+
# Today's usage and online count
|
21
|
+
today=date.today()
|
22
|
+
today_stats = db.session.query(
|
23
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
24
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
25
|
+
).filter(DailyUsage.date == today).first()
|
26
|
+
users_online_today = User.query.filter(User.last_online >= today).count()
|
27
|
+
|
28
|
+
|
29
|
+
# Yesterday's usage and online count
|
30
|
+
yesterday = date.today() - timedelta(days=1)
|
31
|
+
yesterday_stats = db.session.query(
|
32
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
33
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
34
|
+
).filter(DailyUsage.date == yesterday).first()
|
35
|
+
users_online_yesterday = User.query.filter(User.last_online >= yesterday, User.last_online < today).count()
|
36
|
+
# Last 30 days' usage and online count
|
37
|
+
last_30_days_start = date.today() - timedelta(days=30)
|
38
|
+
last_30_days_stats = db.session.query(
|
39
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
40
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
41
|
+
).filter(DailyUsage.date >= last_30_days_start).first()
|
42
|
+
users_online_last_month = User.query.filter(User.last_online >= last_30_days_start).count()
|
43
|
+
|
44
|
+
# Total usage and online count
|
45
|
+
total_stats = db.session.query(
|
46
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
47
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
48
|
+
).first()
|
49
|
+
ten_years_ago = today - timedelta(days=365*10)
|
50
|
+
users_online_last_10_years = User.query.filter(User.last_online >= ten_years_ago).count()
|
51
|
+
|
52
|
+
# Return the usage stats as a dictionary
|
53
|
+
return {
|
54
|
+
"today": {"usage": today_stats[0], "online": users_online_today},
|
55
|
+
"yesterday": {"usage": yesterday_stats[0], "online": users_online_yesterday},
|
56
|
+
"last_30_days": {"usage": last_30_days_stats[0], "online": users_online_last_month},
|
57
|
+
"total": {"usage": total_stats[0], "online": users_online_last_10_years}
|
58
|
+
}
|
4
59
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
60
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|