hiddifypanel 3.0.0.dev64__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/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 +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.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.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.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\x00\xd3\xd67\x82\x94A\xc9\x1bN\xc9\xc4u\xea28\xde\x00\x00\x00\x00\x00\x00\x00\x00/CUtc\xd8\x86x\x11\xa1\x8fP\xf7^\xf7\xf7\x03sKm\x0f\x99\xe5y\xca\xaepq\xc2\x8d\x1f\x17\xf4V^\x98\x9b\x04.\xe5u \x0b\xb5\xcf\xf1\xd1\x1dL]GdB\x93\xc7q\x8e\xe8\x8e\x99\xe8C<3\x91\x18\x19Y\xe2%\x89+\xfb\xf8Zc|Z\x03+^\x05`B\x8c\xd4\xbd\x94\x94\xfb\x87\xf5\xa9l\x19/\xe7:u\x8b\xd5\xdc\xb8W\x86!2\x86@/\x160"\xaa$\x90z\x9f!b-+VF\xfc\x89L\xb8\xc4\xb44$\n\x10\xb7\xb9\x8f\x12\xeb\xde\xc4\xe0\xeb\xc5\xd0\xaf(_r\x9a\xefRf\x1b\xca\xcd[?%2\x87\x04==HDW\xad50V\x1aW\xd2@\xae\xb0D@V\xe7\xcb\x82\x97\x86sh\xc2\xedv,\xdcXl\x9e\xec\xcen^\x8a^7s\x11n\x03.\x8f\xa7\xda\xea\x1a\xc4\x0b3\xf6\xf9[\x01 \t\xfe\x12x_\xf7]\x95\xbf\x95\xe3%\x9b\x02]\xc0\x95G9\xe9H\xebn\xb9\xcd\xbd\x90f\x0f\xa0\x0eA\xfa\xa2\xba{\t\xd4\xf9\xfd`u\xd3\x9d\xba\xf0\x19\xbc,\xcc\x96\x8a\xfa\xee\x8e\xa6K\xbb\xa3k\x99V\xb05\xa8\x9b[\x8c\xaeZ\xa7lKw\t"\r4\x8f\x17\xafA\x91l\x12\xf9\x8eR\xd3\xabT\nQ<\x0bz\xf9K\x8d\'C\x89\xa9\xb9Bw\xde\\ x\x08!\xe2[S>\xfdR\xbdqK\xc0Rf7\x12\xdd\x02*h\x04/\xf6\xfb^\xae\r\xfd\xb3\x97\x886\x87\xa9\xa6\xd3\xe9\x90}l\x9bQ\x93\xe5\xd47\xd4&\xedH &\xd2\xa7\xf6\xe8\x12D\xc6I\r\\\x9c\n\xad\xba\xfd\xa4Fkf\xa8\x85\xb8\xff\xc5\x00\xc4x\x08Pn\xfa\xb4\xb4\x84}cb\xe3l\xd7/Iu2Da\xa6r}\x81\x17\xfd\xf2nC|s\rf\x1c\xe0\x13\x01O\xdcT(\xf1Q\x8fd\x93\xf1\xfc\xf7\x14\x19\xfei\x8c*\xa4v\x01+\x98%>\x05\xb9\x1b\xb1\x01\xae\xc6\x9b\xe4\xe4\xfd \x1d\xd73\xde\xefZ\xd9\xe3\xf9\xe1\xa5f\x12S\xf3\xe5M\xee\x9e\x8f\xdc#\xfa 7\xcc\xfcm|\xefV\x1dM\x06\x11\xcd\x12BB\xa3MpM\xefy\xe5\xb7\xa0\x1c]\xaeu\xc9*D\xc2.\xfa\xf2\xe5d\xd6\xa88\xf0\x03\xb9\xd3\x85My\xf5\xea\x0c\xd3\x1e\x0e\xe3~\xf8\xda\xc7\xd2\x8f\xb7\xe33&\xd1P\xb6\xf4\xd3\xf2\xb0m\xb3\xa4jd\x8e\xc9\x17\xfa\xc9\xd4\xfc\xb2S0\xb8\xd0Umm\xec\x02\xf1\xbbv"\x94\x03|\x13\x05W\x18MhJ&\x88f\x93\n\xda\x03\xfc\x8b\xc0\x175\xc8\x8fz\xa9- \x80\xe7\x03EQ\xe8Q9T\xe3"v6\x8dJ\x90\x91T[\xb1\xeb\xad\xfe\x80\xc5\xeb\n7\x83\xd4=\x9eNr\xc2\xbf\xfd\'qp\xc3\xb9\x9a\x9c\x805\xear\xe2\x8c\x1a\x87\x06\xea^\x0cQf\xc2\x12\xf7\'\xd0\xf7:\xdf\xc6\xc2\x88\x83\x86\x0ck>\x0e\xde-z\xfd\xb0\xed\xfe\x0fwS\x08h\x15[\xa1M\xc6\x9dl\xc4\xc6\xf7d\xc4\x0c[\xbd\xb6\xecM\xf07Dm\x17\xb8\xfdB\xb9D\\k\x8a\xb04\xcb\xc5\xd0\x12{2\x9f\xb0<\xd6\xac|\xfcm4}\x17\x03\xbb\xfd\xbc}q\xb1\x8e\xaf\xf3\x98\xbf_w\xb5\xcb\xfa\xb4\xcb\t\x18c\x1b\x8b#s\xe61\xdca\xf5\xe80*\xc8\xf7N\x1b\xfd\xdcc\xd2_1\xbf\xefU\x98\x0f\x97\xf3|\xab\x94\x92\xbcj\x9f\xc4\xed#\x9a~\x90_?U\x0b\xd4\xd9J\x04\xd7\x01\x16KF\x80\xd5\xe4\xe9T\xa6#\xe7m\x00\xe6\x96^)\xec\x13\xa68\xc0\x1c\x8aF;\xf8\xaf\xe07\xcdgS\x8e\xcbi\xf9o\xfd\xc7\xae\xbd\x86$d\xed\x86\xc4:UT\xd4\x8a\xb3-bO>\xa4\xb11\x11\xa4\xb5\xdd\x0e\xbd*\xfbPy\x97\xd6Z\x8e\xdenuK=<\xfd\xcf\x11#qPc\xa4q(\x00we\xc5\x88\xf0\x17+b\xc4m\xdd\xc0\x92|\xe3\xb8\x10BV\xb3\x8bD\xa5\x1a\xe7\x92\xc8\xd6\xa3\xe51\xb6k\xd0$\x1f\x85^oo\xd2\x9f\x1dB\xdf\xfa\x14\x9d\xf2\x86,\x8a\xc8\xbefd\x9bY\xd8cK\x1f\xa7\nL\n\xe3\x10l\xad\xd3\xef\xcbF\xca\xe9r\xf5\xe0B\xaa\xaa\x18\x14\x00\x8fG\r\x1a\x87\xa9\x1a\xf2\xe8\xc3:0\xce\xde\xea-~\xf0e\x07\xef\xa7\x17\xa7\xf7\xf2m\xe4\xef u\x9c\xcd\xe9\x06\xe1,\x9eO,\x05\xfcw\x05\xc9>\xf0\xb8\xe7\xdd\x9c\xd2\x99\xb2\x84s\x14\x1d\xe3\x9cMWU\xc7\x92\xb9\xef\xc5\xc3\x00tD\xbf\x92\x9e*7\xe5u\xd9*\xcf\xdd\xbf\x1f\xb8\x91\xb6\xc7=9P\xf1\x1c\x992e\xd7\xb70\x90\x10\xcak\x97r\n \x88\xcc\xbb;\x0b\x8c\x11 \xdb\x97\xc9\x1fN\xf5\x80\xba\xac\xec\x05VL4\xc4bQ\x8c\x173?8\xf5\xa9\xa8[A2\xd9@b0\xfer\x87fG\xce\'\xd9LD<P\xcd\xe9\xf9\x14\x14\xd1\xa8\x1aif\x8d\xaa\x81\xc9E\x8eu\xbe|\xae+(\'=\xb1K\xb1\xe5w\xaf3\x1d\x95\xbc5\x80\x9bon\x9d\xab\x8f\xdeM\xf6\xa5\xd7\xefi\xef\x95\x90\x9fP=\xc4J\x0e\xea`G\xbc\xe6\xf7\xbapl_\xf7:\'\xbd\x1d\x8cl\xca\x17\xb1\xcf.\x994\n\xd9I\xa22\xa4\xfa\x02*:\xf3\xfc6\x1b\xdb(\x15k\xff\xb0)\xa7\xa4o\x9f\xcda\x10|!\x1b\x0bc\xb0\xb5;\x14\xaa\x8e\x9at\xb5\xfa\xb3\x03\x99Q\xc4\x07\xeb]"$\xdd\xf5\x0c\xf4\xf7YVh\xc2+\x16\xd6\xbf\xb2\xf8\x00\xee\x83]\x06ol\xaeG3:vz\x9e\x84B\xe5\x9f7G\xd1\xdd\xf8\x15\xeb\x1c\x0c\x93\xd2H(\xae\xeay;\xc9\x1f\xf7W\xa2d\xff\x18D#\xb6o\xcb@8\x86I?\x12\x98t-*%\xf35jm\xb3H\xe4\x84\xe0\xcf0\x8d6S\xe9X\xa4\x06\xc3l\xde~\t%x\xf5Bo!\r\xe8L\x91%\x8c\x15%b\x036\x99\x91\x8c\xe0\xb8B\x82\xb2\x1d\xbb\x08\x03Tb)\x98$\xe4FO\xc2\x81k\x1f\x96\xda\xaeN\x1eO`i<V\xfb{7h\xfa\xa1.\x00\xc8%\x0e\x9dP\xab\xc3MZ\x11\xf6\x04G\x0c\xffy\xc4Q\xfd"\xfbe\xd8\xb2\x00[\xf1^\x9e\xd1\x89ss\xd8\x16*\x9d\xa0\xa0ei\xfa \xd6\xd5\xaf\xda\x8e\xa6\x10"E]\xdfb\x06LH\xc1\xe9U\x17\x0b!\x94\x86\n\xa8\x88m\xf6\xa4\xf6\x1d\x12l\xe9:\x08;\xb7\tc;\xfe\xf8\xe6\r\x84.\x1c\x83\xdd>;\xa5\x11@*\x0e\\X-\xeb\x83\xe4J\xbc\x92\xdf\x14;\x1c\x07\xfbU\x8ay\xe5\xeb\xfd\x1aZ\xef\xe9\xa7\xa3T\xa0\xfb\x92\xbeS\xf8\x08\xe4\x83$\x08\xfc\x15/\xc8\xe6\xf7\xb8\xa8\xb4~8\x07I!\xa0\xec9\xe0\x88\x028\xd3\xab.\xbb\xc7E\xf3\xaf&\x03\xf4D\xf7J\xbe\xd4\'d\x9e\xa4\x80^\x13\x01\xbc\x8c\xe7\xee\xc8\xe1{\xd2\xf6\xdd\xef\x03!\xf5\x00\xdbq\xfa\x0f\xa0\x1a\xe7\x93\t\n\xd5ljW\x04s\x03\xc3\x86\xdf\xdc\xca\x0c\xb5\x0c\x96t\x95\xb0\x7fq\xe7wb\'j\xff\xddk\x96\x1e\x1b\xea\r\x7fs\xab\x05E\xc6Z\xa7\xe4cDQ\xfeoe:\xaf\x9bO\xe9\x9b\xcf~\xf4\xf6\x83Z\xc0%\x1e\x84\xf9\x02\xc6b4R\xaeN\x01\xf8\xe8\x94\xb6\xe6\x8c\x93\xb1\x9dJ\x84\xc0\x19\x0c\x8a\x8e,\x97\x04\xf9\xcc#\x99\xba\x15|\xafM4\xddH\xff`\xb5\x03I8\xf4\xdb\xc8\xa5 rb<\xc4\x1f?{\x18\xca\xd0\xd5\xf8O\xaczn\xaaG\x80\xc8\xbb\x89c\xac\xf5\xf1y2\x98\x03!d\xd4"\xdd\x86\xb0\xe1\xcfQ\xfbX=}\xa0A\x006\x9f\x10\xd2\x85\xbc\x1e\xb5\xc8T_\xbe\x8a\xd8=\xad\x18\xad/\xcdG\xb3N\x83\xed\xa2\xc3\xe0\xd1JsD\xde\x9e\xfa7\x8e\xd8\xe7^\x90\x9e\x15\xc5T\x0c\x96\x15\x88\xac\xbeT\xaap\xf7\xb5w*+\x01d:\xbe\xed\xcf\xf3\x07\xc7\x02\x94VJ\xc5&\xaa[\xf5&\\lz\x1b=\x8a\x97DT\xc0\x9c\x0e\x9c\xe1$A\xc3\x11v\xff<\xc0\x03\xdc\xca\xea0\xde\xc2\tk\xd5\x80"\x80M\x98\x96\xdf\xff\xf5Y\xbe\xb2\x8a\x11\x95;\xf6\x9a;\xcd\xb2\'TPeL\xba\xcf;\xed|#v\x05\xd7\xaaS\xd6\xcf{Q:\x9d\x84zN\x14\xc7\xee\xcdq}\xd7B\xf1V\xd1!\xe5\xc0s\xa1$\x84\xd7\xc2\x80\xbf{\x84\xc4\x06\x03nM\xac2$\xc4U\xc9\x83\xd9jd\x9f\xf6=\x19RE\xa2\x06y(1Q?FC\xf5\xbb6]Af\xeep\x03\xc0\xbf\xd4}\xfeI\xb0\xb9p\x1f\\\x03\x86\xa6\xf1\x86\t\xbb\x03\x9b\xbe\xe8!3\x93\xb1\xc8D2\xfc\xe8\x06^<S\x16\xd8\x9b%\x10\xbc\xa2kfv9\xe5\xd95\xac\xc8\x87\x94\x10m\x15%\x0f\xf7\xdfG\x00\xf7\xb8\x921-\x8e\x9dr\x13\x04P\x9f0\xd2\xc8-.\x15\xb5\xb0\x1cj\xd7mD\rY\x18\xdfV\x8e5\xa7\xc2\xe10\xddB\xf9\xc0\x8d\x03\xbf\xfd\x17S\xcd\x10S\x1e\x86\xdc\xf7\x9a\t\xcc\xbe\x97\xfdzy]\xd0\xbf\xa6\x00\xcf\x80\xa5\xd7\xf8\x88\xd8\x96\xc0\x0c\xc1\xefQ\xaefK\xe6\xc7\x8fZg\x8c\x99\x9a\xe6\xac\xe7\xeal\x18\'N@N{\x06\xca\x06\xd4O\xc7\x17\xb8r\x08\xa7>\x05\xdfG\xe1\xd3fh\x05\xa2\xe0?\xc97\xd5\xee\xb1r\xd0\x15\xbejG\xc8\xb7\x88\n*W\xb3{\xee6*(\x9co\x16\xa6\x920\x93E\x08\x83p\xee-V~\xcc\r\xc5W\x8cu\xc9+X\xac!\xc2?F\xd9\xe1F\xf3`\x7ff\xc8\xd4\xa5\xdb\xfc\x19\xa4\xca\xab\xf9N\xf7\x14JU\xdd\xac3\xf9\r\x8e\xdff\xcd\xe5\x1a\xec\xc3j\xc2\xec\xe0b\x02/\xd9\xf7"\xfa?{\x12E%\xa2\x86\x9cJ&H\xe2\nr\xda\x91\xcd[\x9e\xe3\xf9\xc4A\xa7<\x07\x8b\xaeUd\xe0\x0c;\xb5\xfc\xd9\xe5\\\xc9\xae\xb4\x7f\xe6\x9e\x12\\H;\xb0\xa3p\xc8\xadmvL\xfc>\x9bq2\x1fIH\xd6\x1e\xb0\xb0e\xd1\xa1i\xff^b!\xa56d\xf1\x88%7\x9d\xab\x1c\x93!\xccTj\x00x\x9f~]\x1b\xb9\x80\x06\x99y\x19\xa3o|\'by{K\xe3"\xb5,\x88\xe7$\xe2`\xbfM\x1c\x9f\xe0&W\xe9\xae\xb4\xa6\xd3\x95\x83\xb3Y\x8b\x8e|)\xb8\ra\xd7E\x95\'#>\xe1\xc9\x88(\xec\xa8\xb5\x13Q\xa4\xe9\xa5\x10\xb2\xe6c\x85:|\xaa\xce\x9dK\x84\x8dk^\xc0EX\xed\x91`^\x9e\xc5!\x0b\xaa\x90\'k\xd1"\xb0\xf2\x80\x11\xff\xa9b\xfe\xb1\x1b\xce\xc7\xe7\xa1\xd6\x92\x7fh\xd3\x81\xa4\xe4\xbe;\xfd\xb8U\x90bQK\x91\x97^\x96\xf7\\\xe4g\xf8\xcea\x8at\xd8mRM&\xe3I\xec\x96?\xcc\xee\x8c\xda\x98J\xb4\xe5\x9b\xdc\x9d3\xfd0J\x08\xa4\xff\xfaY\xce\xa5\xb6\x96\x18\x9fI\x1b\xde\xdbl\xdf\x1f\xb8\x8eq\x0e`&Z\x08\xea[\xa8\xa8\xd7h\t&$\x7f\xda:Q\xe9\x1be\x9f}\x89\x0bt\xe1p\xce\x89\x7f\xeb\xa5\x8c\xb5\xbe\x8b\xc9\xcf\xae\nq\xd5\xe2\x00\xbb\xda\xb6\xbcn\x90\x9f\xd8;\xdc\xf9\xda 9B\x17)U\x97\xba\xce\xd3\xe21\xc4q\xb9\xb7\x96*\x19\x8c\xbeh\x9e\xd8\x95\xe1O;~\x8dK6\x81\x9a\x15\x9bX\x07\xb8N\xe0$7\xdf\xe1\xf0\x07\x11\xde2S\x15\x8e>\xfa\xc7\xfd\x07\xb1\xf0\xd6\x01\xda\x8c\xac-\x01\x83\x94\xb1\x07\xcc\x9cu\xa7\x85L\xd6\x9d\x81\x11\xfc\x12\x1b\xde`k\xe9\x02\xa5\x9a\xe4{\x02\xa2v,\xac\xffh\xb4?\x8cK\x82\xe8\x1f\xf1\xb2o\xe6\xb0\x02\x8f\x17b=U^\xfb<\xe9KB\xb7\x9a\x9b\x85\xfb0$\x01\x13\x14\x06\xe7\xc2\x07T\xf5\x89u\xd6\xed\\\xc6\x824\x04\xf4\xf9\xb9d\x0f\x88\x16\xf8u\xe3\x05\x95\xc3B\n\xb7\x0b\xb0\xf6)\x84\xd1P\xd3\x11S\x07\xb1uo\x17\xd2\x92\x86v\xf5\xbb\xcb\x8e\x92`\xeaQ\n\xdej\x83\r\xe2d\xf0\xdf\xa22\x91\xff\x96\'Y\x10\x9ds\x15\r\x07w\xcd5f\xef\x97\xd8Re*0\xa5}\x91\x8d?\xb9\xf2J?\xd2\xc1\xb2\x14\x9aE\x03\xa8\x815\x9d\xb1\xa7u\xb2\xa4_y%m|\xd5Y\xcdw\tWse\xdd\xac\x8b\xa3KL\x9db\x97%^\x1f\xa7WS\x03\x0c\x80\xb3<7DTV3\xb7Q6\xbc\xff\x9ax\xd9\x1f\n\xb2\xff\x07:\xcer\xa2\xeb%w\x8dA\xe5/;\x8e\xcf\x8b\xd8\xb2B\xaeq^7\xc6\x99\xc1\xb4(\xe2VUq\xe2\x85\xd5\x0e\x0e\xbc\x9ae\x83~\x13\x8b\xdc\x95>\xcd\x06\xa5Z\x91Z\x04h\x83\x11\x9a8\x89=\x84\xd2\xcct&\n\xb1\xbb\xcb\xb2\xc1(\x1aFOq\xe7\x1fsK\x8e<Vk\xb8_ka\x88v\xa8\xaa\xfdT\xf1k\xf9\xb0\x08[\x14Z\xd4\x08\x8dLY\x15\xdc\xbe\x93\xaa7Ku&$\x99x\x1bZ\xf6\x8a\x98F\x92\xfbq\xb8g\x96\x98\xa85\\\xe8\xdc[L?\x13\xa3\x11\xcf\xb0A\x0b\x18\x9ag\xb1\x92H\x19\x00R\xfdt1\x0ef464\xb7D\t\xc7\x87$\x91\xab\xf2\x88\x13\xcd\x03\xef7\xa1\xcf\x99jc;\x80\x7f]\xe7W4eY\x90\x0fs\x9a\xfe3\x02\xa4\xf6\x8a\x111\xce\xd5J\x92\xb0\x8eM\x8a\xe4IY\x8e\xb8\xb4\xeb\xbd\xa9\x94\x071\xf2\xd3#\xb79?%\xac\xf6\xfey\xe3?Y~-\xab\xc6\x02\xae\x94)\xb7\xb5q\xcb\x90h\x9b\xea\xce\x87\xe0\x03\xb9\xae9\x9dmZ\xb3\xf1\x14\x90\x874\xe7eL\xfe\xac\xbaQ\xec\xb2\xf2^\xf2>\x1e{#\t\x18\xe0w\x01\xd0b)\xa9\xe9V\xe2\xeb\x11\xb2a\xb30\xecf\x18\xb8\x91\x83Y\xa6+N\x84\'\xb7\xcf\xe8\xecN~\xf8\x04\r\xcb6\x8ee\x85J\xb2\x13\x11\xe5\xba\xd3+k\x86\xd6\xd1\xf3J&\x06ZQ\x9f\xd2[h\x11\xa8j\xd5\x1d=\xed\xc5z\xad\xa4O>\xa4\xa1}\xf7\xd7ce\xb8\xb7\xe7\xc6\x94\x13\x94\xbb0a\xadO\x1bRg\xab^\x85\xb8\xfcz`\xfb9\xce\xd7\xe5\x87\xa2\xcf\xb2\xe8\xccc\xb2\x819\x04R\x8aZ=I5O\xa1{\xa4=0\xc6\xdf\x96=I\x83\x8f\xb7\r\x86\x17\xa2j()P\xcd\x99\xc2Y\x07d\x9d\x06\xf4`\xce\xa4\x17\xfa\x96\x91\xa1Ujl\x10E\xa6<v\xed4\x1e%D$\xefy,v\xff\xd4<\x93N\xf37\x0f\x9a\xc7\xe6\x9eY\xd9\xe8\xe2\xdc\xc6{\x1c\xcb\xbe|\xfd\xeem\x03\xf3\xa1\x8e"<\x05\xfc\xc4\xa7@0=\xb5\x1fy\x92\xf6G S\x8b\xc5\x1a+q\x85y\x15\rOj\xe4A\xac\x87\x8a AD\x0c\x0b\x10\xa0\xe1\xf9\xd4\x07\xce$,\xcf\xeazi\x12\x83\x10\xae\x91\x91\xac\x9eAl\x83\xec5\x8e\xa8q\xe4\xaa\xaf<R\n(Wh[\x93oK\x10\x8d\x91\xce\nR!\xd9r\xe1\xa8\xde\xa7\x9bV\x9f\xd0\xbc\xe4$O\xf2H\xc2S\xf1\xe0ZMe-\xca\xa1\xce\x83\x9e\xfc\xdf\xf4]\x89\xac\xec\xc1\x96\x01\xc5\xeb\xf6|kV\x8b\xd6\x18MyA\xb8\xafdWB\x9dF=\xecH:D<\xa1\'4\x80\xc9\x8c\x85b\xd0U\xfc>iP\xc4{\xd5\x03!\x117}]\xc8\x00\',\xe6\x0b\xd9T\xae\x99X\xb6\x90\xef\x99Cy\xaao\xb4\\\ty:~\r\xe1//`\x8f\xea\xa7\xf2FK>\xd6\x11\xc1\xe5ml5\x9f\xd4V\x11\x17\xfa}\x9c\x83\xd1~:\x14\x13\x02\r3V6m\xb5\x1f\xbanl\xecc\xb6H\x95\xdc\x0e\xc7\xa5cD%\xbd)s\tA\x12\x1d\xce\x0f\xbe\xa6U\xf3\xba\xf6\xc4\x96\xc4\xe2\xafC"\xf0\xb7b\x03|;\x7f\xa2\xc9\xefA\x1c\xd6\xc8MQ\xb5\x1al\x96\xdc\xf9\xae\xc9C\xaa\xd81\x06i5\xb6P\x06\xcf|\xb23\r\xd1\xcc\x9d<\x85\x88T\xc4\xe4\x8a\x91F=\n\xa8\x89\x97-\x8fI\x1f\xc5\x93\x89"q\xf1\xd2H1\xb6B\xf3\x7f\xcf\x8e\xdb\x99\xe4q\x10\xe6Y\x88\x9c\x95c\x03\x07\xdf\x14c\x0cm\xf4\x91\x19\xb2\xdf\x88zC\x08\xcdrX\xce\xd7}Rl\xd4\x939\x00\xcc\x03\x9b\xeby\x1b\x92\x8cr\x17\xfe/S\xb2\x8b\xbb\xce\xfc\x87\\\x07kK[\x0eI\xf6A\x99\xd66B\xee\xffMH\x0f\xb2h155\x0c_\x8bedL9G_\xc4\xcdy\n$\x11:2\x89\xea\xd2W\xb9\'\xb0\xdfc\n\xcd\xa0U\xcbf\xfa\xc7 \xee\xea\xb4\xee\xdc6%\x11\xf6\xc8ha\xf8\x0c\xc5\x1d\x07\xdf\xf2pM#\xe3\x9cg\xd3\x11\xd7]4\xc8\xaf\xbd\xbc\x9a\xf1\x84\xc0\xe2\xd3\x81\xda\xaf,tm<\x8c\xf5Q\xf1\x87\x1bvn\x1c\x0e\x8d\x9a\xb0\xbe\xed\x0b\xdb\xb0\xb5\x01\x0e*\xe9:+\x12\xb5\xdb6\xddq\xe9&\xdd|2\xfe\x8b|\xf7\xc0\x07\x95\xf1\x93\xa5\xc6\xc7\x95\x978\xa4`U\xd8\xde\xe9\xc2\x92\xa9\x04\x0b\xf6MxB5\x8b\xda;\x1e,K\xd8\x1e,\x08%\x9e\x95\x8f(s\xd5A\x11\x1eZ\xb1\t\xa5\x84\xcc\x19D9\xaf\x8f\'\x98\xc9D\xa7\xaf\x90\xc8\x84\x05\xd1\x0b\xe6/\xdb\xc4.\xffF4SW0A\x13\xc9\x94\xf3\xef\xe3n\xd6\x87\xcd\xb3\x7f\x94\x1eB\xbe&6\xbf\xd2\x84\xe2#\x1c\xab/\x12?\xc13^n\x84\x00\x15\xafz\xa0\x0c\xbbu`\xa8s\xfd\xfc\x05f.\xf9\xa5RU-\xb1Oa\xcd\xd3,\xd7~`f\xc6u\x10*A\xa94\xbc\xdd\x1d\xb7\xbf\xdd\x1c\xa0\xab\x14u\x83\xf9\xc2aT:\x8a/\xfa\x19\t\x81s\x7f\x08\xdc\xa8\xb8g\xb0\x0c\xa5qY\x034\x8a\x1d\x1d7#\x9d\x16\xa7\xd4z}S\xc4\xcb\x18\xb58\xbd\xf9\x9c+%\xbe\\\xd3\x95h\x97T\x8a\xf0dp\x06\xb64b\xaf\xa3z\'\x84\xc37\xd5\x9f\xfd\xea\xdc\xb0y\xb4B\x8a\x8bD2+\x90\x01\xf5XE\xf3\x13\xe5\xf3\x8f\xc1\xdcm\x970\xe8J}\xd9\xc1c\xf1\xdc\x011\xcfAye\xa4\xf6K?\x1b)\xdd\x95`\xa0=yw\xc8\xcf\x0e\xc6k\x19\xeb5m\xd3\x8b7\xf0\xadzM\xe6Bq\x0c\xf4\xc6K\xb6\x03\x8d\xb6\xa5\x1f"\x9a\xe3\xae\x1b\xd2\xabg\x98\xcf4W\x17o\x03 \x0clH\x9dw+|\xe6\xf0\xcd\x9c\xa0\xc8\x84\xc1#\xac\x10\xb9j+\x87\xc8\xd8zr\x91\xbcf\xe8\x13\x00w_\xc4\xc6\xc0_\xb3\x99;z\xac\x7f\xdc\xae\x91\x9e\x13\xf8y\x84\xf7\x0b\xf2\xbe\xb3#dJ\xea\xbe\xd0\xb7\xf6\xeb\xef\xfaNxk\xed\x17l\xc9\xd8l\xbb\x08\xa2\xd9\x1ay\r\xac\xca\xf7E\xc1\xcd\xc7\x8eSry\xb7]Z\x0f\x08\x12\x14\xd6\xb4\xa9u\xb3\x7f.\x1d\x86\xe7\xa7\xabo\xfba2`Ww\x17h2\xee^}\xc0\x13\xc5\x89\x9a\xf6\xd5T\xd0sYBr\xaa\xb3%\xa8\xf0"\xd6\xd7\xb4\xdfl\xf8\n\x07i\xdf\x03\xd3.Ii\x9c.\xe6\xba\xbf\x94\xe0\'\xa5\\\xe9\xb3v\xae\xa7\x1f\x0b\xcb\xe7*\xba(\x00\xbf\xc5\xb5\x81\x16\xa8\xb8t\x11\x18\xe9i\xb6\xa3\x9c\xd8q=\x0e\x96\x99\xb8\xf9#\xa5\xa8Q\xcaZ\x83@rZ\xa1/)\xca\x91\xf8\xdbJy\xf6\x03\xbcQC\x8eV\xef^\xaedSL\x06\xef\xech\x99*\xde\xa3c\xfd\x17\xaf\xdao\xa7\x8aP\xec\xbfA\xf3(6s\x9e<\x1f\x7f\xcbw8B\x11\\\x8b\xf2\xe7\xa3Z\xed\x17<\xde3\x19\r*UV\x1f\xc9\xfd@\xe2\xa7\xc9pHZA\x06S\xd8\xb5\xaa\xc6\x17`\xbf\xa6\x99*\x1dyG\xd9\x11@\xf1\x8c\x8eZ\x95\xc3\x8b\xf5\x8fakr{t\xf5E\xac\xb2\x8c|_V)\xf3\xb8&\xda\x9e,H\xc9\n\xb1w\x11\xff\x86:\xfe,\xcb@\xa7#\x05\xab\xab\x13S|.\xeew\xb4_\xd2Dc\x01\x15\'\xfaiB\x95\xd46\xd6\xb7\x921`\xbe\x89z\xa6y\xe9\x15\xca\xec\x94\xa7\x8b."\x86\x9bT5\xc1\xe5\xbb\xc6\x7fm\x1cc>\x98\x83OA\xab6r-\xba\x04\x89\x0b\x93\xa4S\xda3\x07]\xbb\x8cm\x13\xf5@q\xe3\xcd\xear\xa8\x13?7\xf4m\x86rI\xe2\x1f\x0c`\x0b[ZJ\xb5v\x81\x16\x8a\x13,\xf4]=\xfb\x10\xd4\x009r|\x1e\xc9\x9f\xd2\xde&\xc5\x90\xc2\xd5\xf3d\xb9\xb6J_\xd4\x81y\xac7\xfad\xaf\x13g"\xaay>\xb7[\x86\x94\xbd\'\xdf\xe4%\x1c]$\xd2\xda\xa0)\n\x8b\xe3PR\x93\x81\x10\xe5\xac\xc2a^6Y*?\xc6\xc6\x8de\x00\x97H\n\x1d\x1d<!\xd7\x86\xbe\x9b_(\xa7\xb6\xc63\xa9IKH6\x9a-\x0b\x92\x85\x1f\xdb\x9a\x9cc\xf4E\xed/`\x7f\x01\xc5\x1d\x81\xce\xc9\x15BB\xab\xde\xfc4L\xe5H\xf9\x92\x9d\xfd\xbd\xe8\x16j|\x13\xe1\xc1\xfeWH/\xcbeSC\xc6/\xb4\xf6dD0\x9c\x00\xacFbd\xfa\x14Xd\xed\x16\xf4\x8f\nW\x96\x9f\xa2f\x9c\xebv\xc1\xba"\xf8\x15,\x92P\x7f\xd5S\xb61\xe9E\xb4E\xa1\x9e\xbe\xb2\xee\xfd\xb92F\x94\x0ek\x8c8;&\xf4\xf2\r\x88\x9b\xb0\xd8\x8d\xf5\x88\xf3\xc4\x10\x90h:\x1biy\x18\xcb\xca\x91\xd6F\x11@\xd1\xb7$\x15A\xc5/k\xa3\x16\xef4\xc5\x824\x19\n=\x8f\xb8Z\xd5\xa9SI\xd2_\xd74\x0c\xb2\x17F\xcd\xe12\xc5\x84\xfc\xc0e\xb62Y\xca\xe3\xd4\x8ew\x91\x17\xa4\x7fE/\x1ch\xc4\x03\xad\x02c!u0\x83\xd0\xedE2\x00\x95\xac\xe6n`OH\x87R\xcbD[m=\x95\xd3?\xe3\xf4xjo\xe4%r\x89\xb2C\xcf\xab\x97\x18\xedq(s~\x9eb\x94\xeb4>\xafR\x98\xf0\xd7\xbf\xf8\xfc\xf1\xa04\xce4v\x8e\xd3\xd0\x18\xf1\xb4@\xba\xa8,\x11\'R\x89\x8f\r*\xd1\xc9\xd7\xaa\xc9\xfe;\x0c\x8e?\x18\x10F|Lmn?\xa5e\xc5y\xa9\xc9\xc6+\xd4\xaa$\xc8\x1a\t\x1a\x0b\xf0\x88d\xeb@\xd1\xf5\xf1\xb4\xd9\xc2\x0bf#DQ\xb2\x85K\xfe\x0c\xad\x9a\x10\xcd\xcde\xfdt\xcbM\xda \xd1\x02\xefx\xde\xc6\xd6fd\xfe\xbc\x0c\x12\xeanC!\xa4\xf0s\xa6\x1d4\xbeh\xed\xd5\x9c\xa6\xf4\x05\xeb\x93\xadvh\xe7\x07^\xb3V1\xd7\x0c\x89\x8ba\xb0xEo\xc7jv,5\xbf\xf7N\x18&\x92.\x95P\x9cL\x99\x8a\xbf\xf5\xc7\x8e!d\xa8\x83s\'\xf4\xe2\xa6\xa3\xd3\n\xcb\xb1\xc9\xf4\xd1\xb2\x80\x7f\xe6\xf4\xd5FyOz@,\xd5\x8c\xd7\xee\x8f\xad\xc2vP\xe1\n\x03\xb0\x8f\xa99\x15$\x7f\xc0\xf6\xa07\xf1(\xcer\xceI\xa1\x81tv\xf1\xd5\x98H\xe1\x8d\xfewE!\xbe\xd4\x94\xed\xf0k3\xe2\xc2X`\xa7\x02\x14\xfe~\xe22D\xd8A\xb5\x07km\xa2\xbc\xc6Rs\x10I\xc0\xe9\xa4\xecZw*\x96Sx\xd6\xe7\x97!k\xa9\xbc\x82\xe8\x86g\x19\xc5\xa5Ts\xf3(\x06\xe7V\x94\xb1\x83\x87\xa5\x05\x9fX\xf0\xc0"2WGb3\xed\xd6\x11k\x9c\xf6\\?}\x16\xfe\xcb\x17_\x08\xd4\x95\x83^\x93\xaf\x14\xdf\x9aG\xea\xecXI&\xa9\xb5\x06i\x82\x9a&\x8b\x17\xb7\x97/\xbc\xe4\x91\x13\xba\xcf\th\xd2\x08\x96Q\xcc\xf7\xe8\xe2\x8a\xc17\x15\xaf\x85@m\xd3r\xb8\x18E/\xa1\xf08Uzd\x7f\x19\xa2\xc1\xbd\xb3\x9d\x06\x8f\xdf\x07v\x0c\x0c4\xe0Q\xddjcp9\xb5y\x0b8a\xbd\xb8\xe7\x1fJ\x14\xb4\xefD\x9f\x00\x8c2".,::7O\xd3\xf1\xee]\xd1\xba\xfc\xeb]\x93\xbey\xda\xd9\xaf\x0cx\x8a\x9f\xe8\xfe]\xe8\x80]\xc6\xc7\n\xfb\xbe9\xb9c\x1e\xaf]\xa8\xf6\xdd>\x82\xdbv\xf1\xf6r\xd4h[\r\x9cX\x05\xd56\xf6\x84\xf1Y&\xfc\xcf\x95K#\xb9\x0c\xc0\\\xe1\x0c\xfc\xe4\x1a\xa7\xcc\x08\xcf\xbe6\xc8[\x1cm&Y\xf1\x8c\'\xbf\xe7\xf0\x18\x1c)\x91=\x998R*\xa2\xdc??m#\xc2WKIS\x8bQ\xc7m\xe9\x06\x1e\x93h\x9f\x1ed\x04\xa6\x12\xac"\xa9\xa7o\x00\x04\xd3y\xc8Y\xb6\x98\x9e\x16\x8e\xce\xd2x\xe2\x0eEP`\xe4\x11@&\x92\xedo\x03\x1f\xcd\xd7\xf2\xc6\xe5m\x86\xd7\xd2Et\xa4]\x95\x14\x16!(?\xda\xdc\xbf\x85\xb4\xe5,\xb1\xb4\xff4?EG\xb3y\xfe\xcf\x10\xf8+\x9f#\xb2\xbca\xad3\xeb\xa1\x19I\xf7\xe4\t\xfa\x99\xf8\xcb\x99,1\x1e_\x14\xb8ul@\xc3\xb1\\\x1c?0K\xd7h\x06.\xece\xc9\xd8"\xa5\\\xec/H\xbe\xf4\x15\xfa\x88\x92J\x15d\xc2\xc2\x80\x7fM\xf9n\x89\xea\xbbmtIQ\x07\x82\xba\xf3\x9eg\xef\x9b\xda\r?]Fq\r\xf39*\xc83\x94\x06\xd3\xfb1U\x14\x1bZ\xc9\xd1K\x1b\xde\xd1h3d<\xf9OT\x9f_\x87\xd1NSO\xac@\xfb\x04\x7f\x8dp\x06\xd6\x9dN5\r\xea]b\x9e\xbc\xf0\x02\x08\xb5\xfc\x1b\xb26\xa2\xc7\xd3\x03^\x0eU\xe3sl\x8c\x1d5k\x9a\xeaD\x05\xa4\x0c\xe0\xaeT\xbb\x0b,\xf7d\x85S\xe7+\xb9\x1e6\xe1\x98\xe0\xd0\xa7\xd8.S\x92\xc6\xfc\x97l\x813\x13\xec\xe0\xd7\xf9\x8a\xc4}\x0f\xbe\x86\x18\xf8\xea\xaeAE\xec\x9f\x95:\xca\xc3V*\x1f!\x12\xdf{\'\x86:?K\x8dl\xaa\x0b\xc3\xfe\xd2\xa8Z\'\x1a\xc7\x91!\x85&\xb8*\xc1\xbbAdJ+W\xd5\xbd\xf2\xe22(U\x0cqs\xeb\xd6\xf5D0bB\xc1\xd6\t\x96g\xd7#\xdb\xc3\xb2^\xea\x85\xa6|\xb2\x14\x9b3\x97D\xc6\x1f\x7fa5\x05OZ\xce\xf0\x11\xbe\xf3m\xd4\x06UZ\xc4\xef\x89c{\x9d#\x0bP-\n\xd2w\xb9n\xcaHpT<\x04\x91^t\x98V\x80\xdcu\x07^;\xed\x8aZN"\xaa\x89\x0e\x90i$\xf0"\xaa\x91\x14\xcd\x9d\xaa\xfd\x8d/\xb2j\xa9\xe2 \xcf\xb9\xdbJK\x1a\xe0\x1c\\\xa8\x10_\xd5\x84\xfa\xf7(\xfb\xedSq\xe6\xeb\x0b\x08\x91.\x8b\x14\r\xe5\xb7\x1ft\xc8\x13\t\xbd\xbf}\xf1\xbeM\x89\x92\xe2;\xd3\xe22\x9d\xbbS\x97\xa5E\xed\xee;\xa0I\x18;\tP2\xe4\xaf\xafr,\xf7\x16\xcdqgc\xef\x01\x9cV\x19T\x80\n\xa6\x7f\xee\xd6\xf1\x85\xe2\xf6\x82c\x88\xd5\x12\x14`dXq\xebD\x06N\xd9~\'\xd3=+\x9b\xeb\x11sq\xb1&\x99\xdb\x87m\xf6s1f\xc5\x14M\x1b\x12e\xdf\xa7\xcdd7\xac\xcd3A\xc3VYc\xe5\t\x81\x92\xcb\x8a\xef\xbc\xa5\xb1f\x8a\xa6eD\xa7\xe8<\xa4\xbb\x0e5(0\xafP\xe0"\x8a\xa6\xcc\xb7U\xde\xf1\xbai\xeb)BY\x11\xe1\xad\xc3\xfc\x07hP}Hm\x8c>\xc5~\xffLWy\xd0y84{\x17\xd0Su\xaaH&:O\tQ\x0e\x15?\xf8/\xfd\xbe\xe1\x8f{\x1f\x83V9|H\xf1\xcch\x00\xa4\xa8\x1c\xcd2y|\x9eh\xcdr\x1c\x82H\xec\x8d\x0fb\x8a\x0cl\xc7\xe9\x84q3\x80\x15\xb4\xf2hO\x99K\x82LI\xe3J\xf8<\x17\xe0\xeb%\x06\xd6\x17DA\x0b#\xe1xx\xda\xbe\xa4\xda\x99\xd55\xfc\xc2J\x8f\xff(\xd9\xd6;@P<H\x83\xd1k)L_\xd9YL\xbaI5\xdbf^Z\xc2\xeaw\x9e\xa4\xbfC\n\x9d\x00P\x9a\x0f\t\xae\xadwG3\xa6\xfc\x9d\xeb\xda\xa8\x14\xd7\x8fo\x11[f\xbbOh=V\xce\xfe"?\xf5\xc7\x8e\x14O\x04S.\x1b\xcb^=\xa9\x0bP\xb4\x9f\xb7\xe0\xf92eL\xf7g\x80{\xea\xad\x1ce\x8fC&\\\xbd\xbb\x02\x95*\xe9H\xd6EU\x11(J\xa3\xd8U)\xd7\x8awgC\xc5\xa5\xae$\xb3\t\x0cJ\xf4\xd2\xed\xcb\x1e\xa7G\xb68\x0c\x19ML\xf0\xa7\xee\xcb\xb1\xc9\xd6H%!\x11\x06\x89\xcb\xb7\xdd\t\x89{\x8b\x064^]\xa0\'_^p\x0f\xea\xb3z]\x0f\xe0&m\xe5)\xe1\xbc\x80\xc5f\xdf\xbe\x8b\xa5t\x12\xc1gj\xe8\xe2\xf58\xbf\xc1\x8c\xb8\xe6\x04\xf3\x9b\xa6%\x14D_\x05\xe4v"\xeb"\xd3\xf2Z]\xac\x92r&\xec]\x8b\xeby\xcap\x99&\xa7\xae\x0c\xc5\x12\xdb\xd1\xd8\xe4FVl\x82\xa77\x1de\xc4\xdb7\xe0\x92\xb6\x92[\xdc\x14v\xde\xce7\xa3|\xd9,i\x9c!X\x08\xd8\x04\x90N\x80\xe2\xdca\xc8S\x89L\x19\x8d\xd1M\x8d,\r\xe9\xa2\xa9\x08?\xb0\x10\x03\xa3v\xd5h}\x9a\x93\x8b\xa7\xbbvk@$\xc1Z\x9a\xe4\xd0{\xd3\xa8=jd=zT\xd2r\xf8/\x8e\x1de\r\xaf1\x04\t\xc1z\x93Qw\x0b\xae\x95\xef\xd3\xde\x11c\x04\x04\xf2\xdbZp\x03\x11\x90\xd1\xca\xe9h\xf9\xbc|l\xc1Jn\xf50j\x1f\xa6\xf4\x99\xea\x9f\x19\x04t\xfff\xb36m\x9e\xef@\xf0\x9b\xec\x84\xbdi\x8f\xe3qJLX>\x17U\x9cw\xca\t#V\xdf=\xb5\x19\xb3\x93!\xdd\nH\x8f6\xcfp\x08db\xf5@%\xb0\xf6\xc6\xf6\x94\x84\nQ\x83\x89\xe5nor\x93\x83m!\n\xeaW\x97\xf0\x8e\x96\x84\xe5<4\xf3\x17\x82\x18}\x9f\xcb\xe0\xc4\x81\x95R\x9a\x16kg\xb6_}y\x0f=\x109\xdc0\xbe\xa9q\xd1\xee\xe9\'\x05\xde\xc7\x8f\xfc}Gx\x0c\x88\x83\xb8\xbb2X\xbc\x1a\xdd\xdf\xc9%-/\xe8\xd6j\xca\x88iWr\n\xde\xf0\xe9\xac\x85\xe5\x8d\xb1\x1dg\xfe]"\x0f\xc0\x0eE\xcfJ\x13RG\xfa\xb0\x8cg\xaae\xe0\xf7~;e\x87\xfe>@\xe6_\xf5\xa4\xb7M\xa6Y#\xecU\x95\xed\xff\x16\x8b\xc3\xcc\xa7#\x80PQ:\xba\xb3\x1f\xc4I\x9ft,\t\x8f\xf0\xd8\xaa6\xde\xb7<R_\xb7\xdc8^dv\xe2\xb7c\xd8\xfal\xa7\x90"\xc7o\n\x0c\xf7\xbaE\x9a\xc2V\x8e{\xc6\x1fj\xad\xf5J\xa4\xc46e\x90\xe3+|\xf4\xe8h\xdd\x9b\xa8\xc8q\xc0\xbe\x94\'\xc6\x12\xf8{\x1e\x82(\xefN\x06\x81\xf73R\x05\x9b\xe1\xb0\x03\xc9+\x0eQZ\xcd\xef9\xd0\x81\x17Btv\xd2\x14\x0bo\xcd;\xe3\x06S\r\xec\x14\x03\x83\xfb\xe3p)\xcb\xef\x9dP\x1fO>IAG\x99\xfd\xd2\xfe\xbc\',DD1\x9f\xa1\x91\x00H\xd7\x9e\x0b6@3r\xc1\xa3\x8e"\xfbg5l\x8b\x01\xba|\xbd\x18\xef+\xce\x91\x15\xaf\xd5lYC\xcf\xcf\xacn\xc0\x93,')
|
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\x84\xc4\xd2\xa7j\x08\xbdK\x06x\x83\xb5\'\xe3\xda@\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xd4#\x97\xabl\x187\xeb\xe3e\x16\x95{5A\xa2P\xb3\xcf\xf8{1\x16\xbd\x04\x83\x17s`\xfdY\xcc\x02\xbag\xc2_j{\xb5\xcf\xbc\xde\xe4\xd7R7\xc3\x0b\x88\x01\xe2N\x8c`\xf5\xa8b\x16\x11\x8d\xb1GCd\x11\x13\x0bbM\x1cx\xd6+Zg\xccBVy\xbdE\\!L\xfd\r\xee\x0e\xf3e\x8b~]\xd6\xff\x86\xa0\xe4C\x18\x8e\xe2\x90\x8d\x00S\xfb\xe1\xb2/q7\x89\xc7\xe9~\xe4\xe7\x1f\x80\xdb{\x1d\x0es\x83=\xaaD\x81\xbb\x98K6*w\x80\xbf>\xf6\'\xf7z\x9d:\x18\xd9|\xbb9\x99u\xeewz\x9b{E\xae\xc0\xedw\xaasr\xa8\xe8`q\xc4n\x81\x1f\xda\xedz\xb1\xf2\xd9}\xc2]L\xe8\x9b\x05\x9d\xa7\xbfHR\x84Do\xc9\x85\xa6\xc5\x88\xac#\x9e\x13\xd0\xd5\x91\xa3k\x81\x98:?\xfc\x8c\\\xac\xa3\xb6m\xd9\xb1\r%T\xe9\t"\xa5toK\xdfOfS/4\x8b(z\x01\x8dEv<G\xfd\xcfA\xeb\xb3\xa5g\x9en\'\xaa\xc1\x83Qt\x95:[\x03O\xdd\xb3j\xd2\xc0\xa9f(\x9a\xa0+\x1c&Ybd \xd2\xf9\xe79\xa3\xdcX\xf8T\x83\xaf\xde\xf6/\xd3\xf4\x1a\x1d\x17\x9f\xc8#x\x97\x08f\\\xbf;\x91\xef\xb8\xbb\xba\xd4\xbb\xa6\x8bX\xf7E\x8cX\xa5h\x94\x9a\x9aX\xa8zC\xc5\xd2W\x19\\\x16\x0f\xdd\xacA\\\xa0\xd8|\xc9\xf0\xf3\xfe@\xa7{\\\xc8 0\xca\xba\x1bRShR\xc2\x00F\xda\x12\x06\xa8\xc0\xd2\xbc\xf4\xca\xbb\xf2y\xed\x9e\xa1fvp\xf7\x19\x96\xf7\xb3\n\xf2\xd9`\x80\xa0\xe8@YS\xd9"\x9b\x1d\xe3\x8f\x07q\xc0m\xcf\xa4\xdf\x93\xd4,l\xf2\xf7\xd79\xe3\x93\xb3\x7f\xe7\xebc\xaa\x90\xbf\xcf\xa93\xa6\xd7\xea\xe3\xf7\x1af7[\x7f/\xd0\xd5\xa1@\x85\x92(\x89\xc6\xc4\xc0\x88\x83j\xf7\x16r\x87W\x8a\x9eu\x19=6\xe0)v\xf1\x0f\x1f\xc3H\xaam\xd6\xb9\x1c\x9b\xac\x81\x153\xe3\xcen^\xcanjB"\xea\x8e\xa7\\\xca\xcc\x9axj^\xbd\x8f:\x13\xe8\xeb<\xc8L$\x8a\x91\xf8\xaf\xf8AK\xda\xe7\x84\xc2(\xf6\xc5\xe50\n+\xf4K\xe0@\x88\x918]+\x06\x98\x1d^f@{\xc1\x1aMg\x9d\xc2V\xc9o\xd5 \xbe\xc1\x9d\xdb2q\xc8\xf1qq\xec\x93G\xcf,\x163\xfb,\x06\x7f\xc2\xba\x89\x0c?T\xd3\xf65Bu\xbe\x85n\xbbRz\xf4M<\xb8\x00\xbb\x0e\xaa\xaaKS\x88\xc4\n\xa0\xb9d\xd5\xdc\xa6\xca\xe9\xc5\x05\x8fb\n\'e\xfbmI\xc1\xcbH\xab,\xbb\xb9>b?\xb7E1\xa8}\xde\xf9\x82#\xbf$\x90=c\x90_Nd\xac\xb6I\xe4\x87\x98\xa7\xa6 i+\x04/f\r\x92\xbbl\x9av\xf8m>\xd9\x95\x0b\t\xf2\x1a\xa5^\xae\xe9\t\xdd\xce\xb1/0p\x87\x90G\xa4\x11\xe6x&2\xa0\x89\x0cf\xfb-\x86\x81\x99\xb0r\x0e\x9d\x9bJ\xec&\xd4\xb0/8\nU4<~\x15(sn\xf1c5\xea3\xc1\xfa\x80gEO$}\x8e\x95\xca\xa7?]\x031\x1c\x80\xad\xf6\x118\xaf\x0f\x171\x8c\x02\xfe\xe4\xdfD\xb5\xea\xdf\x08\xfa\xec&\x178\x19\'\xc3\xecoT\x1cT\r2x\xb6\x86F]?\x1b\xfe\xdd\xcfhb\xa5&\xb4\xa1\x9c\xfe[\xb0\xcdL\x96\xc5\x15#6\xb75Z\xc9\xf3\xdc\xa8\x8e;$F\\.\xe15\x14\xee\xe3^\x84\xa9\xbb\x9555\xcd\xc4\xbce-\xb6b\x1e\x1b\x03\xeb1N\x1e\x8e\x7fG?\n\xddz\'=\xb5\x9f\xffdr\xed\xb13\xca\x11\x99\xacw\x84:\xca\xb9K\xaew\x13(x\xc9\x8e\xb6Y\x9aI\xa6\x9f\xb6\xf1\x86 %\xff\x00\xbd\xe8\x02\xd1\xe8\x10\xa9|\x81\x8e\x1e<\xbd=\xbc\xe8\x10]\xffHR\xc9\x88\xd9)C*\x1c`e\x94\xc7\xdd\xab7\x93m\x15\xb0\xbe\xbe\xf3\xce3\x88\x1ap\xa4Y\xcf9\x97\x95\xf2\xe9\xbb\x97\xd6]\xe0\xfa\xd7e\xff\xaa\xfc\xde3\xa9\xa4e\xa9\xd6\xe0\xd2\n\x91\xdch\xb8\xef\xc9B[\xa4\x0c\xf2d\x80."c{n\x01\'R\xf0C\xe0\xfd\x7f\xfa\xd0\xbb\\\x9e\x81\xc51\x06\xcd\xc6|\xcbC\x8d\x97\x18\x84U\x18L^\x89\xb9\xbf\xf5#\x83\xe7\x07\xc8\x86\x07\x1b\xe0J\x9b\x95\xfar\x1aHI\xb1,wJ\xe42~\x97\x01\x87s\x90\xffw\xa4\xf5\xf8\x9b\xafp\x00\xa7\x95oE\x8c\xd8f\xbd\x10\x13P\x973\x18\x95\x13L\x06\x9f2\xeb\xaa\xf5e\x1b\x13\x85\x85o\xc2\x00\n\xa2\x02\x10\xb2\xad\xd4\xaf\xaa\xd49RWT\xf6\x84\x86v9\xe5J\xed\xf6v\xdb2\xf2\xd9U 7\x95\xda\xb0\x8c\x1a\x08Y\x11zl%z\xb1s\xcb\xd6\xc3l\xeb\xa4\xb0\x1bZ\xf9\x98\x81\xd7\xb3\xd9.W\x0c\xcc}<\xb8D`\xbckri\x81TE\xd4\x81\xfc\nB\xb1\xd1L\x12I\xbc\xf63\xf1\x12\xec\xcc\x8b^7\x14\x19{$\xfe6I\xb3\x12__\xb3\x99\xdb\x9f4A\x08\x14\xd8XR\xc0\t\x8e\xe8\xc6\x9d6\xb5P\xaa\xfeA\x05\xfe\xeb\xc76pE[\\\x1b\xc3\x18WT\xa7\x19x\xf5\xf4\xc7\xd5\xfc\xd5\x06+\x96\x0f\x96\xc0\x0f\x00\xd0M\xed\xb2\x12\n\xa6g\xc6\xf3\xdd\x89R\x19\xf2\xd8\xa8\xeca\xfbi\xc8\xfe\x98\xc1\xa3.B\x8fc\xf6c\xfd\xe1aK\t\x92\x16\xdd5u\x06J\xf2\xa3Fp\xac\xc0c\xb3\xf6\x9e=\x81@\xbe7\xc0X\xe3\'\xa7~\x81R\x0c\xe4hW\xa1\xf0V\xb2"\xf6\x02\xad\x10\x93\n\x9d\x15\xbd\xed\xe9\x00\n\x1b/\x8c&\xf4\xad\xed\xb3_K\xa8\xa5\xe6\t\xa7\x0e\xd3\xe9\xb8\r[\r\xee_:\xc5TYD\xbb\xc3@\x9e\xaevJ\xa17&\xd7a\xb4\x12B\xa0\xce\x1c\xc1Z\\b\x0ea*lGr\xf1\xeb\x19\x9f\xd6M\xd7\x92\xf9G\x83\xeb\x0e@*+<%c\xf3\xa1\xf9:\xf1}\xc9\x16\x00\xdc\x0btiY\xe0\xae\xfc:\xe0\x93\x19\x0c\xa0\x9eP^\xc6\xc4\xc6D\xe9zT\xe1\x0c\xb9\xfd@%n\xc2U\xd1t\xcc5\xce\t\xb0\x89@V\x1d\x8dMWNc\xf0\xe7\xcd\x8c=XI\xcc\x1c\xd7\xe2\xf1y[YL).u\xc6H\xd2u\xf4\xe8\t\xf8\x98)$y\xd1wkv\xae\x168(W\xea\xc7\x03\x94y\xd6&\xa7\x9fxk\x9d\xab\x0f\xddS\x97\xad\xfb\xb0\xa7\x04B\xf9|\x87 \x97\xa8\xa37T\'\xa1S\x14l\xa1Z\\\xf6\x95zk\x89\tZ\x89\ts!}\xc6p\t~\x01i\xfa\xf4e\x03W\xd5&\xbe\xe0\xa3\xc4yz\xde\xdef\xab\xa35yw\x90\xe2\x19T\xc1D\xfd\x87\x1c\x84w\x83`W\x16%X\xb2\xc6Q\xdd=\xe8}\x8a\xb4\t\xc3\x17\x99\xe5\x83S\x9e\xb22\x16\x96\'\x92l\xa5\x98\xfb\xaeX\x89\x1e~0\xa8#2\xe3\xea\xb1\xe5\xe5\x82\xe8lt\xd3\x17\'\x0e9\x16n\xa6"\xde\xf0\x85(^\xa7(o\xc7\xa9T9\x82\xf8)\x8b\xc5UW\xf9\xfe\xcf-0\xce\x9c\xe9Q\x86\x8d\xafe\xa1\xaa\xd5\xbd\xe1\x14\xb3j\xc2\xd4\xc8\xf7n>e\x93R"\xff92A\n?n\xcb\x14\xab\x96\xaf\xb1\xe9\xa8x\xb8\xe4\xd1\xa1\xf1\xe9\xbfM\xd1\x7f\x94Sg\xff\x1e\xc4B\xeb\xcb\x8b\x13\xd8\xa0\x07p3w\\\xc0\xf4\xb0@\xb3\xd56c}\x079\xeb\xbe\xa2\xb10H,\xe2\xd4\xbd)\x94\xb9z\xf7E\x0f\xedPz\x15\xe1M\x18\xe1\xc9\xd4/\x0e\xa7\x7f\x903h%,\xc2;\x19 \xb3b\x1cg\xf5\x89\xd7\xa6\xe6Z\xfbth\xc5\xa4\x82\xc4\xf0C\x12\x93Z\xc6\xd9\xcd\x13\xe4"\x06L\xdb>\xe2\x91\xbe\x14\xfc\x0b11\xc4b0\xd9\xbav\xea\xcd\x11\xd6TH\x83\x0f\xder\x17\x83\x0e\x17\x8e:Wf\x80%\xbd\xdf\x91\x02\xa2\xcf\xbd\xbe\xe8D\x829\x08ih\x158\xa0\x89a+p\xa8\x19\x99iC5\x99\xd8\x9c\xff\xce\xc05\xb5V\xcf+y\xeeo\xa7Trg\xd8\xcev\x7f5r\x87\\\xf2\xcb\xa1\xfd\xc0k\xe1p\xa1g\x96\xa7\xdd\x85\x06\xb3\\\x84\x8f)\xc7\xc4h\xe0@\xe2\xa6\xb0W`nk,\xaa\xbd\xa8\xa93:\x11^\xcc\x90\xb2\xf5P\xb0y\xd5\xb90A\x0c\xc3\xd5\xf8I\x9b\xdc}\xd2\x1e\xf9\x1a\x9a\x9b\xaaW\xec\xce\xff\x18\x10\xee\xa9\xb3\xb2\x96>B\x1b\x1f\x03\xed\x1cD\xff\x99\xb7\xdc\x8b\xfec{\x86\xe4[o\x93\xe4\xb0i=_\xab\x15\x0b\x15\x0e\xd7\x05\x815\xc2h\xae\x87\xd0\xbb6E\x00\x92\xf9\x95\xe6\x99x\xdf\xc2\xdb\r\x05\x13\xfb\xa0\tG\xb8l\x1f\x8d <;\t,\xd6\xd5@\x91\xa3q_\xa3\xa2\xaf.$\xe1\xc7\xef\xc3\x19\xdd\x8a\xba\xdb\xa7A\xcf-\xf6\x1dV\xe5\x98\xc8\xb8\xba\x01\x82\x12kM\xf2\x93\xc2\x89\xfe\xa5\xe4\x88k\xe7<T\xb6\xe3\xf7\xd1\t\xd4\n\xa8\x11\xd7_\xaf\x03+\xe7\x7f\xacB\x8b\x8f\x8fJ\xd8D*fb+{k\x12\xca\x83\x05\xb8\xa9p\xec\\\xfe\xf3\xc2\xe5u?\']\xbd\x0e\xe3\x88\xe6\xd5\x05w\xf4\xa0{\xbe\x17d\x92!}\x91e\xeb\x87\xb1\x1e\x7fb$/\t\xb6\x9aD\xab\'\x85\xfa\x86/\r\x8f\x01Q\x9b\x97\x87F\xfc\x9fl\xf1&\xe0w\xf9=\xdc\xf6#\x81\x13\x05S\xa9\xee\xb2\xf7\xc4\xae\x07\xb4Y\t\xb2y\x072\x15\x0ed\xca^\x9cz\x8b\xd8\xb1\x19\x81\x18\x1b\xa0WI\xd6s%}p?\xcc\x17\xcb\x97\xd0\x987\x01\xd0C\xc7\xc0\xb2\xcb\x89\\\x9b\x83=\x96\x07\xd8\xc2H\xd9\r\xf8%\xa1\xda\x9a\xe3\x91\xbe\xc4\x8c\x9b\x942n\x88.CzV\xda\x15\xb4\x0f\x89\xe32\xc6f\xf3l\xbd\x02E\xe3\xbf\xaa\xf6\xd2k\xf62\xc0{\xca\x13n\x15\x11w+\xb9G\xbc\xc3\xb6\xae\x99]][*\xa1\xe7|\xea=uy\xa7Yw\xc9j\xf0WsQ^1\xb3\xd7\xae\xd8\xbc\xe1\x96"*\xe0O\xf5!\x0c\xad\x965\xaeml\xcen\xef\xe6n\xacY\xb1i\x92\xed\x9b\x95x\xfa\xc4\x00\x01)eP\x99\xc2\xcb\xdb\xc1r\x17{b\x8a\r\x12F\x97\xa0|\x8fp"\x1bD\x00\x83cB\xbc\x99i7t"\xc7\xf6nm\xfbJ\x8cS\xb0\x88\xaf\xa3d\xaf\x1a\\\x1d\x98\x0bq\xc9\x15\x0c\xbc\xf5v\xa2\x18B07\xf3\x8b\xe3w\xcfV@8m\x9cJR|\xea\x1d\xc4\x97\x9fcbHlpJU\xab(V\x8aIi\xee\x13h\x8c7\x96\xc7\x0e\x18g\xc5\x9c\xc7Z%V\xbf\xf4\x01nD0\xed\x1d\xa9\x05(\'#\xb9b\xfc\x7f\xee\xca\xc7\x1d\x88\x18)[\xae\xbd\xf5\x9b\x99b\n\x19Ww\xff\xc3\x82\xbc\xdb\xfc\xb6\x93\xbcg\xf6\xbaw\xa9\x9d\xe3\x17[5kMt\xb6;/+\xb9p\xd6,tA\xe5C\r\xd0_\xb1\xa5\x9a\xb9]\x18\xe6i0\xc3\x07\xb3j\x92E\xdd\xd6.\xdc>{p\xf7\x9b\xfdh\x93b\x10\xb6\x1f\xda\xe2\xfaz]\xd1!HecI\xbd\xb9[n\xb4?\xe7}n\x99>&\x97\x95w\x8c\x9d5\x7f\xe8c\x1d\xcc\xcb\xb5]\x9f\x88\\\xe0\x7f\xa6)\n\xca\r\xd7^-\xa1,\xcf\x14\x83|\x1cV/\x11-8\xd8^e[JK^\x113\xef#\x03\xebJ\x16\x1f\x85\x866;\xeei\'\xeb\xb7g\r\xe5\xa1\x11\xfc\xb1\xbaQ\xb4\x90\xbd\x04\xde\xa0\xc7\xffbIB\xd4\xa5p\xefi<\xcf{\xde\x04d:*9nV\x8bg]\xd4}\xbdc\xf6O\xb2\x01\xa9\xd0d\xb5V&l0.\xb5\xda\x04\xd0\x96Kq<\xb0\xb9<<\xc4\x8b\xbd2\x9a\xd7\xa8\xa8\x8d\x0f\xb58\'a\xf2\x1e\xc1C\xbeg\xb1L\xeb\xaf\xf0\xa1\xd5\xdc\xd4S\xd5)\xab\x95\nv-{\x17\x11\x0c\x86\xed\xe5#\x044\xae\tr\xb2\x8f9\xa6\x8d\x0b\x8c\xb7}\x87]\x90\xb1j\x15\x0cW\xd8\x05\xe0D\xc6N\xd3C\x12\xc4\n3\xbbWP\xa9eB\xe8\xafuI\x19u\xd0\xfa\xc8\\\xe7\x83\x0e\x03\\n\xe9\x870\xb6.\xc5&Z\xbf7^\x0e\x1c\xfd\xb9\xe9\xbf\xf3Z\xfa\xf8T\xaa\xb0\xb33\xf4R\xb5\x9c\xb0\x90\xdd\x14\x1c\xc8\xfe\xc8`x\x9bg\xf4\x8cu\xb8\xcd\xf3\x0f\xda\xf0\xb4\xd0z\xf2\xb1\x18m\xaa\xe7mt\x9e\x99kvCCf\xfd\xee\t\xba\x14;\x81\xf5\xd9zO\xcd\x8d\xa4}\x86\xd5\xb5\x80\xe9"\xc2l\x07\xd0\x10\xc0\xde\xbf62\xe3q\xaf2\xa4\x8ee_bO\x81\x0f7o/:K\xe4+*\xde\xf2@\x8a\xbf4\x99\xfa\t\xd2\xfc \xae\xb6|c\x00[\xa9\x05\xe4.\x82\xca\nV\xac\x8d\xdf\xc9\xcd\xef\xec\x98\xb9\xdb\xfb\x03\xdaq\xc3O\x97\xdf\xf7R\xb3\x02\xc3\x87N{\xb1\xca\x81l\x05I\rL\xe8o\x96&\x95\x98\x10\xf6\xa4\x07>\xc8\x1c.\xa4-q\xd5\xbc\x0e\x9c%\xddC\x98\xde\x8f\x0e}?\x8e\xd5E\xa0u\x10\xe4z\x108\xe7B\xd5&\xbc\xbc\xd4\x93A\xf2\xa2.\xa7\x02E\xec\x90\xac\x81@\xe3\x1c\x12\x01\xa4`\xb7\xa7S2\x1f\xbc\xa5\x9e\xba.\x97\xed\x1a\x1f\x9d\x1d\x87\x8e\x113\xce\xc2\xde\xefZ]\\N\x9c\'C\x80n\xf7l\x90\xb0\xf5\x01\x91\x16\x02\xb7\x904\x0c!G\xffRM\xf4!(\x1fG\xeb\x1b\xa8\x90O\xf0\x95\x9c\xaeaJk\xb7\xf2\xce\xe5\x1fs\xab\x16\xed.\xa5P\xf3\xb41\xfb\xbd\xd9\xfb\x95,\xfb\xfc5\xb6%pmc\xc9\xa9\xeel\xd2\x1cpe\x0eB\x1c\xcd\xfc\x0c!x\xd9O\x01\xaa\x0e\xfd\xa5\x8b\x8c\xc7\x1b\x85\xcc\xf4<\xdd\xf9\x89\r+V>f\xfc\xa73`\xa1\x8fB\x86\x96\x8e\xbf\x1c\xf9\xda\xbe\xe34\x8d\x9e\x1e\xf5\x81n\xc9\xec\xf8/\x84U\xf5\xcfZk\x83\x13\xca\xc4\xf9g_\xc5\xa7\xbc\xff\x07\xe8e\xcc\xa3\x9eb\x0f7\xb9\x8d2\x00\x06j$Y\xb2\xaaP\xed\x02K\x98\xae\xdb~Y:m\x0b\x8d\xe0\x91\xfdz\xe7\xb4p.\xbc\x89\xc6!f\xdaK\xedi\xd1k\xc6\xb69\xc1Vj\xd0\x8b@\xa3\xbf$= \x07\x1eg\xe1\xa1\x9b\x8a\xda\xbc"\xaf\x9a\x99\x19-\xeag\x8c\x832\xb7\xdf\x9e\xb5hxo\nhe@\xdd\x91\xfaP\x15\x07\x84C\xd1\xd3yC+\x89\xac4\xa3\xd4\xf0bL~\xc1\x91Db\xb9\xfe\x17\x85Z\xf0\x19]\x96\xd7\xd57\xbb\xa5\xaa\xa7\xc3t-y\x8b\x1cSVr\xe7I\x17\x8bV\x0c\xb2\xe0c\xe9\x80.\xeb\xc8\x91\x99\x8fA\x8a\xeb\x9aI\x92I,\xeb\xc7\x82\xb1W\x0c;\xdbW\xbeK\\\x1b\xfex\x88 \x1e(\xe5\x17\x8b\x84\xce\x19m`|~A\xcf\xd9\x94Q\x18\xe44m\x9f\xfb:\x8d\x8d\xa3i\xf5ZZ#\x87\xe4\x19D\xb0c\xed\xb2v\x05\xac\xe28\x96\xf4Y`\xd4\xba8\x16\x10\xbc3\x12\xc4\xa3\xb9\xf4\xbc\x1f\x0fZ\xc3/\xd5\xab\x0eU\xd2\xe3\xf2\xe6\xf2e\xe1[\x9e#\x8e\x17n\xad\xb4\xcc\xb1t\xa7A\xce(\xf0(\xccD]\x97\x1f\x9eD\xacwU\x81\x12\xbb\xb6\xc7\xe8\x06\xb61\xefJp\xab\x14\xc0\xe0\xab\xe4\x1f9d\xb0D\xbeV\xc2V\x8e7\xbb\xd37\xb6\xdbCUXe\x94;\xac\xd1\'\xdb6ro \xe5\x9fS\xbb\r\xaf\xf0\xa7m>R\xdeXu\x8c\xc4\\\xb2\x0f\xdbt\xa1\xeb\x92\xdbi\xd3\x0et\x85\x16\xae\x0f\xf1\xe1\xb0\xcb\xa9m\xd1\xf0?}\x8ff\xa1\x8d\xb2\xd7l\x16\xc3\xb3\xdd\xd9\x85*\x94\xdb\x98\xa07l\x1f\xd6\xee!\x7fei\x05l\xab\x1c\t\xda\x94\x8d\xbc$:r\xbe\x9a\xe2\x98\x9eT\xba\xef\xd7\x9e*+.eM\xaa\xad\xc33\n|\x18\x07\xbb\x13\xf4\r\x8ai\rj\xb8\xe5K\x08u!\xcd\x83f\x9e\xae?\xd2\xd7\xf84\xae#e\xa8\x98\x9eZ\xb1V\xd5\xab\xba\xf7\xfa(3\x1b\xf3\x1b$\xe2\xd3\xfe\xef\xe5\xd1;\xab?\xfb\x98f\x11 -\x99\xbc\xf7\xe2\xd2\xf6\xa1\xf9\xa7Q"\x05L\x18b\x1cV\x0f\x02S\xab\x95/\xff\\\xe2+la\xcbUm\xe7\xe93<\xff\xf3\xab\x84kkO\xd7\xc4\xfe\xcb\xcei\x054~.\x99q/o\xcd\x99\xee>`\x11Z\x81\x1bkt\x89\xb5\x10\xb5\xc1\x92U9\xf7vc\xf0\xf9Kr\x07i~\x16;u\xa1mN\xff\x06\xc3\xdf\x97\xb8+\x87\xb6\xa5\xf4\xed\xc8:\xa7\x94\x165VO|\x8d\xb52\xd9\x94\x98\xf6\xca0\xaa\xea\xa5^\t\\\xebI\xc4c:\xed\'?[\xfc\x82V\xdc0\xd6g\xb3D)\xa7Yr\xdcJk\xd9a\\th\x8b\xe8\xda\xf3-1B\xf5j\xa1\xa92\x1b]#\x91\xa4f\x80\xe3\xabY\x8e12\xb6g\xdd\x8aot\xd7\xa7\xac\xd4"\x17\x80\xd8%u\xce\xce\xccPB\xdd,\xf3\xfa+\xe5\x95\xf2\x06R\x10\x96.\xadB\x97\xa5#\x04\xbf\xa2(^0\xb0\x89\xca\x18g\xb0\x0e3w(\xabE-\x91\xdc\xa6n\x82\x81\xa6\x1f\xdd\x7f\x80\x17m\xb9bG\x8bo\xe9\xab\xe7\x13\xcal\xd6\xdb\xb0\xe8\x08\x0bF^\xff\xe2\x00\xcd\xc9h"\x8f\xa4E[_\xfc\xad\xaa\xcf\x8bs@\xa6p\xb7\xb1\xf2\x11`\x85\xa4\n\xb4\xacr\xc6\xc4a\xe8yO\xee\xe2\xf7O\xf2\xf8\xacvd\xe6ZF5(\xd6\xb6\'\x87\xac3{5\xb9b\xb0\x91qP\xa0\xd1\x9f\xaef\xc9\xf9B\xb1\xdbP\x1b:\xdd\xb2}\xd4\xb5$\x80}\x05\xf0`\xe05\xea\x91\xa5\nE\xc0x\x97\xb3\x95\xe4\xc7m\xd4q\xd4\xe7\xa42\xc9A\xb1\xe0G\x86kjA+@\x944\x1b\x1c\xfc\x18F\xe9\xbbxxn\x02\xa9q^\xa6/\x17\xdf9\xf3\xb4ba\x9e\x8e\n\x9d\x80\xca\x9c\x08\xe0\xd5\x19\xab\x11\x1b\x0e~Uy\xeal\x18\x86\x05=*\x1d\x08 \x05P\xf4}\xcd}\xe1\x8c\x1d*\x8fO\xa9r\xe7&q\x01\nT\xc0XJ\xdc\xaf\xe6\x14\xab\x0bk\xbfW\xef/\x9d\xb4Wm\xa3\x88\xa5\xe5\x92L1\xdcP9\xc0\\\x8d\xf3?\xbf\x85\xa6\xa1b\x95\x92\xd9\xb7A\x07\xea\x88\xa6\xde{\xc6\xb3w\xa925#7\xb6\x07\xd4\xde\r\x16E\xaeq\xa3\xf0\xcd\x03c\x8a\xeb\x1b\xb2\x8c)\xe9\x143\xb2\x9e\x88\xbd\xf5\x7f%\xd0L\xe8\xb3\x8eN\xe7\'\x8d~\xfb\xeb\xd6\x1bu<\x7f\xec\xff\xdf6\xa3$\xfbE\xcf*\x83Z\xc8\xdb\xd0\x020v\xefM}=\x94\x02~#4\xa8N\xabD\x8d*h\x1f\x9d\xab_\xb7\x9b?\x92ll\xc5\x16F\xc8\xd3\xa2\xfc:y~/aZzlO,kqI%\xac\x1ca\xf1r\xd9\xc2Al\xf2Q\xd5\xadXZT\x8e\xd8I\xca\xb3S\xb7v\xe9\x14[\xe7\x05}\x86\x87P\xce\x0ef\x0eq\xb7\xaf\xc5\x89\xb9\x8fNQ\xc7mR\x05\x1d\x18\xc1\x90\xe0K\x97\xd4\xc6\xa7X\x913>S\xfe\x01\t\xf1=>\x00\xc0\xfe\xe1Ki\x9d%\x05\xbb\xff^\xa8;\xf9\xc4\x17\xe5;\x1e\x85\xbfu\xc8s\x0c\x7f\xa5\xb6\x90,\'\xd4\xda#\xdc\xdaB\xef\xff\xba\x11\xfc.\xf2\xab\x02x\x8ee\xa5_1\x16\xdcVy\xca\xcf\x88B\xc8$[\xa1b\xa0\xd7\x0fc\xb8\x98\xd767I\x04\xd2Nc?\x1a\x95\xea\xd2\xcb\xd8\xc9\xd2\xfd"\x8aU\xddso.\xb6\xdbg\xbb\xf3u\x87mlq\xb6\xf4\x96Z\x89x\xc5\xf5\xc9\x95X\xed@\xcb\xef7?\xae\xa9\x87\x1dt`(\xc3\xff\xe5$8$\xf8\xb9\xe2\x13k\xcc\xf5\xfdJm\xb7\xba>\x1c\xa3\x94\xf83\xf5\xa3\xfeu\xc4*\x14\xf6\xac\n\x95\xeb\xee\x07\x9c\x12\xb88\xff,\xfdJ\xbf\x0e\xe8#L\x13g\xf05\x05\xcc\x82\xe3\xe87\xf9\xd9k\x91!\xca\xe8\t\x00\xd6\x11\x9fQf\x9fR\x07Oq\xf0\xc1\x99@\x95\x93ns\x99\xd6\x87\xa1*s\x1f\xe8m\xed$\xbc\x19#\xc5\xf5\xcc\x17\xd8a\x9cg-8c\xfe)%+vI\xf2\xf8\x9b0N\xc2\xe3<\x10\xf8pZ\x13u\xb4\x12R\xae\x9f\xe0{\xab)!\x9ffh\x0e\xe6d\x7f+\x19\xc79t\xe4\x0f\x83\x96d\x85[\x8f\x03g{\x8d\xc0=\xf7\x0f\x19\x0c\xb8n{3\x87\xb1d\'\x7f\x86\x07\x8ff\xd9\x0c/\xd5\xbf2&\xf5\xa7\x14\xac\xa2\xcb\x19\xb3\xef\x15\xa6\x8d-\xdc\x8c+\x06I\xbd\x81\xaf\x13u\xfe\x1c\xf1O\x8b\x17\xed\xe7O\x08\x0f\xae\xf8y\xe7g\x85H\xf0\x96\xb7\xef\xd20r\xc7"5\\\xa5c\x16\xc5L\x14m\x96\xc2=\xd0\xb3~\xa0\xd3\xc7A\x8fY\xed\xdb\x84\xf5\x1ad\xdf\x13xh5\xe9:R\x01Z^\xb8\xa0\xb9\xd2\xe1@Z^\x90~\x16\x12\x94\x88y\xda\x87\x8c\xc3\x02\x84\x96\xe8\xb4\xc8w|/\x92#\xe7\n\xee\xad\x1cc\r"~6<\x8cCw\xfc&\x14\xfe\x97j\x8aI>\xaf\xe8\xcf\x05;\xd2:\r\xaal\xde\xad\x06S\xac\x97k\x08Ffj\xce\xfbi\x03\x1c\xe2#\x93\x87*\r\xf9\x90\xda\x95o.\xbb7!\r>V\xb9\x981{\x8da\xe9Zg\x7f,\xf4\x17p\x1c\t\x1d;\xefiP\x17\x9f\x19\x82n\xd6\xf5\x8b&\xea\x83\x1e\xb8.\xf2{`\xf2\xa5\xc9\x11 \xa5N\xd4\x81hCA:\xf6\xa1\xefI\x99\n\x97}\x1b\xc4\x06D\xc7\xe18g3\x08\xf23\xa9\xc2r\xe13\xa1\xdc\xbflON\xaf\xaa\x1c\x8b\xb14rb(\x11\xf3N\x03$\xd9\xe8!J{*&\x9d?C\xc1\xbf\xc2W\n|\xdb\xf2\xce;\r\x98\x8c\xcb\xe3\x86\x11a\xa2\x9aFh\x9bL\x02\n\x97G\'\x12\xd3\xe4\x17E|r-\x0f\xef\xdaO\x13[c\xb31\xfb\xc2/\xeb(5&\x93\xa4\x08]c\xb1\xd0M\xa7\xa7#\x89k\x8c\xef\x16\xbb\x04\nV\x94|s\xa7\xefq\xd5\x14\xcd\x1fYu\x13\x85\xac&(>\x8d\x1eVE\x8a\x87\x11\x83\xec\xdfS\xe4\x93\x1b\x08N+<\x08\xff\x83IR\xa9\x07\x99\xd5\xa1\xfe\xb9\xf1\x17\xc4jt%\x85\x80\x99\x98G\x0e\xec=\x9dp\x1a\x0e\xda\xe3ir\xfd*n\x903\x11u\xc2\x1cOt\xdb\xb5\xe3u7\xb8W\xc6U~y\x7f\xfb\x0bKb\x97&h:\xa1H\xcb\xc9Y!\xf7\xf2\x005\x850v\x1cz\xf7\x9a>\xcc\xc6\xc3\xc8\xb12,W\x1e\\Ml\xc8\x12\xb4@9\xf5\xa9x\x86\xf8O!}B\x98\xa5\xcb\xe0\xc9\xb6\x1f\xebo\xb5"\xd4\xf1\x8cQY\xa0\x13w4r\xe0\xd6\xa7\xb1.\xc9\x158\xc9\xb5\xda\xb6\xb0\xf5L!\xe7\xbe\x16\xaa\xb8\x19\x9c\xb8\x96K\xe9\x90\x9d\x1e\x0c3\ny\xb9!_\xfe\'\x1e\xc4\xae\x9e\xf7;*\xf9\xca?\x92\xf6qy\xb9\xaa\x90\x1eu\xd8O,\x12\x83\x98t\xf1\x12\xcc\x02\xcf\xff>k^\xb0\xed\xb6\x18\x06\x8c*\x00\xc0\xcd\x1e\xcd\'\x0c\xe33\xcf\x1a\xd3\x11\x00\xab\xc3\x99&\x11\xd6\x19\x1d&\x7f\x96\x1c\xa2\x1a\x08\xef\x0b\x04\xdbwa\x96Y\x18M\xf5\xa2O\xe8.\x04\x0c\xde\x95\x8dBm\xe4\x83K\x8e\xa1\x9a\x87@c\xbb\x03l\xca\x15qAA\xfd\x149\x1eH\xc6\x08\xdb\xa5\x86\xa9\x05\xd3\xd9M\xc2\x00\x89\x139y]\xd3"8\x8b\x16\xcb\xf2K[:Z_\x7f\x1bkw\x99\xa1C\'lB\xdb\xad\x08w\xd7J.Fe\xb7\x9a{\xb6\x1b$|\xf1\x16(\x0cJ\xf9\xfc\x8bF\xe4\na\x89\x01j\x01\x9b\x97\xd4\x12H\xf4\xb6\xe34\xb51\x8b F9:\xea\xa2\xf9\xf4\x051\x89\x1b\xa0Il\xe1I\x93\x8f\x1a\xb2\xefM\x81\x9c\x84\x853\xff\xcf\xaeFe\xea\xe6H\xbcC\xfc\xfc\xd2\xb97\xba\xdd\xcbW\x8aY\x96:\xa2\x80\xa4\x97IF\xb7\x9bl\xcc\xe0\x0c!\xaf\xc0Z*\x1e\x86\xcf \x81C\xded\x15\xcbWr+\x12Hc9#w\xc4\x07\x897\r\xf1l\xa2\xea\x01F\xc4\xa0\x88\x06\xd2\xdex\xf1\xd1\xb2-\xd1\xebp\xae\xb2o?\xea\x01dIgJ\xcb\x189\xeca\xdbE\x11\xa1IH\x8b4\x82\xd8\xb0\x87@p`\xe5\xbb\xfe\x80]\xbb\xfak)\x0f\x94\xdc\xce\x01\xa1\xf2\xebtY\x9c\xfc\xa4\xf71\x97\xb9\'\xa58\xbfk\x97\x10\x8c\xbb\x13U\xf3~\xf8hi\xcc\x8b6\xdb\xc5\x98\xbb\x0cz\xa5>!\x0e\xfeA\x12R-\x86b\xc2\xcf\x18\x08\xbcBh\xecA6.\x9b3\x1f\xdf\x17\xe1\xa7h\x89u{p\xfc\x94<\x82\xe1\xf2\xf3IK\xac\xb4\xe8l \xd4\xea?p\xc5<OLl\x14\xffy\xact]\xe9\xe4\x95\xbe;F\xfd ;0\xad\x8dB\xc0\xb0\xdd\xd3oa\xcbc\x06\xd5\x97\n\xc2Xg)04x%\xfa\x8d\xa4\x9c\x91 \xa5\xe9\x92\xc8\x94\x1e@\xa0\xe7\xbcf6!3\x138\xf7jU\xbe\xb6\xf2\xa1=\x91\x9f\x07 \x10\xd4\xaa*\x07s\x82\xfe\x8b\xd8\x93m\xfd]\xc8V\x02\x99!\x81\xc3\xccH\x90\x81o\xde )J\xf3\x16\xecE\xef\x00\x87\n\x1e1\x1e\xf3\xdb\xf1%\x97:BEC\x05\x05\xb9\x8ae\r\x90\x84_4\x95xt\xed\xc0\xd2\xdaSd\x14\x12\xf9x\xa4\xa2\n\x93:\xa3\x1aJ4}\x92_\xc4rCRo\xcd\x82\xb1Rl\x98\xdeh\x96\xf0\x84\xbd\xe1\xd6>\xa6\xfa\x1c\x90:\xa4r\x89h\xef3mN\x9ayzW\x15\xeeI\xf7\xc6\\\x8bM\x88n\x87\xa4O\xcd\xb5\x9a\xca\x06\xe2\x8d:A\xd3`\xe5\x01\xff\x08~\xc2Ap;\xf2O\xa8{\xed\xca!\x99\xdffe\x04\xe2\x7f\xf3\xe8%\xf5-m\xe6\x91=\x13\x00V\x1e\xc3\xc6E\x10\xa6\xa0+r\x9b\x17\x93\xc8\x8e\xa1\x85s!\x19\xee\xe5\':FC%\xcd\xa3#\xec\x86\xe0\x7fI\xd7C\xb5I\xa1yPNf\xf5H\xd0\\t\tF\xd5\xa5\x92=\xa8\xc8\xc0\x84\xa9\xd2\x01\x8b\xc7\x18t\xaa\xd6\xf1\xab\xa0~\xea\x1f\xe4i0$GCHb[\xefc\x1c\xd3\x0cy\x98w\xae\xfc\xbap\xc6\xd0\x8c|9\xf6D\x80\xd4L\xd2\xa7z\xfb$\xac?\xdc\xb6~\xfb\xdc\x89\xa7\xf6n\xbdiJ\xa3\x98\x9a`\xd1\xc2I\xe0f\xf5Y\xd4C\x9fo\x18\x9b\xd3O_\x19\xe2\xf8Z\x18\xdb&\x16oS\x8f\x83IR%\x95dT\xf0\x90\xca[\x18WE0{3\x95\x82\x8cx\x96\x1b\xe4\x15\xda\xafr\x89\xc9*\x9e\xc0&\xee\xa1\xfe\xca\xd5\x12\x9fP+\xacc\x84\xd40:p\'W\xc1\x17\tcs4\xbd\x92,\x01\x0c\xd6\xda\xc1\x8490\xd1\xb9\xdb{!\x05\x90Q\xf4\x9bz\xcb6\xfe~\xda\xd5\xcc\x0c\x18\x84\xac\xf7\x0eh<J\x16H\xb0\xe9z\x0c\x00Dm.\x8f\xc1>\x8b\xeci\x8f\xed\x83{\x1e\x11#\x0b\x9f\xb7Z\x95L_\xf7]\xccu\xe0\xcdSP\xd2\x10G\x07\x80\xe3a\xcb\x19\x12l\x17\xbb\xce\xa7\xfc\xff\xaa\xff\x8dc\xf8\x16\x19\xfa\xec\x86\xcb|\xcfLr\rg] \x907?\xc9\xc8\xcdeX\xf3\xa0\xc6\x08\x94Fi|\x1a\x9f\xf2\x95\xca.\xd6\xd8\x19=\x87\x17\xe9\x9a\xf9-\x80\xe9\x06x:\xec\x97\xdfU=\x9d\xa7\x8cYo\xd7\xc9\xcbi\x02\n5\xb2\xd3\t\x90\xa2\xa7 \xb4\xab\x91\xa6U]\x9aE\x94\x16\xfcS\x04\x17d\x17hr\xf4#F\x14\xba-\xf5\xf0\x0c\xdb\x14)\xec\xedd\xd4a\x05')
|
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
|