hiddifypanel 3.0.0.dev63__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev65__cp39-cp39-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00M\x1c\x00\x00\x12\t\x04\x00\xd7\xe6\x03\xa1(d\xb2tz\xa6c\x82{\xaf\xcf\r\x00\x00\x00\x00\x00\x00\x00\x00(f\xdbFb3\x8c\xe2XX;\xe7V\x87\xd4M51\xa6t\x89\xac\x1c\xd1\xa6\x10\'\xba\xe0\x14v\r\x93C\xf9\xaaj\xefVse\xec\x0b\x8f\xdek\xd7\x9f^^\x9d\xfb\xaf0:\xc7uj\xe60\xaa6\x07\x15\x0e\xd61L\xbfpsO\xd1\x97q\x80\x88\xb6iyf\x81\xb1k\xff\x823\x95\xe1\x97f\x07Wb >\xa3m\xf5Q\xea\xffke\x8e\xd7U\xfco\x8f\xeb/c\xab;\xc8\xb62\xda\xbf\x0b\xd7\xc4\x1cb\xe2o\xe5\xa3\xdf\xf2\xb6\x92\xbe\t\xca!\xccaJ\xdc\xe5i"\\\xdf\x14/\xeff\xae_)\xa9\xa4J6\x874t\xd2\xe8\x1b<\x90\x91\xc2Vre\xbc\x9f+\xd8\x13\xdb:a\x00\xbb\xe1aC\xb7;\xef\x13U\xacC\x07s\xc0j\x9b\xc7\x01\xe9\x9e\\3x{\xab\x95\xf9\xfd)\xc6\x94?n\n\xb9\xb4\x94B%\xbc\xfbcvdt(\xc89?\xde\x8a\x95\xdaE\xfc\x97\x010\x84NO\xca&\xce\x0f\xcf\x86\xb8\xce\x18\xd9\x18M\xdbH[+\xf1\xf8E\xf9\xdc(\xa8\xf7\xf7ZxU\x97tN:x-e\x8c\xee\x00\x01\xfeR\xf2\x17C\xe7\xa3\x95\xf1\x02\xb4\xf8\x16\xa0\xbc-+\xe7\xcc\xb7\xe1<\xaf\xff\xa1=\xfa\xa60\xb77~L\x94vri\x10\xaa\xdd\xdb(%\x064\x175\xe9\x81j\xd0\xaf\xf4\xdd\x9a\xa8\xbf\xff\xf1z\x00J\xb9\xf9\x95\x18\xd8\xff\xd9\xbf[E\xb6\xd4\x08\x94\x14C\xb7o\x9c[1<\x90\xa4De\xba\x9b\x96J\x94\xa7\x85nO\x0f1W\x1cC.\x02\x92\xf1\xedG\x16@\xd4|\x9c%\xbb\xe8\xd6\xd8\x00\xe3$\xfd\x11\xf3I\xe4\xe8\x90\xc2\xcfa?\xae\xbc\xa1f\x8c\xb4c\xb4+\x13@i\xf1\x1c\x8axE\xcf4\xff[<d8^\xf7\x87\xcf\xcd4\x88\xc8\xcfk\xca_B \xdc*\x8by\xbe\x13y\x834\xa3\x8d#o_\xdf?ZYFG\xdc\xc0`\xe5\x10\x99\xed\x90>c\xdc\xc4+\xe1x\xd9\xbe\xfe6\xd0\xee\xdf.\x81~\xd9\x90\x10bo\xdf\x03\xc5X\xf0\xb7\xea\xb1\xe0\xf4\xfdl\xba\xe6\xcd\xd5(le\x9d\x9c\xb9z~\xcd\x80zv\xbd\xe5\x06\xacG\xc6\xfa\xec\x81\x9bu\xfbLS\x17\xcb\x16=\x14\xa1b\xaaj\xe7\x83\xd0{\xd7W\xc4a\xf3\xac\'\x8dl\xf2.\x9bP\x9bW\x1d\xab\xbf\xee\xe6$\x13\xb2lK\x1f(\xb64\xfb\x92\xc8}\xad\xdd\x04\x0c"t\x0e\xb0\x8c\xfa\n\xb1\xa5\xd4\xf7S\xecTp\xbc\xb3\xda\xb1$<\xf3\x089jH\xe4[AKhR/h\x08\xbeu\x969\xf7\xaa\x9aFU\xcf\xf1\xe5\x88T\xfc\x1d\xf2\x08\n\xe2vf|T\xf6\xe1h\'h\x818\xbe>\x12\xcc\xbct\x8b\x15\xe6\x96Tw\xb8\xed\xdbD\xe6\xac\x00\xea\x8e\xa9i$O|\xac\x0bey\xf5\x15\x9d\'\x97\xce\x81\x0c-\x8dO\x92\x0e\xbcc\xefX lI&\xd0\xcd\x11R\x8d\xc1\xb5h$\x88\xa5\xc1\xa2\xdf\x02\xd2\xc8\xee\xa6\xc1\x15l,\xed\x00\xd4\x9fNo\x11?\xda\x19{z\xe4u\x91\x10J\xe9\xe9\x96\xb3(\x81\x93\x1f1\xe8\xa8\xf2\x8e\x8d\xb2\x0b\xde%\xa0%\xb1\xd7a\x80ML\xa4\xadu\'&\x1b\x91\x13\x0for\xb2\x8a\xc1X\xcd\xd5\x10q$8\x1fDMj\xfcn\'u$\xfd\x8a\xee\xb6\xa0:\xb6\x02Y|6+\xa1@\xedF\rm|\x0ezuCX\r\xbf\xc3W\xa9\xf1\x80\'\x80\xbe\xacxF\x11\xca\x8fl\x10\n\xceM\xd3\x9d\x9d\xfb\x93\x1c\xdfK\xfe\x8ae\x90\xf9\xfd\xfd\xbagS\\\xe4%~\xce\xee\xde\x1c\x11\x16r\xec?\xe2\x9c\xc0\xa0\xd9\xc2\x02\x17?3\xf2\xe7\xd5\xb4\xa9\xd8\x82\xe4\x17\x04\x1f\x92\x14\x9c\xfd/\xc7\xef\xa1CDv\xad\xc6\xc2\xee_m_\xfc\x8be\x1c^f\xe0\x91~\xd5\xcfR\xe6\xef-4\xb7*{\x0e\xe1I\x1dQ"\xc5\x00\xb9+vF\xeag\xad0\x11\xb3\x18V\\\xdfe\xd6$i\x92\x8cj\x8cx\x10s\xdf\xb7\x13\xf7\\\xe3\x03\xe8\x0b\x91\x92=\xb2\xd3\x1b=0\xab\xed\xd9\x1ce\x84\xaa%\xec\x95L\x81\xc6\x140\xa2AQ\x95K\x88Q\xb4\x97P\xc5D\xff\xa7dOP\xd5\xc8\xf5\xed\x1d\xae\xbe}\xb1\xcc{$\xad\xb8\xf1#q+RX\xaa\x1a\x84\x99`W\xf4\xbc4\x88\xde\x83\x156\xed\x8f:\x8f6\xed\x06J\xaf\xf3"J\xf8\x13\xf7\x06jdn\x95({\x15\xd0\x1e>\x19]\xd6Z\xe3\xa8 l\x00^\xfdp\xec\'5n\xc1\xda\xf2\xe7r\xc1\xca\xe5X\x81t*\xc25\xf5\xdf\xa4\xf5t\xff\xac9=>\xd57\xce\xeb_\xa3$\xdek\x0e\xac3\xfdk\xef\xb7~\xfc>a\xb7\x88\x17\x8c\x8dY\xb8-[\xbc\xe1\xcd\x82\xf86\xeb\x1f{q\xb0\xe8>I>\xaeI2\x99z\xe2\xdb[\xa3\x1f\xc9\xc7\xc1\xc4\x1c\xd2M\xc3\x12Q\x0b\x03\xcc\x9e\xa15\xe2P\x9cS\xb6UM\xcdS(\xbe\x88\x1e[\xa8\x9c\x13,\x98\xe7y%\x9b\xd1tb\xb4ED\x9f\xe5\xb3\xcew\x91-\xac\x89\xb6\x05\xb3\xf5\xf55\xf9\x98\x90\x0c^mhU1&\rM?\x02;3\x88\xa7\xf4\x19)\xb3=\x0e\xbd\xb6)q\xf1;\x17\xeey\xebp\x1dB\x85\x8aM\xb7\xadWK\xde\x102h\xf5\xac\xb2\x91\x84\x99\x8a "\x0e\xa6 1\xc5\xb0+\x08\xb8\x9b\xee?^\xcesp\x17d\xec\xe3\xa8\xb0\xe4\x80l\xa5<\xc8\xe4\x1e\x86\x05\xa0\xab\xc7\xc3\x0bL)!\t\xc1 pM\xf3<\x943\xa0m\xdeJ\x1b\xbe\xafK\xab\xf9o\x12\x99\xb1\x02a-\xd0\x1da|\xf39\xb1]\x0cO\xa7\xeao%\xb1\x9b\x93\x02\\\x84M\x1cS\x18\x8c!QD\x04\xa2\x0e\xb6\xe2\x94\xe6\xfd\xf2\xfc\xbc\xa7\x1e\x93/\xf8\xbe\xc1\xb1\xdcQNV\xbb\xc1!\xbddX\xb0\x9c\x86\xdc\x91\\Y\x83l\x9a\x88\x0c\xb1\x8c}\x1ci\xfb\xe0\xd1\x10]\x7f~n\x8f\x00\xb9\x96\xf0J\xbay\xf3\x8e\xfa\x04Z\xe8c4_]\x8dR\xd9{z\rc-\xde\xed\x01\x8d\xc228\x8b\xf8<\xaas\xee\x19\x8bO\xc4\xed\x15\xd2H\x96\xa1qo\x13RJ\xac\x8c\xf1L~\x13i\xf8\xa2\x86\r\xf3\xf8|B-\xaf\xf9\x92\xbaR\x92-m\x8f7\xd0\xc2\x0c\x06\xc0\xb2\xb5\x13\xf9\xa0\xa7a!C\n\x1e7\x0b\xa2\x84\xe3\'cc\x92\xd5\x7ffh\xa5\xb5\xf5q\x0f9\xe7;\xca\x932\x8e Q02\x0b\xc2\xc7\x1e\xc6\xb8q\x1er#Ke\xee\xe9\xa1W=T\x16m\xdc\'\xe8\xaf\x03$|\xed\xe8\x84|r&\x0f\x95\xb3\xd7\xa1,y\xdc\xe2\xaf\xc9\xdc\xdf\x16Yn\xafP,ce\xd05\n\xa5\x07@.\xa4\x8a5\xb1;\xb0\x05\xdaEx\xc5\xfe\xc9\xf2\xc4\xeaUu\xd4\xf5!_\xb0\x8f\xec\xd4\xef\xc6\xca\x86\x9eq]\xaeM\\K\x8b\x83\xa7\x0b\xf68\x8dyV\xf8>\xa6\xfc3s\x1f\xdfI8\xa9\x9a\x80\x862\x1d\xf9K\xf8/\xa0\x9e\x018\x87\xe5L\xde\r+\xf2\xb8[)\xc1Iw\x9b\xd2\xa3\xef\xb0\x19\x89\x12J\x97 \x7f7\xbf\x9f\xd5\x88I\xcf\x04\xb7\xa2\xd3G\x84\x1a\xbe\x80\x04\x92\x8de\x10<\x1b\xecaT\x9b^\xbe\xf4?\xa3\xa2oX,:\x98\xaf\x82\\Y\x17\xebnT\xfc\xaff\x11\t&\n\x12"\x0f\x8e\xa5~\x1f\x90\x84\x1b\x82KE\xfdd\x00\xe8_\x08\x88\xf9\xb2l\xb1\x1eZ=x(X\x04\xb1\x06\x15l\x18Z\xe88l\xee\xb1\x1b\xfb\x1a\xdc\xbf\x80\xe9"\xfb.2k]\r\xc8\x02\xae\xc3^FR\x14\xe2\xd7r,27\x0co\x8d:](l.Xe0g\xb7LwV\xfa-\xed\x8a\r\x8eA\xe3V\xed\xe1\xafk\x0cXoRu~#\xb0\x85\xc6\x1eST)K\x8c\x03Nb\xd1\x16\xccU\xf2\xafP\xa2Er\xbbw\xdd\x18<:/\xd3\xc9\xc6J\xb06\xbbvm\x84\x7f!\xd0\xd6a\xd8\x92\xb1\xe3\xba\xa4d\xbbWd\x02\xd2\x1d\x01m\xfa\x13\x98*\r\xfd\xdd\x13s\xa4b\xea\xe93E4\xb9g\x04\x13Ht\x1a\x02\r\xb4,g\xa4j5w\xb9\x154\xf9A\x89=z\x87\xccI\xa52\x1e\xa1_-3^\xcf\xc7\x8bm\xaa\xf4\xe2\xcb\x16\x9b\x84]\xbc\xf7\xd95\xe1l=\xd9\xab\x8f@\xa6\x9f\x15\x1a\xd7<?8\x1b\x14\xd3B8.K\xe1\xecB\xber\xf5%(\xa6\xf9Od\xf9\x15\xd5z,\xbbe\xb7`\x0e\xe6,D#\xc1\\\x97|\xb5\xaa\x87\xe7\xaf\xfb%o\ro\xde\x999\xdb4.^\xcc\x02\xe2\xdf\xc3\xb9\xe6\xbc\x10\xb4Dk\x97\xba\xf8\x90\xeb\xac#=\xed\xb0\xa1m\n$M}Tmc4\xef\x94\xa6\x98k\xa4\xf4xW\xf9\xf6\xd5\xab\x88[\xd1%\r1\x1c\x05Uz\xd8\xedRj\x0cw1#\xdeI#\x18\xa6PC\x8f\x17\xb91\xf1l?:H%\xa8\x1eoy\xc6=\xf8\xd3*P\xe6"\xed\x82\x12\x7fe6\x0e\xb9\xea,\x9e\x92\xdd\xcdt\x9e\x1e\xc9\x1a\xbc+\xd8\xbbAA\xb3=\xa8\xbb\xf0\xd9\x01GOR\x0e\x84^!$\xdc/7_\xde6aF\xf6\xd9z\x92\x17\xd3\xdei\xcb\xc7\xc0\xa7\xd1\xec\xe89\x91\x8d\xd4\xa3\xa6\x16l\x88o\x9d\xe1\x1b\x97\x905G\x95\xd3\xe4\x05\xb1\xd4\xa4\x8f\xc9a\xc1\x0b\xe1\xb63\'\x18\xd5\xfe?\x8d\x1bT\xcd\xd7\xa4\x18h\xb3\xe2\x9f\xd9:\xfaX\xea3x\xf2D\x89\x0c\xca6\xa7\xb1W\xf48\x08\xdf\x1f\x1d\xd2\xe2\xfb\xa7\x1dKWN\xabKS?\x16\x18[\xe49)ebnY;\xfc\xa1\xbf0\xef\xe3\x8a4\xea\x07\xaa\xba\xbbc\xddS\x7f\xd1Q3;#:\xfaZ\xd6\xc6\x8a\x8a\xd2\xe6\x12\xef\xb6}|\r\xc4\xc8]5j\xf9\xb0\x02\x88\x96\xd7D\xba\n\x97\xb2\x94\x17\x90\xac<\xad<\x198]\x19\x9fW\xc5"(\xea\xac\xb4z\xab\xecVH\xb2\xca\x9a\xa2\x06!\xf3\xc5d\x0c\x9d\x86J\xf6\xbd{b/:g\xbao\xec\x1eQr\x87V\x80\x91\x90\x05BF\xf6\xc8\x18B\x14&`\xcd\x06\xa5I\x9d\xe8\xb8\xea^\x1b\x17O\x9b\xa34\xc59/Ji\x0b\xdbu\x96:\xcf\xca\xc1\xe8\rV8\x0b\xb0\xdag\xfd\xf5\t\x03\x1a\xb8p\xd5\xe9\xbeJ\xb8X\t\x9e\xbc\x17\xce\xef\xd1\x16ldy\xb9\x84\x81 \x93\x8f\xd4\x93*]\xaf\xd7\x94\x8bs\xb8J\xee\xdf\xee(\xa8\x90\x017e<L)\xb7\x93\xa5\xf0y+>\xf7x\xe2\x84\xeb\xf9\x95\xf8\xb8\xfc\t|\x0cT\x15\xc6?T\xa8\xb2\xc8\xf9\x100\xf9\x991;\xee\xa1+\x9f\x03\xbe\xf8\xd0W/\'\x86\x91J\x0e\xf4\xe93\xc6\x10=\x01\xad\xaf\x92\xb7\x94\x81\x92$L\xed\xac]\x94\xb1\x8d\x94\xa9\xc6\xa7\xdf\n\x02R\xab\x12\xe7\xaf\xb2\xe1\t<y\xaex\x88*\x82\x0c\xc9w\x03\x1f\x9c5\xba\x9d+\x9aS0\xb5\xcd\xbaxl\\\x9f\xba\xe1\x9a\x95\x9b4\x8e,\xecO\xb1p\x04\xe5\xfdWr!\xd4\x16hD\x81\x03\x05\xe6\x08ea\xf4\xa0~\t\x16A\xf4c\xe0(\x19{ZQ{F\xebZ\x83+O\xea\xa4\x95\x8a\xf6\x17Ka\xea\xd7\x125i\x1f\x93\xe8=\xad\xe6\x1f\xd6u3\x9dj\xd5\xb7\xc4\x1d\x94\xcf0\x929\xffx\xa4\xf7\xbb\x17\xb3\xdb\xc2(:A;\xcc\x8b0F\xe6\xbf!sN"\x0cm\xd3\xd7\x93\xba\xaa\x92\xd7\xe7A\xee\r\xd3\xa9\x80\xc5;z\xe9\xd5{C\xc6\xb4ft\xe8{\xee\xf6x\xe7Uy\xe7"\xd1\xa2\xe7\xb6x\xcc?M\x94\xfc\xdd\x87w\x81\x8c\x95d\x1b\xab\xea\x9f\x16\x01*\xedN\xc9\xd82]\xf6\x0c\xec\xe6\xaa\n\x14\xee\xbf&!J\xfc\xb8i\xa5\xeel\x11|U\x88\xa1\xaf\xbe\x0e\x060\x1c\x7f,\xd0\xfc\x91\x1ds\x87\xef}J?\xcb\xef\xc3\x9f\xd3\xc8\x00~6S}\x95\xad\xee1(?z\x87\xc9\xe19\xf6X\x084\xc6B\xe2\xb3\x0e\xce\x0bJ\xef<5\x89\xb5\x03\xf0\xe7\x87\xe2\xcf\xae\x05\x8b\x8e\xb6\x99\xe6n\x16\xec\xd2\x83\xc5\xde\xae\x83\xbf8- _2\n\x04\xdb\xcd\x1c\x16)\x8e\xcd%\xc4Z\xc6\xc0\x14\xa1\x81\x18\xb1k\x15N\x10C\x11\xb4?\xc9\xbb\xa3rT%\xbf|\xb5-\xf8\x11\xdfFS_\xd8\x15\x9eb\x88e_\xd3g\xf2\xe6\x9c\xa8\x85L9\x9a\xcb}/?\x7f\xd8aR\xa7\x7f\xd5[\x11\x11L\x10\xb8 \xf7/5\x9d\xc2\xd9Y\x15\xca\xc7&{<_E&/WEh,\x8e\xf1\xc3\xd0\xb3s\xb2\x82\x96\x8aG0%J\xd7n\xe9~\x10\x17F\x18\x83B\x9a\x9a\xc1<\xfd\x0f\xf8\x05\xc4\x90B\xb2jz\xbb\xdd\xda\xe0u,;\xc8\\\x1bP\xd1\x1b\x85)\xe3K\xb5\\\xef\rF\x9bQ\xe15\xa3\x16:\xf6<\xe1\xcd\xa5`y\x0c\x9a\xaaYM\x9b\xfd\xb8\xbfa\x8a`\xb7$El\xa9\xa6\xe6)\x89\xc2\xea\xee\xf8\xdf\xf4ydw\x86\xed\x038V\xfdr\xae_v\n\xd3\xae(Yk~\x1a\xb6a-q\xcc3\x0blQhXB\x91\xbc\xbfj\x9c)\xd5q\xb6\xee\x1f\xfa\x00\xb5Sa2\xc5\xaf\x1d,\xb1\xf3\x91\xbc\xea m7\xa0Q\xd5Rg\xf1\xd3C\xb24B\xe4\x8e\x16X\x92\xcb\r.e\xeaV\xbf\xf1\xdb\x03F\x95d\xafi\x10\x11G\xcc\x8f\x95\xe7?)C\xef\xb2\xfdL\xfb\x9a\xe0$\x06\n\x05\xdb\xd6+d\xc6Bz\x98\x91B@\xfb\xder\xb5\xc2.\x14\xea\\vOp\x17\x19\xa8\xdd\'do\xe75L\x93\x8576\x9a\xc6\xcfS\xd1\xc0\xd8\xb0\xf5\x95\xea\xf9\xb7F\x19\xdd\xea\xe4\xdd\x8d"\xa2\x00\xa9}\xdd\xe0J\x1a6\x7f7\xda\x97\xeb\x07\xe1J\x8d3ndL)\x87W\x8e\x1a?ioy\xc4\x18\x95#R/t\x97\xef#\x8c-\xb8\xf1\xed\x1e\xbd\x9eGo\x98\x9cM\x8e~nN\xe0p\xd7.\x14\x9eW\x86\xe6\xa0m\x16\x80\xf9]\x0b\xd1\xe4\x0b\xf8\xf8\xf9\xfd\xdf\xaew\xa4\x86@\xe75\xeb\xe7Uw"\xe2~\xce?s\xcbN\x92\xe8\x88\xb1\xb8\xf4\r\x93\xc2\x1d[Q\x8b\xcb\xff\x9e\xa4\xba\xe1;\xa6\xf0\xfa\xa9R8\x83\xcc\xf4>\x05\x88\xcd\xd7\xcc\x8a\x19/Y\x1f\xbd\x98h\xa59\x85l\xdf\x8d"\x97\xf3\x14d\xef+qc\xba\'>jWA\x8e\x04\xf0J^{s\x9e$6\x99\x8e\xc3hJ@.\x17>\x04\nkH\xea\x9dTHP\xfdz"\xa37\x88\xa0\xb9U\xbb^7\xc2\xc2\xc6\xb0\xcd}\xed\x02B\x1b\xce~\xc2\xd0-{\x85\xd2\x88\xc4\xec\x80\x00w[\xacQ\x8b\xc3(z\x1ed\xb7!B\xec\xe0,3]\\\xf7tXe\xd4\xba;Z\x86hY\xf2G\xf3);\xb5\xa5\xf5\xc4\x85\xf06dO\x02\xfb\x93\x92\xb7.\xcd\xe9\xcb\x15\xe3\x15\x9fa\x89\xa0m\x9ds\xdd\xfe\xc2\x9e}K\xef\x99R\nC\x1b\xf4\xf5\xa3\x1ca):\x94\x9b\xf3\x8c\xf1\x99d\xe6\x87\xac<\x02&\xde6\xd6\xb0\xa95s)5\x9fH\xc6\xd3l\xd2|\xc0|n\xa8\xbda8-\xd6r&\xa7\xaet<\xca\xef\xf1|\xc4\xce\xdb\xa0\x83\xff\xbcVar\xed\xf8rv\x9c\xef\xf69&\xfe\xc5\x98\xd5\xca\x1b\xba\x97(\x05o5g9F\xd3\xec\xc4B\xe9\xb4\xf1y\xfc\x97\x81\xc15@\x04\x94\x815m\xf8\xdc\xee\xa1?%\x82\x01\x1c\x89b\x17\x14\x13\'\x19K#\xff\xf2\xb9\xd6\x1f}ucn\t\xff\xbf\xd8s\xb6\xdd\x17\xcd\xa5\x95`\x1clbJ\xb8\xc6\xfc\x14\'g^\xe9^\xc6\xa6c\xc4o\x05\x99!\x1d\xd5"\r~\xaf\xcd\xc98i\xc7\xec\x1ewm\x99\xdf(\\\xbe\x03S\x85\xfeG\xc2=\xeb\x95\x0b\x10\xcc\xaf\xe7\xf4y\x1dx\x02\xcbu\x7f\x14e\x8d\x9b8\xad7\x1bS\x0e\xd5"\xcf\xc3b\xe8\x92q\xf01\x9d\xd7\xe1\xdc\x8f\x14-\xd4\x07\xd5c|\x96\xc0=\x81\xef\xd7\xe5\x85t\xe7\x83\x14c\xc2~\x15\xe1\x88F)\xfe\xb0\x8c$\xfe\x17\x85\x7f\xfc\x90\xb6\x89\xb5\xb38\xc5f\xf6\x82:(\xd4\xdfu\x9d2/+^&<\xe7\xad\xc6\xad\n\xb6*\xcfp\x9a\xe0\xe3\xabn\r\x81\xa0m\xf9\xba\xde[\xb4\x0b7F\xc1\x1d\xde\x89t`\xc3N^\xd65C@\xa0\xfd\xbfX\x84\x85\'\xf8\xfd\x0c5\xf2\x88yg\xb1"Y\xeb\')\x15\xb8$\xdc\xfb\xa6\x9f\xc5"\t\x980q\xb1\xb4\xea_N.\xc9|\xcb\t\x0eZ\xcck\x90\xf5\xca\xb2\x10\n\x9a0\x01\xe9K\x1a[@\t\x0c\x92z~\xff\x02\t~\n\xc2\xc8\xc1\xce\xea\x0fY\xeb\xa5\x96\xbe\xd5Q\xe0\x13U!\x90\x89\x87\x13\xc8\x06\xb3\xa0r\x17\xa0IF\x9d\x18\xe3\x9eS\x11\x99\xa9r\xfd\xe6\x01\xb8f\x05)S\x89e\'\xab\t($?\x0b2\x85\x86\xf6\x8bnT\xf1\xcc\xd4\xe9<&\x84I\x99!\xe2X\r1\xdb\x1a\xb8\xe9{\x97\xc4\xa1*cd\xdfG\xfa(\x84\xb5:\x9f\xcdw\x02P3o\xceb\x0f(_\xc6i\xf9\xf5r\xfa\xfai\xac\xd2!Mf#\xb9\x9c\xcb(\xcb\x8b\x19\'r\xef\xbe\xdc\xbb\x01q\xc0\x8bo\xce\x93\xe3"\xb9V\xea\x1f\xade\x9cr\x83K\x8b#\x1aj\x92\x15\xba\x0f\xf7i\x89\x87\xa5\xee\xaeG^\x9f\xae\xdbf\x83\xfe\x94\x85\x0c\xcb\xd9\x9c\xcde\x10\xd1l\x06\xb4(\\J2\xd16\xdd\x03\x8fQ\x957\xder\x9d\xe4t\r\xa9\xb5\xb6\x97p\xe8\x84\n&\x17<3,\x89\x80\x18i\xc0e\xf2\xcc|Wz\xe6\x99\xff\xf6.\x08\xe3\x03_\xea\xd2\x02\xe5\xee\xc9t\xf8g\t\xe2\x80u\xd8\x7f \x88WQ%"81tb\xde3\xa5\xc35o\xb9\x92\xbc\xb1\xbe\xff\xda\xd1\xd6\x0b\x00\xd2\xa5Zt\x98\xe2\xe6\x14\x83\x02\xec,\xe7\x92\x9d/\x84\x90\xf435`\xb6\xdf\xca\xc7\xd8\xfd\x07i\xcf\x11\xbc\xd7\xeb\x80\xb6\x1e\xb0\x02V\xbak_\x95GZw\x11\xc0l\xc8\xb7\xe2\xda\xf5z\xa4}\xc0\x1c\xa8\xa3\xf2\xda\xbb\x91\x10\xe4\x1b\x81$\'\xd7\xaa\xa9\xf5#\x92\xbd\x05\x16\xa6x\x84J\xd7\x11?\xfd\xf5K\xb4\nD\xf1\x0c(\xd0\xd6Y#\xc9\x9bX\x1f+\xc5\\\x00*\xe4^Jib\xab0\x93J\x88\xb6\xa1\xb0W6\xd2\x19\xc89Nd\x03\xacv\x15h\x97GC\xec\'\xab\xd9\xd9i\xa5Q\x0cq\xb3\xe8y?\xe4\xe2:[;G\xf4\xe4\xe6\xe7\xf2\xd2\xaa\xa3\xbbQz~iJ?\x10\xad\x07\xcd8y\x91o\x06\xa0\xf8!hUqQg7\xa8\xa3p\xed\xfa\xa2\xa3\x94\xa4O\xc1,\x00\x1b\x806\xe4M\xd3\x81"v\x98\x85\xdb\x12o\xfe\x91e\xc1e&\xd8\x00\xbd\xf3k\t\x15j\x13\'M\x9e\x86\xca\xf0\xf6\xdf\x8c\xc9\x99\xecuy\xfc\x9b"\x81t\x1dW\xce6\xe6\xdf\x9b\xb1t\x06\xf3\x1a\xc3Y\x8f\xc0?4\xeb\x06<\xb9\x0f\x14u\xe5\xe7\x023\x84\x83\x8a}\x90\xdf~\x1c;![ \x01\xd8e9\xa6\xf2\xf8\xa9\xe0\xdf\xd0\xb4\xcb\x9d\x06\xd3\\<el\x06U\xf6\xf5\x05\x1d&)\x8d\xe5\x0e\x14\x81\x8cZ\x18G\xefo\xc8\xd1\x8bj{:{k}\xbc\rD\xfe\x14bbz\xed\x19\xca\x11\xeb]\x8e\x883\x91\xd8m\xafHLJc1\xe7\x95\x85\xf8\\\xb6\x16\x02F\xdd\xcah\xa9RM\x03\x90o\xc8%nq7\x14\x08\x8d\xf2k\xc9\xdd\nr\xfe\x8a\xacF\xf9\x9c\x8b\xf7^\x8bFZ\x1f\xf1b\xd4V\xe9\xf1\x18H\xf1\x81f\xd4C\xd4\x1d\'\x98vL\xe1f\xd6\xa5\xf3\xe6J\x8a1\xf0\xc4cx\x8f\xfaBk\xddf\xf0\xeb\xcb8\xcdN+?Y\xe2\xb0\x1an\xf6(\xda\x92\x9ct+\x83Bi\xf1\x11&=\x1a\x05\xd1\x08e\xee\x8d\x08\x07\x85\xdf\x96W\x04\xf7\xa9J;\x8e\xbbfD)\xdc\x0bQ,\x86u\x11\x0ee\xb3\xf5[M}\xb1G\xd9\xadjW\xf6\xa7\x0e\x9c\x06\x1b\x89R\xb0\xfdJ\x8d\xe6\xd4\xb0\x8e\xf4\xef\xe1A$\xe0\xe6iY.\xa4\x16\x06"\x92\xb8\x04d\xea\x9aT\xf9\x1a0\xba\xbe\x04\xe9\x17\xe1\'\x97\x15s>8\xc8\xf9\xb8-\xa2f\x9bO\x87\x01\x11\xd0#\xa5yu\x9b\xf3\xd9\xa6\xa3\x87\xe0\x81\xefI\xb0G\xc7\xb2\x17(gQR\x11X\xaa2Aw\xb0\xbf\xea\xd8KcJ\xcaR\xa5M]\x9a\xfe\xd0\xe9V\x9c\x88\x0f\xe6\x11\xf5\xba\x1e\x14\xe9\x00\xa6\xe3\xb9f\xd4\x99;K,P\xbdJP\xf2j\x83\xd8^\x00\xa0Gw\xbf\xbc\xbd}1\x83xQ\xd2tg\xba\x9d\xc7\xfa\x1a\xc3\x8f\xb3\\>\xdd\xb6\xdb\xfd+\r\xf4wU=0;\x95\x8a\\\x98\xdf\xf4HI=dE\xf1\xd8\xe5l\xcf\x03z\xf1R\xd6\xf4\x1b\x1c\xad$ku\x8e\xe8\xe85\x9a\\[\x04\xf1u\xfdH\xca#\xc5\xd9\x8f\xc1F\xa3\x9e-\xd6\x90\xa7t\x12A*\xd1\x89\x0e\x13\xa7\xd7\xcc)\x1b\xfcz\x03\xdepS\x0fK\xed\xfd\xd439\xcacA\xcc\x0b\x1c\x12\xf4\t\xa7\x06La\xa7\xee\r\x9cl\xa0\x07\x1e\xeb\x91\x7f\x02\xaf\xe7Y\xb5\xac_\xba\xdd4{Q\x85kB>\x8aM\xbfvX\xa0\xe8\xb0>\xbeq\x13\x0b\x98\xc46\xd18\x81{\xd2\x90\x1f\xaa\xe7\\\xbc\x8e\xe2\xee\x8b\xd1b0\xbc\xf5\x8e\xb2\x051\xb6\xc4y\xb2\xdfGi\xe46\xd2\xe0\xbf\xe7\xe2\xf6\xfe\xc4\xe1H\x04\x95uj\xeb<\xc9\x0fn\x0e\xfaS\xa8\xe4p\xfc\x9e\xca\x96\x94H\x0c\x7f\x97]\xdd+\xdb\xb4:J]z>\xfd\xf6\x03w\xc0\x18\xaa)\x07\xbf\x8c9\xe5c{X~1\xd7\xc5\x1f\x85\xe6H\xc6g\xbb~q\xcf=\xd6-\x19s2\x08?:J\x88\x13^\x14h\xfc1\xb9\x9c\xc3\xbc\xec\xf4:`\xda\x9av#\xb1\xdc\xf0\x96\xec\xcf\xcb\x1d\x17\x8e@\xccE`8D\xbcS:+\x8c\x94\x031/\xd6\xaeK\x87V\xd1\x9c\xb5)?\\\xdd\xd3\x1c}\xc5\xba(\xe3O\x8ahn<c\x9eL\x17\xaebA\xab>\x05\xe3\xa6\xa0g\xd7\xf0\x10\xd4\x92z!1\xae\x17\x90\x8e\xa3\x07s\x9df\xd4\xad\xc6\xde\xc5\xf3\xbcL\'Oj\x19\x89\xccN\xfa-\x19O\xcbpL\xb0g\xc7\x8c\x04\xc5\xe1\x8d\x0b\xf2!K\x83>\x91Y\xe1\x90\x83\xd7\xc1.\x0f2\xear\xe8,zHu\xaa\xf3\x86&e>\x17\xd2\x9eJ\x08\xf8.\xc8\xbc\x0c@\xa5h\x00\xc9\xbfe\x91\x95c_[\xb0O\x90#\x82k\xdc\xa1\xc19"\x9d8C\x94\x86\xfb0\x1c\x94]\xd6dV!\xce?\x06\xf7l|\xc3c\x12C\xaa_\xad$g\x15\rF\x95\xbe\x96"\xc5l\x039/\x88\x1f\xf8\x99A-Y\x83A\x96\xbd5\x87\x05u\xe1\x15\x94\x035\xd8\x1e\x83\x8b\x1f\x1d\xa8\xbdD\x11\xf4\xba1?\xed\x9a\x8e\xdd6\xb2\xd4%k\x87\x1b\x0e6 \x06\xe6\xf9\xd7x\xb7B\x1a\xba\x92\xa5\x8c3\xe3\xe3\x01j\x19\x9fK\xf2M:\x83\xa2\xb7\xd2\xd6\xc4\x15\x83x\x0c2\xdf\xec\xfe\x8d$\x19\x19Jl/\x12\xff\xbe\xd7\xf4\x00\xba\xf9p@\xfd\xab\r\xe2\xf1v\x02Sj}-\xd4\x84\x9b\x84\xa1\x01\xad\x8bfH\xe7\xce\xd2\xdcB\xb8Q\x9fN\\\n!Z\xcf\xcc\xdbU\xb9\xfc\x85\xe2\x13]\xe8O5\xcb\xeb7eXj ?\x91\x9c`\xa3\x86o\xb4~%\x87VJ)\x1bjAx\x1aj~\x1e\\\xa7\xd65\x1cx0\xfeh9\xda\xfa\xff>\x80\xc9#\xc1\xf6}:H#\xe8\xc5\xb7V\xdb\x8f,\xb9\x1f\xed\xe8&{\xfe\x02\xa7\x9cK\xa9\x0c\x16\t\xd5\x83c\xad+\xea\x0c\x02\x95M\xcd_\x9b\x9c\xcad\xfe\x02\x05k\x9a\xecR\xd3AHqz@F\xf2\x08=ur\xc4\x15Z\t\xbd\xc6\xb5\x17b\xafs"B\xee5y\xdb\xda\xdde\t\x94\xc6g\x97\x11\xde\x17D\xa6\x8bE\xf1\xbf\xa4\xaf\xfd\xe5\x14\xba\xfdX\xad\xca^\x12\r\xffH7\xe2\xd8\xf9\x9a\xa56K\xab\x19\xbcu\xd7\x85sN\xbc\xfd\xa9 \xb4\x01\x9f\x9a!w4\xc9\xd4\xc4"\xa6n\'4\x00\x8au\xe4\x88\x88rA\xb3\xc1\xbc\x07\xfd\xdd\xfc\xb6>\xb7\xa9\xeb\xc76=\xeb\xe7\xf5\xfc\xa9W\xc2\xd5\xfc0\x155\xec%\xad\xb5\x8aJ\x9f\x15wz\xb3\xbahE\x90[\xf7\xc2\xd7\xeb"\x82\x97\xa0\x8a\xe6)a\xcd\x84\x1dDh\xb7^#W\x15\x93\xfd\xc8\x957\xc2 \xdf\xe4\xbd\x06hn\xa4\x8f\xe1$Q\xdaw\xeay\x0fv\xe6\x8e\xa2!\x8d~\xfam\xec\t\x15\xe6\x162c\xb1}\xa4\x97!\x19\teJ!GvgT\xe3;\x8b\x0bfq\x03}U\xa8\xcc\xa7ST\xdd\x93\xec\x10\x82\x0f\xfd\x0fk7\xda\xcetw\xf0\xe3\xa2\xc97t\t%f\xc0\xb4Q-y\xde\xc8\\\xf4\x02z\x02+\xb2\x0bk\xe2p\xb3\x0f\xa0\x1e\x13\xed\x95\xb2\xf8j\xb2\x84\x9d~\xca\xf1\xbev9\xb7\xe4\xba\x8b\xd5\xec\xf5o\x05-]\x11\x0c?\xdd\xdc\xea\x05\xec\xed9\x18NO\xff\xc8\n\x82\x9b\xa6\x02\xb1\xfa\'\xa1i/8\x1bcl\x9a\t\xb4MMM\xebKQ\xdfF\n\xc9\xbbZ;\x10*D\xb8\xa5\\\x197\x08\xedh\x98\x16\xf4\xdc\xb2-\xb3\xcc1#W\x83)\xf3\xec$\xac~<\xdeZO\xe7\x90\x02\x8c\xd0\xb1\x0e~t\x18\'\xfb\x9a\x164+B\xba\xd2qX\x8f\x9d\xed\xaf\x81\x11\x10/d/\x00\xbc\xa7)\x8f\xb2kJC\x9d#\xe3/\xcd\xdf\x1c\x93\xf9\xdb\xbd\xae\xd3T=\xd7h\x9b\xb4\x15;Cy\xc6\xa33\xf7U\xa7\x0b\n\xf2[\xb2\xd7\xe3*\xde\x17\xcb\xf3\xa9\x7f\xc7\xe7\xe3\xe7T\x84\xe6\x83PC\x1a8A\xe1I\xf5\xcf\x1a\x91\x16\xe1Se\xb9\xb8c\x84\xb0\x1ee\xe2\n\x00\xcf?#9h\xbc\x86\xec%\x17!\x91\xd8\\qQ\r^X\xba\xfc\x18\x9f(pg&N\x8e\x93\x1c\xbd\x8b:\x01b\x05\xee\xc2[6\x01@\t\xdb\xdc\xbd\x19\x069\xd5&\xceg\xc4J\x1e\xb1V\xad;}\xa1\xb2\xa3\xaa^\x180\x0f\xb4*\xf2\xba\xdd\xa99\xe9\xe1\xdb\xf3\xe8\xe7j/\x01!\xd2\xc7UZ?\xb3\x7f\xd8\x9b:\xfa/\xed\x94M\x92\'\x15\x95]Y\x97\x8c[\x18\x1f\xc3Y9\x14#\xaa(&\x92\x83\xdb\x8eq\xb2u\xaa@\x9e\xb9J\xf6\x95"\xd1\xa9y\xb1#~\xb2\xf5#\xbcL\x90\xc3z\x81\xcb\x83\xb2>\x80\xd7X\x15T-\x1b\x12\x15i\x83\xc2G\xf0\x82\x00\x04V\x18`\x06AM\xfb\x1cW\x8b\xb4~\xe9v\xd0\xe5^z\xbd]\x00gAT\xae\xad\xba}p\xa6\xeb\x13\xcf\x9c\x9cC~\x838\x86\xc4\x8e4\xfa\x0c\xc0|\xb7\\gV\xc60 \tF\x90\xdaxg\xd1\xfd\xca\xcb\r\xc6p\x16\xcb\tOc\xda\xfd\x1cG\x83\'\r\xa8\x14\xcf\x7fBiO\xbc.\x93Q\xf7\xa9?\xba\\\x1a\xffLJ\x1f\xa4\xfe\x1d \x0e\xbewL\x07\xaa\xcc\xfa\xa3\xb5\xc0\xae\x87\n7\x94"\x173I\xb2\xe9>\x9cg\xcf\xe0/\x1d\x17M@\xd0]\xf12\xf1\xb4b\x83\x81\xcd\xa3\x93\xa0\x8a\x93\x1a\xba\xaa\xa3Y\xe7\x03v\xe1\x9a\xd3\xd1\x80J\x87\xd1HMq\x1d\x17\xb9T\x9b\xdccu>\x10\x83\x96\x02i\xe2\x16,!_2\x88\xde\xa8lQ\xa8\xd9\xc8\x11\xe7]\xde\x17\x87\xcf\xf0\x1e\xfeYG\xf5\x83\xd98<\xf4\xd96F\xd9\x17H\n\x9f\x81\xc7\xaeY\xd7\xb3\xaf\xc9\t\x0b\xe0B\xe6N^\xb3!\x7fJ\x8b!\xde\xcb\xd3N\xe4\\\x17\x16\xa9\xee\x04\x8d\x03*\xc9\xc4\'0 \xd3\xd9\xc3DH\\\x8a\x86\x0e\x9ey\xbd\xb9e-\xb9\x87\xb91\x0e\xe5~)x\xe3?<\x11\xe0"V\xb2\xeai\x85SRr\x03\xde7\x8eE\xa1!I>\xf6\xc7\x8b\xdc\x0f\xd2\xf09N\xc4\xfd\xb5\x82\x0c{\x00\xc6\xd1\xd2\x85\xdc \xbd\xe9\x1f\xbc.q\xac\xb7\x82\x85\xe1\xfb\xb9\xb9\x0b\x81\xc3\x1a/!\xbe\xf8\xd9\x10\xddO\x96\x1ek\x8e\x92+\xb7\xe8\x96.\x97\xa6)\x14\xd8\xa1\xe8\xeb\x03\x84\x7fl\x1ft;\xd0\xc81f\xa5.\x02X\x14i\xfe}\\Tw\x83yh\xff\xe0\xde\x95\xbc\xb3\x81\xd1D\x0c\xd2g\xf4 N\x00\xac\x04>\xd7f[\xd2\nE{m\x03\xb2\\\x97R\x81X\x86\xfd\x02\xf8]\xec\xa5Q|\x15\xab\x97\x999)\xa3\xc2\x9fwB?\x89<\xceF\xc7\x1e\x0b\x0e\xfd\x07\xfb\xd64v\xf3\xa3Q\xad\xf2O\x19\tJ\x062\x9c\xcc3a\xbeW\x93\x0c\xf8x\xe8\x17\x92\x15\xb7p\x13\x0c}!\xe8\x01\xc7\x08\xb7\xcb\x8b&j\xae\xd6\x8b3\x11\x8f\xa2|\xf9\xfboB\xb4M\x0cH\x03l\xbcO\xec\x04Ce\xf0N\r\xb3\xd6\xb5>;\xb1#fR\xea\x02\xe0o\xf2FL-\x0bjl\xe4\xceU|\xbb3\'3\x8e\xd9\x19\xc1\xa2\xd5\rU4\xb2:(\xf7\xa9\xf6\xa3\xdb\xe9$^\x9am\x9aN\xecJ[\xd0+F\xce\xbd_!\xabN\xf4\xee\x96\xd7im(\x97b0\xa7\xa5\xe5*\xe3\xbe\x99)\xcd\xb94\xb5V\x19o\xc5U@\xd60K\xb9cN\xe6>\x9a\x97\r\x06\x96\xab\x9d\xf7ix\x1e\xa4\x05\xa7b\x06=R\xff1ld-\xea\xdan\xb0\x96\x88R\x19}*\x80\x8c\xed\xac\x10A\x94OO\x16\'\x0e\x80\xd6`]J\x06\xf0\xe2/\x07\xc8=w\xdce ^\xc6K\x85\xb5\xf3 4\xde\xfb\x83\x13\xa7\xdcN\xb7h\x85\x0c\xf3r\xeb"}\x88\x89\xa1\x83\xa6\x1d\xd6X\xe6\xb3O\xab\x05@w\x81\x8a\xc3\x89\x99=VV\xab\xa0\xd5\xfb\xea\x8d\xa8\xfem75\x95_\x7f\xab\xd5TO\x08]~\x1c\xcd\xa4,E`q6\xe8b\xf2\x90K\x8d\xf4\x02\xaa\xd4\xb1\x1f}\xe4\xa5\xcc\xf7\xb1cwdI\xf2\xe8d\xed\x8e\x9e\x0bP\xd3+^\xf1h\xact=\xcd\xb6\x00\xd9\xbaB\xbe\xe7w\n\xe0V@f~\'o\x0f\xf49\xef\xaf\x94\xba\x01\xf7OH^\xb9!\xa7\xa80\xff\xd0\xa6\xddO\x7fp\xc7z\x84')
|
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\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xfd\x19\x00\x00\x12\t\x04\x005\x8eI{Sca\x19\xfd\x05\x8f\xb2q\xc1O\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x87\xc4\xe7\xd3\xacb\x9f\x86\x0f\xfc0\xd7\xda\xc2\xd8x\xd1\xf9\xd6R\xe8ce+b\xe0\xad\xf8U \xd0\xbc!\x83\x06 \xb5\x00\x15GK[\xde<\t\x9es\xf9\x80\x99\x11#\xd0[\xc31\x9b\xa3\x90]0:!\xc2\x9f_\x95_;\x9c\xb1\x12\x1fx\r\xb5U\xd7-H*\xc98\xeca\xa3\xc2\x89Cmp\xc4A\xd9\x0bOb\xf6r%%\xf7(\x7f\xac\x19j\x9d\x12\xbd\x980A\xc1\xd6\xa6O\xf4\x1c\xee\x06s]\xef0\xacV\xe9\xdd\xb7\x96W\xe8\xde\x9e\xb9I}\xa3v\x8e\xcf\xea\xad6\xf3h|\\\xd8\xb8"\xbfc\x01\x058\x11W<\x8b\x12o\xbe\xdc\'\x00vv\xf6\xab;\xc33R+"G\x82\xd9\x19\xb3\x17\xe7f\r\xf2\xc6\xf2I\x99\r\x1a\x1d\x18\t\x93\xb8\x0f\x85\x04\xd4\xf8\xc7\xe3\x0be\xaf\xca,\x0fS\xf0\xd8\n\xb7\xa0\xe8\xa4rf\x87r\x1c\x16\xcf\xb7;+\xfd\\h=\xc2\xbe\x83\xc6\xb6\xa8\x0fs]\xf3\xf5\xf3B\x03K`\xee\x0bq\xd3\x0cP3R3\x06\xd89u\x02\xdd\xc0\x12\xf1v Q\xcc\xceqO-\xaa\xc7\x9b\xc88\x10\x95t2\x08;"\xb3h\xc38\x9d\xbe\xa4/\x14\xce\xc5|-\xcf@v\xeb7~\x800\xbde\xd8\xbf?-l\x95\xb8\xb4\'Cj\xf3\xc2\xf2\xa7I\xdf\xc5\x98\xb3m\x18\xbc}\xad\xc1m\xd0\xd8\xfb\x01Q\x11\x97\xd2\xe1Q\xea\r?!\x15l\'\xb6\xf8T6\x15\xd9Q\xe8\xd27\x98I\xc7f\xbe\xcd\xb8Cx\xd8\x84-\x17\xbav\xfa\xe0\xbf\xd4~\x1eWc\x0b\x80\x16\xa2h\xb9\x14\xb1\x16R!\xa8\xddV\x9d\xef\x84\x8c\x95b^\x92o\x19Q\x0f\x10\xf0\xb1\x84\xddXv\n\xe5\xef\x1f_\xc9L\x91\x8b@\xb3\xa8{\x86ivw\x8b)k\xf7\x12-4\xb3\x8dm+0/\xc0Y7Cj\xe4\x12M\xf9?\xc4? \x8b\x15\xfe\x1b\xb2f:dK\x99\xcb\x13\'\xd9\xa64\xd1\x9e\x8f\xe35\nr\xefz\xd8%\xae:\xc84\x05\x87?`dS\x0c\x9b\x15J\r\x9aR\xb6\xbe\xad\xaa\x98{\xe8\xe2\xb5\x81\x9a\x80c\xfd\x94~\xe2\xf2]\xf0\xc9\x8b\xe1\x93\xd5\xe7\xb8}\xba\xd7;?j:\x9es\xdfF\xa1\xe4\x15\xe07+\x8c\x12\x12e\xfb%\xb7\xf7\x81\xf6\xc6TJ\xe2\xd9\xe2\'\xf1\x84\xd1\x020&\xf8.\xfaRrj\x9c]\xd6_\xe4\xee \x107U\x8e\x80\xa0\xb2g\xc3\xce\x11yI<s}\t\xe6\xc9\x0c\xc9\r\x95o\xa1e\xb5\xb9\xb54\x1fhNE\x94]\x13I\xb7\r;\xcd\xf6=\xb8\xaa\xbf\xaa"O\'\x97\x9a\x92$MM\xb6!\xe3h\x94\xcc\xcczy\x14\x91\xad\x00\x9d\x9e\xa4\xdb\xebY\x94\x9a1\xb3x\xcc\xee\xc9\x99\xf5\xbb\xe6 \xce\tH\xbd\tc\xda\xf0\xba\xeeX\xff\\Y\x9e\xc41w\x8e\xb8>\t3\xd2J\xa4\xc2@i\xcd\xf6X(\x8e\x9ex\x9f\x8f+\xfa\xc9\x9f^Z\xabW\x95R\x8f.\xb7\xe4\xff\x10\x9bO\xa9\xf7\xe1\x89|i\xb4\x84uq\xd3\xc9\xab\xcc$\xadKWdf\xc1,0\xe6\xb2\xf6\x8e\xaf\x11\xde\x90E5\x02x\xc8N\x81\xc9\xd0\x8e\x84\xb7\x127\xec1\xec\x10+kL\xfb\xa2[$\x94\x14\xd4\xe0\xc2\x943"\x1a\x1e\xc8&\xbb\x87AZ=\x84\x03K\xd6\x1d\xd1Z\xdd\x07\x11\xc8$\xe6o\xc6\xd5d\x88\xaf\xd7Y+\xef\xdap\xa4\x07V00\xb9\xd3F\xc4\xaa\xac\xe2;^J\xe4\xaf[\xcau\x1a\xa6v\xbeF\x14\xe46\x91%xn\xf05\xdc\x8a\xa70b\xe8\xf8 \x13\xablp^\xf4\xb6Ns\x8c\xb3\x05\x1e\xbc4T\x9a\xde\x17\xf1\xce\xec2\x1f\xed$\x86y#\x91\xf9\x16\xa6\x19\x8f\x01\xffH\xbcaJ,\xba{6 g\xbe\x08t\xa5N\xa4\x10\x03\xb2\xe2\x1f\xab\xc0C\x90\xfc\xb2I @\x0b\xf64\x00\xc3\x04\xe8=\xf8\x01\x92\xd0lL\xec\xcb&\x83\xdd\x87K\x11[\x11f\xff\xd5\x12 \x14U\xd33\xec\xf6$J\x13ZtE\xf1\x16\xfc\x9a\x04"\x07^"7 O\'h^\xc2\x10\x1e=\xdf\xca\xb5\x02Faw\xaf;\xcb\xd3\xce\xef\xb5\xc1e\xa5\xa1 \xcf\xf4\xad\xc2\xab6\xd2\xf3\x10\xcc\xd5K\xc0;\xba\xee\x92\x9d7t\xa1\xf86\x95\x97|7\x93\xc8\xae\xde\x82\x01\xdf\xa6\t\x02\x85Z\xd8\xb3"\xfb\x96I\x11\xac\xc9\xfc\x95Y\xa6#\x9aj\xc6\x95\x98\xff\x9f[\x8dd\xbcI\xe4\xc8\xa6\xa3\xdd\xe1\x04\xa8^b\x7fY\xb6\xae\xa06\x88\x8c\x9d\xd9\xe4\xf5\n\x04\x05\xff\x1b\x8a~\xa10\x85~p=\n\xd8%\x88\x12\x01\x8ei,\xf4\xb3<[\xce\x90/k\x06\x1a\x9d\xe8\xfe\x1bQ:eu{ \xc75\xf8\xeen\x00\x8c"k\x03\xf0\xc0\xd7#\xca\xa9\xd1\x99\xac8-\xfba\x91\x8e\xb0@\xa1Z\xa0$\xff\xa4\xce\x0e\x11\x0e\x11\x05{\xc7]\xb6(\x18\xb5\x13\xa0\x06Tn\xcb\xf0i\xa6E\xcb{\x9dl\xb2~bU>\x8e\xd2\xab\x97 \x91uQ\x17<\xb5\xbf\xbc+\x99\x12{chZ)\x14\xf87\xfbs\x0f>\x8a\x87g\xaev\x8d\xb7\x08\xc1@8\x82\xe6\xbe\x0e\x9d\xe9$\xe3f`/U{\xd1\xe2M\xeaN9j\xb3\xf9\xa9\x9ev|K\xd1\xac\x99\x92\xeb\x81d\xd9\xb8\xbc:\rT*n\xfcK\xd0\x9e$fT\xefoM\xc4Ks{\t\xa9\x03o\x99\x17\xa3\x01\xb5\x04m\xb6\xf2t6PJ\xc8\xc75k\x97 ?rvJE\x18\x0f\xb2\xa9\x8e\x82\xe6\x9a\xb7\x80\xa8\xcf\xfd\xd9\x88\xc41\xc5\xedf\xaaV\xd2i\xc2\\w?\x81\xe2\xa4\x8a\xe7\x88\x13f\xcd64\xf2\x07R\x02\x82\x1f\xc7\x81\x89\x8b\x8b\xf8yo+"\xd2\x97\\\x8eRA\x05\xe5\x91\x8a\x05L\x05\x13J\xb1-\xa8\xff\xff--\x95)l!\xabv\x16\x8e|\tA\xd2\xc5_\xc2\xc1\xda\xd0\x05\xdf\x8d\x8af\x1e\x1fU\x0f\x0b\xc0\xdd\xd8"&\xdb\xeb\x7f~~\x90jD\x13\xab\xe1r6\xc5\x0e\xd2\xdc|p\xb9\xb0v\'\xe9W\xcf\xb6\x9b>s\xeas\xe0\xd2\x87|"\xe0\xd9\x13nXh\xda\x8es\xb8\n/\x0b\xfc\x8f\x96\xaa_\xeczES\xd8\xac\x93\xdb\x93\xab\x97<\xd6.\x0eB\xbfk\x08/U!]\x93\xbf\xef]\xc3LS\xb2\xbf\xdab$"9i\xe1\xb4\xf1\xc8\xcd<\x13\xfc\x904\x99\xf1`\x95\xd5\x0ez\x93\xbc\xafw] \x8fA\xe1\xca\x86\x12t\x03\xc8>\xc0\xd9\x1fI\xf2r%\xa2\n\xf5\x10\x86\xd2\x88\xdf\xf5\x1b\xc2\xa2\x10\xe3c(\xbc\x1cW1\xe0\xa4\xad$eM\xffpL\x8b)=\x10zoZ\x81\x9b\xd1G\r\xaa\xaf\xa7\x84 \x10\x0e@B}\x878\xb5bL\x19%\xfee\x8d\x01~ot\xb8\xd3\x1d\x9a\x05\x9e\xcd\xa1\xad\\\x8e&\xd9\x98a\xa5"\xa1\t\xc0\x86\xcfm\x13\xb3\x1c\xe7\x1b\x01\x01H\xb9\x91Z\xe3\xba\xcc%0\xf3\xcdT_\xean\xd6\xa3\xb2\xa2\x84\xb9\xd5\xde\x98d\xc0\xaa\x15;>Wj\xe6\x80\xa9]\x85\xff\xfe\x9b\x05\xd6\xf5\x88Il\xe5\x8d9\xf6\xdf\x9b/\xed\x940\x87\x00o\x033\x8bMQ\x9b|\xd5\xc0\xe4\xa1\x9a\xdc!\xd8\xbb\xc4\x8d\xa7\x96\x8cH\xf1\xbbe\xdcK\x9e\x94\xd2\xdc_\x91e\x8b\x01_\xd5\x91\x94\xb5\xd7x\xd4dcRs*\xder2\xf4\x8bD4\xa2\xc8\xed\xbf1[\xfdZ\x96P\x93\x11.\x95\x04\\\x98xR]\xee|\x1841\xcd&9:\x01\xae\xcbZ\xa9\xf3\xceU\xe0\x18\xfb\x9f\xad\xc3_\x03L\xb9 In\xdb\xdc\x10&\xd21\xeb\x0f\'\xe9\xec\r\x81\xb0=?\x02\x96\x89\x83\x1d\x18\x8c\xfd\xf16FWq\x93\xaf\x05\x06\xbf\x02a\xf0\x04E\x1cI\xd96J\x13\xbd\x9c\x84\tb\x7f#m\xdb\x86\xefr\xee\xbf\xd3\x9e9\xda\x8ef\xb2\xc0hP\x17J3\xd11aF\xf2\xe1\xbf\x85\xc7\xb0P\x08\xdf$?\xe19h\x10\x1eLg\x97\x9f\xb1\xb5\xcc\t@\x86w\xa6\x80\x87\xc3\x9fS\x93\x01\xcc\xe7\xcfU\x8aD\x06\x93f\x1a\xec\xc7\x81^\xf5;\xdd\xe7\xd6\xda\x1f\xf8:s\x9c\xf8\rR\xda\x92>\xad\t\x80\x02\x90\xb9\xa3\xbe\x9a#\xda\x8d\\\xf9|\x95\xd4\xf4]J\x88\xcc\xc5:L\xf3[\xffY\xd3\x03\x07X\xa8O\xe5\xab\xf0Z\x80zX\x1e\x1a\x1e\xa18h-\xecCF\xb7\xf8&VA\x1em\xa8\xc2\x1a,\xfa\x80\xdc\x15\xf8\xce{\xa1n~\\H\xf9\x07\x03\xd4\xa0\x8f\xdd\xd8\xdf\xd7!\xefY|\xa6\x85\xed\xbd:\r\xe9\x949\x0e\xed\xe9a\x97z\x1c\x15\x90\xbc\xcc\x94\xb7\xed\xda=\xc4\xdaY\xeb\x8a\xb2\x04\xe0\xd8n\xe7\xef\x94\xb7k\x90\x14\xd2\xe4\xf2\xbe\xb5\xd5\xae\x08S_\xc7\x97\x81y[\xbdq\xd8\x85|\xa1\x1c\xa1\xf3\xcb=\'\x85\xdd9\x0b\x89R\xdd\x88h\xb5\xbf\x8e\xa6\xbe\xc1\x16\xbe\xb3\'\x9bT\xd1*\xad^\xa5\x9e\x0b\xb1\x1c\x9d!\xe4<\xc9\xbc\xa2\x0cm\x10\xfd\x8c\x0e\x01b_%.\xe9\xad\xe4\xf5\xf3w\x98@=\x1d\xfaB\x84\\\x8c\x82g\\\x979\x03oK}\x89\x9bT>\xdf\xba\xf8\xb4\xbbV\xb3Y\x07\x97\x04;6\x0b\xc7\xc9 \xb6{\xb4\xb0e\x8d\x0cm:\xd8\xe8}U\xef\xeb[\xf2\xcdVm4\xe0\xd7\xa144Tac\x11R\r\xf0\x1f\x15mt\x7f~\x18\xd7Mf5\x9aQ.\x04\xa2H\x88\xc2\x02*\xd5\x86\xbfS\x18\xb6o\x0f\xf49l\x04?\x15u\x7f\x0f/\xf9\xd1\x92@\xa0\x95O\xec\xba@2\xd4V\xffZ\x84<`\x1d\xce\x1dN!\xa1V\x9a\xd0\x1f\xbe\x80b&\xbb\xc0+\xcd\xfbb\x81\x8e\x8a\xf7\xe5\xb3H\xf0\xf0\xd7\x1a\x92\x17r6\xe3Z\xf0\\\xf1\x90c2</U\xc9\x81k\xe0U\x8a^\xcd\xf6\xc3i\xc6S\x85\xc6N\x8a\xa5\xb5\xb7\xa5\xd5\x82\xf7k\xb8W0\xdb\xd0\xb4g\xf2MX\x9a\xd8\xbc\xcb<\x93\x00\x00\x9e;\xc8\x90\xea\xb0?X\x01f\x07;G\xf1Q,!\xb8\xb5\xba\xa0j\x17Z\xd1\x965N\xa5\xf4\xc0\xf7\x88\x15\xf4N\xa5\xda\xa7r<f\xe1Wvq\x1f\x089\xfc>"e>\xbbd\x86\x8c\xb3\\!\xe7\x81\'\xbe\x16\xa7\xfd\x94\x9f\xc1\xc3\x8b3\x8f\xb0Z\x99\x88\xd9\xd4j\xbew\x1cl0#r,\xe5\xe0\x1e$\x1c\r:\x8b2\xe6\x92\xb9\xf0\x12\x14\x9e8\xf8\x8fy\xb3\xdfX<\x02\x12\xd3\x85ba/t\xf2\xc1\xfdKVsm\xd1\x06\xab\x93\xc5Ib0\xea\x1b\xedXI2\xf0\xd9\xe6Jt\xf4\xe0\xeb1d\xe1b\xe0J\x0be\xcdyC1x\xf1\xc1\xee\x9c\x180y\x7f\xcb}\t\x11\xe7\xd7\t\xda\x9b\x7f\xfa\x16\x1a\xd8\x19\xa1\r2\x05\x90\x93\r\xf7w\xfeQz\x86\xdb\x04j=\xc4\xb3@L\xc6\xb7,\xb5\x12\x85C\xaf~\x80x\x16\x12\xec%>J\x90\x95\xea4\xae\t\x121C\x96\xda\x85A\x17\x0bE{On1\xb0.h\xf5\x0f\xf6@z\x93w\x9c\xdf\xab\xe0O\x0f\\\'\xfe\x10%\'\xadF7\xbd\xf6\x7f3\x10Y\xbd\x7f\xc5\xa9\xf6\xf2\xa4\xda\x90\xb8"m\xa8{g\x7f\xdem\x16\x0b\x1fi\x82&\xa2\xa6\xbe3\xb9s\x8a+\x8dxnX}v\xea5\n\xdeJ\xa4\xca?\xee_R\x11\xa5\xb54\xeb\x8d`%\xca\x14\xf1l\xf3\xec\x13\x7f3\x02\x08\xbf\x8c\xf3\x8a\x8b\x93W\x13af\xd0\xff\x92\x9c\xa3\xa1\xef\xcdy\xd48\x17C1(\xb2\'\x87"\xac+\xc1\x07\xd0v\xcc\x84\xb1\xe7\xe6\xe4\x87\x00~:\x0b\xcd\xf9;\xd0^\xddZ\x03(\xaa\xfcE|\xd3\x87\x01\xb5^$p\xc6 *e\xec\xc0\xfb,\xce\xfc\xad*\xcc\xd5::N\xb8vt%B\x92Jl\x8f\xe1\x89J\xcdN\x99\xd4\xaa\xbe\xb4\x0c\x10;b\xfd\x9f*\xbd\x87j\t\xf1\xb5\xacsn#K\xa06\xf6*\x9c\xeer\xd6\xbfs\x05\xe4\x89F\xc5\xe1B_\xa3S\x9c*S\xf0\x9aJ\xac6\xf7Du\xe4\x8f\xd3vm\x0f\xb1t|o2\x00\xa6\x83\x8d\xe5\xd7a\x05w\x16/&\xb6\x10\x81\x8b\x85\x82m\x1fXb:\x17]pI2\xf86EI\x08#\xc1\xcd\xa4\xf3K\xa6G>\xbc_(!\x94\x8c\xe7\xf6)3\x04\xf7\xfb\xc8$&JcP\x04\xea\xe7\xe1BR&\xb97W\xfb\xe4\x05?9\xc3\xd1\xc2\xd1\xe2$\x1e\xbd\xe73\x1bI\x8d\xd5z\xf8\x04\xc0\xa2\xc6PB\xb8\xdd\x12\x82\xfa\x9f\'\x162U\x11\xb9o\xc16\xc8\xdf\x9d\xd1\xe9^Jq\xa5\xfc%\x8e\xca\xf0\xa1x8u\xb8\x1fyj^\xcb~2\xa2Ly\xa8Sd\xeeU\x18\xcb&\xc6ye\xa5\xf4\x08\xfb\xb4M\xbe\x94\x87\x1c\x8b\xef</\xef\x9b\xdd"\xefT7\xb4u\xe9I\x99Y\xe6\x18\x10\xfc\xe7\x9e\xb47\xf8a\x86.\xb5\xa4\xe4\x08\xad\x16U\xda\xfe\xf5\x0fB|\xb8hx\x08,P\r\xc7\xc9\n\x13\xa1T%\x9a\x19I\xdbp\xfd\x95\xb2ZZ\x03\xc1\xa3\xb1<^}\xbd\xc0\x9e\xc9$\xa2\xa3\x16>A\xa7\x0b\x89x\xc8a\xd4\xc3\xf0[\x96\xec\xbe\x13\xbda\x1b\xf9\x1f\x8e\xd5Y\xc5l\x08=6#\x89\x8a/f\x00;\x02\x91\xd4\xc9S{\xac\xc8\xce\'\x17\x0b\x87J\xa8\x04\x99\x8dI\x16\r\x18.:\xf8t\xce\xb1\x9dw\xf9L\xae\xf1 \xf78BNB\xe9X\xba*\xe9F:P\xd1e\xc9\x0bO@\x86V\x98.\xe5\xa0\x12\xceW(N\x9b\x9d\x94A\x92\x9e\xf4\xdb#\x1bp\xe6\xe01\xadyk\xec6\x81\xdb\xf2Zh\xe1\x85\xda^\xb8!\x8d\xa2\x07-D\x92\xa4\xd3\r\n\xb5V\xf0M6\xac\x95\x12\xf1\x97,\xe8\xb2\xd8p\xb5s\x9a\xb6\xc9tu\xba[c~s\x83q%\x93\xda\x9e,F\xb8\xde|\xb4\xff\xd97\xf9\x8bVb\x16\x89\xb2\x01*\xa3\x89\n\xa4\xc6\x0498\xa7d\x152?\xe9\x01\xd2 \xe2\x84\xf3\xe9\x01\xdd\x08\xd5\xa4\x08k\t\xc4\xa6r\xdc\x809\x9f\xb8\x89\xbf!s\xfcT{\xe4\x8d\xe7\xecFv\xd2\xd3\xf7)(\xc5\t\xd3\xf3X\xab9\xba])\xd5\x0fA\x84~*\xea\xc5\xbe\x8d\x08"\xd8\xca\xbdo\xc0\xddAQm\xcb\xd7\x81$\xf2\xa0\xc4:\xaaK\xf1L;\xc77S\xcd(\xaa\xc4\xba\xf9\xe7]\x1e\xbas\x06\x89z\xb9l\xfc\xba~\xf4\x83\xb6\x99;G8\xf7\xaaC\x16y\xd3\x10H\xbf\'A\x15\xcdp\xdd\xee\x97\xf4\x98\xf7U\xd5\x14\xeen\x7f\xeb\xaf\xb6\x94\x1aU!\xce\xa3\x97\xa3\x9f\x02\x8d\x02\xacj\xcb,\xf6\\\xc7.\xec3\x04\x1dq\x89\xea\x01\xc7\xc7n\xb1\xa2-\x86\xae*\x9eNK\r\x9d\xce\x1c\xc3\x89\xc8\x05\xaf\x83\xac8\x11*\xc5E\x8d\x87!1:p\xbc\xc4P\xe4\x12Wv*\xf4\xfaQ\xd2p\x87|\xebk\x11\xd8\xb8\xf8\xe8}S/}\x00\xd4\xcd\x9e\x99\xbcI\xc6\'t\xefQwtg\x80[&[\x87#\xd5\x1ab\xb8pC\xb9F+\xf1\xf5\xcd\xe2\xaa\xc3\xcc\xd9\x8c>\x81\xf2\x90{N9a+\x15;\xe24\xab\xa9\x8a\xcc\xd2\x93\x04\xcd\xdb\xc2\xd8\x0e4\xd2\xbd\x99\xfa\xafQ\x8fT#jD\xb3T\xec-\xc2\x9d_\x19\xae\x02\xe2r\xd93\x84J\x02\x00,\x12\xa4L\xe3V\xf6\xe0\x18<R<\x0c$u\xa2\x87q\xca\xf4\xcb\x8bl\x9a\x9e+e6u\x06Ey\xb5i\x13\x0bcMTF\xcb\xea\x0b`\xc1\x8c48F\x9e\xfbo\x0f\x80\x18B\xb1\x02Ag=\x9eh \xe1d/4\xa7Ln4\xca\xa0\x81\x1e\x12$\xc0\xf4g\xe2\xc1\x8d\\)\x18\x80\x92}\xbc\x04\xac\xc2\xdd\xfc\xaer\xa3\x1a\xf2\x1dR\xcf\x0f\xe6~J`\xb4b\xd6\xfc8\xf5,J?\xec _\xd25\xccY%\xf5\xf6\xfe\x82Cwv\x07B\xf6Fe\xc1\x05\xaa\xe3M\x181w\x0cK\xc9\xd2Re:v\x00\x1c\x03\xe1\xf9\t\x1a\xaeFm\xf6z\x9a\x9b\x06W\xa5\x93!\xe8^\xe4\xd4\nBGo2\x9d&\xe8\x1d\x14\xb5\xca\x88\xec\xce\xa3^\xab\x00\xc3\xd1fd\x8b~~\x16\xa1\xe4\x14f"\xf9\xe5^\xe3x\xe44Z\xaf\xfd{*\x17\xe4\x16\xeb\xa5)\x03\x88B\xed\xf9\x0b3\x03\xae\t:1\xf8~\xfc\xdd>\xb25\xc86\x0cF\xcb\x99:\xf1\xe2`\xcc\xd8\xa8\xef\xb0\xe5\xdf@\xb3\x9b\x01\xb4b\x10q\xa0\x00\xf8\x8e\x92\x8a(\xaa\x9d\xaa\xe5OHs\x11A\x89\x9bE\x00\xe00\xb1{\xae*_\x06s\xf4\xb6\x87\x18\xf1\x88\xba\x83>h\x05+i`\xf2\x01\xe6\xb6\xd7i\xa3\x89\xce\x8dN\xa3}M\xe6\xb5T\xdf\xb4\x14Kx02\t\xd9\x18\x17i\xc3\x0f\xb5G\xdc\x1f\x0b\xf2\x9b\x9c\xad\xd7\xc1\x13\xe5/\x96}\xc7\x92\xeb\x07\xfe3\xfc\x95\x9exJ&\xba\xfd\xc5\x97\xd4}\xf7%\xef\xf8\xd8-d\xa5\xb3\x11a\xa8l{A\xc3\xe6\xa36J\xbb.\xaf\xe9\'\xb8:\x7f\xfb\xdc^\xec%\xa5$\xb1K\x87>\x8e\xcax#\xaf\x86\x1f\xdd\x95\xfd\xfa\x9a\xbfH~y\xf5a\xfd\xa3 \xa8\xab,\xfa\x1b\xec\xc3)\xb2\xe7\xed\xde\xc5\x1a\xb5X)\xc6S\x00o\xe9\xa4\xd5\xcc\xdc\xe9;\xe9\x8a\x01\x97Nj\xa9\xf2=\x94ez"\x94\x9ch\x16\xbf!:\x8f\x91#zN\xa4\xb1\xa0#\xb2\xea:\x86\x81%\xa2\xb9\xef\x88\xe8\x7f>R\xf5U\x12\x1c\xc6\x98\x8e\x1c\xf1\xd0\xc57o\x7f\xac\xa0\xbf\xd1\xbcJ\x8d\x92\x1ap\x1b\xba\x00#\xb3p\xda\x19\x9d\x07\xca\xd22\xe6^P$\x07\x06@{\xf9L,\x90!P\xc1\xf5\xdc\x03#L>\x19\xa3\x9e\xda\x84GEy\x7ff&\xb7\x1b!TA\x06aj\xf2\xad\xc9\x9f\x9ab\xfb\xc3<\xaa\xd2\x07\xfa\xd5\x16\xa2\xe1k\xb6@7\xa28\xe0\xa8\xc2G"\x95\x1e\x174d\x89SD\x80\x94\xd7\xba\x12\xf7d\x96\xe7\xcc\xe25F\x95\xa6\x8b\x9b\xad\x08\xabl\xeb\xa8\x0c\x0en\xb1\xd9(\xff1\\;\x0f\xa7\xcc2-\x81t\xd9\xeaV^\xf05\xf4P\x96\xd5\x14\xc4\x01\xc9*T\xb7~\xba\xdb\xc5\xe1\x99D\x00\x9a\xdc\x18\xff\xc6\x1db\x16\xacR\xecfSs\x82*\xa7\xec\xc60\x01I\xd8\x11\xc4\x1a[\x06\xdd9\xbd\xcc\xaf\x1e\xf2z\xfd\x1d\x9b\xde\xb7/SJ\xcc\x9d\xfb\x91p\xc9?\xe3<\x1b\xf0U\x83\x8a\xf5M\xd2\xa1\x16\xef\xdb\t\x13\xb1O\xc1\xd8\x8fbN\xd1\x14c.\x93~\x92\x8c\xc7\x07\xe0\xa1F\n\xe7Bx\x85k\x83\xad\x92\x9c\xeeA0\x1b}\r\x94\x01@\xfd\xc7\xa8\xd3\x98U\xf0\xb1\xf1k\xdcr7\x95\xae[\xef#\x86V}2\x8cY\xe3\xb8\x87\x0f*\xff\xc5El\x1c\x16\xa3\x8e:\x9b\x84\xbe\x89\xae8\x94z\x9e\xa6\x18\x0e[)NA?h\xd8\xe1\xe0\x9a\x1aM\xf1PFI\xc5AA\x82\x81a~~\xfa\xfd\x07\x9c-\xaeZ\xa6\xd1Tm\xd5E\xa4\xc8\xf4\xf4\xd7\xa8\x08r\xd8\x13\x02\nU\x94N\xb0\xce\'\x02\x8dT\xcc\x10\x14\x81\xb2\x97(i!{\x82\xf6\xa8\x0f\xc0\xe9\x1a\xa7\xc0<\xa2\xf0\xd85\x96o\\A\n\xafU[\xd5\x05\x16O\xef\xc5\x7fz\x8b\x8d\xa4\xfe\xfd\xd4\x87\xa3\xbe\x8bp\x94"\x9f8\x87\xe2\xcf\x99\x12\x8f&\x8b\x89N\x9e\xb3t\xc7_"*6\xe4%\xda:\xa5\x8f_>\xe1\xfdT\x16\x15{n\xd3cP\x05\xd4b\xbd\xa3\x10\xcfJ\x16\xdaQ\x13i#=(,\x1a\xdfX\r\xc3\xa7[`\xc3\xab\x06\xac\x95\xfa\x19!\xf4&\x91q)\xc5l\x99\x06\xb6\xba\xb3$>\xbd\xf3\\\xfc&\x9a\xd4gK\t\n\xb6S\x84]\xac\x7f=S,\xf5~5\x98H\xef\xf4\x1b8>\x0e-@\x1bc\x85i\xfa,\xab\r0\xcbe\xb9\xfb\xc1j\x14K8\xef\x1eb\x96\x01E\xa0\xa7R\xa5OMk\xa8l\xcc\x06`D\x9b\x7f_\x8e\xa04\x85\xf1_y^\x0c|\xf4\x0f\xaa\x8c.\xff\xf7\xf1E\x852\x9e\x9d\xa4\xfa|c;\x13\xa8\x82\xe4\xa4n/B\x8f\xdb3\xd1\xa2|%\xe7\xcd\x80\x91\xe9\x05\x18w7\xba\x9e\xa0\x174K\xa0lW\xcc\xd7\x9a\x1a~\xb7\xc0!U\x8d\x17\xb2\xe0>A\xf5\x9c\xe3~\xdcQ\xc1E\xf1KK\xf9\xb7\xe9\x9f"3\xa0$\xd2\xa7\xca\xd4L\xa6\x10\x86\xa0\x1fP\x94\xe0BHA\x8e+t\x80\x1d\rC"*l:\x16E\xfa\x9c<\xef\xe9\xee)\xaf\x8a\xfa\x1b@\x82\x13\x9fC\xceO\xf8\x9esE\x89e\xce\x07C\xe4Drc\xa7z\xc8\x0cb*\x18\xd1\xa3x\xc6P\x8d\n\x07\x8f\xa8\xd6H]\x01\x8c\xc1F;y\x12\xd8\x99k\x87" \x95\xb7\xd0\x1e\xbb\x95\x86|\xc9h\xc7\x80\xce\x97=\x9b\xba\x9c\x07J\xb1\xaa|i\xf0^\x91\xce\x89\xf6\xd2\x88ZR{.\xb7c\xa1.\xe9\x99\x1c6\xdf\xfc8~!\xcdM(\x8a\xa9\xca\x94u=T\x8c:\x19\xda7\x12&\xdf0\x15S\x95\x06=ZQh6A\x84\xfc\xa9\xa8\xfb\xa4\xc9F\xa7\x9d\x8a\x81\x8e\xbf\x05k\xef\xbc\x91\xcfHU\x11s\xad5_\xaa\xa1Hd,i\xed\x9c<\xe9f,\xe3\xa3\x08\xb5\xdas7\xdaB\x9e\xd2}\xc4\x80g"1n\xd5\x81\xc1|\xd0\xdc\xff\x87\xf1\xba\xcb\xe0\x1b\xcf\xfb\x11 H5\xee\x8c\xb0\xaf",\xd3\xbd\xa4\xcd\xd0\'\xe6\xc1\xbc\x01\x9a\x94@I\xde\xb2\xc1;\x1a\x1e\xae\x0cF\x17pKw1\xab6\x90\xb3u\xc1F\x9f\x97p\xe0\x08_\x1e\x1d-\xc1\x1co\x84\x90\x03F\x1eKq#\x17\x9b\x01n\xb4~=.H\x9fR\xcf\x97\xe6\xd8W\xed\xe1\xdb\xf5\x00\xab1\xb3\x9a\xb0\xeb\xad\x15\x01\xcf\xe7\x95\x04S\x9b*\xd56\xdd\x7f\xe4BX`pmiI\x1f\xb8MK\xa9w\xc9\xe2\x8e\xd0 jl\x9c\\BO|\x01\xc3\x98wS\xdf\xd6\xe1\xe4\x05Y\xc4\x92\x06c\xb3Bq\x0e\xd2\xa9\x8c\x9c\xfa\x1e\xdf\xb0\xd5\xc2\x00}\x08\x01\xf1\xb5\x02\x1d\xf0\xe8\x8f\xa7=\x06G\x19-\x1e\x18\xd35`8p\x19{KY?\x91;i\x02\x19\xa8\x9fW\xa9\x03\xb7\xfe\xa4\x17\x80\x8bo\x9fo\x90\xae\x13\xf6\xdb\xbd\x8c\xe2\xc6\x9d\xab\xee\xa1\xbb\xd2\xc8\xf8z\x87$h\xa9T&\xbe\x1eR\xef?A\xcf\xe7v\xd8_5KBjs\xe8\x9c\xd7\xc7\xcd\xef\xca\xb86\xf7le\xd4\xe0\xfb\xb2\t2\xbf\xad\xc5Ac#\xe1nBS\xe7\x19N\x97+\x8e\x8d\xde@\x01\x17p\x01\\\xba\xbd\x86\xb0\x19\x8fV?k\x9a\xc7\x08\xee;\x18\xff\x1f\x87\t\xdc\xc5U`h\xa1\xe7j\x1f`+s,,\x0ep8\x80u\xf9I\x98\x1f\x98\xa02\x99\xb5\x88\xf9\x950\xd2d92$\x96\x030\xe1C\x0c\x89>\xce\xe5KV\x1a\x9a\xe0"\x92\x15\xb3\x1eI)\xba\x05\xdd]^eV\xbe\xeb[12(\xa1P\xdd\xda/)7\x9a\xb5\x91\xcdAl\x12\xbc\x8d\x02\x15\xde\xa0\x9a\x92\xec\tzs\xdev\x19~\xe9\xc9\x14\x1aP\x13\x1a\x93\x84$\xf7\xf9\x1a\xf1\xc9:\x81\xc7bh\x1f\xf6\xb7\x08\xf9\x06~\xcc\xf8b\xb1zr\x8b\xc3\xb4\x18&X\xc7<\xed\xaahi\x90\xed\xc5\x97\xa5g\x97\x8fo %\xac\xa6\x0cB\x85\xa3\xc4\xd0p\x12\xee*\xb7\xc0\xbd\xcd3\x7f\xcd?\xf5\x0f\xedW\xde\xdb\\g\xb6\x00{H\xf4y\xc4i\x01>\x10\x1c\xc2zs\xc0u\x9a\xa0\xf0\x0f\xf2L\x9fx\xd0\x1a\xa2\xdb\xb2\xe3\xca\x14\x85(*\x93\x88D&R\xd2[\xd1g\t\x83\x10:\xa7\x8a\x07\xf6\xc2\x05\xace\x11\xda\x82_G\x89\xf2\xe2`\xc3\xe5~y\x15\xd5N#S}h\x18\x12[dq9\xcd\x84\x15\xaf\xdd\x8d\x96\xf7\x17\xd3\xcdMJkR\x14\x9bE\xfb\xae&\xb3\xcb>\x97q\x1e\xbe\x99\xae\xdb\xcdd\xf8\x8f\x8d\xaaA(PuX\x99\x0fYe\x91\xe9\xcb\xd4\xde\xfb#B\x8eH\xf1\xb6\xe2\xda\xf6D\xc3yj\x11\xac\xd1\x927\xb7Qa\xf95\x8d\x83\x93R/\xa7\x91x\xcdB\x95\x0f^\x06\x8f\x12D\x9e\x9ajQ-\xad\xc2HQ\xb2\xbe\xf5 \xae\x8c2Y:c\x81\xac2A\xf7\xa2}\xb7\xa2K\x8a\xb6\x1d\xe7y\xfc\xcaP\x98\x9bF\xd0\xd3\x86\x9am\xa0k/y\xd9\xca\xcd7uG\x83X\x91\x13\x02\x04\xe1\x87\x98a\xa2Zh\x89\x18]G`\x92/\x8dI\xf5\x87]4\x19\xe7\xfat\xb2\xcf\xf6\xf04R\xbe\x82\x9d\xeaK\\,\xbdKR\xee\xe6\xf8\rT\x83C_$\x9f\xaf\x9e\x99G\x07\xf4\xd0yu\xb4E\x1f\x1a&\xaeQAw\xb5\xb8{m\xb7d\xdfC\xd4\xe9+\x1bi\x1dC\x7fz\x16\xc6\x80\xd7\x91E"\x91\xf1E\xaa}\xf4\xc8\xb83\x97Cm\xc37\xc9/0\xd5\x88\x8b\x93\xffB\xe6\xafs:\xa4\xa9v&$g\n\x8a\xd2\xfe\xec\xe7\x19%r\x1aC\xd1\xe3\xd0\x8d\x8ex\xba>=0\xf6\x7f\x840\x0bEb\x87\x9c\x0b\x9fF\xd4\xc7\x90\x15\x0f\xff"\xa6,\xf7\xe4P-\x05,\x07\x85*\xdc\xab4\xf4\xb0\xd75\xef\xa6\t7\x96\xa1\x86@c\x04U\x1c\x1d\xcf\'\\7\xe6\xd93\xd3\xf0\x11\x94\x97~\x118\x90\xb0;l\x0f\xee\x92\xedH\xddqC\x1d\x8e)\xfaN\xcey\xfc\xa0\xa8\x81\xd8\x9b{-\xa81O\xccvc\xa5\x186\x8d\x1d\x9b@\x08\xb5\xb1\xf3\x19@J\x9f\xb3\x86u\xb1SoY\xa4\xb1\x88\xd2#\x07\xbb\xbb\x16h\xa3\x84C*\xd2\xdc\xec\xe8\x07D\x93Q\xd1kD\x8b\xb82+\xa7\xb7\xe6\x91\xc1e\x8f\xaay \xb6\xd3RJ\x85\xaa\x9b\x01\n\xb6\xb9>\xe7\x0cp\xf4\xfbU#K\xd5\x84\x05\xe0Z\xf9\x1e\xed\xee\x90\t\x9f \x9a\xaa\x9e-\ti\xdb\xd2\xb2\xd8\xb0\xdam\xa0\xb2\x88\xd6\x96:\xdb\r\xfc;yc\x05{hC\x90=\xf1\xfd1\xb1\xde!\x19\xd4\x0c\xbd\xb1c\xd2\x1f\xee\x9a\xfe>ir\xcfB\x98\xf8\x8d)be>r\x147f\x8a\xccG\xa5\xc2\x8cP#\xaa\\\xceR\xa4\x9aL\xde\xd9X\x90\xa0aG\xb9FR\x0e\x92|\x9bPZ\x08[xn\xbeQ3\x0fu\x16\xdfA\x93rdf\x8f\xd8\xd6\xc6~q\xe9\x91\xde\\\xd9\xc8\x96\xf4\xecF\x08\xa2\xdaT\xc1m\xd1\xb9\xe2j\x0c\xfd\xd6\xc2\xe9\x8d\xea\xc8Q\xaf\xc3\x97\xff\xc2\x90\xa6\xaa\xb7\x8a\x9f\xf8$\xa7\x9cz\xfb\x07\xaa\xfa\x80+\x8a\xf3w5j\x0f\x16\xc5\x93\x1d\xc9\xa1\xdd\xde\x16\xcf\xac\x16\xac\xb4\xe13^\xfb\xbe\x01\xe1H\xea\xa2v.\n0\xb9\x15\xe3j\xd0\'NT\xbb\xd7\xc7\xbe\xd00c?\xa0\xb5\xbf\x8c\xb7^\x15\xd0]-<\xec\xba\x13\x9ffQ\x16\xee\x8c8\xbbl7b\x03We5\xbcITH\xbdD\xae\x06\xf0`\xb9\xbc\x1e\xdf\xebd\xf3f\x1e\xe8\xb8\xfc\x06N\xa7\x0e8\xd8\xc97pe\xdb\x06k\x9fY\xdf\x04\x12?\xd3\xd20\xf8\xc98\xbe\xbf\xd2g\xd0\x86_s\x9d\xdf\xb3y\xc8#\xe6\xe81\xd8@kM\xee::?z\xe1\x16\xe1\xe2;\x02\x83\xb8\x9d\xff\xa2\xd5f\xfdi\x1ad#=\x05\xfb\x91\xe5D\xa9U\x83\xc4\xcc\x9e\x8d\xcf\xc3$\xaemo<8\xb1\x97\xc1\x02\xf3\xb6\x9b\x1e\xc1VO#|\x0fw\x82\xa4\xd3z\x042X\xf9\x02\xa0\xd9\x11\\\xc5%8\xbe\x17\xf1D\xdc\xe3Tq\xaf\xcb=\xa6c\xd5\x8d\xb8\x8d\xebX\xc1\xd5\x0e\x8b\x1fzk\xecpuM\xe6\xb4\'\xf5\xe2\x7f\xbb\x0f\xf9\x0e\x10}\xc9^Nu\x10e\x94\xf4')
|
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
|