.*?)\)",re.S)
75 | jdata = json.loads(regx.search(response.text).group("dic"))['data']
76 | return {
77 | 'bg':jdata['bg'][0],
78 | 'front':jdata['front'][0],
79 | 'token':jdata['token']
80 | }
81 |
82 | def getVerifyImgLocationX(self,verifyInfo):
83 | bg = self.sess.get(verifyInfo['bg']).content
84 | bg_arr = np.asarray(bytearray(bg),dtype=np.uint8)
85 | bg_img = cv2.imdecode(bg_arr,-1)
86 |
87 | front = self.sess.get(verifyInfo['front']).content
88 | front_arr = np.asarray(bytearray(front),dtype=np.uint8)
89 | front_img = cv2.imdecode(front_arr,-1)
90 |
91 | loc_x = self.identify_gap(bg_img,front_img)
92 | return loc_x
93 |
94 | def identify_gap(self,bg,tp,out="out.jpg"):
95 | ''' 識別滑塊缺口位置,返回x坐標
96 | bg: 背景图片
97 | tp: 缺口图片
98 | out:输出图片
99 | '''
100 | # 读取背景图片和缺口图片
101 | bg_img = bg # 背景图片
102 | tp_img = tp # 缺口图片
103 |
104 | # 识别图片边缘
105 | bg_edge = cv2.Canny(bg_img, 100, 200)
106 | tp_edge = cv2.Canny(tp_img, 100, 200)
107 |
108 | # 转换图片格式
109 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
110 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
111 |
112 | # 缺口匹配
113 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
114 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
115 |
116 | # 绘制方框
117 | th, tw = tp_pic.shape[:2]
118 | tl = max_loc # 左上角点的坐标
119 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
120 | cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
121 | cv2.imwrite(out, bg_img) # 保存在本地
122 |
123 | # 返回缺口的X坐标
124 | return tl[0]
125 |
126 | def build_tracks(self,target):
127 | '''自定義的軌跡方程
128 | Args:
129 | target: 目標水平位置
130 | '''
131 |
132 | track_res = []
133 |
134 | x = 4
135 | y = 0
136 | t = 46
137 | track_res.append([x,y,t])
138 | while x < target:
139 | x = x + random.randint(1,4)
140 | if x > target:
141 | x = target
142 | if len(track_res) % 30 == 0:
143 | y = y - 1
144 | t = t + random.randint(8,10)
145 | track_res.append([x,y,t])
146 |
147 | return track_res
148 |
149 | def checkCode(self,token,data,cb):
150 | headers = {
151 | 'Accept': '*/*',
152 | 'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7',
153 | 'Cache-Control': 'no-cache',
154 | 'Connection': 'keep-alive',
155 | # 'Cookie': '_ga=GA.1.288ffd5247189.2eaa87d52df9504b4b1a; Hm_lvt_4671c5d502135636b837050ec6d716ce=1680831446; __root_domain_v=.163.com; _qddaz=QD.110080831446904; Hm_lpvt_4671c5d502135636b837050ec6d716ce=1680833869',
156 | 'Pragma': 'no-cache',
157 | 'Referer': 'https://dun.163.com/',
158 | 'Sec-Fetch-Dest': 'script',
159 | 'Sec-Fetch-Mode': 'no-cors',
160 | 'Sec-Fetch-Site': 'same-site',
161 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
162 | 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
163 | 'sec-ch-ua-mobile': '?0',
164 | 'sec-ch-ua-platform': '"Windows"',
165 | }
166 | params = {
167 | 'referer': 'https://dun.163.com/trial/jigsaw',
168 | 'zoneId': 'CN31',
169 | 'id': '07e2387ab53a4d6f930b8d9a9be71bdf',
170 | 'token': token,
171 | 'acToken': 'undefined',
172 | 'data': '{"d":"QSX9uO911ZlbyxTHyBlR/Ydu9GSVj4lQ9lgI4z8eL1QO1Ly1m58ODys0gNvHJqnUoUfGB\\\\Ls5pDHp6iY8AL987GnTkBYdNjqSVODNbtw97PqFRpLnAL6m7uo4HM5SvlkLluNtfuejxj3","m":"","p":"zkmpOtobmURbSGvK1EbMEgI6bOGjDKqP","ext":"phktVx2iKUW/k8W9aUp/ji/p1ka3"}',
173 | 'width': '320',
174 | 'type': '2',
175 | 'version': '2.21.3',
176 | 'cb': 'lL1ebHabbB7Ay67cu\\gP/ErHOc7GcA8Ax7tNJcQ5EnaxXV6mnrhnyzt/bePQ9uEJ',
177 | 'extraData': '',
178 | 'bf': '0',
179 | 'runEnv': '10',
180 | 'sdkVersion': 'undefined',
181 | 'callback': '__JSONP_ik2ginl_1',
182 | }
183 | params['data'] = data
184 | params['cb'] = cb
185 |
186 | response = self.sess.get('https://c.dun.163.com/api/v3/check', params=params, headers=headers)
187 | print(response.text)
188 |
189 |
190 |
191 |
192 |
193 |
194 | if __name__ == "__main__":
195 | dun = dun163()
196 | dun.run()
197 |
--------------------------------------------------------------------------------
/极验3滑块/down_pic.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # @Time : 2022/6/1 10:30
3 | # @Author : xiaobo
4 | # @Site :
5 | # @File : down_pic.py
6 | # @Software: PyCharm
7 | import json
8 | import time
9 |
10 | import requests
11 | import urllib.request
12 |
13 | def get_chall_gt(sess):
14 | headers = {
15 | "authority": "www.geetest.com",
16 | "accept": "application/json, text/javascript, */*; q=0.01",
17 | "accept-language": "zh-CN,zh;q=0.9",
18 | "cache-control": "no-cache",
19 | "pragma": "no-cache",
20 | "referer": "https://www.geetest.com/demo/slide-float.html",
21 | "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
22 | "sec-ch-ua-mobile": "?0",
23 | "sec-ch-ua-platform": "\"Windows\"",
24 | "sec-fetch-dest": "empty",
25 | "sec-fetch-mode": "cors",
26 | "sec-fetch-site": "same-origin",
27 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36",
28 | "x-requested-with": "XMLHttpRequest"
29 | }
30 | sess.headers = headers
31 | url = "https://www.geetest.com/demo/gt/register-slide"
32 | params = {
33 | "t": int(time.time() * 1000)
34 | }
35 | response = sess.get(url, headers=headers, params=params).json()
36 | print(response)
37 | # get_php()
38 | return response
39 |
40 |
41 | def get_php(res_chall_gt, sess):
42 | headers = {
43 | # "Host": "apiv6.geetest.com",
44 | # "Connection": "keep-alive",
45 | "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
46 | "sec-ch-ua-mobile": "?0",
47 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36",
48 | "sec-ch-ua-platform": "\"Windows\"",
49 | # "Accept": "*/*",
50 | # "Sec-Fetch-Site": "same-site",
51 | # "Sec-Fetch-Mode": "no-cors",
52 | # "Sec-Fetch-Dest": "script",
53 | # "Referer": "https://www.geetest.com/",
54 | # "Accept-Encoding": "gzip, deflate, br",
55 | # "Accept-Language": "zh-CN,zh;q=0.9",
56 | "Cookie": "GeeTestUser=d0f290c60ff46c8308097fc8e8ea1459"
57 | }
58 | sess.headers = headers
59 |
60 | url = "https://apiv6.geetest.com/get.php"
61 | params = {
62 | "gt": "019924a82c70bb123aae90d483087f94",
63 | "challenge": res_chall_gt['challenge'],
64 | "lang": "zh-cn",
65 | "pt": "0",
66 | "client_type": "web",
67 | "w": "A3HF(MKLkgJ5I3)5PW3Itdt0gglu8cs75N0wnyQZTktFj(EzyPIDhOQ8Qsl7DqSBy8AiRry(hsnzN)6uUXl9eECrhpxAS9AiCr40drGCjlgul(38Cj0oxtnDlxzpZZH4HZIrzgUSqneLkdiNg46osZmGhz4)7sToym)Rmwjvb2ASIkszDAUX(r80LOsegrPaWsIS5nUyEnWMlUDkGTA4CRy)7TyHxkYpWDT87P8cUMv(qX)FhA3PtMT)JrG1flESJSP7Eq7SHE66RmrvesBIth9nIrW3fCaIqzXxQ9N6V(s4xLLAyBRF(SgkR093bzj191aBKpYLQSYNwHLLkls3RuGFCfrfpoe6(XaEHhv9vpOM3g0yJPqo5aX2QCTiWC775wl(CyY1Qh8xKvcA(Wml7kSS(SFWQD7mq7Eg6YO2HSapD)CyltwymUbsDsM1WyStENQRxVgooZ6bvMN0r20n2LdoBEMUIVz4gk)gMVHScfmXXoTDbq5pB6z9EOzZTPRUEIWw6F4f4SE3SbcpD0qQEzwrtkgFpf5UANBXhYqxJIB0vG4JaaqS0jiXwDOSHeCwW1b1y0TJbpN7iwPJQBZPyG(lvTM5eODIuYLo9zOPBIP04VPp94v0I3LJF84v93S4FOr5s764RQEwV530LUYE7vbW(aeb29XCn7b2kEVDiQfnlF(Xs4AtFnK6eYO5(cD36bCw1H)5ptBSpfgRpzf7bIRD6jlX0qsaOHFEEwcI)2k6iG064YBgvFiylaAxmDGehnZ19c309YmLxpRljXlXoEx)DsOMBX9NirSc94KEpcNLZcAtBdwnUf04FuVnxDZdn29zs87rHuPRHwazF04pLrGX)4cqgwKOsvooDzyvQFrNJahJPzBB3IbbZRDjoVGCoJpfSIzP7pDMaVS1ExN8rXHDH)C0H5u2MxbcuUEMhaAT9zJIqaQsbcBGgWRMh17TGP5LBZ8ADNiE7)9Vz8KaSxYZYvD1(PzsB2HTiKesyLyx3eN31UsjfyOU85z4y8UbaFt5j0yjVaOxKPdBrJK496yYEc3brY2VeHlX1YaxSnZkXIpBVVoFVLM3DVty0b(hH2Ubtlidcv6HrtSMbDNU2PNhytTVWKEaB0kU23967K1h9DM4wEQw5ZW6AFnJ6oXWnfq3tzTWTFByL3F6ZJo7sVvqW6in0ijtALK6ndHePz534tKpIfsX3FbX0JxqvbjLo6RZoVkCoVvcn5(jf9we48sZF8wOZWdaAYudeav4Ii0Kap6Vgy6ttG0oNB3f3lpTI2RHbndi8Bpzmx80n2dIfwOtx3S(o6zBq)3jzO2UdCxnrUscTb)2uPophLZgDKNwX1cF6lXf)0WsSRlArMnzEnABAHBQ7be0ULoXiYQpPlHUTAN72x9nCsz3AxfXj2nWHCHgqgmOvu)ohlaq8JRr08YvTl)fePuooslJgfHvTVlgSOG)24y2KvmMljYMf)Kv5Aw)fs9)NLV6Nije27UG73(hYuNwC8GetewzoNYVY9B7A6evOW8GWl8x2kbV(WXAhWDq7tnNtn)LDfZrpi5aIBH8yoPtzUcJdz92C5zowBisWM68vWInfpcmF3voXEWE3eLGgqJ(7YCT1oQ5nUGk8WaVlC9A7KDrC0eg7yU)5A8bTotrXTL8ofLLFpS70tVJmtSGv3CusYXjULTyHJcw4ZwJ8Z1tLVMwZphNnfiWgVmUdVmE7K(7pZIEdizj(aBcnsx53LruFJFT6T9Hu6Dny1DYXdANW(x3GT6gfRMtozDH)V7OY98cPDgM7GRMFzD6DvJA7LSMnUKAn(5U0szViHc9aWEPUZCR6xg8fQw)ognrTBvC2Rz1akEjF7fBrHXAbcRIQ67Om64sgWv1MxNudF)zEdUuUAfJfvotlS39ZhF92ET2OTE2sTgm(SnKFboUcVMMipLiImYKADBnBW5KuVyxsLhuvOwbtGorxxEPIrzAoSlCPGKEAILk)uS4lNtOgI3re2ftWX9L5jazND)w7noeSfp7b(L3UrUXpyHyNy345TGZ(S83MUdBmY6zKDUYnyHlXw0)4mC7p(43xsbb3rPSbSFFXiN39lfs7twkCsk.17497f2c2e7be7382505daaaaea6f3b28cd3b568626c8a0294f8b8f05ebdf29457819e41746711777c5b2b273df2030f32e47f72717d940d6c26f5cafbd9b62b13244efcdcf51ec1d03bd9c7bff66cc208fb6e15d245b052852c3f82cad1cb25c4e64595cc33d95dae90c6fc6ab58413693f8a1d64f1143d804edf34342adffb",
68 | "callback": f"geetest_{int(time.time() * 1000)}"
69 | }
70 | response = sess.get(url, headers=headers, params=params).text[22:-1]
71 |
72 | c,s=json.loads(response)['data']['c'],json.loads(response)['data']['s']
73 |
74 | return c,s
75 |
76 | def get_ajax_php(res_chall_gt, sess):
77 | headers = {
78 | "Host": "api.geetest.com",
79 | "Connection": "keep-alive",
80 | "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
81 | "sec-ch-ua-mobile": "?0",
82 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36",
83 | "sec-ch-ua-platform": "\"Windows\"",
84 | "Accept": "*/*",
85 | "Sec-Fetch-Site": "same-site",
86 | "Sec-Fetch-Mode": "no-cors",
87 | "Sec-Fetch-Dest": "script",
88 | "Referer": "https://www.geetest.com/",
89 | "Accept-Encoding": "gzip, deflate, br",
90 | "Accept-Language": "zh-CN,zh;q=0.9",
91 | "Cookie": "GeeTestAjaxUser=c02c2c61d4eb11ea629cbff0a07b19df; GeeTestUser=ec59f466abfb8dc5a76b9e35c44273ae"
92 | }
93 | params = {
94 | "gt": "019924a82c70bb123aae90d483087f94",
95 | "challenge": res_chall_gt['challenge'],
96 | "lang": "zh-cn",
97 | "pt": "0",
98 | "client_type": "web",
99 | 'w': '',
100 | "callback": f"geetest_{int(time.time() * 1000)}"
101 | }
102 | sess.headers = headers
103 | url = 'https://api.geetest.com/ajax.php?'
104 | print(sess.get(url=url, params=params).text)
105 |
106 |
107 | def getpic(res_chall_gt, sess):
108 | headers = {
109 | # "Host": "api.geetest.com",
110 | # "Connection": "keep-alive",
111 | # "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
112 | # "sec-ch-ua-mobile": "?0",
113 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36",
114 | # "sec-ch-ua-platform": "\"Windows\"",
115 | # "Accept": "*/*",
116 | # "Sec-Fetch-Site": "same-site",
117 | # "Sec-Fetch-Mode": "no-cors",
118 | # "Sec-Fetch-Dest": "script",
119 | # "Referer": "https://www.geetest.com/",
120 | # "Accept-Encoding": "gzip, deflate, br",
121 | # "Accept-Language": "zh-CN,zh;q=0.9",
122 | "Cookie": "GeeTestAjaxUser=c02c2c61d4eb11ea629cbff0a07b19df; GeeTestUser=ec59f466abfb8dc5a76b9e35c44273ae"
123 | }
124 | sess.headers = headers
125 |
126 | url = "https://api.geetest.com/get.php?"
127 | params = {
128 | "is_next": "true",
129 | "type": "slide3",
130 | "gt": "019924a82c70bb123aae90d483087f94",
131 | "challenge": res_chall_gt['challenge'],
132 | "lang": "zh-cn",
133 | "https": "true",
134 | "protocol": "https://",
135 | "offline": "false",
136 | "product": "embed",
137 | "api_server": "api.geetest.com",
138 | "isPC": "true",
139 | "autoReset": "true",
140 | "width": "100%",
141 | "callback": f"geetest_{int(time.time() * 1000)}"
142 | }
143 | response = sess.get(url, headers=headers, params=params).text[22:-1]
144 | print(json.loads(response))
145 | challenge=json.loads(response)['challenge']
146 | s_=json.loads(response)['s']
147 | bg=json.loads(response)['bg']
148 | fullbg=json.loads(response)['fullbg']
149 | slice=json.loads(response)['slice']
150 | urllib.request.urlretrieve('http://static.geetest.com/'+bg,'bg.jpg')
151 | urllib.request.urlretrieve('http://static.geetest.com/'+fullbg,'fullbg.jpg')
152 | urllib.request.urlretrieve('http://static.geetest.com/'+slice,'slice.jpg')
153 | return challenge,s_
154 |
155 |
156 | if __name__ == '__main__':
157 | sess = requests.session()
158 |
159 | res_chall_gt = get_chall_gt(sess) #获取challenge,以及gt
160 |
161 | c,s=get_php(res_chall_gt, sess) #获取s以及c的值
162 |
163 | get_ajax_php(res_chall_gt, sess)
164 |
165 | getpic(res_chall_gt, sess) #获取图片信息
166 |
--------------------------------------------------------------------------------
/极验4滑块/分析/w_track分析.js:
--------------------------------------------------------------------------------
1 | "https://gcaptcha4.geetest.com/verify?callback=geetest_1681309625549&captcha_id=24f56dc13c40dc4a02fd0318567caef5&client_type=web&lot_number=12a5bc0af01f49f8a0e331ca923b9007&risk_type=slide&payload=39Gl86BQgpTxeuyf4iPX07XXFkx0bovpnI3h_rl8H_56UKy4OMaldrXfWf7mRvGD_naaOGkjucUPlaFhfpgZw3f1TuwWVz-LImQi0hwKV61zXSvzORGz-huXDl-LMUtqj7w7wAzIbeVCVlfWU_29ptkCP7koaIJfsOI0Z1rDcF79QSaF4w_GlxDI5X4tcSVtajPuPYK8m2D-08xf_ZvLWfDqKtGtrMK3_AbyEHIj64s7KrMJN7PU-EdsHPlXQyg2N2g5ojDjU2kv5Zp-S2GRgIqHUB6QK9fXzLnqBxnM1bZIhrVzYkLcBBsDOqBPdLpA2AoupjBcL_1E33Y541fZGYFmK6quBD0pawVaRZ6QMhwzfPgtFGzmAQBFOVm9vC7_Q8i4V-6-G2XFzuCT6RJ5QxJIixN30TuPI2D2MSBFxWbgHOh43NtQ5NXcWvnsMthasiaenvI0iSDWPqTXpKUhck0WmxRnItD6vDnAt7c-zrIw0_ptOSQhstJek1_2lVj-lqnEibqS-fsJYc8tATqc9tDjWRX8BMsTpNg8hAS8tYjNJ9SDvx4gF-T2O0vGeeOhWxA8jE6fmOJTqiYKin3dlJW2EQzdXxdoU60zK58DX8JljLYTuC-SRPqjuhhyeZIm_fAsr0C_gAEeCGTYuqxZNF6KSiQUoYfgA7YDMcaDpeMdRcGtivnRIqPxAzcbrSO-nuuvEGnOxAHhwwvYR_V4ILU0unaxVgbVTpmKrXsBAElu1xA1b6pdcOhkl2MUINLTvdnxfO58EX1JgF6LqKRxfzauq2Cljma_-Hb6ZjhIYHPjunK0-j0Qzt_yJMFWOapTx_vPUiLxiHfGD9ccSbp9Lh-aDBnxjj11YJM4_T-dNKGNjPxlZT_g1lnKYlW2B1CC3xqnIcSt1hHbR6tSlblL8ahUXJnwlamiCxNu8fe6GWOyzeIS8g1ggXxqE7JCTZ5uN2bwufvpZ0r-uATba-mbts5Ns0eWm8BXz3KveIZf49rX6tDkctGwWGPtQ2pLINNeKAsxLdAaVG4sJRm9z47wlIt7o-cN4axk_m4f4I7fa_sDQlw0Si5jJk4e-osXH0NI5JVDhqpcp4Wa_WLcWiGPkFcaDf07pVBVZxHtyNVBcwouSrLlLYkNNzSgEG7orXRt0xFNdxvyGXsYxmbTdQAVHF8Na4TZx39ga5aTW8E6uIgtKWOkq2oHMKEGa920NpeNYEpVAbESxyDSf-t10-niZtBa3bGsRBk14MZdGlvkjU-MFiOUvb7cyRVhVJyhaVd70AJfpuNXpIb1U3IkmBWgiyjfU_xxjqHwhip-liD7LxZE9Cpby687m0qPobijfmMy2H9UNJGwBILxqEug3WKbcd2cx66UdC1npF8BcjfY2mrAbDfwohmwbwzdiLmxCuT0Yx2ajeMC5hnfGtViCb-hl-iqQ_qo6MAiT9fQvXmzCQGcf0kNpOU9XVp_zXAWZzrm2GrKTRpv0xWR3O0K3HpylYDVrUh9y0E4uR3VMgGRP0JghUGA1hr36dWYj4pPhnwcok2KpUQZfx9_clWhrHa4VpptDz5cNoh_VJg2KIjr3c25h8l6Eifg6mRPKRccDGJTwheKrMXF9N-rnaUaJWFA8RBiuVmsF2U3oPiehlNm3hqGEtm804numHZFKgRIlJJNFh1mFKGOjcF9_ePlWEdsw9Mdksgf3Si3IS56t_jdUUeBPRG-55qKXjBXAurMDlznRZzu6GZQUMtwu0IKBXRzEG45gkwP1zfWpC_ODgQrJNBqhsLXsnONkcEoM38rBtnCkDClFirc8hmkI5E9OmUprvjLR-Za5R64LMaUNSPUHvVX9FRTo4QLUqvDQry6yhI5x1sM84yGYuRw0pxsw7xUOv6oMvyz0TSnB4CDNv-ChTCvk1BC2EPwKEATbEzugqBr6zckRgmHqngNW_QBcRIWLhHZPC-1CEMBGkasJUkqSJiiciYbLG1feoiXM8HjVCzZrPOkQDgtQIwzC6L18JPXuxFwpDXO_o2wE4SuM0NxlIQ7Du-_nf64xtwToZje4OKUBEDA12iqyk8H7jJtR-KDd-hvlJA7mBx1QeR41Nn3lIwZHJCivWDUt0kt0eAB8DNhHX_eOpdYWYls1LXsd2DCn470G1xH04r61rJIx7aaPBLUbfZjKA0AOvHS2VCU8dTsX1LoYGZ0xT6jDcFcI-oGwamTg5puS11SIJcxP3HDvgdRmaYycSMNnqWUqKneUkKp8rxw8ffI7mDtvKaHhCQ9E-eWxp3bqbNXVsdNkyBn3iiYcec17BUQLDqU-HWiweKnr1J6kFuxaiZfDgDKS8Q2Oa9ZvRRJga29ZX3VCGZtDM89WS0VlSqeiNpAsC3iNdpG3USojV6ohHamrBoN3FTpipBIsdpQC8J6I7SmqQPHMElFHM6wX0ewqYLWmXUW4vHiCe6t-GXmMCiiarltoLUXkdRGEtH5TKQpTPQoGfs_ZAo9n5eBnGW4cCJEWj1ThCjLHSkpmq9IjYDE1B-kx_0NSnHwczxp4mslF-xGYYKgGiuP9boVCGf4Ah02uOyb9Y6URo2gHV8siKlx6soATD2CG_m76lpr9G5NRRsJ59S5IMcq-u1BD2YYVRMXkUcCHwXXr69UQydJxTZgCMbxPHAhTGUEOLmDcm_I28c0_3t_HNrjX0Z2Y-UVFh-czy7maBPf1_p1flHu6ZRdlVEg7iKawisY9HIEUfYRQ28XzzZXM-EW0Yftz_LQZAFXKS8yalrtFiIclr2dg26-1gbCZZLhPTw65ubUmwJIJSMCXXHDQTj-HSdCZYPxo4hXlc5BFgzPVYHCSM5Mi6NL7wj4jj6ty0POSZSnu2kq10MM2QMbRQqq7CqTSRDrD4iPzYSTw1mNMb7odxE9_MWYF2MUQFNMUAice9DhIpLf_OI-qU8tncCs4B8C0cJOegO7HpvTqqeSAJN1LGnFcjsIKDjZy9N3UJmENpPyKEsss9poJ9ZDiUxvCf8xIJtDYd6gOeduOoxbcSXrKau8fHi86bgmtXpJzpKgqZr33g-2jkmVXHCRnhF2i_stHIyXY-RNTLsVE5ACmBHoLkRlNicVKtd4n22H8mY8gtqhI0JVhcnGh8NzxSg%3D&process_token=79d0e8b4c65133201c98b36185818ecc34f12ffb23ff3ee42e02f4b445f00488&payload_protocol=1&pt=1&w=75e2d145d0b41d2468284984c962f437fd7ee52c80241c8b913285db6ce0ccf087c4920d6e047ab7c0e6315b36f8dc2ccf214f3db79da5cddaaba176b2ca3e1124add4ffdcb036b422373e5eb84b06daa2cb886d9aae3744ef26e0d3ca9f10e4c7d75b1af6e3a5f3f416e9be3b6b2275e153c05e0f091aa094240afccdd55684a7b29da39c135b2915529ef99e13dd758ff504cb1d94be4122935c265447b60bb78b1481d4b140943a28b8d763528903dce2db48720a7ff6300c196b02fae8a89fa7f0816476b28127f4e492758b6aca6d1cf3d5a2f83355c34f2f0971686521a76c3e9048a291309ccc69ee908e413ae3913ad51efc777f13edda29d7b06d3460cd376aa16faf23b35c234e449c3aa2c01b3a0b0061622fdc5bdfcd2fa114b37280d800f5110139bfbc2e72c4a04c76abee4560f12535680c4cf262064304193f5a1ad745332191b66ee679e8c6aa39d66bd42b942cfe522ce145d1799f081ccf9eb999d0a62b335d54cfc9bf9a021c232efdd1ed76098ed9536e1586d4580bae3410314862561f90537f4141ed6bf68ac3532b33850871928ec34541a76c3dfd8b836e4901c251f5f200ad5c217c0b679f2e1891604cf1f46396cfb04fef715a1084a17013791147aad1d27ee6ba3fa608310fb195e308f674540b09440e7c58838b301ab5b764c7d8412d25a22fc074d75c76d484b8f8f8d1c7fdb6c62239af5e90a9afdc85bae5b0cd678a45b1ce16bd1dcdc2f93f72857e509ee51c19dade45b9cc028013342666ffa89d0b371535805a0307572b79aa54f629fc82d357f37f983a89199f97236b89adcfb1f1a288d583176e204c5a8f5a191811a62123b412a81fa6e79b83c492725b45a5d91f5b5a446f611bcf412046c1fe4cbbb75da5285e8b31a6f49c9626b70b617e681b2dbf2a879868e7fcc014ca25285a6303868d83e799d6e5c92a47c7f3f77f6406"
2 | // w參數
3 | // 流程:先生成軌跡 -> 對軌跡加密 -> 傳入生成w參數的函數中
4 |
5 | // a
6 | var r = (0,
7 | f[$_BDCDk(129)])(n, t, o, a);
8 |
9 | // s
10 | c[$_CBHHo(433)])(t, $_CBHIu(714), s, a)[$_CBHIu(377)](function(e) {
11 | var $_CBIHT = oTEDG.$_CO
12 |
13 | // r
14 | var r = (0,
15 | d[$_CBHIu(22)])(f[$_CBHHo(22)][$_CBHIu(524)](e), i)
16 |
17 | ////////////////////////////////// 軌跡分析: //////////////////////////////////
18 | // -16後就是缺口的x坐標?
19 |
20 |
21 | // _內的c
22 | var _ = {
23 | "\u0073\u0065\u0074\u004c\u0065\u0066\u0074": a,
24 | "\u0074\u0072\u0061\u0063\u006b": c,
25 | "\u0070\u0061\u0073\u0073\u0074\u0069\u006d\u0065": s,
26 | "\u0075\u0073\u0065\u0072\u0072\u0065\u0073\u0070\u006f\u006e\u0073\u0065": a / t[$_GDFDR(1905)] + 2
27 | };
28 |
29 | // c是加密後的軌跡,u不知係咪初始軌跡?
30 | c = l[$_GDFCw(22)][$_GDFCw(26)][$_GDFCw(661)](u)
31 |
32 |
33 | // 軌跡加密
34 | "\u0024\u005f\u0042\u0042\u0043\u006e": function(e) {
35 | var $_BIDHE = oTEDG.$_CO
36 | , $_BIDGU = ['$_BIEAM'].concat($_BIDHE)
37 | , $_BIDIw = $_BIDGU[1];
38 | $_BIDGU.shift();
39 | var $_BIDJZ = $_BIDGU[0];
40 | for (var t, n, i, r = [], s = 0, o = 0, a = e[$_BIDIw(157)] - 1; o < a; o += 1)
41 | t = Math[$_BIDHE(670)](e[o + 1][0] - e[o][0]),
42 | n = Math[$_BIDHE(670)](e[o + 1][1] - e[o][1]),
43 | i = Math[$_BIDHE(670)](e[o + 1][2] - e[o][2]),
44 | 0 === t && 0 === n && 0 === i || (0 === t && 0 === n ? s += i : (r[$_BIDIw(113)]([t, n, i + s]),
45 | s = 0));
46 | return 0 !== s && r[$_BIDHE(113)]([t, n, s]),
47 | r;
48 | },
49 |
50 |
51 | // t[$_GDFCw(1970)][$_GDFDR(432)]是軌跡數據(可能前面有做一D處理)
52 | // t['$_BIJG']['$_BABH']
53 | u = 160 < t[$_GDFCw(1970)][$_GDFDR(432)][$_GDFDR(157)] ? t[$_GDFCw(1970)][$_GDFDR(432)][$_GDFCw(127)](0, 160) : t[$_GDFDR(1970)][$_GDFCw(432)]
54 |
55 |
56 | // t = this , t在此被賦軌跡? this的軌跡從何而來?
57 | $_GDBGF.shift();
58 | var $_GDBJf = $_GDBGF[0];
59 | var t = this;
60 | t[$_GDBIf(1913)] = new o[($_GDBIf(22))](document),
61 | t[$_GDBHB(1917)] = new o[($_GDBHB(22))](window),
62 | t[$_GDBIf(1913)][$_GDBIf(206)]($_GDBIf(1935), function(e) {
63 |
64 |
65 | // (hook點), 執行完t = this後就可以hook,睇下邊到set左個值
66 | "\u0069\u006e\u0069\u0074\u0045\u0076\u0065\u006e\u0074": function() {
67 | var $_GCGCc = oTEDG.$_CO
68 | , $_GCGBw = ['$_GCGFA'].concat($_GCGCc)
69 | , $_GCGDO = $_GCGBw[1];
70 | $_GCGBw.shift();
71 | var $_GCGEO = $_GCGBw[0];
72 | var t = this
73 |
74 |
75 |
76 | // t[$_GDEDU(1970)]
77 | // (計算t['$_BIJG']的地方,即初始化軌跡的地方)
78 | // 軌跡的第1個數據就是在這裡得出
79 | var r, s, o = n($_GDEDU(1965) + i)[$_GDEDU(1975)](), a = n($_GDEDU(1889) + i)[$_GDEDU(1975)]();
80 | return s = $_GDEDU(1901) === e[$_GDECK(110)][$_GDECK(110)][$_GDECK(253)] ? (r = a[$_GDECK(664)],
81 | a[$_GDEDU(848)]) : (r = o[$_GDECK(664)] + t[$_GDEDU(467)][$_GDEDU(1848)],
82 | o[$_GDEDU(848)]),
83 | // here
84 | t[$_GDEDU(1970)] = new l[($_GDEDU(22))]([Math[$_GDEDU(670)]((s - t[$_GDEDU(1976)]) / t[$_GDECK(1905)]), Math[$_GDEDU(670)]((r - t[$_GDECK(1940)]) / t[$_GDEDU(1905)]), 0])[$_GDECK(1915)]([0, 0, 0]),
85 | t[$_GDECK(460)] = t[$_GDECK(1951)],
86 | t[$_GDEDU(1981)][$_GDEDU(1909)](),
87 | t[$_GDECK(1995)] = {
88 | "\u0078": 0,
89 | "\u0079": 0
90 | },
91 |
92 | // push第0個軌跡的地方
93 | // e是第0個軌跡
94 | function r(e) {
95 | var $_HIGGA = oTEDG.$_DX()[0][10];
96 | for (; $_HIGGA !== oTEDG.$_DX()[8][9]; ) {
97 | switch ($_HIGGA) {
98 | case oTEDG.$_DX()[0][10]:
99 | this[$_BICIK(432)] = [e];
100 | $_HIGGA = oTEDG.$_DX()[6][9];
101 | break;
102 | }
103 | }
104 | }
105 |
106 |
107 |
108 | // push後續軌跡的地方 this[$_BIDCK(432)][$_BIDCK(113)](e)
109 | // this['$_BABH']['push'](e)
110 | // 除了第1個軌跡之外的軌跡由這裡push進
111 | "\u0024\u005f\u0042\u0041\u0045\u0043": function(e) {
112 | var $_BIDCK = oTEDG.$_CO
113 | , $_BIDBE = ['$_BIDFt'].concat($_BIDCK)
114 | , $_BIDDY = $_BIDBE[1];
115 | $_BIDBE.shift();
116 | var $_BIDEN = $_BIDBE[0];
117 | return this[$_BIDCK(432)][$_BIDCK(113)](e),
118 |
119 |
120 |
121 | }
122 | /////////////////////////////////////////////////////////////////////////////////////////////
123 |
124 | // w參數的加密函數
125 | function r(e, t) {
126 | var $_HJHEj = oTEDG.$_DX()[4][10];
127 | for (; $_HJHEj !== oTEDG.$_DX()[6][6]; ) {
128 | switch ($_HJHEj) {
129 | case oTEDG.$_DX()[0][10]:
130 | var n = t[$_DIEIS(467)];
131 | $_HJHEj = oTEDG.$_DX()[2][9];
132 |
133 |
134 |
135 |
136 |
--------------------------------------------------------------------------------
/数美/数美ast.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");//文件读写
2 | const parse = require("@babel/parser"); //解析为ast
3 | const traverse = require('@babel/traverse').default;//遍历节点
4 | const types = require('@babel/types');
5 | const parser = require("@babel/parser");
6 | //类型
7 | const generator = require('@babel/generator').default;//ast解析为代码
8 |
9 | console.time("耗时:")
10 | // 读取js文件
11 | let jscode = fs.readFileSync(
12 | './demo.js', {
13 | encoding: 'utf-8'
14 | }
15 | );
16 | // let jscode = `
17 |
18 | // `
19 | let ast = parse.parse(jscode);//js转ast
20 |
21 | //获取自执行函数
22 | let visitor1 = {
23 | "NumericLiteral|StringLiteral"(path) {
24 | delete path.node.extra;
25 | },
26 | // 获取自执行函数,第一个自执行会改变大数组的顺序,所以这里遍历一下把自执行函数的代码保存给全局 后面运行
27 | "CallExpression"(path) {
28 | let {node} = path;
29 | if (!node.callee || node.callee.type !== "FunctionExpression") return;
30 | if (!node.arguments || node.arguments.length !== 2) return;
31 | if (node.arguments[0].type !== "Identifier") return;
32 | //修改大数组的是一个匿名函数,这里加个感叹号让他语法没问题
33 | let changeAst = parser.parse("!" + path.toString());
34 | let ChangeArrayOrder = generator(changeAst, opts = {"compact": true}).code;
35 | console.log("改变数组顺序的自执行代码:", ChangeArrayOrder)
36 | global["ChangeArrayOrder"] = ChangeArrayOrder;
37 | path.remove();
38 | }
39 | }
40 | //解决大数组
41 | let visitorArray = {
42 | "VariableDeclarator"(path) {
43 | let {id, init} = path.node;
44 | if (!init || init.type !== "ArrayExpression" || init.elements.length < 1) return;
45 | let binding = path.scope.getBinding(id.name);
46 | if (binding.references === 0) {
47 | path.remove;
48 | return
49 | }
50 | if (init.elements.every(element => element.type === "StringLiteral")) {
51 | //获取父级函数,如果没有就说明是最外层定义的数组
52 | let funcName = path.getFunctionParent();
53 | if (funcName === null) {
54 | console.log("大数组名字应该是:", id.name)
55 | global["largeArray"] = path.toString();
56 | path.remove;
57 | // 父级作用域传给另外一个函数操作
58 | getDecName(path.parentPath)
59 |
60 | } else {
61 | // 获取最后一个返回的函数名 和父级函数名对比,如果一样 就eval
62 | let lastElement = funcName.node.body.body.at(-1)
63 | if (!lastElement.argument || !lastElement.argument.callee) return;
64 | if (lastElement.type !== "ReturnStatement" && lastElement.argument.callee.name !== funcName.node.id.name) return;
65 | console.log("大数组名字应该是函数名:", funcName.node.id.name)
66 | let largeArrayAst = parser.parse(funcName.toString());
67 | global["largeArray"] = generator(largeArrayAst, opts = {"compact": true}).code;
68 | // 父级作用域传给另外一个函数操作 获取解字符串函数
69 | getDecName(funcName.parentPath)
70 | // 移除掉大数组
71 | funcName.remove()
72 | }
73 |
74 | }
75 |
76 | },
77 | }
78 |
79 | function RecursiveAssignment(path, pPathString) {
80 | eval(global["largeArray"]); //加载大数组
81 | eval(pPathString); //加载解密函数
82 | eval(global["ChangeArrayOrder"])
83 |
84 |
85 | if (!pPathString || !global["largeArray"] || !global["ChangeArrayOrder"]) {
86 | throw "有些没解析全,退出"
87 | }
88 | // 递归函数,因为他的引用又是一个赋值新变量操作
89 | //代码长这样子的: var _0x1e4a2f = _0x4a9d; console.log(_0x4a9d(100));
90 | let {name} = path.node.id;
91 | let binding = path.scope.getBinding(name);
92 | for (p of binding.referencePaths) {
93 | let pPath = p.parentPath;
94 | let {node} = pPath;
95 | if (node.type === "VariableDeclarator") {
96 | let leftName = node.id.name;
97 | let rightName = node.init.name;
98 | // console.log("似乎要把解密函数"+rightName+"赋值给", leftName);
99 | // // 先改成解密函数的名字,
100 | pPath.scope.rename(leftName, rightName);
101 | RecursiveAssignment(pPath, pPathString);
102 | // // 移除掉赋值新变量名
103 | pPath.remove();
104 |
105 | }
106 | //console.log(pPath.toString());
107 | if (node.type === "CallExpression" && node.arguments.length === 1 && node.arguments.every(element => element.type === "NumericLiteral")) {
108 | let pPathCode = pPath.toString();
109 |
110 | let result = eval(pPathCode)
111 | // console.log(pPathCode, ":", result);
112 | pPath.replaceWith(types.valueToNode(result))
113 | }
114 | }
115 |
116 |
117 | }
118 |
119 | // 获取解密函数代码
120 | let getDecryption = {
121 | "FunctionDeclaration"(path) {
122 | // 判断函数是不是需要传两个参数
123 | let {node} = path;
124 | let {body} = node;
125 | if (!node.params || node.params.length !== 2) return;
126 | if (!body || !body.body) return;
127 | let lastReturn = body.body.at(-1)
128 | if (lastReturn.type !== "ReturnStatement" || !lastReturn.argument || !lastReturn.argument.expressions) return;
129 | let lastCall = lastReturn.argument.expressions.at(-1)
130 | if (lastCall.type !== "CallExpression" || lastCall.arguments.length !== 2) return;
131 | let name = node.id.name;
132 | console.log("解密函数的名字是:", name);
133 | let decryAst = parser.parse(path.toString());
134 | let decryCode = generator(decryAst, opts = {"compact": true}).code;
135 | RecursiveAssignment(path, decryCode);
136 | // 移除解字符串函数
137 | path.remove();
138 | }
139 |
140 | }
141 | var getDecName = (path) => {
142 | // 这个函数 通过大数组的作用域传入同级作用域 来获得解密函数
143 | let {scope} = path;
144 | scope.traverse(scope.block, getDecryption);
145 |
146 | }
147 |
148 | // 优化加减乘除操作和解对象
149 | let visitor2 = {
150 | // 优化加减乘除操作
151 | "BinaryExpression": {
152 | exit(path) {
153 | let {node} = path;
154 | let {left} = node;
155 | let {right} = node;
156 | if ((left.type === "UnaryExpression" || left.type === "NumericLiteral") && (right.type === "UnaryExpression" || right.type === "NumericLiteral")) {
157 | let leftValue;
158 | let rightValue;
159 | if (left.type === "NumericLiteral") {
160 | leftValue = left.value
161 | } else {
162 | if (!left.argument.value) return;
163 | if (left.operator === "-") {
164 | leftValue = -left.argument.value
165 | }
166 | }
167 |
168 | if (right.type === "NumericLiteral") {
169 | rightValue = right.value
170 | } else {
171 | if (!right.argument.value) return;
172 | if (left.operator === "-") {
173 | rightValue = -right.argument.value
174 | }
175 | }
176 | if (!leftValue) return;
177 |
178 | //console.log(leftValue, node.operator, rightValue);
179 |
180 | path.replaceWith(types.valueToNode(path.evaluate(leftValue + node.operator + rightValue).value));
181 | }
182 | }
183 | },
184 | //解对象
185 | "VariableDeclarator"(path) {
186 | // 其他的话对局部数组做的,比如代码:
187 | // var _0x4b4e24 = {
188 | // "Xpwku": "=6)return;
215 | //console.log("旧代码111", pPath.toString());
216 | pPath.replaceWith(types.valueToNode(rightNode.value));
217 | modificationNum+=1
218 | //console.log("新代码111", pPath.toString())
219 | //console.log("-------------------")
220 | } else if (rightNode.type === "FunctionExpression") {
221 | // 此时这里的pPath.node为_0xa7a3b2["JHTcH"] 还要上一级才会有arguments的东西
222 | node = pPath.parentPath.node;
223 | let {parentPath} = pPath
224 | if (node.type !== "CallExpression") return;
225 | if (!rightNode.body || !rightNode.body.body) return;
226 | let bodyResult = rightNode.body.body[0];
227 | if (bodyResult.type !== "ReturnStatement") return;
228 | let {arguments} = node;
229 | //BinaryExpression 就是长这样的代码 return _0x398914 == _0x5433f6;
230 | if (bodyResult.argument.type === "BinaryExpression") {
231 | let {operator} = bodyResult.argument
232 | // 只有一个参数,说明是判断类型的,右边固定
233 | if (arguments.length === 1) {
234 | parentPath.replaceWith(types.binaryExpression(operator, node.arguments[0], bodyResult.argument.right))
235 | modificationNum+=1
236 | } else if (arguments.length === 2) {
237 | // console.log("旧代码222", pPath.toString())
238 | parentPath.replaceWith(types.binaryExpression(operator, node.arguments[0], node.arguments[1]))
239 | modificationNum+=1
240 | // console.log("新代码222", parentPath.toString())
241 | // console.log("-------------------")
242 |
243 | }
244 | } else if (bodyResult.argument.type === "CallExpression") {
245 | if (node.arguments.length >= 1) {
246 | // console.log("旧代码", pPath.parentPath.toString())
247 | pPath.parentPath.replaceWith(types.callExpression(node.arguments[0], node.arguments.slice(1)));
248 | modificationNum+=1
249 | // console.log("新代码", pPath.parentPath.toString())
250 | // console.log("-------------------")
251 | }
252 | }else if(bodyResult.argument.type==="LogicalExpression"){
253 | parentPath.replaceWith(types.logicalExpression("||", node.arguments[0], node.arguments[1]))
254 | modificationNum+=1
255 | }
256 | }
257 |
258 | }
259 | if(modificationNum===binding.referencePaths.length){
260 | // console.log("删除了一个小数组。")
261 | path.remove()
262 | }
263 | }
264 | }
265 |
266 | // 获取动态post参数和加密的key
267 | let key_dict=[];
268 | let visitor3={
269 | "AssignmentExpression"(path){
270 | let {node}=path;
271 | let {left,right}=node;
272 | if(!left.property||left.property.type!=="StringLiteral")return
273 | if(!right||!right.arguments||right.arguments.length!==2)return;
274 | if(right.arguments[1].type!=="StringLiteral"||right.arguments[1].value.length!==8)return;
275 | // console.log(left.property.value,right.arguments[1].value)
276 | key_dict.push([left.property.value,right.arguments[1].value])
277 | }
278 | }
279 | traverse(ast, visitor1);
280 | traverse(ast, visitorArray);
281 | traverse(ast, visitor2);
282 | traverse(ast, visitor3);
283 | console.log(key_dict)
284 |
285 |
286 | let {code} = generator(ast, opts = {
287 | compact: true,
288 | jsescOption: {minified: true, retainFunctionParens: true, retainLines: true}
289 | })
290 | fs.writeFile('./demoNew.js', code, (err) => {
291 | });
292 |
293 | console.timeEnd("耗时:")
--------------------------------------------------------------------------------
/极验4_滑块第二种/1.js:
--------------------------------------------------------------------------------
1 | window = global;
2 | navigator = {
3 | "appName": "Netscape"
4 | };
5 | window.navigator = navigator;
6 |
7 |
8 | function get_track(e) {
9 | for (var t, s, n, a = [], o = 0, r = 0, i = e['length'] - 1; r < i; r += 1) {
10 | t = Math['round'](e[r + 1][0] - e[r][0]);
11 | s = Math['round'](e[r + 1][1] - e[r][1]);
12 | n = Math['round'](e[r + 1][2] - e[r][2]);
13 | 0 === t && 0 === s && 0 === n || (0 === t && 0 === s ? o += n : (a['push']([t, s, n + o]), o = 0));
14 | }
15 | return 0 !== o && a['push']([t, s, o]), a;
16 | }
17 |
18 | function n_encrypt() {
19 | var n = function () {
20 | var e;
21 | var s = Object['create'] || function () {
22 | function s() {
23 | }
24 |
25 | return function (e) {
26 | var t;
27 | return s["prototype"] = e, t = new s(), s['prototype'] = null, t;
28 | };
29 | }();
30 | var t = {};
31 | var n = t['lib'] = {};
32 | var a = n['Base'] = {
33 | "extend": function (e) {
34 | var t = s(this);
35 | return e && t['mixIn'](e), t['hasOwnProperty']('init') && this['init'] !== t['init'] || (t['init'] = function () {
36 | t['$super']['init']['apply'](this, arguments);
37 | }), (t['init']['prototype'] = t)['$super'] = this, t;
38 | },
39 | "create": function () {
40 | var e = this['extend']();
41 | return e['init']['apply'](e, arguments), e;
42 | },
43 | "init": function () {
44 | },
45 | "mixIn": function (e) {
46 | for (var t in e) e['hasOwnProperty'](t) && (this[t] = e[t]);
47 | e['hasOwnProperty']('toString') && (this['toString'] = e['toString']);
48 | }
49 | };
50 | var u = n["WordArray"] = a["extend"]({
51 | "init": function (e, t) {
52 | e = this['words'] = e || [];
53 | t != undefined ? this['sigBytes'] = t : this['sigBytes'] = 4 * e["length"];
54 | },
55 | "concat": function (e) {
56 | var t = this['words'];
57 | var s = e['words'];
58 | var n = this['sigBytes'];
59 | var a = e['sigBytes'];
60 | if (this["clamp"](), n % 4) for (var o = 0; o < a; o++) {
61 | var r = s[o >>> 2] >>> 24 - o % 4 * 8 & 255;
62 | t[n + o >>> 2] |= r << 24 - (n + o) % 4 * 8;
63 | } else for (o = 0; o < a; o += 4) t[n + o >>> 2] = s[o >>> 2];
64 | return this['sigBytes'] += a, this;
65 | },
66 | "clamp": function () {
67 | var e = this['words'];
68 | var t = this['sigBytes'];
69 | e[t >>> 2] &= 4294967295 << 32 - t % 4 * 8;
70 | e["length"] = Math["ceil"](t / 4);
71 | }
72 | });
73 | var o = t["enc"] = {};
74 | var p = o["Latin1"] = {
75 | "parse": function (e) {
76 | for (var t = e['length'], s = [], n = 0; n < t; n++) s[n >>> 2] |= (255 & e["charCodeAt"](n)) << 24 - n % 4 * 8;
77 |
78 | return new u["init"](s, t);
79 | }
80 | };
81 | var r = o["Utf8"] = {
82 | "parse": function (e) {
83 | return p["parse"](unescape(encodeURIComponent(e)));
84 | }
85 | };
86 | var i = n["BufferedBlockAlgorithm"] = a["extend"]({
87 | "reset": function () {
88 | this['$_JAr'] = new u["init"]();
89 | this["$_BCFd"] = 0;
90 | },
91 | "$_BCGa": function (e) {
92 | 'string' == typeof e && (e = r["parse"](e));
93 | this['$_JAr']["concat"](e);
94 | this["$_BCFd"] += e['sigBytes'];
95 | },
96 | "$_BCHV": function (e) {
97 | var t = this['$_JAr'];
98 | var s = t['words'];
99 | var n = t['sigBytes'];
100 | var a = this['blockSize'];
101 | var o = n / (4 * a);
102 | var r = (e ? o = Math["ceil"](o) : o = Math["max"]((0 | o) - this["$_BCIO"], 0)) * a;
103 | var i = Math["min"](4 * r, n);
104 |
105 | if (r) {
106 | for (var _ = 0; _ < r; _ += a) this["$_BCJO"](s, _);
107 |
108 | var c = s["splice"](0, r);
109 | t['sigBytes'] -= i;
110 | }
111 |
112 | return new u['init'](c, i);
113 | },
114 | "$_BCIO": 0
115 | });
116 | var _ = t["algo"] = {};
117 | var c = n["Cipher"] = i['extend']({
118 | "cfg": a['extend'](),
119 | "createEncryptor": function (e, t) {
120 | return this['create'](this['$_BDAS'], e, t);
121 | },
122 | "init": function (e, t, s) {
123 | this["cfg"] = this["cfg"]['extend'](s);
124 | this["$_BDBd"] = e;
125 | this["$_BDCs"] = t;
126 | this["reset"]();
127 | },
128 | "reset": function () {
129 | i["reset"]["call"](this);
130 | this["$_BDDg"]();
131 | },
132 | "process": function (e) {
133 |
134 | return this["$_BCGa"](e), this["$_BCHV"]();
135 | },
136 | "finalize": function (e) {
137 |
138 | return e && this["$_BCGa"](e), this["$_BDEO"]();
139 | },
140 | "keySize": 4,
141 | "ivSize": 4,
142 | "$_BDAS": 1,
143 | "$_BDFj": 2,
144 | "$_BDGs": function (c) {
145 |
146 | return {
147 | "encrypt": function (e, t, s) {
148 | t = p['parse'](t);
149 | s && s["iv"] || ((s = s || {})["iv"] = p['parse']("0000000000000000"));
150 | for (var n = b["encrypt"](c, e, t, s), a = n["ciphertext"]['words'], o = n["ciphertext"]['sigBytes'], r = [], i = 0; i < o; i++) {
151 | var _ = a[i >>> 2] >>> 24 - i % 4 * 8 & 255;
152 | r["push"](_);
153 | }
154 |
155 | return r;
156 | }
157 | };
158 | }
159 | });
160 | var g = t["mode"] = {};
161 | var l = n["BlockCipherMode"] = a['extend']({
162 | "createEncryptor": function (e, t) {
163 |
164 | return this["Encryptor"]['create'](e, t);
165 | },
166 | "init": function (e, t) {
167 | this["$_BDHv"] = e;
168 | this["$_BDIy"] = t;
169 | }
170 | });
171 | var d = g["CBC"] = ((e = l['extend']())["Encryptor"] = e['extend']({
172 | "processBlock": function (e, t) {
173 | var s = this["$_BDHv"];
174 | var n = s['blockSize'];
175 | (function r(e, t, s) {
176 | var n = this["$_BDIy"];
177 | if (n) {
178 | var a = n;
179 | this['$_BDIy'] = undefined;
180 | } else var a = this["$_BDJH"];
181 |
182 | for (var o = 0; o < s; o++) e[t + o] ^= a[o];
183 | })['call'](this, e, t, n);
184 | s["encryptBlock"](e, t);
185 | this["$_BDJH"] = e["slice"](t, t + n);
186 | }
187 | }), e);
188 | var h = (t["pad"] = {})["Pkcs7"] = {
189 | "pad": function (e, t) {
190 | for (var s = 4 * t, n = s - e['sigBytes'] % s, a = n << 24 | n << 16 | n << 8 | n, o = [], r = 0; r < n; r += 4) o["push"](a);
191 | var i = u['create'](o, n);
192 | e["concat"](i);
193 | }
194 | };
195 | var f = n["BlockCipher"] = c['extend']({
196 | "cfg": c['cfg']['extend']({
197 | "mode": d,
198 | "padding": h
199 | }),
200 | "reset": function () {
201 | c['reset']['call'](this);
202 | var e = this['cfg'];
203 | var t = e['iv'];
204 | var s = e["mode"];
205 | if (this["$_BDBd"] == this['$_BDAS']) var n = s["createEncryptor"];
206 |
207 | if (this['$_BEAZ'] && this['$_BEAZ']["$_BEB_"] == n) {
208 | this['$_BEAZ']['init'](this, t && t['words']);
209 | } else {
210 | this['$_BEAZ'] = n['call'](s, this, t && t['words']);
211 | this['$_BEAZ']["$_BEB_"] = n;
212 | }
213 | },
214 | "$_BCJO": function (e, t) {
215 | this['$_BEAZ']["processBlock"](e, t);
216 | },
217 | "$_BDEO": function () {
218 | var e = this['cfg']['padding'];
219 |
220 | if (this["$_BDBd"] == this["$_BDAS"]) {
221 | e["pad"](this['$_JAr'], this["blockSize"]);
222 | var t = this["$_BCHV"](!0);
223 | }
224 |
225 | return t;
226 | },
227 | "blockSize": 4
228 | });
229 | var m = n["CipherParams"] = a['extend']({
230 | "init": function (e) {
231 | this["mixIn"](e);
232 | }
233 | });
234 | var b = n["SerializableCipher"] = a['extend']({
235 | "cfg": a['extend'](),
236 | "encrypt": function (e, t, s, n) {
237 | n = this["cfg"]['extend'](n);
238 | var a = e["createEncryptor"](s, n);
239 | var o = a["finalize"](t);
240 | var r = a['cfg'];
241 | return m["create"]({
242 | "ciphertext": o,
243 | "key": s,
244 | "iv": r["iv"],
245 | "algorithm": e,
246 | "mode": r["mode"],
247 | "padding": r['padding'],
248 | "blockSize": e['blockSize'],
249 | "formatter": n['format']
250 | });
251 | }
252 | });
253 | var v = [];
254 | var w = [];
255 | var x = [];
256 | var y = [];
257 | var k = [];
258 | var C = [];
259 | var E = [];
260 | var A = [];
261 | var z = [];
262 | var T = [];
263 | !function () {
264 | for (var e = [], t = 0; t < 256; t++) if (t < 128) {
265 | e[t] = t << 1;
266 | } else {
267 | e[t] = t << 1 ^ 283;
268 | }
269 | var s = 0;
270 | var n = 0;
271 | for (t = 0; t < 256; t++) {
272 | var a = n ^ n << 1 ^ n << 2 ^ n << 3 ^ n << 4;
273 | a = a >>> 8 ^ 255 & a ^ 99;
274 | v[s] = a;
275 | var o = e[w[a] = s];
276 | var r = e[o];
277 | var i = e[r];
278 | var _ = 257 * e[a] ^ 16843008 * a;
279 | x[s] = _ << 24 | _ >>> 8;
280 | y[s] = _ << 16 | _ >>> 16;
281 | k[s] = _ << 8 | _ >>> 24;
282 | C[s] = _;
283 | _ = 16843009 * i ^ 65537 * r ^ 257 * o ^ 16843008 * s;
284 | E[a] = _ << 24 | _ >>> 8;
285 | A[a] = _ << 16 | _ >>> 16;
286 | z[a] = _ << 8 | _ >>> 24;
287 | T[a] = _;
288 | s ? (s = o ^ e[e[e[i ^ o]]], n ^= e[e[n]]) : s = n = 1;
289 | }
290 | }();
291 | var B = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54];
292 | var D = _['AES'] = f['extend']({
293 | "$_BDDg": function () {
294 | if (!this['$_BECV'] || this['$_BEDc'] !== this['$_BDCs']) {
295 | for (var e = this['$_BEDc'] = this['$_BDCs'], t = e['words'], s = e['sigBytes'] / 4, n = 4 * (1 + (this['$_BECV'] = 6 + s)), a = this['$_BEEZ'] = [], o = 0; o < n; o++) if (o < s) a[o] = t[o]; else {
296 | var r = a[o - 1];
297 | o % s ? 6 < s && o % s == 4 && (r = v[r >>> 24] << 24 | v[r >>> 16 & 255] << 16 | v[r >>> 8 & 255] << 8 | v[255 & r]) : (r = v[(r = r << 8 | r >>> 24) >>> 24] << 24 | v[r >>> 16 & 255] << 16 | v[r >>> 8 & 255] << 8 | v[255 & r], r ^= B[o / s | 0] << 24);
298 | a[o] = a[o - s] ^ r;
299 | }
300 |
301 | for (var i = this['$_BEFH'] = [], _ = 0; _ < n; _++) {
302 | o = n - _;
303 | if (_ % 4) r = a[o]; else r = a[o - 4];
304 | if (_ < 4 || o <= 4) {
305 | i[_] = r;
306 | } else {
307 | i[_] = E[v[r >>> 24]] ^ A[v[r >>> 16 & 255]] ^ z[v[r >>> 8 & 255]] ^ T[v[255 & r]];
308 | }
309 | }
310 | }
311 | },
312 | "encryptBlock": function (e, t) {
313 | this['$_BEGu'](e, t, this['$_BEEZ'], x, y, k, C, v);
314 | },
315 | "$_BEGu": function (e, t, s, n, a, o, r, i) {
316 | for (var _ = this['$_BECV'], c = e[t] ^ s[0], u = e[t + 1] ^ s[1], p = e[t + 2] ^ s[2], g = e[t + 3] ^ s[3], l = 4, d = 1; d < _; d++) {
317 | var h = n[c >>> 24] ^ a[u >>> 16 & 255] ^ o[p >>> 8 & 255] ^ r[255 & g] ^ s[l++];
318 | var f = n[u >>> 24] ^ a[p >>> 16 & 255] ^ o[g >>> 8 & 255] ^ r[255 & c] ^ s[l++];
319 | var m = n[p >>> 24] ^ a[g >>> 16 & 255] ^ o[c >>> 8 & 255] ^ r[255 & u] ^ s[l++];
320 | var b = n[g >>> 24] ^ a[c >>> 16 & 255] ^ o[u >>> 8 & 255] ^ r[255 & p] ^ s[l++];
321 | c = h;
322 | u = f;
323 | p = m;
324 | g = b;
325 | }
326 |
327 | h = (i[c >>> 24] << 24 | i[u >>> 16 & 255] << 16 | i[p >>> 8 & 255] << 8 | i[255 & g]) ^ s[l++];
328 | f = (i[u >>> 24] << 24 | i[p >>> 16 & 255] << 16 | i[g >>> 8 & 255] << 8 | i[255 & c]) ^ s[l++];
329 | m = (i[p >>> 24] << 24 | i[g >>> 16 & 255] << 16 | i[c >>> 8 & 255] << 8 | i[255 & u]) ^ s[l++];
330 | b = (i[g >>> 24] << 24 | i[c >>> 16 & 255] << 16 | i[u >>> 8 & 255] << 8 | i[255 & p]) ^ s[l++];
331 | e[t] = h;
332 | e[t + 1] = f;
333 | e[t + 2] = m;
334 | e[t + 3] = b;
335 | },
336 | "keySize": 8
337 | });
338 | return t['AES'] = f['$_BDGs'](D), t['AES'];
339 | }();
340 | return n;
341 | }
342 |
343 | function _() {
344 |
345 | var a = function () {
346 | function s() {
347 | this['i'] = 0;
348 | this['j'] = 0;
349 | this['S'] = [];
350 | }
351 |
352 | s['prototype']['init'] = function E(e) {
353 | var t;
354 | var s;
355 | var n;
356 | for (t = 0; t < 256; ++t) this['S'][t] = t;
357 | for (t = s = 0; t < 256; ++t) {
358 | s = s + this['S'][t] + e[t % e['length']] & 255;
359 | n = this['S'][t];
360 | this['S'][t] = this['S'][s];
361 | this['S'][s] = n;
362 | }
363 | this["i"] = 0;
364 | this["j"] = 0;
365 | };
366 |
367 | s['prototype']['next'] = function A() {
368 | var e;
369 | return this['i'] = this['i'] + 1 & 255, this['j'] = this['j'] + this['S'][this['i']] & 255, e = this['S'][this['i']], this['S'][this['i']] = this['S'][this['j']], this['S'][this['j']] = e, this['S'][e + this['S'][this['i']] & 255];
370 | };
371 |
372 | var n;
373 | var a;
374 | var o;
375 | var t;
376 | var r = 256;
377 |
378 | if (null == a) {
379 | var i;
380 | if (a = [], o = 0, window['crypto'] && window['crypto']['getRandomValues']) {
381 | var _ = new Uint32Array(256);
382 | for (window['crypto']['getRandomValues'](_), i = 0; i < _['length']; ++i) a[o++] = 255 & _[i];
383 | }
384 | var c = 0;
385 | var u = function u(t) {
386 | if (256 <= (c = c || 0) || r <= o) {
387 |
388 | } else try {
389 | var s = t["x"] + t["y"];
390 | a[o++] = 255 & s;
391 | c += 1;
392 | } catch (e) {
393 | console.log(e);
394 | }
395 | };
396 |
397 | }
398 |
399 | function p() {
400 | n = new s();
401 | while (o < r) {
402 | var e = Math['floor'](65536 * Math['random']());
403 | a[o++] = 255 & e;
404 | }
405 | for (n['init'](a), o = 0; o < a['length']; ++o) a[o] = 0;
406 | o = 0;
407 | return n['next']();
408 | }
409 |
410 | function g() {
411 | }
412 |
413 | g['prototype']['nextBytes'] = function z(e) {
414 | var t;
415 | for (t = 0; t < e['length']; ++t) e[t] = p();
416 | };
417 |
418 | function v(e, t, s) {
419 | null != e && ('number' == typeof e ? this['fromNumber'](e, t, s) : null == t && 'string' != typeof e ? this['fromString'](e, 256) : this['fromString'](e, t))
420 | }
421 |
422 | function w() {
423 | return new v(null);
424 | }
425 |
426 | "Microsoft Internet Explorer" == navigator["appName"] ? t = (v['prototype']['am'] = function T(e, t, s, n, a, o) {
427 | var r = 32767 & t;
428 | var i = t >> 15;
429 | while (0 <= --o) {
430 | var _ = 32767 & this[e];
431 | var c = this[e++] >> 15;
432 | var u = i * _ + c * r;
433 | a = ((_ = r * _ + ((32767 & u) << 15) + s[n] + (1073741823 & a)) >>> 30) + (u >>> 15) + i * c + (a >>> 30);
434 | s[n++] = 1073741823 & _;
435 | }
436 | return a;
437 | }, 30) : 'Netscape' != navigator['appName'] ? t = (v['prototype']['am'] = function B(e, t, s, n, a, o) {
438 | while (0 <= --o) {
439 | var r = t * this[e++] + s[n] + a;
440 | a = Math["floor"](r / 67108864);
441 | s[n++] = 67108863 & r;
442 | }
443 | return a;
444 | }, 26) : t = (v['prototype']['am'] = function D(e, t, s, n, a, o) {
445 | var r = 16383 & t;
446 | var i = t >> 14;
447 | while (0 <= --o) {
448 | var _ = 16383 & this[e];
449 | var c = this[e++] >> 14;
450 | var u = i * _ + c * r;
451 | a = ((_ = r * _ + ((16383 & u) << 14) + s[n] + a) >> 28) + (u >> 14) + i * c;
452 | s[n++] = 268435455 & _;
453 | }
454 | return a;
455 | }, 28);
456 |
457 | v['prototype']['DB'] = t;
458 | v['prototype']['DM'] = (1 << t) - 1;
459 | v['prototype']['DV'] = 1 << t;
460 | v['prototype']["FV"] = Math['pow'](2, 52);
461 | v['prototype']['F1'] = 52 - t;
462 | v['prototype']['F2'] = 2 * t - 52;
463 | var l;
464 | var d;
465 | var h = '0123456789abcdefghijklmnopqrstuvwxyz';
466 | var f = [];
467 |
468 | for (l = '0'['charCodeAt'](0), d = 0; d <= 9; ++d) f[l++] = d;
469 |
470 | for (l = 'a'['charCodeAt'](0), d = 10; d < 36; ++d) f[l++] = d;
471 |
472 | for (l = 'A'['charCodeAt'](0), d = 10; d < 36; ++d) f[l++] = d;
473 |
474 | function m(e) {
475 | return h["charAt"](e);
476 | }
477 |
478 | function b(e) {
479 | var t = w();
480 | return t["fromInt"](e), t;
481 | }
482 |
483 | function x(e) {
484 | var t;
485 | var s = 1;
486 | return 0 != (t = e >>> 16) && (e = t, s += 16), 0 != (t = e >> 8) && (e = t, s += 8), 0 != (t = e >> 4) && (e = t, s += 4), 0 != (t = e >> 2) && (e = t, s += 2), 0 != (t = e >> 1) && (e = t, s += 1), s;
487 | }
488 |
489 | function y(e) {
490 | this['m'] = e;
491 | }
492 |
493 | function k(e) {
494 | this['m'] = e;
495 | this["mp"] = e["invDigit"]();
496 | this["mpl"] = 32767 & this["mp"];
497 | this["mph"] = this['mp'] >> 15;
498 | this["um"] = (1 << e['DB'] - 15) - 1;
499 | this["mt2"] = 2 * e["t"];
500 |
501 | }
502 |
503 | function C() {
504 | this["setPublic"]("00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81", "10001");
505 |
506 | }
507 |
508 | return y['prototype']["convert"] = function S(e) {
509 | return e["s"] < 0 || 0 <= e["compareTo"](this['m']) ? e["mod"](this['m']) : e;
510 | }, y['prototype']["revert"] = function M(e) {
511 | return e;
512 | }, y['prototype']["reduce"] = function R(e) {
513 | e["divRemTo"](this['m'], null, e);
514 | }, y['prototype']["mulTo"] = function F(e, t, s) {
515 | e["multiplyTo"](t, s);
516 | this["reduce"](s);
517 | }, y['prototype']["sqrTo"] = function O(e, t) {
518 |
519 | e["squareTo"](t);
520 | this['reduce'](t);
521 | }, k['prototype']["convert"] = function j(e) {
522 | var t = w();
523 | return e["abs"]()["dlShiftTo"](this['m']['t'], t), t["divRemTo"](this['m'], null, t), e['s'] < 0 && 0 < t["compareTo"](v["ZERO"]) && this['m']["subTo"](t, t), t;
524 | }, k['prototype']["revert"] = function P(e) {
525 | var t = w();
526 | return e["copyTo"](t), this['reduce'](t), t;
527 | }, k['prototype']['reduce'] = function I(e) {
528 |
529 | while (e['t'] <= this["mt2"]) e[e['t']++] = 0;
530 |
531 | for (var t = 0; t < this['m']['t']; ++t) {
532 | var s = 32767 & e[t];
533 | var n = s * this["mpl"] + ((s * this["mph"] + (e[t] >> 15) * this['mpl'] & this["um"]) << 15) & e["DM"];
534 | e[s = t + this['m']['t']] += this['m']["am"](0, n, e, t, 0, this['m']['t']);
535 |
536 | while (e[s] >= e["DV"]) {
537 | e[s] -= e["DV"];
538 | e[++s]++;
539 | }
540 | }
541 |
542 | e["clamp"]();
543 | e["drShiftTo"](this['m']['t'], e);
544 | 0 <= e['compareTo'](this['m']) && e["subTo"](this['m'], e);
545 | }, k['prototype']["mulTo"] = function N(e, t, s) {
546 |
547 | e["multiplyTo"](t, s);
548 | this['reduce'](s);
549 | }, k['prototype']["sqrTo"] = function q(e, t) {
550 |
551 | e["squareTo"](t);
552 | this['reduce'](t);
553 | }, v['prototype']["copyTo"] = function L(e) {
554 | for (var t = this['t'] - 1; 0 <= t; --t) e[t] = this[t];
555 | e['t'] = this['t'];
556 | e['s'] = this['s'];
557 | }, v['prototype']["fromInt"] = function H(e) {
558 | this['t'] = 1;
559 | e < 0 ? this['s'] = -1 : this['s'] = 0;
560 | 0 < e ? this[0] = e : e < -1 ? this[0] = e + this['DV'] : this['t'] = 0;
561 | }, v['prototype']["fromString"] = function $(e, t) {
562 | var s;
563 | if (16 == t) s = 4; else if (8 == t) s = 3; else if (256 == t) s = 8; else if (2 == t) s = 1; else if (32 == t) s = 5; else {
564 | if (4 != t) return void this["fromRadix"](e, t);
565 | s = 2;
566 | }
567 | this['t'] = 0;
568 | this['s'] = 0;
569 | var n;
570 | var a;
571 | var o = e['length'];
572 | var r = !1;
573 | var i = 0;
574 | while (0 <= --o) {
575 | if (8 == s) {
576 | var _ = 255 & e[o];
577 | } else {
578 | var _ = (n = o, null == (a = f[e["charCodeAt"](n)]) ? -1 : a);
579 | }
580 | if (_ < 0) {
581 | "-" == e["charAt"](o) && (r = !0);
582 | } else {
583 | r = !1;
584 | 0 == i ? this[this['t']++] = _ : i + s > this["DB"] ? (this[this['t'] - 1] |= (_ & (1 << this["DB"] - i) - 1) << i, this[this['t']++] = _ >> this['DB'] - i) : this[this['t'] - 1] |= _ << i;
585 | (i += s) >= this['DB'] && (i -= this['DB']);
586 | }
587 | }
588 | 8 == s && 0 != (128 & e[0]) && (this['s'] = -1, 0 < i && (this[this['t'] - 1] |= (1 << this['DB'] - i) - 1 << i));
589 | this['clamp']();
590 | r && v["ZERO"]['subTo'](this, this);
591 | }, v['prototype']['clamp'] = function X() {
592 | var e = this['s'] & this["DM"];
593 | while (0 < this['t'] && this[this['t'] - 1] == e) --this['t'];
594 | }, v['prototype']["dlShiftTo"] = function U(e, t) {
595 | var s;
596 | for (s = this['t'] - 1; 0 <= s; --s) t[s + e] = this[s];
597 | for (s = e - 1; 0 <= s; --s) t[s] = 0;
598 | t['t'] = this['t'] + e;
599 | t['s'] = this['s'];
600 | }, v['prototype']["drShiftTo"] = function V(e, t) {
601 | for (var s = e; s < this['t']; ++s) t[s - e] = this[s];
602 | t['t'] = Math["max"](this['t'] - e, 0);
603 | t['s'] = this['s'];
604 | }, v['prototype']["lShiftTo"] = function W(e, t) {
605 | var s;
606 | var n = e % this['DB'];
607 | var a = this['DB'] - n;
608 | var o = (1 << a) - 1;
609 | var r = Math["floor"](e / this['DB']);
610 | var i = this['s'] << n & this['DM'];
611 | for (s = this['t'] - 1; 0 <= s; --s) {
612 | t[s + r + 1] = this[s] >> a | i;
613 | i = (this[s] & o) << n;
614 | }
615 | for (s = r - 1; 0 <= s; --s) t[s] = 0;
616 | t[r] = i;
617 | t['t'] = this['t'] + r + 1;
618 | t['s'] = this['s'];
619 | t['clamp']();
620 | }, v['prototype']["rShiftTo"] = function G(e, t) {
621 | t['s'] = this['s'];
622 | var s = Math["floor"](e / this["DB"]);
623 | if (s >= this['t']) t['t'] = 0; else {
624 | var n = e % this['DB'];
625 | var a = this['DB'] - n;
626 | var o = (1 << n) - 1;
627 | t[0] = this[s] >> n;
628 | for (var r = s + 1; r < this['t']; ++r) {
629 | t[r - s - 1] |= (this[r] & o) << a;
630 | t[r - s] = this[r] >> n;
631 | }
632 | 0 < n && (t[this['t'] - s - 1] |= (this['s'] & o) << a);
633 | t['t'] = this['t'] - s;
634 | t["clamp"]();
635 | }
636 | }, v['prototype']['subTo'] = function Y(e, t) {
637 |
638 | var s = 0;
639 | var n = 0;
640 | var a = Math["min"](e['t'], this['t']);
641 |
642 | while (s < a) {
643 | n += this[s] - e[s];
644 | t[s++] = n & this['DM'];
645 | n >>= this['DB'];
646 | }
647 |
648 | if (e['t'] < this['t']) {
649 | n -= e['s'];
650 |
651 | while (s < this['t']) {
652 | n += this[s];
653 | t[s++] = n & this['DM'];
654 | n >>= this['DB'];
655 | }
656 | n += this['s'];
657 | } else {
658 | n += this['s'];
659 |
660 | while (s < e['t']) {
661 | n -= e[s];
662 | t[s++] = n & this['DM'];
663 | n >>= this['DB'];
664 | }
665 |
666 | n -= e['s'];
667 | }
668 |
669 | n < 0 ? t['s'] = -1 : t['s'] = 0;
670 | n < -1 ? t[s++] = this['DV'] + n : 0 < n && (t[s++] = n);
671 | t['t'] = s;
672 | t['clamp']();
673 | }, v['prototype']["multiplyTo"] = function Z(e, t) {
674 | var s = this["abs"]();
675 | var n = e["abs"]();
676 | var a = s["t"];
677 | t['t'] = a + n['t'];
678 | while (0 <= --a) t[a] = 0;
679 | for (a = 0; a < n['t']; ++a) t[a + s['t']] = s["am"](0, n[a], t, a, 0, s['t']);
680 |
681 | t["s"] = 0;
682 | t["clamp"]();
683 | this['s'] != e['s'] && v["ZERO"]["subTo"](t, t);
684 | }, v['prototype']["squareTo"] = function Q(e) {
685 | var t = this["abs"]();
686 | var s = e["t"] = 2 * t['t'];
687 |
688 | while (0 <= --s) e[s] = 0;
689 |
690 | for (s = 0; s < t['t'] - 1; ++s) {
691 | var n = t["am"](s, t[s], e, 2 * s, 0, 1);
692 | (e[s + t['t']] += t["am"](s + 1, 2 * t[s], e, 2 * s + 1, n, t['t'] - s - 1)) >= t["DV"] && (e[s + t['t']] -= t["DV"], e[s + t['t'] + 1] = 1);
693 | }
694 |
695 | 0 < e['t'] && (e[e['t'] - 1] += t['am'](s, t[s], e, 2 * s, 0, 1));
696 | e["s"] = 0;
697 | e["clamp"]();
698 | }, v['prototype']["divRemTo"] = function J(e, t, s) {
699 | var n = e["abs"]();
700 | if (!(n["t"] <= 0)) {
701 | var a = this['abs']();
702 | if (a['t'] < n['t']) return null != t && t["fromInt"](0), void (null != s && this["copyTo"](s));
703 | null == s && (s = w());
704 | var o = w();
705 | var r = this["s"];
706 | var i = e['s'];
707 |
708 | var _ = this["DB"] - x(n[n['t'] - 1]);
709 |
710 | if (0 < _) {
711 | n["lShiftTo"](_, o);
712 | a["lShiftTo"](_, s);
713 | } else {
714 | n["copyTo"](o);
715 | a['copyTo'](s);
716 | }
717 |
718 | var c = o['t'];
719 | var u = o[c - 1];
720 |
721 | if (0 != u) {
722 | var p = u * (1 << this["F1"]) + (1 < c ? o[c - 2] >> this["F2"] : 0);
723 | var g = this["FV"] / p;
724 | var l = (1 << this["F1"]) / p;
725 | var d = 1 << this["F2"];
726 | var h = s['t'];
727 | var f = h - c;
728 |
729 | if (null == t) {
730 | var m = w();
731 | } else {
732 | var m = t;
733 | }
734 |
735 | o["dlShiftTo"](f, m);
736 | 0 <= s["compareTo"](m) && (s[s['t']++] = 1, s["subTo"](m, s));
737 | v["ONE"]["dlShiftTo"](c, m);
738 | m["subTo"](o, o);
739 |
740 | while (o["t"] < c) o[o['t']++] = 0;
741 |
742 | while (0 <= --f) {
743 | var b = s[--h] == u ? this["DM"] : Math["floor"](s[h] * g + (s[h - 1] + d) * l);
744 |
745 | if ((s[h] += o["am"](0, b, s, f, 0, c)) < b) {
746 | o["dlShiftTo"](f, m);
747 | s['subTo'](m, s);
748 |
749 | while (s[h] < --b) s['subTo'](m, s);
750 | }
751 | }
752 |
753 | null != t && (s["drShiftTo"](c, t), r != i && v["ZERO"]['subTo'](t, t));
754 | s['t'] = c;
755 | s["clamp"]();
756 | 0 < _ && s["rShiftTo"](_, s);
757 | r < 0 && v["ZERO"]['subTo'](s, s);
758 | }
759 | }
760 | }, v['prototype']["invDigit"] = function K() {
761 |
762 | if (this["t"] < 1) return 0;
763 | var e = this[0];
764 | if (0 == (1 & e)) return 0;
765 | var t = 3 & e;
766 | return 0 < (t = (t = (t = (t = t * (2 - (15 & e) * t) & 15) * (2 - (255 & e) * t) & 255) * (2 - ((65535 & e) * t & 65535)) & 65535) * (2 - e * t % this["DV"]) % this["DV"]) ? this['DV'] - t : -t;
767 | }, v['prototype']["isEven"] = function ee() {
768 | return 0 == (0 < this['t'] ? 1 & this[0] : this["s"]);
769 | }, v['prototype']["exp"] = function te(e, t) {
770 | if (4294967295 < e || e < 1) return v["ONE"];
771 | var s = w();
772 | var n = w();
773 | var a = t["convert"](this);
774 | var o = x(e) - 1;
775 | a["copyTo"](s);
776 | while (0 <= --o) if (t["sqrTo"](s, n), 0 < (e & 1 << o)) t["mulTo"](n, a, s); else {
777 | var r = s;
778 | s = n;
779 | n = r;
780 | }
781 | return t["revert"](s);
782 | }, v['prototype']["toString"] = function se(e) {
783 | if (this["s"] < 0) return "-" + this["negate"]()["toString"](e);
784 | var t;
785 | if (16 == e) t = 4; else if (8 == e) t = 3; else if (2 == e) t = 1; else if (32 == e) t = 5; else {
786 | if (4 != e) return this["toRadix"](e);
787 | t = 2;
788 | }
789 | var s;
790 | var n = (1 << t) - 1;
791 | var a = !1;
792 | var o = "";
793 | var r = this["t"];
794 | var i = this["DB"] - r * this['DB'] % t;
795 | if (0 < r--) {
796 | i < this['DB'] && 0 < (s = this[r] >> i) && (a = !0, o = m(s));
797 | while (0 <= r) {
798 | i < t ? (s = (this[r] & (1 << i) - 1) << t - i, s |= this[--r] >> (i += this['DB'] - t)) : (s = this[r] >> (i -= t) & n, i <= 0 && (i += this['DB'], --r));
799 | 0 < s && (a = !0);
800 | a && (o += m(s));
801 | }
802 | }
803 |
804 | return a ? o : "0";
805 | }, v['prototype']["negate"] = function ne() {
806 | var e = w();
807 | return v["ZERO"]["subTo"](this, e), e;
808 | }, v['prototype']["abs"] = function ae() {
809 |
810 | return this['s'] < 0 ? this['negate']() : this;
811 | }, v['prototype']['compareTo'] = function oe(e) {
812 |
813 | var t = this['s'] - e['s'];
814 | if (0 != t) return t;
815 | var s = this['t'];
816 | if (0 != (t = s - e['t'])) return this['s'] < 0 ? -t : t;
817 |
818 | while (0 <= --s) if (0 != (t = this[s] - e[s])) return t;
819 |
820 | return 0;
821 | }, v['prototype']["bitLength"] = function re() {
822 | return this["t"] <= 0 ? 0 : this["DB"] * (this['t'] - 1) + x(this[this['t'] - 1] ^ this["s"] & this["DM"]);
823 | }, v['prototype']["mod"] = function ie(e) {
824 | var t = w();
825 | return this["abs"]()["divRemTo"](e, null, t), this['s'] < 0 && 0 < t["compareTo"](v["ZERO"]) && e["subTo"](t, t), t;
826 | }, v['prototype']["modPowInt"] = function $_CEW(e, t) {
827 | var s;
828 | return e < 256 || t["isEven"]() ? s = new y(t) : s = new k(t), this["exp"](e, s);
829 | }, v["ZERO"] = b(0), v["ONE"] = b(1), C['prototype']["doPublic"] = function ce(e) {
830 | return e["modPowInt"](this["e"], this['n']);
831 | }, C['prototype']["setPublic"] = function ue(e, t) {
832 | if (null != e && null != t && 0 < e['length'] && 0 < t['length']) {
833 | this['n'] = function s(e, t) {
834 |
835 | return new v(e, t);
836 | }(e, 16);
837 |
838 | this['e'] = parseInt(t, 16);
839 | } else {
840 | console && console["error"] && console['error']("Invalid RSA public key");
841 | }
842 | }, C['prototype']['encrypt'] = function pe(e) {
843 | var t = function i(e, t) {
844 | if (t < e["length"] + 11) return console && console["error"] && console['error']("Message too long for RSA"), null;
845 | var s = [];
846 | var n = e['length'] - 1;
847 | while (0 <= n && 0 < t) {
848 | var a = e["charCodeAt"](n--);
849 | if (a < 128) {
850 | s[--t] = a;
851 | } else {
852 | if (127 < a && a < 2048) {
853 | s[--t] = 63 & a | 128;
854 | s[--t] = a >> 6 | 192;
855 | } else {
856 | s[--t] = 63 & a | 128;
857 | s[--t] = a >> 6 & 63 | 128;
858 | s[--t] = a >> 12 | 224;
859 | }
860 | }
861 | }
862 | s[--t] = 0;
863 | var o = new g();
864 | var r = [];
865 | while (2 < t) {
866 | r[0] = 0;
867 | while (0 == r[0]) o["nextBytes"](r);
868 | s[--t] = r[0];
869 | }
870 | return s[--t] = 2, s[--t] = 0, new v(s);
871 | }(e, this['n']['bitLength']() + 7 >> 3);
872 |
873 | if (null == t) return null;
874 | var s = this['doPublic'](t);
875 | if (null == s) return null;
876 | var n = s['toString'](16);
877 | return 0 == (1 & n['length']) ? n : '0' + n;
878 | }, C;
879 | }();
880 |
881 | return a;
882 | }
883 | function w(e) {
884 | for (var t = [], s = 0, n = 0; n < 2 * e.length; n += 2) {
885 | t[n >>> 3] |= parseInt(e[s], 10) << 24 - n % 8 * 4;
886 | s++;
887 | }
888 |
889 | for (var a = [], o = 0; o < e.length; o++) {
890 | var r = t[o >>> 2] >>> 24 - o % 4 * 8 & 255;
891 | a.push((r >>> 4).toString(16));
892 | a.push((15 & r).toString(16));
893 | }
894 |
895 | return a.join("");
896 | }
897 |
898 | function get_w(e, track) {
899 | var eee = e; // var n = c.guid()
900 |
901 | var n = "c2fa6d0dde9fd7da";
902 | eee.track = get_track(track);
903 | var a = new (_())().encrypt(n);
904 | var o = n_encrypt().encrypt(JSON.stringify(eee), n);
905 | return w(o) + a;
906 | }
907 |
--------------------------------------------------------------------------------