hiddifypanel 3.0.0.dev63__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-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
hiddifypanel/panel/asset.py
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
from flask import g, send_from_directory, url_for
|
2
|
+
|
3
|
+
|
4
|
+
def send_static(path):
|
5
|
+
return send_from_directory('static/assets', path)
|
6
|
+
|
7
|
+
|
8
|
+
def init_app(app):
|
9
|
+
@app.url_defaults
|
10
|
+
def add_asset(endpoint, values):
|
11
|
+
def get_asset(path):
|
12
|
+
return url_for('asset', proxy_path=g.proxy_path, path=path)
|
13
|
+
g.asset_url = get_asset
|
14
|
+
|
15
|
+
app.add_url_rule('/<proxy_path>/asset/<path:path>',
|
16
|
+
'asset', view_func=send_static)
|
17
|
+
pass
|
4
18
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
19
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/cf_api.py
CHANGED
@@ -1,5 +1,36 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
from hiddifypanel.models import *
|
2
|
+
import CloudFlare
|
3
|
+
|
4
|
+
|
5
|
+
def add_or_update_domain(domain,ip,dns_type="A",proxied=True):
|
6
|
+
res=False
|
7
|
+
if hconfig(ConfigEnum.cloudflare):
|
8
|
+
cf=CloudFlare.CloudFlare(token=hconfig(ConfigEnum.cloudflare))
|
9
|
+
zone=get_zone(cf, domain)
|
10
|
+
if zone:
|
11
|
+
dns=get_dns(cf,zone,domain)
|
12
|
+
data={'name':domain[:-len(zone['name'])], 'type':dns_type, 'content':ip,'proxied':proxied}
|
13
|
+
if dns:
|
14
|
+
cf.zones.dns_records.put(zone['id'],dns['id'],data=data)
|
15
|
+
else:
|
16
|
+
cf.zones.dns_records.post(zone['id'],data=data)
|
17
|
+
res= True
|
18
|
+
return res
|
19
|
+
|
20
|
+
def get_zone(cf,domain):
|
21
|
+
zones= cf.zones.get();
|
22
|
+
res=""
|
23
|
+
if zones:
|
24
|
+
related_zone=[z for z in zones if z['name'] in domain]
|
25
|
+
if len(related_zone):
|
26
|
+
res= related_zone[0]
|
27
|
+
return res
|
28
|
+
|
29
|
+
def get_dns(cf,zone,domain):
|
30
|
+
dns_rec=cf.zones.dns_records(zone['id'])
|
31
|
+
rel_dns=[d for d in dns_rec if d['name']==domain]
|
32
|
+
res=""
|
33
|
+
if len(rel_dns):
|
34
|
+
res=rel_dns[0]
|
35
|
+
return res#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
36
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/clean_ip.py
CHANGED
@@ -1,5 +1,127 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xf1\x15\x00\x00\x12\t\x04\x001\xf8\xfc$\xc4\xb9\xd7\x8ayC\xa0\xe0\x8b\xe7\xdet\x00\x00\x00\x00\x00\x00\x00\x006*`\xbbW/\xcb\xc1;\xf4]:Y\x8dQ6\xbd\xcb\xdd:>\x16\xa8\x04p\x00\xf0#\x89\xce@q\x9bU\x9a\x89\xe02lpg\x1cS\\^%Yi\xd2\xb8\x900\x90 \xa5A\xb6\xd6R\xe8\xee3\xd0x\x9b\xa8\xb3\x87rGv\\\x89\x18)\x12E\xd1\x8b\xc6\x07@\xcf1\xff\xcb\x8ce[\x81az\xd3\xc4_\xe9\x0c \'\x0e<\x03\xf8\x1bX,u\xbd:\x00\xddr,\x94\x1f?\xde!Q*\x00z:\xeb\xb9\xb4\xfc\x83)\xf0\xcf\xc1\x8f\xf6N2vl\xce|\xba$\xd9\x1c\x87\x87\xefF\xfa\x05\xd7\x18iNw\xcd\xcc\x0c\x8e\xd6m\x1b\xda6\x08\x8aXd\x1b\xaa\xf5W\xcd\xf5\xcf\xbb\x85\xed6\xe8Ydt\x81+\xd3\xb9\xe6ffZW|,\xfb^*N]\xe4\x00\x11o\x9ek\xbc\xa3\x16\xdc\x17\xf9\xdf\xcd\x95\xa9\xa9\x0f\xe7e\xc9\xddO\xc0\xe1v\x0f\x06ca\xf8\xca|I\x8e$\x11T\x89ei\x1fS\xc0\xde\\\x16\x03\xf2,7)\'\x05\x85\x0e\x0f\xd2\x8c%rO>\xf8%We\x1a\x10\x14\x0c\xbd\xb8l\xf1}\x96\xa2 ?\xd7\xef\xb1d\xcf\x1bBS\xf7o\x03&\xa3\xa3\xf7\xef\xea\xc3\xd2*\xb8\xac\x8a]\xa9K\xd6\xb8_\xee\xba)\xa7S\xdd\x7f9\xfa\xe5g\xca\x012EU\x0f>E\xc9\xee[#\x15\xf7"\xfcU\xf9\xa4\xa7\xf8w\xf1L\xa9\xbb\x8f#\'a\x8f\xafl\x01\xddw\xfcW\x9cl\xd3\x93\xd0\xb7\xdb3c\x18\xf8\xb1\x9ae\xaf\xe9]\xc0\x00\xdf%\xee\xf7\xbc\xf6TZ\x11Ok\x05\xb1\xdc\xf4\xe3\x0f\x98+\xa2\xd3\x90\x8c\x17=\xdfq\xd5?\x03\x19\x8f\xa2\r*\xa48\xa3V\xd6\xa2\xc4K\x80\xb0\xdcoa?\x917M\xd8o\x99\x18Y\xcd\xd8\x8d\xba\xe3\x04,\xef\x91\xd1\xea\x9d\xe1\xc4\x89\xf8\t\xf8\xe9\xde\x86AFCQ\xcd\xf6e\xefZ\xa9\x13L\xcb\xfb \xae/\xa7a\xa0V\xd6\x19\x06\x84/\xa2\x11\xfb\xc1\x03\x8d[\xd6\xb66\xcb$\xcc4\xfc\xdaS\xa6-\xa4q\xfa\xfa\xf8\xcf\x86\x93\xf0K\xe6\x18\xc5C\x84\xe4mF\xbd\xfc\x7fets4~5\x94n\x9aOn\x97\xd0<\xcd6D\xdd\x8c\x83wC\xd3\xf2&U)h\xe79}\xe5u\x88\xc8\x8b\x913J{\x0e\x8c\x90\xe1mJ1Nc)!\xa8h\xe4\xea\x7f\x99\xf4\x14\xe6\xc7\xae\x821\x8c#\xb2\xf8k\xeb\xf4>T\xbd\xf8\t$*\\Czv\x15L=\xafYV\xcf\xa3c;\xe9\xce*.\n)\x19\xcd/\xde\xcd\xe9\x04\xfb\x81o=\x1e\x02\x11\xe3\xa3\x06\xddb>\xb6\x0e\xf1\xac\xf6\x15\x97W\xa0KF\xd1\xe3\xdc\xd94\xf9\xf2\xba\x07\x08\xfcF\xcb]w\x1a\x10N\xb1\\\x86\x06=\x84\xc9i`~\x92;K\xe4U.`\xb2\xbd\x84\x9d\x0c\x86PF\x89\x8d\xe2\xe6\xeecCjBI\x9f\xa4!\xb0\n\xc3\xe1\x88\x89\xe0\x8e\x9e\xf1\x9bD)\xcfW\xc2\xcb\x98\x15\xbc\xc9\x81\x87\x15\xeeY\xb8,\xdb\xfch\x81\xb9\r\x92Zg\xe8/\xe1\xfe\xbe\n\x1f\xe8_\x93\xcd\xa3\xda\xf8\xac\x87\x14\xbaL\xf7\t\x8c\x1fr\xcf\x19\xb1\xb5N\x9c\x82eK\xcb\xb7\x06\xaf\xc2#T\x18\xea\x94UZ\x12T<\xb8\x8c\x14\x99\x91XZZ\xf3\xf6@\x84=\xbbZ)\xce\xc3\xf8\xd9\x01\xa6\xcc\xdc\xb3\xecj\x1f\xb3\x80J\xfd\xc1\xe7\xab\x7fi\xc4\x90b\xab\xa8\xb2\x14m\xf3j]\x12\xdc\xb5\xa1\x7fI\x8f\x07( 7\x10\x9b`\xc9\xffdn\xbc\xd7\xc05o\x83G\xf7\xf3\xbd\x85\xc35G\x7f3\xe3\xad\xc8\xbe\xc4C\x0f\xf7\x9bex\xcdz_\xefGT\xba/)R\x92\x05\xfeO\x91\xba\xfa0\x91\x99\n\x1f\xfc\xf8\x92\x16y\xc4Lb)\xf2\x8f\x9c\x1aO\x17I\r\xbc\xa2\xc6\xff\xbc{\xda\xd45\xd3\x1d\xee\x90\xfb\x9e\x92\x8b\xe2@g\xca\xb3\xceQ\x16.L\xc5\x8cGuk\x80\x98]\x98bj\xb4n#\x02y\xbf\x94i5\xf0\x06t\x19\x05\xb2\xcf\x95A\xe3\xc0\xcf\xd4\xb2e\x16\xf7`\xc6\xf4\xd2\x05\xf4\xf9o\xeb\xa6\x82\xea\xa8\xcaO\xdd\xd7\xd4\x00\x04c?\xf2D3\xbcd\x1e\xd9\x84\xaa\x0bU`\xd2\x96o\xc1\xcb\xd9\xce\x8a\xf2\xb9q\xe7\xe5\xff)A\xbd\xcaZ\x81\x84\x9c)t\x0c\x8c\x8b\xcf\xa8\x8ah\xd2A\x17Z\xfarJ\xdf\xac\x9d\xf5\xad?\xaa\x8e\xea\xa8\xceQQ\x0b\x95v\xc5\x87\x96X(\xad\xf7y\x03\xaf\xf9G\xaa\xad\x15W\x15\x9f\xc2`<j+B\xb1\x84\xb8\x84\x9a\x01G\x06 (0\xeb\rC\xceT\xa0\xd8\xf6;\x8f\xdf\x08\x92$R\xff\x975\xde\x9a\x99\xe0\xe6\x1f\x8d\x8dwkV\x90\x94L2H\x9a6\x02p\xda=\xdep\xc6\xa4\xa8$f\x84Yk`\xe4S\xe6B[G\xbb\x08\xa8\xdb\xf1\xd4t\xd0\x12\xb3=$\xff\x9f\n\xa9cj]\xfd\xd5\xb5\\\x12\xea\xd3\x8e\xf3\xbf\xcbz\xf8\x19\xc0\x00\xdb\x12h\xc0\xcdj\x19\xba"\x19\x98\xa3.Q\xfa\x80\xa7-D\x9dS\xd1\xba\x8b\xae\xd6\x13;Z\xb1\x9c\x93Ll)\xbe\xdd\xcd\xa2Kd_\xaa\xf1\xce{\x13\xdd g\xcc\xd5\xfe\x91\x1dM\xf9\r\xf9\xb9\xd9\xdaj\x13&\xca\xd1\x80Lr\xa3d\x8b\x00K\x80\xe1\x8e.<\x9f,4\xe4\xa0\xe3\x13\xb83h\xc9c!\xcf\x82\xd4\x91qa\xbb\xc0LHI\xd7\xd1\x0f\xbbg\xd4\xda\xfd\xd02\xdd\xed\xc8\xc7\xe8\x8e1\x84\xfd{\xb4\x14\x8d\x8ax_\xe7\x0f\x89\x18\xb5\\\x97UyO\xeb`\xfaS\xf8\x14\xb9\xb9\xbf\x80\x89\xc5\xf2\xfc\xf5\x95\t1/\xf1\x91\xbe\xb2$\xf2\x18?\xa0V\xfd\xc5\x08L\xb7\xb3\x94(\xec\xf6v\x10\xb9kI\x19\x89a\x95\xd9\xf5\x87\x0f\x11\xb8~\x80\xc0\x10M\xadz\xb5\xcb/\'H\xbc\xd2\x84\xe4I\xf4Pn\xc3h\xfd\xdf4\xcc\x8e\x8e\xff\xea*\x838\xec\xf1\x8b-\x05\xa3\x11\r\x9a\xe7\xb6"\xde\xf7\x0eG\xfe\xdf\x88\x816\xd4@2\x9b\x13\x03\xd0v1]\xb3\x13\xdcc0\xc2\xa5l4\xe7\xac\x9e\x8c-N\xca\xd3j\x1b\x00\xab\xa2\x1b{\xc3A\xc7|\xceV\xb9\xb1\xeb\xc3\xd9T\x96\xe3#\xf4\x9d.\x7fUa\x94\xa4\xb2Qba\xbb\xb7\x0f\xf6\xf4\xcbg\x14xS\xadr5\xc7\xf0\x87\xd4vW\xde\xb8}\xd8)X\xd7\x997\x9d\x16\xd2\xc8\x83q\xe4\xaae\x08\xe4\x9b\x9b\xa13\xde\x00N\x8f[H\xe9\xe21\xa7B\xc0P\xd5\xb1\xc1\xddX\x1dy\xa8*\x0fq\x9d\xb5\xf9be\xa0AH.\x84\xd8\xb8TO\xf4w`\x13O\xd7\x17\xb4\x9f\xbcl\x18\xf3\xda\xd3\xda4\x98s.\x95C\xbf\x8b\xb9\x04\xaf\xa4\xf4\xfa\xeer\xd3]\xdfE\x8bn\xd1\xf6XN\x0b\x98p\xd4\x9f>\xd7\xa6iF~K\x94\xa3K\x1e{\x0cc\x8c\xa4\xddi\xc71S\xf9\t\x07\x98^\x93\x14#\x0b8r\xad!b\xbc\x89\xadD\x80G\xa6\xbfYh\xe3\xe4R\xf5\xd3\xfd\x19\xe2\x1a\xfc\xd3\x1ae\x93\x97]\x95F\x86\xae\xe1Z:s\x99\xb0\x864%\xd2\x92\xb5\x84\xb6\x96\x86\xad\xf7 \xb55Zb\xaa\x9d\xccI\xc4\xc5\x94\x1e\x8d\\\t\xaf\xd6\tR\xe4\xc5\x9em\x06\x00\xbd\x91U\xf8\xef\x8a^<\xbc\xa6\x14R\x83\xb5\xe1\xe4\x82%\x88\x87C\xf7\xf0\xdf\xe1mg\xc1\xd7\xd0\x9e\x0c\x15R\x1c\xc3\xae\xf7\xbd\xaf\x10\xc1^\xb0M\xd6\x9f\xe4\xfdF\xd8\x18m\x07LWb\x94\x9f\xaej\xa0[M\xff\xa3\xf2\xca\xc8\xed\xd6\xac\x07\xd8\xe3\xe3\xf7\xb1\x19\xa4\xb4\'Q\xc56\xcbo\xc1\xa1M\xb1\x95\xd6\xbf\xc8\x80\xf2l\x06\xfe\xfb\xf5\xf1\x02bp\xc7\x1fR\x9b&\xca*[F;\x18z"\x05\x8fv\xb7\xdcd\xb1\x1b\xab`\x18\x97k\xb0F\xc9\x9a\xf3j\x92\xa1\xdd\x8d\x83s\x13\xa8\x9e\xe9\xab\x1a\x0epW\xb6\xc6yxeo\xa7\xdaS\xb2]\xf6\x17\x1aa\xa9\xfb]\x8b\x18\xb3\xd6sf\x0c\x8e\x04\x10\xcd\x14\x130\x7f\xa8]\x1e\xda\xd3\xaef\x98\x87\x95:\xe8\x19\xb8Z\xa5\xd0\xcf\xd9\xaew\xb0hr&qf\xd7\xa3\x06!#\x15x\x11\xc4\xc2\xbf1j\xeaq\x03@4+\xb7{\xd9\x84\xe8\xad\xc1\x02\xb8\xf6\xef6{~\x81\x15\x99\x15\x1b\x7f\xd2(0\xdb?"\x93>\x98\x8d\xadM\x96\x06\xb8\x95V\x8e :\xba\x9fL\x9a*\xd4p3\xf6K\xbf\xa7p\x9f\xb2\xe4\x11<\xa4\xa0\xc3\xcdg\xb6\xd7\xb8\x1d\x1a$@\x9eNf\xab\r\xfd\xeeT\xcf\xf0\xcdd\xf9R\x7f\xafG\xed\xd4\xb6\xc8}\xa6\xa5\xc6\xab\x1d\x13j\x98\x1b\xf6\x96\x99\x99\xd6*\xddz\x01\x8b\x85PD\xe1\x07\xc7\xaf-S\x1a\xcdL\xf3(\x1a\x13\xdbq\xd2o\r)c\xc79\xf1U(E\xb2\x00\xdc\xd5@\x92\xd2t\xc5&\x86\xfee\x16\x90\xc8\x07\xd4\x13\xecR\xb6\x02g\xc8AM\xae\xa2\xb7L\xf0hh\xcd\x86\x1f\xd63\xber\x84\x87\xa3C?\xe3\xc0\x18\xf7\xfb\xf7\xe7_u_)/\xe29\xea\x99Eo\xbb\xa0D\'\xe5s\xda\xde\xb6\xd7Lu+(\x9dM{\x8a\x92\xa4s\xa6xK\x94\xa9\xcf\x0e\x0bbT\x01\x1a\x86\xe3\xab)\x16\x14\x8d6jDMr~\x87\xe3=\xeb\xac+\x9fMS\xbf\xe0h\xd1\x91\x96o\xf0g\x12U:e\xbcgpd\xda,\x80\xd3\xb4\x95$;O\x8cn\xc4\x92T\x1c\xc1\xf0\x03H\xc6\xc9\x08\xf5\x1b\x1av? $\xe1\x85\xe2\xdd\x03\xd13\xa4T\xab\xcf9\xdb9\xe2\xb5\xb4g\xc2p\xe1O\xac\xc7\xfb\x13\x1a/\xe0\xac\x18\xec\xc1N\x08\xe0P\xfb\x83\xef\xe2.__\xf0\xd9\xce\xb2\xb4\x9b\xf0>\x99\xaaR\x1a\\<\x05V\x8eB\x9f\x94\x91\xff\xc5\xf4\x9f\xedR\x10h|\xffB\xb7q:A\x9dZ\xd4\x0f\x9a\xe2r\xf4E\x83\xaf\x1b\xb2-z[\xb2\xe9\n]s\xc4\xa1E\n{Y\x82cY\xfa\xef\x0e\x88\xa16uN=\x88\xd0\xe5C\xb9\x83t)\xad\n\xca>\xbe\x021GS\x0e!\x14\x12\x1e`O\xfa\xccb\xf2x%\xcbJWs\xf9\xfc\xeb\xda:\x8c)+Ud\x128\xcb\xc88\x7f\xed/\xc5\x14\x07\x12aF\x98\xc6\x101\x0e\xcc\n\x87G\x12\xbcG\xa7\xe0\x04\xfb\x9e\x19P\xd9s5:NR=\x94\x8b\xacT.\xa0\xb5\x0b\xd3\x8fpV\xa9\x1b\xe7Ws~`\xd4L\x86\xaa\xfe\x01\xdd\xd6\x87\x10\xd1\xbd\xe7"k\xf2\xd0\xd1\xa1`\x9c\xc7+\xe6\x81x\xedg\xd7rF\xc9\xbfY\x12\xfa@\xca\x134Y\xb7\xdb\x1d\xb5f\xd2\xfap|\xff\x0e\x9a\xb7B\x9fI\x19s\xcb\xf1\xed\xf5-\x9fT]Y0N\n\x89\xd4\xbc\xcdjR>\t\x86\x7f\xaf![~x\xf3ARl\xdb\xf6\xd4A\x98t\xf1\n\xc8\xd6\xd1\x0f\xcb\xf0\xe2\xdf\xfck\xe9\x12a\xcc\xabAYY\x1b\xdb\xf3\x17*5b\xeeF\xb0Fb[\x10\xb7\x8f\x95\xdb\\\x0fY\xafN\xe9\xceK>W,\xf5\x85\xe4\xbcH\xd0XW\xb4\xfb\xcbw\x90\x92\\\x9a&\xad\xb5\xdf"\xfc\x05b\x96\xb5\xd1|K*\rB\x8c\xc4\x1e\xbc\x1a\xce\x9d\x89\xbc\xc6\xc1\x10k\xf5\x9c9B`\xfa\xb8\x8f\xa2>w(L\x0cj=F\x19m\x82gW\x94\xd6\x80\x16\xcb\x19lE\xb3,\xc2\xbc\x01Z\xaf\xa5pW\xa81\x03\xa6\x8a\x98\xcc+\x0e\x0b\x82\x81\x0f\x07\xce=\xa4\xc9\x15TU\xbcT\xfaM+Q\xba~%\x11J6\xcc\xcd\xe3\xf9L1\xfd\x08\xc5{!\x0f5t<\xe0\xf8\xbc\x088\x83\xe7P\x86m6\xa6\x08\xce^\x07\xcd\x1b\x89H\xf4\xf0\xb9\xb0\'\xab\xe1}?2\xcdy\x13\x93\xd0\x8fW\x82L\x15\xd5.\x8c\n\xd4\x1a\xf1R@rq\xff\xf8f\xe3\x90_\xe7\xe0\xbctM\xad\xa0\xb3\xa54\x0f\x87\x86\xe9+\xfb\xf5\x8e\xc2!\x04\xdd8\r\x9d\x8b\xcd};Y\xe6\x17\x04\xec\xcfH\x84m\x02<-\x95\xf7\x8a\xaaxE\xda\x18)\x16\xec\xc8\x13!:\x1fC\xc4\xbd\xc90\x07\xdd\x19\xab\xcb\xa8\'\xe8$\xb4\x81\x16\xdd\x15\x86\xb6\xaaq\x8c\x88F\xcc\x1f\x0es\x9e]p&\x8f\x95\x98\xe7 i\x06\xf1!\x95O&\xce\x81\x0f\xef\x85\xaf\x9d\x8d\xab-\x99\xed\x1f\x8c\x99\x85B\xc1\xb3\xb5\xdc\xb5\xcb\x86\x1d\x06R-\xf8m p\xb8\x0c\xa9?\xea\'J}i\xe2\xe7\xdc\xd7#\xd2\x0b\x85if\xe1)\x1e\xcaDFg\xa5S\x9b^\x9a\xfa*\xec9cw\t\x809*D\xbchZ\xbcI\xa5a\xefX\xca\xdc\xbcu\xa3\x94\x14\xaa\xe3\xff\x9es\xb5\x8a!\'<\xfdd`\xa2B\x83.K9q\xabV/\xb6QLFW\\\xdb\xaa\xc0\x86\x93\x1fv\x12[/1\xc9\xe6u\x80D\xf5jG\xd0w\x1fnj!4\x88\xcc\xd4\xed8\x01q\x06\x94&\x16\xfc\xd0\x88\xa5\xff\xcb\x8d\xc2K/\x9c\x80\'\xd6\xd7\x17%\x93@\x17.S\xd1\xb3\xe3-\xa3l\xe8\x18>\x06Y%\x9a\xf8\xa9\xa0\xfd\xd3\xeb\xde\x1d\xfc\x15\\\xb3\xc93\xb9E\xcb\xab"j\xfa\x83\x06=\x04\x83Bk\n\xef$\xae\xb6\x92db\xa5\x85\x05q5\x9a\x15\x04^W\xc4\x19(\x89\x9d\nR\xaa3Z-*K\xe6\xc1\xb7\xa9\xe7\xc2\xc0\xe8b\xc2\x17\x9c\x15\x83M\xcbE\xd5\x85\x95\xcc\x9e\xca\xec\x8d^Hl\x8f\x8d<G\x9b\xa5\x9e+\xf8\xcd\xc6\x99l\xeb\x92}\xab\x9e\xf1\x1e\x1c+\x196d\x1e\xf7}\xc3\x9bQ\xb9\xf8\xd3\xd8\xb6i\x9f\x83s\xf1\xdb\xd0\x11\xf6]\xad\xe1q#<o\xe3\x9d66k\x15\xf6wGR\xf9\xce\x80%dH\xeca\xa2\xabG\x93\x06\x00\xef\xc7T\x8a\xf3j\x18g\x9fqc\x88\x8c\xd5\x855\xf4\x88J\x0e\xa9\xcb\xd1{\x16\xdf4\xae\xad$\x97\xee\x99\x9cl/\x8b\xe1\xb8\x97\xed\n\xefQF\xf0\x19+pb\xc0\x03\xca\xf59y\x876\x9a{\x01\xa1o\xd1\x85Z\xb5\x01\xcc!UN]\xaaW\x1e\xa3^\xc0\xa0\xe0\x86\x00\x16\x19\x1b!\xf7\x87\xdf;\x1e\x0f\xbe^\x16\ts\xf8\x95?d@q3n\xf3A2F\xdc\x95B\xc8\xf4u\xdePw\x0c\x16\xc6\xd1i_-J_\xa6yJ\xf0\xder\x194w\xee\xb5Z\x10\xd4\xdcX\xf2k\n5B\xc9\xec$\xe9\xc8\xe4S\x81\x15S\xc4-\x9a\xeb\xae\x04\xe3\xf1\xe7\x1b\xfb\xb5\x87R\x86*\xa3\x12\xd3\xc1\xd6VAU\t\x92\xf8\xb8f\xbd\xc2\x14\xf3\x98,l\xdc\xefC\xa1\x1a\xb8\xd9)\x90\x86\xa8\x07\x93\xd2\x82\xee<\x80ve)u\xf8\x15R \x16\xb6\x15b\xbf\xdb\xfb\x1a\x9e\xf2\xa6\xe2\x80\x89\x16\xf1G\x0e\xe8\\\xb7 =\x15?\t\xa78x\x7f\x9f]I2W\x9flL\xf0!\x15H\xe1\r\x86l\xd4{]t\x9d\x1c\n\x1e\xa3\x13%"\x81\xfd}\xa5\xba\xa4\xfa~\xf6\x0b\xc4\xba\xa8\x90\xbc\x11w\xef\xb0\x81K\x9b\xec\x7f\xbd\x02_\x8d\x10\xb1r@7\xe1EObQP\xa6\xc6\x01\xc75\xb0V\xf7\n*eJ\xa2\xcc\xf2=\xd8\xae\x07\xa4\x93\xb6\xa5x\x83@Z\xad`\xe6^7\xf0D\xf1B\xa5\x99\xc83\xf3{\xe7\xbba\x9e\xcah\x0f/\xcc&+K\xb6\x8f\xae\xbcX\n\x8f\xa6\xa6\'\x068-\xeb\xe9\xa9\x18\x9a\xa3\x82?_H\x8b\xb2\x0e0\xbaNz,f[\xfe\r\xc0\xf1%\x1dN\x1f,\xb76\x8c\x94\x89\x08\xa2\xd2(\xba\x9cVf>\xa4\xceH\x1d\xa4\x87\xa4\x8a\xf8k{b\xf1\xefC(\xa9\xa5q\xa8\x88&\xc5_\xd6j\xca\x12m\xc8d\x9bz\x99\xe1\xeaa\xc8@9\xbe \x1f\xf8\xfb\xf5#^\xc1\xf7\x15\xd6\x12\xe3\xd2\x169@$\xbd\x02\xdb\xa4~N\xc0\x90\xe0\xa6\xb1\xdf\xa8\xd5\x82\xbc\x08\xf3\xeb\xa5s\xe5\x9fI\xa1\xa2\xba\xcb\x94z\xdf*\x9d\xe6\xe1\x15@1\x97\xc8\xe4\xb0\x146\x98\xb7Z\xf1\xab\x1b\na\x82\x1a\xea7\xc01~_\x85\xc4\xae\x9a01\xb6<\x9f!^\xf6\xe9\xa7U$\xda\x11\xa9\xf3\x8c1l\xb2\x0c7\xc5C\x88\x14\xc5\x1d\x92\x1fW\xba\xc9D\xe1\xe4\x8c\xffi\xb4\x92H\xb7\x06\x99-\x86v5\xd8:\x02\xf3\xa4N\xff\x10\xf4\xee\x92\xdeJ\xa6\x86\xd6\xe0\xaakW\x12\xf7\xa1\x9c_\xb1\xcb\xcd\r,\xc8\xf0\xfb\x8d\x8b\x94\xe8X\x8d\x9a\x99%L\x04\xcb 9\x9f\xdbL\xc5\x0f\rj\x1ft\x85$\xfa\x98\xa0i\x1a\xaa\xd8Ma/\xfa\x89OY`\x06\xbb\x836\x14\xb6v\xd9/\x01I\x89\x19wThBU?\x10\xae\xb6[\xa9a\xd4\xad\xef\x87\x8f\xe2Rc<AO\xd6\x1a\xecq\x08\xcb\x97\xc2\xfek\x8bT\xf0\xb8K\xa8\xc7\xde\xea\xb2\xfe\x1f\xb7=\xe8\x86v\x95\x95\xa9\xa61\xba\xb8\x15\xb5\xb4f\x9b^\x85\xfc\xb9W\xd3\x90\xf2v\xbbo\xec\xdf\xb0\xd2X\x0c\xcf[\x07\xb27*\xd6\'\xf3\x00\x9dZ\n\xba\x9a~\x83:\x1d\x85\'\x94]\xa9\xf2.Q\xe1\xda\xa1\x81\x05\xees}\xad\x0e\xedc\xf6D\x00\xd2\xd6\xfd\xb9\xb8\xb5(\xa0o\xd25\xd8\x0eM\x98\xe4B\xe9\xb3t\x94,\x18\xa8\xa7M\xdc\xbf\x13Y\xa0K\xa6\x8c\xd6\xc0\xaeE\xbcA\xf9\xac\x1d\xdd\xdf&\xd0\xb8"\x9f\xf6\x9bdzDP\xdf\xf6\xbe\xfb\x02X\x9b\x07Q\xeap\xc1\x8b\xae\xf7\x96\xcbf\x06\xb1\xd7]I\xf1\x8b\xd1\xd1\xb0(\xe7\xb6j\xa4v\xff\xe0Y\xc7\x13\x1f\xb3\xaf\x8b\xb4\x85\xf7%\x9b\x05\x19\x0b\xa5\xac\xe2\xcf\xfe }\x1a\xc7\xa9\xeb,\xb4\x9d[;\xf40\x9f\xc7\xf8\xeaypX\xc6d\x89\x87\xef\xc0\x14\xee\xd9\xf8\x84\xe2\x0e\x13\xeb\xde\xbd\xf6a\x92\x7fm\x14,\xbb\x94\x9b\x1d3\x91\x16\xb6\\\x976\xee]:E\xdf\x02\xf8u\x8e:\xcb\xd2vE\xfdWd\xfbX\xd8b\x9d%.\x7f\x8bC\xf7+\x8e\x1d;0^\x88xL-\xdf\x9c\xb7\x15\x13`e\xc1\xff\x0bK\xfd\xb7\x85\xe9\xfe{D\xc2\x8d\x8b\xd6o\x92\xbaG\x03\xef\xdcP_\x9b\xbc\xbf\x03\xe0\xce\xf6x$\x8a_\xa3\xb1\xf9~\x85\x13l\t\xf8\x9d\x96\x9d\xf0\xec]\xf4\xb6`\xcb\x9e\x01\xddz7q\x9a\xbe\xb7\xf6uR\xfb4V\xb1L3\xdfx!\'\xceO\xb3^\xfe\t\x02\x893\'1\x80\xbe?]\x04\x87\xd5\xfb\r\x9d\x13\x1f\xe2\xa8\xf1\xdc\x9c\x8a\xb0\xa4OA\x00|Oc\x0cTnq\xc6\xdc\xea\x8a\xf246\x88\xde\xefIt}\xa9q\xffE,\x07\xe8E\x01\x7f\xd5\xf0w\x1d\xc9\no\xc5\xbe\xfda\x82\xc0\xc1\xe9\x10\xe9\x07\xc7S\xcbW\x16\x1e\x99\xa4\xcd\xf4\xa9\xe6\xb5|"\x99\xc7\xb7\xb9R\xe6\x0c\xf45c\xd8d4w\xb9J\xc0\xb9R\xe4\xdf^\x91\xa3\x9fpS\x89\x91\x9a\xa4\xf7\x7f\xa2\xd1\x16\x1c\x94W3d&\xa9\x83\xabh\x011`\xbfHG]\xfe\x07\xb6\xf7\xf7\xe5r3@\x81\x15p\xcbi|\xdf/\xc3\xe8\xdf<\x90`\x93\xef\x0cB\\\x9cB\xca?\x05\xc6\'\xfc\x12\xd8\x19\x89\xe3\x13E\xc6|\x9e\xaf\xc8\x83W(\x9f\xc6\x80\xca\xcdN\xea\x03\xcc;\xe6o"\xc3\xf0}<`4\x94R\xc3_\xc7A\xd9\xfcP\xf1M\xa0\x12\xc0u1\xd9a\xeaEK\xc1Ul\x8b\x9a\x16_\x17\xb7\xc0\xbaeSJ\x1b!\x1a\x8d\xf3\x15\x99\x07\xa6\xa6\x9bs\x80X\x08[B/J\xb3\\\xd6\x04S\xd0\x8f\x8f\x9a I9\xe0\xd2\x9d\xb8\xc2\x80\xf2X\xb9C\xebL{?\xbb~\xb1\xa0\xd1\x92\x08\x1c)\x16\x19\xc15|\x9e\xa3t\xe2\xef\x95\xee\'h:\xeb\xee \xb4\xe7K\xde\xc8}\xaa\x9d*\xf4)5\x07qnD%\x1eh)\xc4C\x85\x0bG)K\xb1n\x00!\x1a\x9cwh\xaep\xdf\xba\x08m:\xd2\xbc\xbe\xabcE{\xbc}\x0b\xd0\xe8\xddC\x82\x8b\x9b\xf5\x82\x93\x96x\\i\xfc!6p\xa5h\xcbX"\x84\xd5\xb7\x15C\xc8\xc5(\x0blPs\x88K\x1c\x08\xe932\xa7>\xc5\r\xcboO\x01z\xc0_\x89Y\x0bj\x91\xa0\x92Z\xb6\x19\xe9\x05=\xad\xde\x1d@r\xd3\xeaae\x00:\xb7t\xc7A\x83\xf6\xe3+j\x8f\xd9tN\x1fK\xc3\x16\x81\xf9\xc9\xbf\xd6\x1e\xc5\xf0,\xef\xc9\n\xb0\xe8\xd3\x87\x01#T\xbe\x97~H\xbe\x97~E\xcc@-\x87\x10\x1d\r\xc0\x8d!\xe0\x02\x7f\x1b\xe6\xfa\x91l=H|/=\xc7\xc6}d\xda\xc8\'f#\x99\x0b\xdcs\r\xc2`\xc0\xd5<\x19]\x17r\xd5\xf9\xa1P\x1e\xfagE\xb9\xd0\xf4#\x08E\x88\x85A\x04\x9a\xb4\xa3\x95R\x1f\xd5\x7f\x90\x0b\xb2,Q\xd2\x96\x10\xafT\xfc\x8d\xd9S\xd8\xc5\tM\xd2\xd6\xcf\xec\xc5\xd4\xf6C\xd0O\xd6\xcf0\xc0\xbc+\xfc\x15\xd7\xbdF8^\xe3\xf7\xfe\xb3\xca\xdf\'\x89\xbe\x8d\xe6>\xa1\xd4\xe7?_\xcb\x94\x96o]\x04F[\xa8`H\xf9\xef\xcf\xd0p\xc1\xdb\xd8\x1a\xa3"#;\xe2qG\xe7\xdf\xac\xaa\x92(\xab8k\xa4\x12vh\xb0\x04O\x9e\xe5\xbd\x87\xe0i\xcf\x19\xad\xe1Sy\xdc\x99\xb9_\x91\xb7\xfd\xbfo\xe5\x03r\x9d\xca3l<h\x0f\tO\xb7v\xfd\x10\x98\xd8\xcd\x84\x99\xbf\x9e\x1a8e\x16"\x1eh\xf8\xae\xf8\xa1\xa9B\xa7<\x8d=)\xb1hO\x1am;\xcc\xb6J"\xd7\x83\x05\x15)\xaa\xe3\x7f\xf7\x15\x0fg\xcc\x83v/\x049y\xc0fiBnst\xc6F\x9f]_\x8b\xdc"\xa82\xa0\x06\xa2B\x1f5?\xcf#\x8f\x07\xa8N)\xb1GM\xc3]\xfa\x96B\xbdi\xfbq\x8e\xacy\xf5\xc6\xcc\xba\xb7\x13fO}9\x9f\xf4\xc5\xe0\xd7\xe81\xca\xd4\xdf\xa9\xcd\x856%\xf1A\xab\xad\xf5r\xb7r\x8b\rU\xf4l\x9b\xc7a9k\xca\x19K\xb2\xf0\xcaK^ 3\x93c2\x08Mp\xf5\x10B\x10\xe7E\x0eto\x04\xf8\xb5)ajlz\xe6\x91!7\xfa~\xe1\x19=2v\xf7\xef\xca\x19\xb7W\x92\x8f!\xcd7\x90)\xdb\x9d\xad\xc0A\xa5\xff\x98\x84\x98\xb5\xaf\tB\xf3rG\xa4\xa0\xb3\x01\xd29\xec, \x80J\xe1\x1fE\x1fA\x8f\xc5j\x03u\xc9\x81so\x1b-\x0e\x90I1\x12\xb4\n]\x8b\x8dJT\x8a\x9e\xc4\xabN\xcc\xb6\x83\x83\x8a\xdc\xf6NF\x1d\xfd\x9cV\x05\xd9\xa8t\xde\xeeU\xf1\x8d\xd0\x19\xd2Y=\xf7\xb5\xber\xd8\x98\x88\xc1\x00bN\xc8\x1b\\\x8eX\x98\x10M\x92M6\xf0\x8f\xd2\x19d\xedO\xf4!\xe7\xfa\xe7\xb6tlR\xb6rf\xee\x93\x9aU\xd2*\xc0\xc2\xdd\xb8\xd9\t\rh!l~\x00\x87~+\xfb\xd5MbL\x7f5\x04\x1a\x9c\xa2,\x08\xe3\x1d\xa1p\xd5\xd1\xad\x9c!G\xbfut\x7f\x9eN\xc1,\x0f\xe6\xb6\xac\xeeV\xf7q\xe8\xba\x95P\xc6\xa4g.\xfel\xd8Su+t\xd2\x81D\x89\x8bie\xae\xd4\x82\xe9\xd6\x0e\x03\x16\xff\xe9z;)\x00\x0b*\rux\xbb\xfdnT\xbf\x0e\xdf\x19\x9d\xcf\xb5\xe3IV\x89\x93h\xf2%6EV\xfd\xa3F\xda\x8a\xe1\xf1^\xaa\x90^\xb6B\xd3\xecj\xcf~\xea\xf5\xf7\xf2\x02~\xb7x-\x14\x87L\x1dm\x90\xa6+\xad\xa8\xcb\x99\xf7\x95\x7f]\xdb\xde\x91k)\xa3[\xae\x93\xdb\xbb\xbeK\x8c\x92\xc4\xcfl\xad')
|
1
|
+
from hiddifypanel.models import *
|
2
|
+
from flask_babelex import gettext as _
|
3
|
+
default_ips="""
|
4
|
+
mcix.ircf.space MCI
|
5
|
+
mci.ircf.space MCI
|
6
|
+
mtn.ircf.space MTN
|
7
|
+
mtnx.ircf.space MTN
|
8
|
+
rtl.ircf.space RTL
|
9
|
+
mkh.ircf.space MKH
|
10
|
+
hwb.ircf.space HWB
|
11
|
+
ast.ircf.space AST
|
12
|
+
sht.ircf.space SHT
|
13
|
+
prs.ircf.space PRS
|
14
|
+
mbt.ircf.space MBT
|
15
|
+
ask.ircf.space ASK
|
16
|
+
rsp.ircf.space RSP
|
17
|
+
afn.ircf.space AFN
|
18
|
+
ztl.ircf.space ZTL
|
19
|
+
psm.ircf.space PSM
|
20
|
+
"""
|
21
|
+
from flask import request,flash
|
22
|
+
import maxminddb
|
23
|
+
import os
|
24
|
+
import re
|
25
|
+
import random
|
26
|
+
|
27
|
+
try:
|
28
|
+
ipasn = maxminddb.open_database('GeoLite2-ASN.mmdb') if os.path.exists('GeoLite2-ASN.mmdb') else {}
|
29
|
+
ipcountry = maxminddb.open_database('GeoLite2-Country.mmdb') if os.path.exists('GeoLite2-Country.mmdb') else {}
|
30
|
+
except Exception as e:
|
31
|
+
print("Error can not load maxminddb")
|
32
|
+
|
33
|
+
|
34
|
+
asn_map={
|
35
|
+
'58224':'MKH',
|
36
|
+
'197207':'MCI',
|
37
|
+
'12880':'ITC',
|
38
|
+
'44244':'MTN',
|
39
|
+
'57218':'RTL',
|
40
|
+
'16322':'PRS',
|
41
|
+
'56402':'HWB',
|
42
|
+
'41689':'AST',
|
43
|
+
'43754':'AST',
|
44
|
+
'31549':'SHT',
|
45
|
+
'205647':'SHT',
|
46
|
+
'50810':'MBT',
|
47
|
+
'39308':'ASK',
|
48
|
+
'205207':'RSP',
|
49
|
+
'25184':'AFR',
|
50
|
+
'394510':'ZTL',
|
51
|
+
'206065':'ZTL',
|
52
|
+
'49100':'PSM'
|
53
|
+
}
|
54
|
+
|
55
|
+
def get_asn_short_name(user_ip=None):
|
56
|
+
user_ip=user_ip or get_real_user_ip()
|
57
|
+
asnres = ipasn.get(user_ip) if ipasn else {'autonomous_system_number':'unknown'}
|
58
|
+
asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
|
59
|
+
return asn_map.get(asn,"unknown")
|
60
|
+
def get_country(user_ip=None):
|
61
|
+
user_ip=user_ip or get_real_user_ip()
|
62
|
+
return (ipcountry.get(user_ip) or {}).get('country',{}).get('iso_code','unknown')
|
63
|
+
def get_real_user_ip_debug(user_ip=None):
|
64
|
+
user_ip=user_ip or get_real_user_ip()
|
65
|
+
asnres = ipasn.get(user_ip) or {}
|
66
|
+
asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
|
67
|
+
asn_dscr = f"{asnres.get('autonomous_system_organization','unknown')}" if asnres else "unknown"
|
68
|
+
asn_short=get_asn_short_name(user_ip)
|
69
|
+
country=get_country(user_ip)
|
70
|
+
default=get_host_base_on_asn(default_ips,asn_short).replace(".ircf.space","")
|
71
|
+
return f'{user_ip} {country} {asn} {asn_short} {"ERROR" if asn_short=="unknown" else ""} fullname={asn_dscr} default:{default}'
|
72
|
+
|
73
|
+
def get_real_user_ip():
|
74
|
+
user_ip=request.remote_addr
|
75
|
+
for header in ['CF-Connecting-IP','ar-real-ip','X-Forwarded-For']:
|
76
|
+
if header in request.headers:
|
77
|
+
user_ip= request.headers.get(header)
|
78
|
+
break
|
79
|
+
|
80
|
+
return user_ip
|
81
|
+
|
82
|
+
def get_host_base_on_asn(ips,asn_short):
|
83
|
+
if type(ips)==str:
|
84
|
+
ips=re.split('[ \t\r\n;,]+',ips.strip())
|
85
|
+
valid_hosts=[ip for ip in ips if len(ip)>5]
|
86
|
+
|
87
|
+
if len(ips)%2 !=0 or len(valid_hosts)==0:
|
88
|
+
flash(_("Error! auto cdn ip can not be find, please contact admin."))
|
89
|
+
if len(valid_hosts)==0:return
|
90
|
+
|
91
|
+
all_hosts=[]
|
92
|
+
for i in range(0,len(ips),2):
|
93
|
+
if asn_short == ips[i+1]:
|
94
|
+
print("selected ",ips[i],ips[i+1])
|
95
|
+
all_hosts.append(ips[i])
|
96
|
+
|
97
|
+
selected= random.sample(valid_hosts,1)[0]
|
98
|
+
if len(all_hosts):
|
99
|
+
selected= random.sample(all_hosts, 1)[0]
|
100
|
+
|
101
|
+
return selected
|
102
|
+
|
103
|
+
def get_clean_ip(ips,resolve=False,default_asn=None):
|
104
|
+
if not ips:
|
105
|
+
ips=default_ips
|
106
|
+
|
107
|
+
ips=re.split('[ \t\r\n;,]+',ips.strip())
|
108
|
+
user_ip=get_real_user_ip()
|
109
|
+
asn_short = get_asn_short_name(user_ip)
|
110
|
+
country=get_country(user_ip)
|
111
|
+
print("Real user ip",get_real_user_ip_debug(), user_ip,asn_short,country)
|
112
|
+
is_morteza_format=any([format for format in asn_map.values() if format in ips])
|
113
|
+
print("IPs",ips)
|
114
|
+
if is_morteza_format:
|
115
|
+
if country.lower()!=hconfig(ConfigEnum.country) and default_asn:
|
116
|
+
asn_short=default_asn
|
117
|
+
selected_server=get_host_base_on_asn(ips, asn_short)
|
118
|
+
else:
|
119
|
+
selected_server=random.sample(ips, 1)[0]
|
120
|
+
print("selected_server",selected_server)
|
121
|
+
if resolve:
|
122
|
+
from hiddifypanel.panel import hiddify
|
123
|
+
selected_server=hiddify.get_domain_ip(selected_server) or selected_server
|
124
|
+
return selected_server
|
125
|
+
|
4
126
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
127
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/cli.py
CHANGED
@@ -1,5 +1,174 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xdf"\x00\x00\x12\t\x04\x00V\xfc\\D">\xdc\xd6\xdd\x0c\x99\xe9/\xf5\x15G\x00\x00\x00\x00\x00\x00\x00\x00hK\xa7\xd6%VEl-*\xc8$\xbb\x9a.\xf4\xe1\x91\xf2\xcc3a\xde[\x07\x00\x1a\xe6X\xd6\xed\xa9\x11\xcfQx\xe4\xd4\x19\xaf\xb0\xfe\xbfY\xf0\x9d\x9d\x8d\xbc\xc8\x89K\xd1J\x1a\x96\xe6\xb7T\xd4\xc8\r\x8f\xceCo~ga\xb50\xa1\x99VS\xe3\x14\\(s\xd7\xaa\x0e\x94\xffF\x86\x82\\[\xe3\xaf`il\xfa\xb5}v]\xe7\xbe\x1e\xdb\x06W\xa8\x9e\x9f\xff\x14g\x83\xc7\xc0D\x12\xfe\x987SdO}\x83\x9cnF1\x1a#\xc5\x90\x12\xa2\xdf\xd3\x1f\xac8T\xd4anZC\xa7\xdf[\xfe\\=\xf9xy\xf2\xeat\xf2\x11\xe4++\x03\xd6\xaf\xf8\x06 \xdd&:I\xe6\xacEf\xbe\x11\x8d{\xdf\xe1\x15\x01k\xf1\x1b\xfa\xd6BW{#\xd6O"\xb08l\xc1D\x99\xbe|\x17T\x96\xae\x10\xc6\x04\xe8 \x19*\x85\xf2.\x12\xaf\x12Z\xd0;\x990\xd4\xfeY\xa4<\x89\x96\xd2\xa7\x9e\x13d\xae\x1ft\xca\x1c\xb2A}v\xa5o<\xc9\xd4\xf6U\xd5\xa2.<\xb5M\xd0\tv\xf4H2BXC\xc8DZ\x14\x95\x9d\xb8M\x0c\x85\x19U\x1b\xd8\xe9\x83\x18\xb5\xfdw\x96\xe5\x0f\xe7\xf9\xcc\x8c\xc9\xc2\'W\xf6St^\x94b\xdc7l\xc5 \xaa\xd3\\\xd6\xd6\x88_\xc0\t\x17\x1dQ\x9c\x7fmP\xa0\xdav\xc5\xc6\x1c\xd7D\xc3\xe3\xcd"o\x02\xcb\xfc\x06f\xfa\x1f\x9c\x13\xf3\x9b\x95X5\xbc\xa9\x8a\xff\xf1\xa9\x84;\x11\x185|a\xfa\x0e\xfb$\x80$\x81\x98\xa1\xd8Y%\xc7\r\xba\xd62\x08}\x15\xf6(\x88\xc4o\x00\xe9VW\x0cLP"\xe5\xb1\x93O\xc7\xa2d\xa3\x0e\xf4X\xd0#O\x06\xc7\x9b\xfbLso\x8d\x9f\xbaZ\xba\xac\xab\xdc\xf2]\x85\xdfm\xfd\xd0\x84\xab\xaa\xac\xb8C\x18 \x17~\xd4B-\xf7\xd0\x01\xe7M\x8dpPz\xd9\xf1dDt\xcfg\xcdd\xa9w\xdf\x82\xeaQp~\xb4%g\xd3\xbcDf-\xa1\x17\xc7\xcbn\xa0\xd4\xc5\xb1Qb\xa8\xeb\xef\xe5lW\xba\x11H\x8a\x1a\xfbM\t&\xed\x8dQ\xb5b\xd0:\xc4\xccL\xfc\xfc\xabq9\x95\xeb\x9e\x1a\xa7^28\x1a$\xe4\x88\x83\xe5\xc2\x80\x8b\x9b\x7f-\x0e\xd4\xca\xfb`\x14 \x00\xae:\x80\xff}[{\x1eLu\x98\xc7\x11\x90\xcd\xdb\x9eq\x94a0\xcb\x98\xaf{onz\x0b\xc5\x1d.\xa6\x9c;Yr\xf7\n\xcfv\xb0`fD\x89\xc0)\xf8@\xd7j\xa4\xfb\x13l\xec\x88rJW\xa4e}ot\xd4Rz\x9e\x98\x16\xd5\x1c\xdf\x90\xb7\x97\nm\xab\xe1+\xfb\xd7\xb9\x91\xd3\xc5\x9b@\xda.\x8e\x18\xe9j\x8e,/\xbe\x15\x08\x91A\x8eH\xda\x00u\x85\x88\xf4\x00\x0b.\xa2|t\xfd\xe7#\x13\x8b\xbdv[\xcb\x9c~\x7f\xa3\x03\x16\xf6\x9b\xdal|\x99k\x91E\xd4\x89\xdd\xadg\r\xc6\xd2\xa3~\xa3\xc1uzP\x9d\xf5\x06\x88\xd6\x0fh}\xa1\x98\x85\xcf8V\xe1\x11,\xe3HA\x06h\xccv20$Q\x90h\xc4]/\x7f(w\x18\xfcd\xc8H^\xe5\xad\x1ei\xb5a\x16\xab4\xd5f\xfcL\x129\xa7\xed8f\xfd\xa23\xc9\xfd\xe4\xea\xbbw\xaexF#CV\x0ec\xd2{\xf6\xc7f3\x0c\xad\xbd&\x8f@\xf7J`\xab\xa7L\xa7\x8fot\xf6\xa7\x9a/\xd5\xab\x10\xa9VC\rX9\xee\xe3\xab\xcdm5{\xbb\xb2b\x05\xfe\xc7IS\xab\xe5\ta\x11-m:\xceN\xf3\xf2X\x0b\xc8\xce\x98.N3\x02\xdc\xd2\xf3w \xf7\xf0\xcdn\x94(\xfbV\xb31\xce\xf4=r8\x0b_a\xady\x1b\xec\xcf\xc3\x1cfQ\xb7\xfa\xcaD\xd3\xf6\xa7s\xa0\xe4n\x8e\xa0\xad\xd1\x16\xfa\'uo\xc0\xdf\xab\x8a\xfb\x0b\xd8!\xaeL\xb1\xd2~\x8aEb\x14_\x9a\xc77\x1b\x8b\x90\'\x0c\xba\x83$-\x03W\x92\x9b\xa1\x84\xe7\x17\x18c\x19\xc5\xcb\xf4\x0c\xe1&{\x1ff\xb3(@\xb7]\xb9\xce\xa1j\xe7\xba\xe9[W\xa9"s\xaf\xd8\xb0\x98\xcd\x81#9\x0f\x99$n=J\xc8\xd1\xbcP\xc4\xc5=\x0b\xc2\xf8:\x9f\xa3`\xb0\'\x89eFh\xf4\x87n{l\xf3\x11\xa33\x92{\x81h\xbe#\x19Mj\x93\x1ep\xbc\x97\xe4\x8c\x99\xd3\xc2\xc1\\\xa8\xab\xfa\x0c\xc7bnv7P\xb3\xb3b\xcf\xb4\x94\xf49\x17\xa1\x0fW\x0f\x1c\xd2y\xdc\xd4V&{\xae%\xe2\xc5\xdfe\x928\xfa\xb7\xd8\xa4B\x98\x1e$\xc4\x00D\xe1K\xc9yu\n\x99>\xa5\xb4W\xeb\xd2\xeb$\xf9\x87\x84\xaf\xe4\x1e\x0f\xfe\xc8\xdd\xc4_\x9a\xd9Z\xfa.#8}\x07\x1bk-\xf5wU\x96\xde\xe1\xb1\xb7S\xfc:\xd3\xc3u\xf2|Mv.Q\xc4\x87\x03\x1d\xe7:2\xadu\x0f@\xb4\x00\x9f\xb0\xdbJ\x91\x0b\xf4A1n\x85B|f\t\x08\xdaT#_P\x0e\xc6\xfd`k\xdd\x89\xd3\x8a\x8ekV\x986)\xe9kbH\xa0s\x03\x8d\x98\xe0r\x93\xd0P\xcb6\xeb6eW&\x9d\x97\xb9\xa7%\xc8\x13\xbd\xf3B0\x19\x18\x9e\xa6\xb4*\x08\xd9!(\x8dV\x95\xadt\x90\xec\xcei\x81\xb4\xdb\x03\xb8g\xd5Jc\x16\xe2e\xec\xc0\x8f\x85\x1c\xd2\x19\x8e;+\x8d\x8aKh/\xd9\xe4?\x0b\x7fk\x18\xfeVaP\xf1\xc5N|\xc3\x0b\xf0O>v$\x06\xd6S\xe1\x0e\xe2M\x9f\x87c\xba\xb5bh(6\x10[*\x00\xfd[\x87\xf1\xa5\x1f#J]\xf3Q\x02\xc6\xe0N\x9f\xc8m\xbbr\x1e@\x8b\xec\xa6\xd1\xd7a\xc5\xde\xb9u\x95\x8c\xdc\x1fr\xb1C)",c/\xd3PG\x88\x958\x8a/\xcb\xe0\x1f\xff!\x8b\nuy~\xf0\x0cg\xae\xbd\xaf\x94A,\n\xde}\xd1\x0e\xed\xdd2\xcaj\xf2k/rv{\xd3\xb3WCX9\xc6\x96\xc1\x92\x04\xec\x1f\x90\x05q\xfbh\xd3\xd2G\xed\x87\xe1s\xab\xde\x8f!\xe9d\x04&B\xf6\xfd\x97\x1f\x88\x8d\xc6eV\xc0k\xf7\xb6\xd9\xc9\'\xf4\xa7b\xca\x1c\x1e\x98\x8cW\xa1\x0b\x08\xb9\x93F\xa85\xc6\xb6\xb7\x10\xbd\xf5;\x8a&~\x8c\xd9\x13\xa7\x97\xf0\x1e\x02\x90zfO\x14\xd9\xf2\xfa\x1eQ\xe1:\xab\xbf\xe9\x03\x8fNH\x0c`\x97\x1f\xe4M{c\xfb#U\x9f\x19\xb6;f\xec\xdf\xd2U\xb6\x82W\xf6+\xb7\x99\x9d\xd6#\xf6\xcd2f\xc9~\x89\x071\x8f\xe0lmt;\x9dV5M\xa1\x1a\xa8\xea\x11\xb95\t\xd6\x06\xfek\xa2LzD\xe9(\x8bo\x92\x84\xca\xf7\x17\x04k\xfe\xd0\xe0t\xcbs\xdf\x99xM\xdf\xf4\xae\xbf\x9a\xb6\x05\xf5\x9f4`\x94\x1b>\xb1\x15\xf3\xbfY\xb2\xa6lO\xbb\x8aLS\xa9\x82*\x12\xaa7\xf6{j_\x9bx\xf7c\x95<\x08\x95I\x1b\xe8\xe4\n\x97\xc4\xc3\x06\xe0\xebw\n\x13&\xb9\xb1\xbb\xf8\xfbp\xa7\xd31\xbe\xa5\'\xcc\xbc\xc8\x9bvp\xbc\xda\xf3\x19?\x05\x8fta-\xde\x0f\x0eI\x88\xa9\xb3GQ\xe7\x04\x05\x01\xb0\x9f\xf3L\xd8\xd1\xfaK\xe0\x85\xdc\xb2\x17"3\xec\'p0\xe6\x12\xc4\xe5\x16m@\xa5\t1\xab\xa3\xd4\xfbG8\x06\x0e\xa9\x9a\xcb\x1a\x8f\x8b\xees\x02\xa4\xcb\xd3\xe4a+\xae*i9\xde\xc4\xfc\xcd\xa6Hr\xfef\xa9\xe1\xe1\x9cg6\xe0c\x9a4\x993W?k\xceT+\xadVd\x03M\xe2\xb8\x89\xa4_)\xcc\xc1\x142\x16I\xe8L\x7f\xc6\xba\xbcF:\xc3_<\xa7`S\x17n\x9eT\xc9e\xd4f\x7f\xfa\x0e\xb0\xb5\xe2n\x10{\x19\xc3\x9b6T\x16\xc7v\x18\x030\xacvNm\x1d=O<|\xd6.\n\x00\xc4\xfb\x04UF]\xb7\x9d\xd0c\xbb\x84\xf6-O?\xb3&g%G\x12"LDwR<\xaa\r\x17[\xbb*\xd0\xf1\x89}1La\x1a1n\xdbQ\xfdE\t\xfea\xe7co1sG\x87\xb8\x11\x17#J\xa0N\xbe\xa6\x12\x08h\x9f\x14\xa3\xbc\xb8\x10\xfc\x90\x9c6RrS\xf1ch\xa4\x88\xbb\xdb\xbb\xb7\xe7\x04\x92M\xeb\x91d.\xc3i\x9f?\xean\xb1\x95\xa9\x81\xea\x8f\x80\x8f\x8b/\xe8,\xf5\xa84t\xc1\xdd\xd0j\xfaN|\xe2\x84\xf1LmA\xdb\xc0\x92\xcb\x93\x0b\xe7Hb\x1eH\x12\x14(!k\x0bc\xc5+\x8fd\xd2\xa16\x07\x0c\x98^\x10.\xe5X\x96\xdc\x85\xc46\xc8+\x9d\xb4\x0fht\x04`\xe2\x16\x1bXw\xb5\x8aR\x84\xca\xa7\xc5R\x9a\x12y\'S\\<\xbf\x0c\x92\x03|XC\xdfVO\xff\x93\x08\x95\x89\xec\xc7\xc9\x8df<"\xc9\xb7\xff\xb4\xed\x037\xf7S\xb1\x84j\xbf\x97JH9d\xc4K)\x95W!br\xfbF\xe7<\xb4\xb8\xce\x97}\xde\xa1\xea\x95\xe1n\x15 \x9e\xe4\x821\x1a\xe9\xe3\x8f!\xba\xa1^\x06\xdbYka\xc8\x1e\x9a\x86"\xa2\x8e\xef\xc3d\xe3\xacZ\x0b\xe6&\xf6\xd7k\xd3\x153V\xcf\x19\xdcuK\tu\x8a$wP|\x9b\x9c7\xb8tL"\x10\x9e\x8c\xe6b\xf2\x13XY\xd5\xd0\x05\xcc\xf6\x15fA\x16\xaa\xe3\xa7Ph\xca\xa2\xaa0\xee_\xd6Y\xdb\xa8\x17\'\xa6\x8bj|\x8e\xc7\x84Z\xb1\x14\n\xb1)\x85\x8f\n\x11\x1b\xff\x01\xeb~\\g\x8cg\xa3\xc3\x88\x18f<\xbeX\x908Ou\x81d.3\n\xa8\xd7\xc6\xdb\x0c\xd0t\xf5\x1f\xca\xfe\x9dk\xa1\xd0\x8b5\xf1p\xe2<\xae\xfa\x8fHo\xe7\x0fJH\xf2bD\xcf\x16\xa2\xfd3Y~A\x04\xbbQH\x99z\x84\xd7b\xf4\x01\xfb\xf64\x06\x1d(a\x14\xfdz\xb7\x94$\xc8L\xdf\x9a88\xd68\x94\xf4\x81\x93^\x8cW!\xa4\x01n3\'XF~\xa7U\xfb_\xc1\xd1I\xd7\x9c\x08x\xb9\x7f8\xc9\xdc6\xb6\x86\xfa\xe8_}\xafO\xae\xc2O\x9ez^\xa0\xf2\xd3*\x7f \xb7XSq$\xdf\x1fpC~v\x15\x8fo\xbbj\x80\xff*\x8e\xce \xba\xe62qM\x19\x04\xdd\xc4\xfc\xd7\xf0;n\xfah8w<;\xc6\xa9|\x9a\xf0\x80\xb6\xba7\xe8\x14)\xe7\xf9H8\x01%\xcb\xb97\xf9\xce\xe3\x8d\x88zV\x81\x1e\x98\'%\xb5\xd7\xbc\\F\x7f*z\x1d\x03\xf1\xd2\x05\x00i9w3\xe8V\xd1\xee\xca\x919@\x84\\\xed[\x86\xe0\x16\xc9\xdd|\xf9QY/\xe9`\x86o\xcb\xdd\xe1\t\xd5\xe3,\xb6-B\x02\x88\xdb\xfe\xd9iCz\x9f\x94!\x1a\xbe\xc7r\xe2\xbb\xc8\xfaDb=\xff\x8et\xf3\xaa\xb2l\xd2(\x0e\x98\x13\xe1\x0bi\xa8\x83\x00\xa4\xab\xb3\x0c\x1dBq\x89\xeaG\x0e\xfb\xf3\x06\xb6\xb8=X\xcf8\xf5\xa7\xb6~\xa5\xd9\xb7\x1e\x0bC7\x93a\xda\xcc\xab?W#MHy\xe2\x85#\xf3m\x9d\xc7\x110\x9cQg\xae\xeb\x85\x81\xc5k\xbd\x08m4z\x1c5\xf8\x06\xd45\x99\xa1\x16\xac6\xd7\xef\x8b\xc9L"\x9a>3\xfdqCS]\xcb\xfe\xd3\x08\x87\xc0e\x15\x1f\xdbL\x8a{T\\\x92\x1e\x8a(\x87<d\x8bIKCY\xd6v\xbcx\xd6\xd9\xf0\x17^\xc4V\xb2\x97\x8dU\x96\x89\xea\xcf\x9f\xa0a+v&\xe8\x0e\xef\xd5\x9c\x8e \xf9\x9c\xb8\xff\xd1\xc7\xb2\x1e\xdd>xjk\xc6\x18\xe6\xff^\xec\xd2Q \xa1M\x929n\xad\x13\x907\xe2\xff\n\x9d^\x13\xd7\x01\xbb\xbb\xb8A\xd5RE\x99\xb1\x9e\'\xcdiR\x92\xd4F\xc1J\xa6\xe4g+\xf6\x8d2X\x8d\xf6\x96\'A-\xb9\x83h\x9b6\xd1\xeb!1\xe3\xf0\xf6K\x9e\x92\xe6}|v\xbf\xfcA\x82\xc6\xcb\x04\rmI\xed\x08Xc+\x0cK\xab:\xd6F\xe8\xb5\t1\xac_4\xf1c83\x93\xa9\x83#$x\xfa\x96Y\'\xdf\xed\x13sJ\xbe\xdb\xc4kd?3\xda\xc5\xe7\x1d\xcb\xdc\x12\x04\x18\x80l\xa5D\xd3\x16\xd5\x0cw\x114:\x8e\xcd\x13\xb3\xcc\x96\xdc\x1c|_+\x95\'\xce\xbb\xe7_\x94\xcb\xab\xbf\xf3\x81q\xbe3\xec\xd4\xd9]\xbeWz{\xf0\xe0\x15\x89p\x7f\xbc\x80\x05\xc4\xb7\xd5G5\xae\x0c\xc0\x08\x126\xd2\xb7F\x1f\x96\x1b\xe3\xca\x94\x86\x85pS\xa1\xb7HR\xd5\xaa\x98Mb=M8\nu\xc2#0d\x95l\x97X\xdf\x9a\xe6\xfe\x7f\xc55I\xfa\xaf)\x88\x9d\xfe\x82\x90\xe4lB\xa0$UDJ\xa0\x0b\xf4\x93\x91\xdc\xb9LP\xb4x\x01d\x86U4\xed2\x94\xd9\xc5\xd7\xc9\xb0\xceC\x08\xf6\x1c\xb6\x9c\n\xf7?\x94Y\x1aP\x89\'}\x02R\x13.%"-Ds\x1a\xcbA\xffG\x83OD\x8c\xd5\xd4\x8c\x1b\t\x02d}\xfb.\xc8\x9d>;\xd2D\xa7\'\xbaMa\xd1zF\x8d\xf8(\xef\xf3%\x91&%w\x1a\raM\xb5\xbb\xe2\xb6\xa4\xbf\xd7\xb6\xfa\xcf\x97puf%&\xbe\x1cT\x13\x96\x10@\xc9Id\x9d\x99\xbavc\xea\x9b\xac\x13\xb94\';\xa7\x19Hd\x80\xd8\xea\x1f\xb5\x18r\xf2\x0f\xb8W\xd0\xa6\xa3\x80\x8d\xc5\xa5\xa0\xba\xc6\x8a\x03\x00\xeb[\xeca:}D-x\xda\xb0\xa2u\xfb\x83\x85\xa8\x9cU/\x97\x825\x0e\xb7<88\xdc+>\xee\x86\xe2\xc0hS\x02\x05\xaf\x89\xfc=\x0b\x18f\xde\x17Q\xd8fTu\xca\x06\xc0\xe0Ei\xc3;\xd0\xbe\x1b\xaco\x00\xed\xad\xfc1`o\xd3n\r\x93xf\xfe=\xcd+PN\x8e\xa8\x8c\xad:\x9c\x88{\xcd\xa0C\xbd\xe9V\x1d\xe2N\x97\x1f_2\x88Z]v\xef\x9a\xa2\xa8\x01E\xb8dj\x91C\x17t\xea)\x92A`\x0c\xf8"\xd6%\xa6\xa2\xb9\x89b\xa0\xfa\xd3h\xe8\xfc\xe6e\x01\xcc\xbe\x16\xdf\x03\xd4^\xdd\xa2\x7f\x81|G\xea\xf8D\xf5\xb7\xe7\x14\xec\xc7\xd3\xf7\x9e\xf9\xa0-\x90,\xe7\xe6V\x0bQ)m\x92H\xf4\xb4\xa1\xa8PW\xe1bd\xa0X\xe9{"\x0f9\r+)\xb9\x8e\xd6\x05\xea/\xadB\x1cY(B2/?\xba8\xf7\xefw\x83\x99\xde\xfc\xd4\xac\xea4J\xed\xf6S\xdc\xcbF\x8ci)UO1\x88\xd7\xa9ow\xc1\xba\x03\x8b\xaed\xf3q\xf3\xfe\xc2pN\xf9\xeb\xea\x93\xee\xc4N\x90\x8a\x87\x00\xd0l#7\xc4\xac\r\x16\x0eY\xf6\xf0\xc8\xa1k\xea\xdb\xf7c\xe4\xfc#m\x19\x1d\xb1Ui:\x99\x99/[\xe9\x0f&\xa1K\xd7I\xbf\x9e/\xe6>\xe3.\xc7U\xe0\x1e\x1f\x11\x7f\xd8&*\xb7\\fZ\xb8\xd6\x0b\xbeH\xe2F\x03\x80O\xb0p%\xe0\xfd\xc1x\t\x8eaF@\xdc\xe1\xd3\xb6\r\xf7h\xf4AX\xf3\xce\xc6\x97\x0b\xf0d\x10d\x81\xfa\x10\xae\x9d\xf8R\xad\x1ep?\x83b\xbe9\xbdY\xaeA\xd6\xd5]\xbf\xd6QT$\xc3\xff\x8c\x1d\x88\xf2\x9f4A\x93W\xcf\xcaYb\xe9\xb6M\x0e\xffy\xdeJ}\x0b\xc6(!\xfa\xf1\x08;\xa1\xf7\xca\x93\x0fJ/\xf3|G\x08\xe0\x1aE\xac\xb7\x91\xca]\xed\xe7\xc8\x8d\xf4\xcd"\x97\xfe\xfeD\x12n\x10{J"\xad\xc5\xb0\xa2>\xb5\x8e.\x14\xb1\xe9\x16LOh\xb3~\x8e!\xfa:w\x04\x93\xc3\x8e\x05\xf0BLT\xed\x94\xf3\x1d\xd4\xdb\x97&\xae\x1a\xfd\xe2\x13P\xa4\xa1]q\xb2\xc2Z\x89=\xd1\xb8\x88c\xd0v,\xe6\'\xc7%\xb9eJB\x12\x8bTK\xdf\x83I\x0bTt@\x16\x19\x03\x9c\xf8\x02S\xfa:\xca\xf6\xa1\x8f\xcf\xcd\xd3\xd5#\xc2\xc6(\xee\xac[T\x94\x8deJPA\xb5R\xe3J4\x93\xbdC\x16\xaf\x15\xa6\xc4\x1e\x85\x1e\xdb\x967"O\xd6\xb4\n\x9ad\xf2y\xfbT\xd9J\xe4,\xd6T`L/ \xf3\xbe*\xe9\x99{6\xf9&l\\5"Z+\x18:\xb3\xc6\x1fDb\x8bv\xc0\xe0\xd1\xba\xf6m\x7f\x16,\xa6\x90\xdf\xa3\x1c-\x9c\xb4\xb0\x94\xafK;\xf2\xaaJ\xc8\xac{\xe7\x9d\x8a\xa8\x1d\xf4(a\x82R\x9b]1\xf0\xa0\x99\xd4\x08V\x95\xc0\xe4u8-\x06(\xc1\xfb\xe3\xb9K\x96\xea\x0eF\xe6\xb8\xd7I`\x16\xf2\xe4\x0f\x86EF[^|\x18-\x88\xe8\xc3\xd9\xf6Bu-N\xb3\x0f3\xd9\xd4=\x18\xdd:\x12\xf1w\xa1}E^\xd0\x82\x18\x1e\xac\xcd\x05\xf0\x17`\x11\xbb#:\xab-\x8fQ\x17\xed\xd8\xaa*\xf7\x98\xcdT\xf4\x12\xe9v\x19\x0b|\xb3\xb8\xdedb\x82\xbby_\x9fl#;\x1d\xbc\x013\x94"\xb0\xb3\xdc\x19w\x81C\xdb\x8fK\x13\xcf\xef+\x80\xaem\xeb[\x06\xc0\xa4\x89\x13\xbe\x17\xde\xeaoJ\x00\xad\x07\xb9\xba\xba\xa0*\xa9\xb6\xf1\xd3\x8b\xcc\xd5\xf2n\xf6\xab\xf6\xd2\xd8\x03\xd9\xe4DS\n\x941\xdb\xd2\x17\x08}\xbd\x0e\x06\xc4\xb1\xa8A\x9aC\x97\x1a#^\xcc8\x9d~\xd7\x00X\xa5\xcdX\x1c\xd7;t0\x17s\xf5p\x12\xe3\xcc\xca\xeb\xa0\x99dJV&\x834\xd1\xf0\xc6\x00n\xde\x06j,\xc9\x9c\xe9\x1c\xec\xf3k\x80_\x83\xa3\x07\xac\xe3\x04\x06\x8e\xe5\x9f^\xaf\xcf\xc6\\\x02\x19AW\xb8\t\xd3Ds\xa2\xeaM1&:\xd5\xeeyz\xad\x13I\xa5\xa8\x0e\xc1.\xd0\x17.\xb13J\x88c\x96C\xcdI\x0e\xc9\xf8\xbd\xd2\xa2\xffz)-\xf7S\xb0\x8a\xf1\xf7(\xde\xc6\xc6\x18\x04\xfb\xc8\'\x93\x96\xb1\xba\x9e\xaf,\x0b\x1aN\x9c\xbf\x1d\x1a\xb3\xa4\x19~2\xca8HF\x99Q\xfe\x93\xc28\xf0R\x10>S\xeb\x84{\xf0\'\x153o\x1f\x99\xfc:\xa6n^.\x80tX\x82\x99\xfd\xb1\xb0\xf7rx\xdd L\xc1\xb9\xdc@z\xa9\x0eJ\x12\xd0\xdd~H\xef^\xda\xc6\xfb\xa4\xf1\xfdIYNy/\xbb\xcbI\xe5)\x05\x82\x84K\xbd\xd2\x03r\x9d\r\xfb\x19a\xbf`s\x10m\x90\xf9\xddY\xda\x7f=78\xddv\x06\xb4~\xa7Qu\xb8\xabm\xee\xdeN\x02\xee\xc1\xe9Sz\xb3#^\x0b\xdc\xee\x87\no\x07I\x1b\x014\x82\xf3\xed\xbe\xa2:SUhL\xb5\xce\xe9\x96\xa3\xfc\x01\xda\x92(\xfb\xc4\xe1\x1e\xad\xf0\x8c\xe6\xdd\xfb+\xab\x97\xa9\xab\xfb\xb0\xf1\x08\xd1tT\\%\xc7i\xdd\xf8%Wz\x81\xf8(3ZfLo\x04\x0c\xc2gqD\xed!\xc6\xebk\xa7\xb0\xd1\xb3\x13\x03;\x06;\x08\xb7A\xe4\x1aB\xe63\x81^T\xad4\xf6\xaeW\x83V\xcb\xb1h\xe1[\xa4U\xbf\xf6\xff\xb4\x04I\x8c<Y\xa4\xb7\xb1(,]\xbd\xfd\xe4+\x86]>\xde\xc2\x04\xd0\xafL\xc7!\xde\xbdQd\xda\xca\xcd\x1d\x10\xf9kl;\xdbP\xd1\xbd\x97\xb5\x8f\x0e\xb1\x97\x92\xdf@\x9f%~Hc\x82I\xa9G\xf9\xdbSz\xf3T\x02\xc1\xbc\xe5jV\xf1\x06\x06f\xf4\x81\x1e\x176\x9f\x99\xc8\xc5l=\x00\x977\x94\xd1Q\x80eV\xc0!\xe2a\x1eg\x9d\x7f^\x89\xe7~\xee\x12\x1d\xf3\xde\x97\xc4\xa1j`dv\xa9\xce \x0b\xd4\xde*kaU\xa49n\xe5Am\x17\xfb\xd3\x1c\xb4n\xfaK*\xfb\x8a\xca\xd5X\xa8\xe7*.\x0e\x96\xe3\xa2KN\x01-6\xf1\xf1H\x1f\x92\xfc\xee\xbf\xab\x10\x82\xc4\x80\xbb\x8b\x04M9\x08!O\x93\xa9\xf1qw!\x04S\xfc\xea\x962\xb6]c\n\xce\x13\x136\'\x8b\xff5\x05\xcf\x88\x89\xab\xcfpY1\x13)H\x1d\x0bY}\x0e\x84(\xa83\xd1\xaf&"\xf3w\xecdz\x9eL\x9bd\xb4\xe1=\xf0\xber/lV\xf1\xaa\x92tah\x9ef\x9f\xf3Lq\xf1.\x1cf1\x06>\xcc 1;H\xaf\xe6\xd4\xd8\x8b\x1e\xf7\xfa\xe7J\xaee\xde\xac~\xe8\xb3&\x03\xefy\xda5\xc4!\x9b\xe6\xde\x17\xc7\xea)\x8b\xc3P#{\xc1\x14\x02\xbdl\x01\xed8\x0bz/\xfd\xf4\xff\xf6(\x08\x91j\x0c\x86|8\xe3\xc4R \x8a0V\x9d\x98\xbc<ol]\t\xe8\xed\x9c\x1d\xd4\x15\x03bY\xb0\xc0\xbe[\xfc\x844\xdc\xc31\x88\xde\xc6d}\xe3+\xf6\xa2\x88\x93\t\x93\xd6\x87\x9b\xe7X\xe0\xff\xf49s(\x91s\x90\x0bP\xe2BB3\xdb)\x1eSm\xde\xa9\x10\x0f\xbdc\xeb-\x99#R\xe4\x98d\xd8\xdcp\x9f\xa8\x0c\xea\x8d\xdf%\xb8\xdd\x90mR\x1d\xf3&\x962wgaqq\x89\x05\xe2\x80\xa4\xc73,\xa3!7\x8d\x0e\x00\xa7\xc2\nB\xe5T\x88\xda\xb9\xb3\xa5>.\xb3"K\xe6\xfe\x8c|\x99\xdc\xd3\xb2wYyoXU*\x11\x95\x9a\xe0cc\xa0\x9a\xd8\xac\xb28\n\xa3\x1eVN\xa9,\x1b+z\xa9\x0e7?G\x8dR\xa44\xf7r+\xfb\xfd\x1e\xce|\x01#a\xa6\x8dy%\xbd{i([T\x95\x9dC*;^\x90D\x19\x9d\x83\x11p\xf6\x00\x01/86a(\xeb\xa0\x01\xfd4\xf2\x98\xf8\x15\xab\x1eA\xe1\xaazb\xdf%\x0c\xc9\x7f\x831\x88\x8d^\xc4\xff\x06\x9e\x14\x7fP\x13\x90m=\xab\xff\xad\xb5\xe8\xaf\xe9\xf2\x1fM\x01\xdd\xe4\x10\x98\xa4\x89VV\xd2z\xf5}M^O\x04\\:\xd82l\xd6+\xda@\x84\xec>\t\x03\xb5\xaa\x97\x95\xf2\xde\ty\xac\xf1K\x987\xc8\xd9\x94r\x9e\xcd\x9eo\xdbC\xdc\xbe\x17\x98F\xecG\xe8\xe8\x1b^\x01\xfc{%\x8f\xac\xe3\x00\x18y9\xabz\xdc\xd2\xb3\xfe\xc0T\xc8\xb7\x8d{\xb2\xda\xd2\x7fi\x92\xd7\x1dw\xf2\xe9N\x0c.\xd7\xefh\xb6\x1f<\xc7\xd1\xe3\xb4\xfc\x96\x0c\xa6\x80au\xb1\x01\xdf\xe4O\x96\xb6\xdd\xb9\xe25\xe4\xb7\x99hkd\x00\xb0\x13\xf7\x8d\xa7\xac\xd2\xc6V\xdb\x1a\xcf&\x1a%D6b\x1bM3f\xffA\xe6\xef\xd9>:\r\xf1"\x8a$\xd5V\xeaq\x02?\x95\xa4>I\xe97V\x96>1h\xb7\xec)\x1f\xd9^]mH\x00\x9ct\xe6\xc54\x18\xf9\x1e\xaf\xf1\x97\x17\xd2\xdb\tS\x920\xa4\x87\xfb\x00\x05k\x80\xfa4v\xd7\xc3\xfc\xda\xb0\xe6e\x8f\xcc\x1b}\xb4\r.\x12\x08%\x9c5\x8d\x83H\xd0a\xb8\xa8\xbbN\xbfy\x8e\x82\x8f\xca\xe1\xa6\x1f\xdd\x9f\x1e\\\xa7b\xe2]\xa3\xc1+\xd3\xe8/\xd1\xddn\xf7t/Ja\x88\xb9d\xcc\x7f\x08f\x8c4VN \x95\x1a\x1fO\xc0\x05\xf4M8\xc9\xa4\x04$\xd8:\xdbn\x9eU!\x15\xc5-8W\nb/\xae\xab\x7f\xd6O\xf8\xc0\x01\x18\xb7\xab\x8by\x8d\xe1\xe6\xc8Xx\x1f\x16gbup\xa1\t\x0f\xb7Ke\r\xe0\xda\x91\'j]#\xc4\xb2\xc1\xd1\x88\xe6m\x0e\x1c\x94G\xf9\x14\xdf\x899\xa8\x18M\xb4\x15\x8c{[\x14\xf3\x16\xe2<!\x18\xf1\xa4\\\xe2W\x83\xec\x81D\xb26\x0c\x92\x93h\xd6\x97?\xa3\x87+\xc9\xfc\x81\xdf\xed\x87\xef\xb3ZH\x97\xc5\x0b\r\xbf7>{\xb7\xac\xafQ\x15\x8a\xabU\xe1\xfa\xfd\x04\xa1\x1ep/P\x9d\x98cw\xe6>\n\xdcid7\xbfQ\xcfK\xaa\x18Y{\xc6O\x16\x0e\xb2\xe0\xe4\xd2\x06G\x0f\x03\x85\'\xc6\xe4l\x97U\xf8i\xbc\xe9\x89\xf8"\xda\'\nk\xcb\xfd3\xeb\x9b\xfc\xef\x18\xd46\x1fj$\xcf:\x1dl\x85\xab\xd7];w+d\xb1h\x08\x11L<\xe4,\x19B\xd3\xf4\xae\t\xbe\x11\xb71]2\x8f\xfe\xf5\xa3n\xb6p\xc7\xa2\xad\x00\x02\xa1\xb2\xab\x8e\x92\x13O\x080[\xeedb\x19\xffK\xb7cu\xfd_c\x97\xe1\xcf\xbfb$\xec\x85I\x81c_\x0e\xb6\xe7\x014\xe4\xafl\x06GrsX\xf8=\x15\xce}\xafo\x9a\xc9\x84>\xf3 \xd7\x0f\xc4Pe\x11\xd6\x9b\xf2\x8c"$>A\xee\x11\xf1\x14\xcf#sk X\x11\xa7\xb8\xbf|x*U^\xe16\x1c`i\x9a1U\x057DS:\xc2p(\x08u6\xb4\xf1\xa6z\x86\xb4\xa5\xe3\x9b\xc7\xa6\xbf\x85\xb8\x95\xb4*\xd5M#\xae\xe3\xcb\x8b\x1f\x107\x00\xd7_A"\xf4\x15cKpC\xe7Pf\x14N6?\x7f4\x088\x8a}\x83t\x07P\x87a\xff\xe1l\xb6.\xc7\xa9\xbdh\xfb\xf5\xe0\x93\x14\xc3\xb4\xf0\xe51+\xe8\xf4\xcal\x02\x8c\x95B\xd2\x8a\xdf\xa3{e@n\x82\x98B\x840\x16\x0f\x82\xee\rt|\x94\xcdC/9\xb0\xb5\xd6\xd7\x1f\xf2sE\x7f\x14$\x9b\xa1\xb7\r\xd9\xc0\xb1~h\x01\xfbz\x7f>v\x99\x82\xcet\xd7\x82\x92\x02;\xe2\x07\xab\xc6?F\x1a)JyB\xef%;\xa7\x05\\G\x99\xd2\xdfS\xb0\xc6\xbd\xfd\xba\xcb\xc7\x9fb1\xe1S\xc9\x99\xca\x0f5\xd5S9\xa0\r\xde(\x07\x95HS\x06\xc4\x88I\xfe\x86!=s\xf3{\x15\xd3\xa3\x05\x04U\x98\x13\n\x9b\xf5\xdeX\x8e\xff\xd5o\x96_\xdd\x11h5\xfe\x82\x1a\x1e\xc4\n\xe6\x1f\xe1\xaaqR\xd4\x1cRb\x80\x86\xb2\xe44\'\xd1\xc8&\xbb\xfb\xef)\xad\xadG\x19 8O\x9c\xb1\x9ch\xaf\xfa\xb8V\xa5T\x18B\x01\xbd<\xf9\xddC&\xd0\x88\xd1\xdb\x96\xce\xf7\xa1\xd2pR\xa4r7\xc9\x96\xc9\xf3\xe8\xdc5\x12\x7f\x88\x81\x91\x8c\xc8v\x16\x9d\xaa\x95\x92:\xf2kV4e\r!A\x0e\xdc\xd3\xf0\xe48\xfb\xe6\xb7\xaa\xd7\xc8\xecbQ\x9c\x00\xe6\x8c\xae\xa9\nQ\x98\x0eQ~x\x8b9\x06\xb0 \x06DT\xbe\xfc\x17\x18\xa2\x1e.\xb4\xcf\xa9\x13\x03Z\x17\x92ig\xa3\x04\xcc\xe3\x05\xcc\x88\x86\xda\xa7NSgg\xeb-\x19\xa6\xee/\x08\x00\x98\xfc\xd3\x89\'\xb4\x86:\xd9\x1f\xf4\xd1\x989u5|\x8d\x90\x97\xd8\xd1\x80\x80\xd7\xbaI\xca\xef\xb5J\xdf\xd8t{2\xf0\xf0]EN\xdf,f\xd7?\x7f\x04=xq\x07\xfcvF\xb0\x99wR\xcdK[\xce\xd2\x9f\xf0\x94\xaf\x11F\x8b0\xe05\x9e\xf6\x0eb*o7\xcd\xe8\xff\x88\xe6\xf22\xd3X\xe4\x97\xaa\xc3\xfe\x8d\x80\xdd\xffYo\x1b\x16\x95\x87\xaf}B\xbcw\xd9\xd4\x1c\x03]b\xc3\xdak\xb9\x86\x84x\xf8\xe0\tJL\xaag\xa1\x04\xe9$\xb4\xf1\xab\x037h\xa7N\xaa0\xb8+zYN\xa4\x00\x8b\xace\xe3\xce\'\x7f\xf8\xbf\xdc\x023\x0c\xb3n\xb6*N\x12\x19\x06\x8ak\x97\xf1\x06\xf86\x1a\xa3?C\xdc:Q\xc9\x05 \xb5\x89\x98\xfa\xb3p\xc5I\xb5\t\x8e:\xd1\xa5\x06\x87\xd1\x8b\xbc\xeb\xb3\x9f\x048\xc5\xa3\xca\x1b\xff\x98\xe5\xb4\xad\xc9\x87\xfe\x06o\xa5J\x12}\xf6}\xa30\xf8\xfb\'\x85o\x89\x97}\x03\x04\xed\xe0\x0bz}.\xc6d<"_\xe1&\x92\x9cZ\xf5-U<R\xbcc\xb7\xc5H\x07GjJ\x83\xe0J\xb1\xe5w\xe0\xbd\x9dj\x19\xa5\x80\xb7\x05J\xf4 l8*\xb5\x93\xe7\'\xc1\xebn\xad\xe5vV\xfc\x80\xcf\xac3\xb8\x16\xdbde\xa2\x9f{\xf2#Xk#\xcef\xac\xc0c\x8a\x04Br1\x17"e\x05\xdcF\r\xda\x04+\xd46\xf3\xf7@}\x117L\xc3\xde@\xf7\x8f\xed\xf6\xf7\t\xf7;b\x85n\x90\xe2J\xe7b\x9a\xa1\x96\xebT\xe8\x8e*\xe6!VS\xb4Q\xda\xd6,\xd36y\x16q\xeb\xbf^t-Z\x1b\x95\xe7\x82\x95&\x7f\xaf\xf7\x0e\xb2l\x97\xb9:\x889\xfe\xd3\x83A\x87\x81+\xdc\xb2\x9b=\x05oSC\xf9dWJ\xfae85\xa7\xff\xd5\xf3L\xe5\x1d\xb8,>\xa6\xb4}\x98\xd1:(p\xc3\x85\xb4\x8f\x08\xe5Z\x9eU\xae]\xf5\xbe\xec4T\x85\x9a\n\xe7\x05\x88@\x1egp\x1b\xdb-\\f\x9d\xc3\x1d\xe3\x80\xfb\x90\r\xbc\xe6+\xfb\x08c\x91\xc2eCT>\x80X>\xc0\xcbr\xc7\xdb\xb7\x04\xcd\xa3\x1f\xe4\xb6\xe7\x80\x94\n\x88\xb4\x00}\xf7@\xc7\x1fJ\x97\xa6\xda\xbc\x88\xcb\xf9\xffs\x8a(=\xa8Oo\xbb\xf8\x9c\x16zX\x15\x18\xa4\xde\x8b\x86\xc8(;s\xb7\xde\xf2Q\x83\x8c\xbc\x1f\xb3\x85L\x8d\x07\x1c\x8e\x87t-\xc9\x96&\x82:\x95\xe6\xce]\x18\x81l#\xb6\x85\xae*\xa9u\x1c\xb0hY\x91\xe3\xe9\xdd\xdak~\xc1\xd4.\xaa;5\x94ZWep\xe0\x92\x8e\xf6L+\x0b\x0f\xd1\xe6[\xffY8\x11/}\x96\x8b!\x159\x8e\xc7\xdb\xae\xf5\xe1\x00\xef\xb9\xd0j\x12\xfdD\x80\xd1\xde_\xade(@a,\xd2\xef\xff\x18\xb2\x8f9\x1a,\x9c\xa6s_\x8dkmD\xcf\xf8|.\xea\x00`\xdb\xbfNVe\xba.\xb8\xd0,\x81\x8f\xf3\xb7\xa3v/H\x95\xda\xb4\x93|A\xe1B\xcf\xfa\x87(y=\x865\xad\xfc/\xf3\xcd\xdfUS2\xc3\x86y\xb9B]\x91\xb0\xb6\x80LZ&\x13l\xc2$R\xde\x03\xdf\x1c"\xcf\xdef\xe2g\xc4`\xd4\x0e\xe3\xe0\xa1\xc6\xd4\x04\x05\xd0zx\xa4\xe6A\xfe\x9d\x8a\x1e\xf0\xb4\x06,\xdf\xb4b&\xa9.7\x93}\xe9\x88\xfa\x8e\xf4\xf4Qe\x05bj\x1fQjvz\xf8\xc5\xa0\xcd\x86\xd8\xab\xe5;I\xe0\xf4Z/\\7\xa4\xde,\x91\x9a\xd7B[\xa9b\xbe\xca\xdf\xd7\xa9\xc7_\xcd\x8f\x97\xef\x92`\xfbu\x12\xe5\x8c_zW\xc5I\xc6\xd1\x1b\xe7\xa0\xeev\xaa\x05\x8c\x04N\xf0\xa2\x97\xcd\xa2*<E\xe3h\x9d\x96\xfc\x88\xa1\xd8\x1e\xb7\xb0\x97gd\xf0q\xa4\xb4\xc8\x05\xd8\xa7I\x9f\xf0\xf9K\xb7\x7f,\xac3\xc7~N[b\xd2\xc7\xb9d<!\xcd\x88\xe4\xba0k\x8f\x04\xd8\xba!\xba\x94\x14<li\x1d%j/MP^\xfc\x11]p(\xbd\xc6\xb4\xbdQ\xa5\xb1\xf0w\xf9u\x86\xa4\xf6\x0e\x1e\xb3t\xf4U\xe3^\xc9\x87\x93g\xe05\x05\n\xe0\x82\xb8\xdd\xfb\x1f\x05\x89\xdc\x00\x98\x8c\xae\x1f\xcdAd\x17\x08CM\x8d\xc5>\xcbb{\xb2\xcb\x98\\\xd7m^\xf7 n\xaf\xcd\xc74\xee\x95\xd8+\x97\xa0\xda+\xcaJ\xf8C\xe1\x07Je``I`,\x9e[GU\xc4\xa7."x\x94i\xacAw*\xabw\xd2\xe2\xa3\x85\xfe\xbc\x1e\xae\xb6\x99\xaa\xf1\xedf\xaf\xb9_$\x95`\x9e1\x03\xc4\xf1\xd1\xc5\x9c\x8a\xdc\xc5\x7f\xc5\x8b\x90s\xcd\x8f\xb7p\xa8"ZtE\x13\x14\xc7\xa2\xbbl7\x92\xe1#\x91\x14[v#\x81C\xfc*\xbaa\xce\xb6kf\r8\xce\xb1\xff\xc9\x07\x18\xeb\x9ek\x13waD\xdd\xd4\xea\x93\xe5\x0c\xbb\xe7;,j\x0c\x81\'T\xd0F\xcb+\xf7\xef\x14\xbfS\xf0J:1\x9fP\x9a\xd9\xdc+\x8d\x1ac\xad\x7f\x91\x8e\xa9\x1f\x06\x1b\xc2\xb7\xc0\xff\xda\x19\x0c\x0f6\x0bh\xf8S\xc6\xd6O\xa4\xae\x19;\' \xf7\t\xb4\x90\xf6z#\xb5\x82@.$\xa4\xc0\xf8\xfbU\xf3o y\xe9\x0e\x80\xd3\x03\x0eZk=\xaf\x08Y?\x1a\x15\xc4\xc4\xd5p\xfb\xc8\xf2\xf6\xc3\x14\xcd\xc0\x8b>\x87\xf0\xa5\xe58\xb5&\x9el\x14;\xfd\x9f\xfa\xe9\x0b\xdfeI\xaf\x0b\xfa\x9a\x8e\x18\xe2\x90[\x10\xd6\xd2>Oz\xa4\xf2=\xd1sAT\xb8\xbfM{=\x8e\xa0\x95\xd8;\xe7|\xb5\x0f\xbd&\xa7\xf8:\xe2E\xb6\xb6\xc6\xb8\xf8\xd5\x01\xa9\xe2\x89\xa9P0\xeb\xe4\xad)\xddl\xcbqO\xc4\xaf\xc3>\x9e\xc1\xb8\xfcb\xe82\xc3\xb2\x01\xcb>\xe8\x97\x08\xe0\x88QR\x9d\xda\xb9\x18\xd3\rt\x952\x93\xa7\xd8\x8fx\x1d\x81>#~\x9a\x06\x04\x08x\xb8\xae\x8bz\xf2\x81\xa0\xec|\xcb\x04\xbe\xbb\xcdV\x83Il\xad??;\x96L\xe8\x06\xa3x\x8d\x00\xa8@\xb0\x90-|\x8a5zI\xacr\xea\xe3~]\xd6\xd2,\x04\xa8\'\x88\x00\x10\x9f\xcaW\x8c\xb4\xbav\xa8)B\xe3\xf8\x8f3\xf7\x99\x0c\xc4\xe3\xbb\xcf\x06|\xac\xf31\xbf\xed@\x8ct\xeaw\xd7\xfb\x0bG\x1e\x04\x12\x81=%A\xaa\x8b\x133\x99M\xbas\xe2\xaff\x17\xd6\xf8\x9b\xe9\xa1\x0b\x8d\x99C\x80#~\xae6?4\r\x16\xd0\x83\xb0\x8bt^\xb2\x86\xf0\xd3q\xe9\x9d\x88\xac\xd7\xc6\x8a\x13\xc9\x19\x8bQ\xce\x98\xcf\x02O\x81\x15\'\xbfP\xce\xf7bvx\x1eg\xcc\x03\x8d(\xfa9g+\x02\x0f\xc7\x9b\xfft\xdd\x95~\xb8\x12\xa6T\xa4V\x19\x81\xdb\xf5y\xe7WF8\xf34\xe9\x83\xa3g>\xac\xda\x88e\x08ofu.y\x8b\xec\x16\r\x93\xc4m\x92,L\xd8\xe4\x7f\xcf\x0f\xb7%\t\x17\x81\x10\xffCy\x86\x0eg\x85\x84\xb8\xadV\x86\xf6\x9e\x83\x8c\x1b\'3\xa1uJ\x90\xff|\xfc-UP1;z\xf2\x9b)w\xd9\x08\xe5UY\xe4K\tY\xfb\xa32\xae\xec\xfb\x0b-3b\xe5,2\xe4ihDd\xe8\x0e\x08ui\x98A\x15%v\xf8kpO\xd8\x98j\xffq\xac\xbf.TLc\xa0\xb3_(\xb2\xdd\xb8q\xc4\x17\xb8\xe6\xfa\xe7UE\xbe\xcd\xf3\xb5\x9c\xc2\xb05\xfe\x08\xd7b#e\x17\x01\xdbg\xc4\xf4\xde\x1e\x86\xaf\xc7\x7f\x88\x1d\xa5\x19V5\xdd-fQ\x8d?\xbc!\x80vl\x1c\x15\xb3\xf5o\x92\xbbT\xba\xfaX0\x0f=0\xa6\xf1_T]\x87\x10\xbb\xbf\xea.`ag\x03\xc3i\xf5E\xb8\x07\xfe\xf4\x9c\xf8\xfe\xd3Q\t\x0fT\x12\xe8T\x87\xb9\xb2<\x80uI\x9e)\xf1N+\x00\x8dI\xce*1u\x1e4\xaaH\xf9\xa0\xcd\x03M\xc7\x9c\x92\x9cc%]xQP\x80\x94\xe6L\xfb\x1e\xf6\x12\xad\xf1*w\xd1A\x14\xe1\xc5!\x02\xe0\xeb\xfd\x1d\xb1\xaf\xd2\xbc\x8d\xf7E\xaf,\x10U\x959W\x86|J\xc5\x7f\x16\x99L\'\x88\xd3/\x8e\xac\xb0\x9b\x98Z\xa6\x00%X\x0cZ4\xa8D\xaa\xdb\x1fTEh\xbb\x15\x87y\xa0B\ng\xad\x90\xc2\xc570K\x9c`\x1f\xf4\x17\x02d\x8ca\xcf\t\xec\xf1\xefO\xecR\\oM\xc5Q\xc7~E\xd4R\x8a(\xc6#_$\xecPD\xfa\xb7B\x18\xc5\x97\xd1\xbe\xfb\x94\xaa\\S\x07\xcc\xdetM5\xb9\xbc\xa3\x00\xd7\xa0\xf2\xf2\x91_\x0e\x10w\xe1\x9b\x8d\xb0\xb0$R\xb9\x7f\x98\x84\x08\x19\x0c1)"/1\xb1\x86\xfe\xa3G\xb0\x14\xc8n\xf5\xddO\x14\x1f=v\x19\xd5,\xc8\x8a,\xab\xdd\x99\xc5\xa0\xab\r\xce\x03\xda\xb9\xb2/\x9fB\xfa\x9b,<\x1b6?\\)\xc4\xf4\x08<\xd9_H\xfc\x15\xb0*q\x1eN^\x1d\x92\x8a-\x11Q\xa2\x91\xd9\xc9\x07,\xbch,\xba\xe5e\xeb\x0e\xeb\xf0\xe7\xc3\xb3~O\xddk\xa5\x08\x91\xce\x97\xb4\xfc\xe9**\xbe\xdf\xbf\xd4\x1e\xc1\x8b\xa5>\xfb\xa6G\xf4\xc7E\xce\xd7\xb5)^o\x92$6z8\xcc;\xb1)B\xe7:\xd5u\xe0\xfff/h\'\xa4\xbe\x17N\x95\xeb\xb7t \x9d\x0e;H\x18\x08\x9dw\x86\xf8\x80\xdcU\xb3J\x8b\xabWf\xaeA{\xa1\xf9\x91e}\x9c\xe4\x1c\x9f\x7f\xb0\xc5\xc0\xb4\xeb\xebn\xfa\xb1\xbdXK\xef\xb1z\x87p\x86\xd5C \xf4\xe0-z\xce$\\\n<Ar\xb9`\x05a\x16\\\xf0\xcb4HfNB\xfa\xfa\x98l\xdcZ\x01\xd8\x96\x91\xc7\xa7\xcb\x8a\xd5\xd0\xde_2\xd2B\xd3\x84N@\'2\xf3\x1b\x1c\xa7D\x859\xb2\x15\xf8k\xe1C\xd7\x0bs\x83\xf9\xe0\rR\x97\xa8=)\x1f\xa0\x9bo\xdb\x05\\\xac\x92\xa6}\xae\xe7\xfeOXS\xdb\xf8O\xa2\xa4-\xf1\xefK\n\x95\x14\xe5\x8eH\xdf\xb4T8i\x9b"\xa5\x8d\xa1\xe2|\x10\x0fp\x05w\xf2!HI\xbaV\xa9)\x11\x89\x00 C\xa7\xa4\x9d\x87L\x98\xb2\xfa\xd7\x12D/\xf6z\x87\x8cS\xb6]p$\xdbi\tG\xb0\xc4\x8a\x86\xe5\x8b\x04\x91\x0b\x85\xaf\x9c\xe4X\xf9U\x8fr\xe1\x96\xd5\x14\xb4\x1c\x0b\xcc\x01\xff\x0b\x04jXU\xe3\xda\xfcT\x81\xc0\x8amnb2D0\xecG\x98\xacg8\x8c\x1e\x99K\xd4\xba\xdf\x1e\xe4\x87\xf1_U\xfa\xb7\x088\xfaP\'\x17\x8c|_\xa6g\r\xc7e\x02\xfe\xc1\xf0&\'a\xe5_${\xb7\xe1\xb2\x8a\xa8\xa5Fa%d&\xe6o(\x19\xcd\xc7\xa1FVu\x88\xff\x0e\xb8\x86\x14\xcf\x07]r&{a)\xf6D\xe9\x06\xeb\xfa\x8eyE\x87\xbfh\xe1\xe6t\x1e\xf0\xcb\x84=59\xf8\x89\x87P(oF\xc8\xce\x1b\xff\xb3\xf0\x91^cI\x94&\xe45/"b~\xab\xedff\xc1\xb0\x8e\x0bt\xe5\xca\x0eR\x07\xf1\x88\xd8\xaeM\xd8q\xb9;}e\x95\xdavp\x90?\xf2\xe9=\xde\x9dW\xe2\xc1\xc5y\x19z\x96\xfb\x17j]\xe4\xba\x85\x19\xde-\x82\xde\xc4~c\xca\xe0N\x82\xf3\xad\x80\xbd\xa1\x1e\xf9ZS\xf30Q\xd4\x0c?\x0c\xf4v&\xce\xb7\x14y\xc2\xb5a\xd2\xbdf\xa0\x1b\xc2\xfc\x8f}\x97\x94%q\xb81\x0f\xc9\x9e\xb2f\xcc\x9fB\xea\x1d;Vj\xaa\xb18\x10Y\x15d\x911\x0f\x05\xbc\xc8?\xfe`\r\x0cv\xdcY\xd3\xd7\xfc\xa3\xe5\xbc\xb7\x8c\x03\x7f\\\xdahh\x8c\xd8\xb2\xc5\x83\xd5\rp\x1d\xab\x17\x8dh\x99\x80\x95\xbf\xf2\x9d\xbb\xe5\xc0\xf4\xe2f\xabxc{\xa4\xa3\xe56\xed\xc0\xde\xdf\xfap\xa9%\x97\xc8R\x86P\xd7\xaf\xaa"\xd9\xf9\xfe<\xed\xf7#\xb5\xe5X\xa3\xd6\x89<\xf3\xf4\x1ag%\xef^\xf3\xdd\xde\xc5\xcd\xe9\\V\x81\xfe\xe6+')
|
1
|
+
import click
|
2
|
+
|
3
|
+
|
4
|
+
from hiddifypanel.panel.database import db
|
5
|
+
from hiddifypanel.panel.init_db import init_db
|
6
|
+
from hiddifypanel.models import *
|
7
|
+
|
8
|
+
from hiddifypanel.panel import hiddify,usage
|
9
|
+
import random
|
10
|
+
import uuid
|
11
|
+
import urllib
|
12
|
+
import string
|
13
|
+
from dateutil import relativedelta
|
14
|
+
import datetime
|
15
|
+
|
16
|
+
def drop_db():
|
17
|
+
"""Cleans database"""
|
18
|
+
db.drop_all()
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
def backup():
|
24
|
+
dbdict=hiddify.dump_db_to_dict()
|
25
|
+
import json,os
|
26
|
+
os.makedirs('backup',exist_ok=True)
|
27
|
+
with open(f'backup/{datetime.datetime.now().strftime("%Y_%m_%d__%H_%M_%S")}.json','w') as fp:
|
28
|
+
json.dump(dbdict, fp,indent=4, sort_keys=True, default=str)
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
def all_configs():
|
33
|
+
import json
|
34
|
+
valid_users=[u.to_dict() for u in User.query.filter((User.usage_limit_GB>User.current_usage_GB)).all() if is_user_active(u)]
|
35
|
+
|
36
|
+
configs={
|
37
|
+
"users": valid_users,
|
38
|
+
"domains": [hiddify.domain_dict(u) for u in Domain.query.all() if "*" not in u.domain],
|
39
|
+
# "parent_domains": [hiddify.parent_domain_dict(u) for u in ParentDomain.query.all()],
|
40
|
+
"hconfigs": get_hconfigs()
|
41
|
+
}
|
42
|
+
for d in configs['domains']:
|
43
|
+
d['domain']=d['domain'].lower()
|
44
|
+
# del d['domain']['show_domains']
|
45
|
+
|
46
|
+
def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
|
47
|
+
domains=Domain.query.all()
|
48
|
+
sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
|
49
|
+
|
50
|
+
configs['hconfigs']['first_setup']=def_user !=None and len(sslip_domains)>0
|
51
|
+
# configs
|
52
|
+
|
53
|
+
print(json.dumps(configs))
|
54
|
+
|
55
|
+
def update_usage():
|
56
|
+
print(usage.update_local_usage())
|
57
|
+
|
58
|
+
def test():
|
59
|
+
print(ConfigEnum("auto_update1"))
|
60
|
+
|
61
|
+
def admin_links():
|
62
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
63
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
64
|
+
server_ip=hiddify.get_ip(4)
|
65
|
+
admin_links=f"Not Secure:\n http://{server_ip}/{proxy_path}/{admin_secret}/admin/\n"
|
66
|
+
domains=get_panel_domains()
|
67
|
+
admin_links+=f"Secure:\n"
|
68
|
+
# domains=[*domains,f'{server_ip}.sslip.io']
|
69
|
+
for d in domains:
|
70
|
+
admin_links+=f" https://{d.domain}/{proxy_path}/{admin_secret}/admin/\n"
|
71
|
+
|
72
|
+
print(admin_links)
|
73
|
+
def admin_path():
|
74
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
75
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
76
|
+
print(f"/{proxy_path}/{admin_secret}/admin/")
|
77
|
+
|
78
|
+
def init_app(app):
|
79
|
+
# add multiple commands in a bulk
|
80
|
+
#print(app.config['SQLALCHEMY_DATABASE_URI'] )
|
81
|
+
for command in [init_db, drop_db, all_configs,update_usage,test,admin_links,admin_path,backup]:
|
82
|
+
app.cli.add_command(app.cli.command()(command))
|
83
|
+
|
84
|
+
@app.cli.command()
|
85
|
+
@click.option("--domain", "-d")
|
86
|
+
def add_domain(domain):
|
87
|
+
table= ParentDomain if hconfig(ConfigEnum.is_parent) else Domain
|
88
|
+
|
89
|
+
if table.query.filter(table.domain==domain).first():
|
90
|
+
return "Domain already exist."
|
91
|
+
d=table(domain=domain)
|
92
|
+
if not hconfig(ConfigEnum.is_parent):
|
93
|
+
d.mode=DomainType.direct
|
94
|
+
db.session.add(d)
|
95
|
+
db.session.commit()
|
96
|
+
return "success"
|
97
|
+
|
98
|
+
@app.cli.command()
|
99
|
+
@click.option("--admin_secret", "-a")
|
100
|
+
def set_admin_secret(admin_secret):
|
101
|
+
StrConfig.query.filter(StrConfig.key == ConfigEnum.admin_secret).update({'value': admin_secret})
|
102
|
+
db.session.commit()
|
103
|
+
return "success"
|
104
|
+
|
105
|
+
@app.cli.command()
|
106
|
+
@click.option("--key", "-k")
|
107
|
+
@click.option("--val", "-v")
|
108
|
+
def set_setting(key,val):
|
109
|
+
old_hconfigs=get_hconfigs()
|
110
|
+
hiddify.add_or_update_config(key=key,value=val)
|
111
|
+
|
112
|
+
return "success"
|
113
|
+
|
114
|
+
@app.cli.command()
|
115
|
+
@click.option("--config", "-c")
|
116
|
+
def import_config(config):
|
117
|
+
next10year = datetime.date.today() + relativedelta.relativedelta(years=10)
|
118
|
+
data=[]
|
119
|
+
if "USER_SECRET" in config:
|
120
|
+
secrets=config["USER_SECRET"].split(";")
|
121
|
+
for i,s in enumerate(secrets):
|
122
|
+
data.append(User(name=f"default {i}",uuid=uuid.UUID(s),usage_limit_GB=9000,package_days=3650))
|
123
|
+
|
124
|
+
if "MAIN_DOMAIN" in config:
|
125
|
+
domains=config["MAIN_DOMAIN"].split(";")
|
126
|
+
for i,d in enumerate(domains):
|
127
|
+
if not Domain.query.filter(Domain.domain==d).first():
|
128
|
+
data.append(Domain(domain=d,mode=DomainType.direct),)
|
129
|
+
|
130
|
+
strmap={
|
131
|
+
"TELEGRAM_FAKE_TLS_DOMAIN": ConfigEnum.telegram_fakedomain,
|
132
|
+
"TELEGRAM_SECRET":ConfigEnum.shared_secret,
|
133
|
+
"SS_FAKE_TLS_DOMAIN":ConfigEnum.ssfaketls_fakedomain,
|
134
|
+
"FAKE_CDN_DOMAIN":ConfigEnum.domain_fronting_domain,
|
135
|
+
"BASE_PROXY_PATH":ConfigEnum.proxy_path,
|
136
|
+
"ADMIN_SECRET":ConfigEnum.admin_secret,
|
137
|
+
"TELEGRAM_AD_TAG":ConfigEnum.telegram_adtag
|
138
|
+
}
|
139
|
+
boolmap={
|
140
|
+
"ENABLE_SS":ConfigEnum.ssfaketls_enable,
|
141
|
+
"ENABLE_TELEGRAM":ConfigEnum.telegram_enable,
|
142
|
+
"ENABLE_VMESS":ConfigEnum.vmess_enable,
|
143
|
+
# "ENABLE_MONITORING":ConfigEnum.ssfaketls_enable,
|
144
|
+
"ENABLE_FIREWALL":ConfigEnum.firewall,
|
145
|
+
"ENABLE_NETDATA":ConfigEnum.netdata,
|
146
|
+
"ENABLE_HTTP_PROXY":ConfigEnum.http_proxy_enable,
|
147
|
+
"ALLOW_ALL_SNI_TO_USE_PROXY":ConfigEnum.allow_invalid_sni,
|
148
|
+
"ENABLE_AUTO_UPDATE":ConfigEnum.auto_update,
|
149
|
+
"ENABLE_SPEED_TEST":ConfigEnum.speed_test,
|
150
|
+
"BLOCK_IR_SITES":ConfigEnum.block_iran_sites,
|
151
|
+
"ONLY_IPV4":ConfigEnum.only_ipv4
|
152
|
+
}
|
153
|
+
|
154
|
+
for k in config:
|
155
|
+
if k in strmap:
|
156
|
+
if hconfig(strmap[k]) is None:
|
157
|
+
data.append(StrConfig(key=strmap[k],value=config[k]))
|
158
|
+
else:
|
159
|
+
StrConfig.query.filter(StrConfig.key==strmap[k]).update({
|
160
|
+
'value':config[k]
|
161
|
+
})
|
162
|
+
if k in boolmap:
|
163
|
+
if hconfig(boolmap[k]) is None:
|
164
|
+
data.append(BoolConfig(key=boolmap[k],value=config[k]))
|
165
|
+
else:
|
166
|
+
BoolConfig.query.filter(BoolConfig.key==strmap[k]).update({
|
167
|
+
'value':config[k]
|
168
|
+
})
|
169
|
+
if len(data):
|
170
|
+
db.session.bulk_save_objects(data)
|
171
|
+
db.session.commit()
|
172
|
+
|
4
173
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
174
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,60 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from flask_admin.base import AdminIndexView,expose
|
2
|
+
from hiddifypanel.panel.hiddify import admin
|
3
|
+
from flask import render_template,url_for,Markup,request
|
4
|
+
from flask_babelex import lazy_gettext as _
|
5
|
+
from hiddifypanel.panel import hiddify
|
6
|
+
import datetime
|
7
|
+
from flask_classful import FlaskView,route
|
8
|
+
from hiddifypanel.models import *
|
9
|
+
from hiddifypanel.panel.database import db
|
10
|
+
from hiddifypanel.panel.hiddify import flash
|
11
|
+
class CommercialDashboard(FlaskView):
|
12
|
+
def index(self):
|
13
|
+
return ""
|
14
|
+
bot=None
|
15
|
+
# if hconfig(ConfigEnum.license):
|
16
|
+
from hiddifypanel.panel.telegrambot import bot
|
17
|
+
|
18
|
+
if hconfig(ConfigEnum.is_parent):
|
19
|
+
childs=Child.query.filter(Child.id!=0).all()
|
20
|
+
for c in childs:
|
21
|
+
c.is_active=False
|
22
|
+
for d in c.domains:
|
23
|
+
if d.mode==DomainType.fake:continue
|
24
|
+
remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
|
25
|
+
d.is_active= hiddify.check_connection_to_remote(remote)
|
26
|
+
if d.is_active:
|
27
|
+
c.is_active=True
|
28
|
+
|
29
|
+
return render_template('parent_dash.html',childs=childs,bot=bot)
|
30
|
+
# try:
|
31
|
+
def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
|
32
|
+
domains=get_panel_domains()
|
33
|
+
sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
|
34
|
+
|
35
|
+
if def_user and sslip_domains:
|
36
|
+
quick_setup=url_for("admin.QuickSetup:index")
|
37
|
+
flash((_('It seems that you have not setup the system completely. <a class="btn btn-success" href="%(quick_setup)s">Click here</a> to complete setup.',quick_setup=quick_setup)),'warning')
|
38
|
+
elif len(sslip_domains):
|
39
|
+
flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
|
40
|
+
elif def_user:
|
41
|
+
d=domains[0]
|
42
|
+
u=def_user.uuid
|
43
|
+
flash((_('It seems that you have not created any users yet. Default user link: %(default_link)s',default_link=hiddify.get_user_link(u,d))),'secondary')
|
44
|
+
|
45
|
+
# except:
|
46
|
+
# flash((_('Error!!!')),'info')
|
47
|
+
h24=datetime.datetime.now()-datetime.timedelta(days=1)
|
48
|
+
onlines=User.query.filter(User.last_online>h24).count()
|
49
|
+
total=User.query.count()
|
50
|
+
return render_template('index.html',onlines=onlines,total_users=total,bot=bot)
|
51
|
+
|
52
|
+
@route('remove_child', methods=['POST'])
|
53
|
+
def remove_child(self):
|
54
|
+
child_id=request.form['child_id']
|
55
|
+
child=Child.query.filter(Child.id==child_id).first()
|
56
|
+
db.session.delete(child)
|
57
|
+
db.session.commit()
|
58
|
+
flash(_("child has been removed!"), "success")
|
59
|
+
return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
60
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|