@whitesev/utils 2.8.0 → 2.8.2
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.
- package/README.md +176 -176
- package/dist/index.amd.js +896 -875
- package/dist/index.amd.js.map +1 -1
- package/dist/index.cjs.js +896 -875
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +896 -875
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +896 -875
- package/dist/index.iife.js.map +1 -1
- package/dist/index.system.js +896 -875
- package/dist/index.system.js.map +1 -1
- package/dist/index.umd.js +896 -875
- package/dist/index.umd.js.map +1 -1
- package/dist/types/src/CommonUtil.d.ts +59 -59
- package/dist/types/src/DOMUtils.d.ts +1 -1
- package/dist/types/src/Dictionary.d.ts +1 -1
- package/dist/types/src/Httpx.d.ts +2 -2
- package/dist/types/src/Progress.d.ts +0 -4
- package/dist/types/src/TryCatch.d.ts +2 -2
- package/dist/types/src/Utils.d.ts +365 -365
- package/dist/types/src/UtilsGMCookie.d.ts +2 -2
- package/dist/types/src/UtilsGMMenu.d.ts +1 -1
- package/dist/types/src/indexedDB.d.ts +3 -3
- package/dist/types/src/types/Event.d.ts +188 -188
- package/dist/types/src/types/Httpx.d.ts +1344 -1343
- package/dist/types/src/types/Log.d.ts +19 -19
- package/dist/types/src/types/Progress.d.ts +20 -20
- package/dist/types/src/types/React.d.ts +119 -119
- package/dist/types/src/types/TryCatch.d.ts +9 -9
- package/dist/types/src/types/UtilsGMCookie.d.ts +93 -93
- package/dist/types/src/types/UtilsGMMenu.d.ts +77 -77
- package/dist/types/src/types/Vue2.d.ts +166 -166
- package/dist/types/src/types/WindowApi.d.ts +14 -14
- package/dist/types/src/types/ajaxHooker.d.ts +151 -151
- package/dist/types/src/types/env.d.ts +7 -2
- package/dist/types/src/types/global.d.ts +31 -31
- package/index.ts +3 -0
- package/package.json +19 -8
- package/src/ColorConversion.ts +105 -106
- package/src/CommonUtil.ts +280 -279
- package/src/DOMUtils.ts +251 -272
- package/src/Dictionary.ts +153 -154
- package/src/GBKEncoder.ts +108 -112
- package/src/Hooks.ts +73 -81
- package/src/Httpx.ts +1457 -1466
- package/src/LockFunction.ts +62 -62
- package/src/Log.ts +258 -259
- package/src/ModuleRaid.js +1 -0
- package/src/Progress.ts +108 -114
- package/src/TryCatch.ts +86 -86
- package/src/Utils.ts +4773 -4825
- package/src/UtilsCommon.ts +14 -14
- package/src/UtilsGMCookie.ts +254 -261
- package/src/UtilsGMMenu.ts +445 -454
- package/src/Vue.ts +233 -229
- package/src/WindowApi.ts +59 -59
- package/src/ajaxHooker/ajaxHooker.js +1 -0
- package/src/indexedDB.ts +497 -502
- package/src/types/Event.d.ts +188 -188
- package/src/types/Httpx.d.ts +1344 -1343
- package/src/types/Log.d.ts +19 -19
- package/src/types/Progress.d.ts +20 -20
- package/src/types/React.d.ts +119 -119
- package/src/types/TryCatch.d.ts +9 -9
- package/src/types/UtilsGMCookie.d.ts +93 -93
- package/src/types/UtilsGMMenu.d.ts +77 -77
- package/src/types/Vue2.d.ts +166 -166
- package/src/types/WindowApi.d.ts +14 -14
- package/src/types/ajaxHooker.d.ts +151 -151
- package/src/types/env.d.ts +7 -2
- package/src/types/global.d.ts +31 -31
package/dist/index.umd.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
if (typeof str !== "string") {
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
16
|
-
if (!str.match(/^(
|
|
16
|
+
if (!str.match(/^(#|)[0-9a-fA-F]{6}$/)) {
|
|
17
17
|
return false;
|
|
18
18
|
}
|
|
19
19
|
return true;
|
|
@@ -27,18 +27,10 @@
|
|
|
27
27
|
*/
|
|
28
28
|
hexToRgba(hex, opacity) {
|
|
29
29
|
if (!this.isHex(hex)) {
|
|
30
|
-
throw new TypeError(
|
|
30
|
+
throw new TypeError(`输入错误的hex:${hex}`);
|
|
31
31
|
}
|
|
32
32
|
return hex && hex.replace(/\s+/g, "").length === 7
|
|
33
|
-
?
|
|
34
|
-
parseInt("0x" + hex.slice(1, 3)) +
|
|
35
|
-
"," +
|
|
36
|
-
parseInt("0x" + hex.slice(3, 5)) +
|
|
37
|
-
"," +
|
|
38
|
-
parseInt("0x" + hex.slice(5, 7)) +
|
|
39
|
-
"," +
|
|
40
|
-
opacity +
|
|
41
|
-
")"
|
|
33
|
+
? `rgba(${parseInt(`0x${hex.slice(1, 3)}`)},${parseInt(`0x${hex.slice(3, 5)}`)},${parseInt(`0x${hex.slice(5, 7)}`)},${opacity})`
|
|
42
34
|
: "";
|
|
43
35
|
}
|
|
44
36
|
/**
|
|
@@ -47,14 +39,15 @@
|
|
|
47
39
|
*/
|
|
48
40
|
hexToRgb(str) {
|
|
49
41
|
if (!this.isHex(str)) {
|
|
50
|
-
throw new TypeError(
|
|
42
|
+
throw new TypeError(`输入错误的hex:${str}`);
|
|
51
43
|
}
|
|
52
44
|
/* replace替换查找的到的字符串 */
|
|
53
45
|
str = str.replace("#", "");
|
|
54
46
|
/* match得到查询数组 */
|
|
55
|
-
|
|
47
|
+
const hxs = str.match(/../g);
|
|
56
48
|
for (let index = 0; index < 3; index++) {
|
|
57
|
-
|
|
49
|
+
const value = parseInt(hxs[index], 16);
|
|
50
|
+
Reflect.set(hxs, index, value);
|
|
58
51
|
}
|
|
59
52
|
return hxs;
|
|
60
53
|
}
|
|
@@ -66,16 +59,16 @@
|
|
|
66
59
|
*/
|
|
67
60
|
rgbToHex(redValue, greenValue, blueValue) {
|
|
68
61
|
/* 验证输入的rgb值是否合法 */
|
|
69
|
-
|
|
62
|
+
const validPattern = /^\d{1,3}$/;
|
|
70
63
|
if (!validPattern.test(redValue.toString()) ||
|
|
71
64
|
!validPattern.test(greenValue.toString()) ||
|
|
72
65
|
!validPattern.test(blueValue.toString()))
|
|
73
66
|
throw new TypeError("输入错误的rgb颜色值");
|
|
74
|
-
|
|
67
|
+
const hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
|
|
75
68
|
for (let index = 0; index < 3; index++)
|
|
76
69
|
if (hexs[index].length == 1)
|
|
77
|
-
hexs[index] =
|
|
78
|
-
return
|
|
70
|
+
hexs[index] = `0${hexs[index]}`;
|
|
71
|
+
return `#${hexs.join("")}`;
|
|
79
72
|
}
|
|
80
73
|
/**
|
|
81
74
|
* 获取颜色变暗或亮
|
|
@@ -84,11 +77,13 @@
|
|
|
84
77
|
*/
|
|
85
78
|
getDarkColor(color, level) {
|
|
86
79
|
if (!this.isHex(color)) {
|
|
87
|
-
throw new TypeError(
|
|
80
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
88
81
|
}
|
|
89
|
-
|
|
82
|
+
const rgbc = this.hexToRgb(color);
|
|
90
83
|
for (let index = 0; index < 3; index++) {
|
|
91
|
-
|
|
84
|
+
const rgbcItemValue = rgbc[index];
|
|
85
|
+
const value = Math.floor(Number(rgbcItemValue) * (1 - Number(level)));
|
|
86
|
+
Reflect.set(rgbc, index, value);
|
|
92
87
|
}
|
|
93
88
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
94
89
|
}
|
|
@@ -99,40 +94,43 @@
|
|
|
99
94
|
*/
|
|
100
95
|
getLightColor(color, level) {
|
|
101
96
|
if (!this.isHex(color)) {
|
|
102
|
-
throw new TypeError(
|
|
97
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
103
98
|
}
|
|
104
|
-
|
|
99
|
+
const rgbc = this.hexToRgb(color);
|
|
105
100
|
for (let index = 0; index < 3; index++) {
|
|
106
|
-
|
|
101
|
+
const rgbcItemValue = Number(rgbc[index]);
|
|
102
|
+
const value = Math.floor(255 - rgbcItemValue * level + rgbcItemValue);
|
|
103
|
+
Reflect.set(rgbc, index, value);
|
|
107
104
|
}
|
|
108
105
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
109
106
|
}
|
|
110
107
|
}
|
|
111
108
|
|
|
112
109
|
class GBKEncoder {
|
|
113
|
-
#data
|
|
110
|
+
#data;
|
|
114
111
|
#U2Ghash = {};
|
|
115
112
|
#G2Uhash = {};
|
|
116
113
|
constructor() {
|
|
117
|
-
let dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
|
|
114
|
+
const dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
|
|
118
115
|
let index = 0;
|
|
119
116
|
this.#data = dataText.match(/..../g);
|
|
120
117
|
for (let i = 0x81; i <= 0xfe; i++) {
|
|
121
118
|
for (let j = 0x40; j <= 0xfe; j++) {
|
|
122
|
-
this.#U2Ghash[this.#data[index++]] =
|
|
119
|
+
this.#U2Ghash[this.#data[index++]] = `%${i.toString(16)}%${j.toString(16)}`.toUpperCase();
|
|
123
120
|
}
|
|
124
121
|
}
|
|
125
|
-
for (
|
|
126
|
-
this.#
|
|
122
|
+
for (const key in this.#U2Ghash) {
|
|
123
|
+
const u2ghashValue = Reflect.get(this.#U2Ghash, key);
|
|
124
|
+
Reflect.set(this.#G2Uhash, u2ghashValue, key);
|
|
127
125
|
}
|
|
128
126
|
}
|
|
129
127
|
handleText(text) {
|
|
130
128
|
text = text
|
|
131
|
-
.replace(/#(\d+)\$/g, function (
|
|
129
|
+
.replace(/#(\d+)\$/g, function (_, b) {
|
|
132
130
|
return Array(+b + 3).join("#");
|
|
133
131
|
})
|
|
134
132
|
.replace(/#/g, "####")
|
|
135
|
-
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (
|
|
133
|
+
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (_, hd, dt) {
|
|
136
134
|
return dt.replace(/../g, function (a) {
|
|
137
135
|
if (a != "##") {
|
|
138
136
|
return hd + a;
|
|
@@ -152,8 +150,8 @@
|
|
|
152
150
|
* @param str
|
|
153
151
|
*/
|
|
154
152
|
encode(str) {
|
|
155
|
-
|
|
156
|
-
return [...str].reduce((result, val
|
|
153
|
+
const that = this;
|
|
154
|
+
return [...str].reduce((result, val) => {
|
|
157
155
|
return result + toGBK(val);
|
|
158
156
|
}, "");
|
|
159
157
|
function toGBK(val) {
|
|
@@ -162,7 +160,7 @@
|
|
|
162
160
|
const codePoint = val.codePointAt(i);
|
|
163
161
|
const code = String.fromCodePoint(codePoint);
|
|
164
162
|
let key = codePoint.toString(16);
|
|
165
|
-
key.length != 4 && (key =
|
|
163
|
+
key.length != 4 && (key = `000${key}`.match(/....$/)?.[0]);
|
|
166
164
|
/* Add up i by code.length */
|
|
167
165
|
i += code.length - 1;
|
|
168
166
|
/* If code is in ascii range */
|
|
@@ -176,9 +174,9 @@
|
|
|
176
174
|
continue;
|
|
177
175
|
}
|
|
178
176
|
/*
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
177
|
+
If 2 or more char combines to one visible code,
|
|
178
|
+
or just this code is not in GBK
|
|
179
|
+
*/
|
|
182
180
|
result += toGBK(`&#${codePoint};`);
|
|
183
181
|
}
|
|
184
182
|
return result;
|
|
@@ -189,18 +187,18 @@
|
|
|
189
187
|
* @param str
|
|
190
188
|
*/
|
|
191
189
|
decode(str) {
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
const GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
|
|
191
|
+
const UTFMatcher = /%[0-9A-F]{2}/;
|
|
194
192
|
// let gbk = true;
|
|
195
193
|
let utf = true;
|
|
196
194
|
const that = this;
|
|
197
195
|
while (utf) {
|
|
198
|
-
|
|
199
|
-
|
|
196
|
+
const gbkMatch = str.match(GBKMatcher);
|
|
197
|
+
const utfMatch = str.match(UTFMatcher);
|
|
200
198
|
// gbk = Boolean(gbkMatch);
|
|
201
199
|
utf = Boolean(utfMatch);
|
|
202
200
|
if (gbkMatch && gbkMatch in that.#G2Uhash) {
|
|
203
|
-
str = str.replace(gbkMatch, String.fromCharCode(
|
|
201
|
+
str = str.replace(gbkMatch, String.fromCharCode(`0x${that.#G2Uhash[gbkMatch]}`));
|
|
204
202
|
}
|
|
205
203
|
else {
|
|
206
204
|
str = str.replace(utfMatch, decodeURIComponent(utfMatch));
|
|
@@ -214,7 +212,7 @@
|
|
|
214
212
|
/* 定义变量和函数 */
|
|
215
213
|
let callbackFunction = null;
|
|
216
214
|
let context = null;
|
|
217
|
-
let handleError = (
|
|
215
|
+
let handleError = () => { };
|
|
218
216
|
let defaultDetails = {
|
|
219
217
|
log: true,
|
|
220
218
|
};
|
|
@@ -246,7 +244,7 @@
|
|
|
246
244
|
run(callback, __context__) {
|
|
247
245
|
callbackFunction = callback;
|
|
248
246
|
context = __context__ || this;
|
|
249
|
-
|
|
247
|
+
const result = executeTryCatch(callbackFunction, handleError, context);
|
|
250
248
|
return result !== void 0 ? result : TryCatchCore;
|
|
251
249
|
},
|
|
252
250
|
};
|
|
@@ -270,8 +268,8 @@
|
|
|
270
268
|
catch (error) {
|
|
271
269
|
if (defaultDetails.log) {
|
|
272
270
|
callback = callback;
|
|
273
|
-
console.log(`%c ${callback?.name ? callback?.name : callback
|
|
274
|
-
console.log(`%c
|
|
271
|
+
console.log(`%c ${callback?.name ? callback?.name : `${callback}`} `, "color: #f20000");
|
|
272
|
+
console.log(`%c ${error}`, "color: #f20000");
|
|
275
273
|
console.trace(callback);
|
|
276
274
|
}
|
|
277
275
|
if (handleErrorFunc) {
|
|
@@ -290,9 +288,9 @@
|
|
|
290
288
|
|
|
291
289
|
class CommonUtil {
|
|
292
290
|
assign(target = {}, source = {}, isAdd = false) {
|
|
293
|
-
|
|
291
|
+
const UtilsContext = this;
|
|
294
292
|
if (Array.isArray(source)) {
|
|
295
|
-
|
|
293
|
+
const canTraverse = source.filter((item) => {
|
|
296
294
|
return typeof item === "object";
|
|
297
295
|
});
|
|
298
296
|
if (!canTraverse.length) {
|
|
@@ -308,34 +306,34 @@
|
|
|
308
306
|
if (isAdd) {
|
|
309
307
|
for (const sourceKeyName in source) {
|
|
310
308
|
const targetKeyName = sourceKeyName;
|
|
311
|
-
|
|
312
|
-
|
|
309
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
310
|
+
const sourceValue = Reflect.get(source, sourceKeyName);
|
|
313
311
|
if (typeof sourceValue === "object" &&
|
|
314
312
|
sourceValue != null &&
|
|
315
313
|
sourceKeyName in target &&
|
|
316
314
|
!UtilsContext.isDOM(sourceValue)) {
|
|
317
315
|
/* 源端的值是object类型,且不是元素节点 */
|
|
318
|
-
target
|
|
316
|
+
Reflect.set(target, sourceKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
319
317
|
continue;
|
|
320
318
|
}
|
|
321
|
-
target
|
|
319
|
+
Reflect.set(target, sourceKeyName, sourceValue);
|
|
322
320
|
}
|
|
323
321
|
}
|
|
324
322
|
else {
|
|
325
323
|
for (const targetKeyName in target) {
|
|
326
324
|
if (targetKeyName in source) {
|
|
327
|
-
|
|
328
|
-
|
|
325
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
326
|
+
const sourceValue = Reflect.get(source, targetKeyName);
|
|
329
327
|
if (typeof sourceValue === "object" &&
|
|
330
328
|
sourceValue != null &&
|
|
331
329
|
!UtilsContext.isDOM(sourceValue) &&
|
|
332
330
|
Object.keys(sourceValue).length) {
|
|
333
331
|
/* 源端的值是object类型,且不是元素节点 */
|
|
334
|
-
target
|
|
332
|
+
Reflect.set(target, targetKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
335
333
|
continue;
|
|
336
334
|
}
|
|
337
335
|
/* 直接赋值 */
|
|
338
|
-
target
|
|
336
|
+
Reflect.set(target, targetKeyName, sourceValue);
|
|
339
337
|
}
|
|
340
338
|
}
|
|
341
339
|
}
|
|
@@ -343,7 +341,7 @@
|
|
|
343
341
|
}
|
|
344
342
|
isNull(...args) {
|
|
345
343
|
let result = true;
|
|
346
|
-
|
|
344
|
+
const checkList = [...args];
|
|
347
345
|
for (const objItem of checkList) {
|
|
348
346
|
let itemResult = false;
|
|
349
347
|
if (objItem === null || objItem === undefined) {
|
|
@@ -369,11 +367,12 @@
|
|
|
369
367
|
case "boolean":
|
|
370
368
|
itemResult = !objItem;
|
|
371
369
|
break;
|
|
372
|
-
case "function":
|
|
373
|
-
|
|
370
|
+
case "function": {
|
|
371
|
+
const funcStr = objItem.toString().replace(/\s/g, "");
|
|
374
372
|
/* 排除()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){} */
|
|
375
373
|
itemResult = Boolean(funcStr.match(/^\(.*?\)=>\{\}$|^function.*?\(.*?\)\{\}$/));
|
|
376
374
|
break;
|
|
375
|
+
}
|
|
377
376
|
}
|
|
378
377
|
}
|
|
379
378
|
result = result && itemResult;
|
|
@@ -394,18 +393,23 @@
|
|
|
394
393
|
return target instanceof Node;
|
|
395
394
|
}
|
|
396
395
|
isNotNull(...args) {
|
|
397
|
-
|
|
396
|
+
const UtilsContext = this;
|
|
398
397
|
return !UtilsContext.isNull.apply(this, args);
|
|
399
398
|
}
|
|
400
399
|
deepClone(obj) {
|
|
401
|
-
|
|
400
|
+
const UtilsContext = this;
|
|
402
401
|
if (obj === void 0)
|
|
403
402
|
return void 0;
|
|
404
403
|
if (obj === null)
|
|
405
404
|
return null;
|
|
406
|
-
|
|
405
|
+
const clone = obj instanceof Array ? [] : {};
|
|
407
406
|
for (const [key, value] of Object.entries(obj)) {
|
|
408
|
-
|
|
407
|
+
if (typeof value === "object") {
|
|
408
|
+
Reflect.set(clone, key, UtilsContext.deepClone(value));
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
Reflect.set(clone, key, value);
|
|
412
|
+
}
|
|
409
413
|
}
|
|
410
414
|
return clone;
|
|
411
415
|
}
|
|
@@ -432,11 +436,11 @@
|
|
|
432
436
|
}
|
|
433
437
|
TryCatch()
|
|
434
438
|
.config({ log: false })
|
|
435
|
-
.error((
|
|
439
|
+
.error(() => {
|
|
436
440
|
TryCatch()
|
|
437
441
|
.error(() => {
|
|
438
442
|
try {
|
|
439
|
-
result = new Function(
|
|
443
|
+
result = new Function(`return ${data}`)();
|
|
440
444
|
}
|
|
441
445
|
catch (error2) {
|
|
442
446
|
if (typeof errorCallBack === "function") {
|
|
@@ -447,14 +451,14 @@
|
|
|
447
451
|
.run(() => {
|
|
448
452
|
if (data &&
|
|
449
453
|
/^[\],:{}\s]*$/.test(data
|
|
450
|
-
.replace(/\\(?:["
|
|
451
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][
|
|
454
|
+
.replace(/\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
|
|
455
|
+
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g, "]")
|
|
452
456
|
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
|
|
453
|
-
result = new Function(
|
|
457
|
+
result = new Function(`return ${data}`)();
|
|
454
458
|
}
|
|
455
459
|
else {
|
|
456
460
|
if (typeof errorCallBack === "function") {
|
|
457
|
-
errorCallBack(new Error("target is not
|
|
461
|
+
errorCallBack(new Error("target is not JSON object"));
|
|
458
462
|
}
|
|
459
463
|
}
|
|
460
464
|
});
|
|
@@ -466,7 +470,7 @@
|
|
|
466
470
|
return result;
|
|
467
471
|
}
|
|
468
472
|
}
|
|
469
|
-
|
|
473
|
+
const commonUtil = new CommonUtil();
|
|
470
474
|
|
|
471
475
|
class UtilsGMCookie {
|
|
472
476
|
windowApi = {
|
|
@@ -495,14 +499,14 @@
|
|
|
495
499
|
if (typeof cookieName !== "string") {
|
|
496
500
|
throw new TypeError("Utils.GMCookie.get 参数cookieName 必须为字符串");
|
|
497
501
|
}
|
|
498
|
-
|
|
502
|
+
const cookies = this.getCookiesList();
|
|
499
503
|
let findValue = void 0;
|
|
500
504
|
for (const cookieItem of cookies) {
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
505
|
+
const item = cookieItem.trim();
|
|
506
|
+
const itemSplit = item.split("=");
|
|
507
|
+
const itemName = itemSplit[0];
|
|
504
508
|
itemSplit.splice(0, 1);
|
|
505
|
-
|
|
509
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
506
510
|
if (itemName === cookieName) {
|
|
507
511
|
findValue = {
|
|
508
512
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -532,7 +536,7 @@
|
|
|
532
536
|
if (option == null) {
|
|
533
537
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
534
538
|
}
|
|
535
|
-
|
|
539
|
+
const resultData = [];
|
|
536
540
|
try {
|
|
537
541
|
let defaultOption = {
|
|
538
542
|
url: this.windowApi.window.location.href,
|
|
@@ -541,16 +545,16 @@
|
|
|
541
545
|
path: "/",
|
|
542
546
|
};
|
|
543
547
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
544
|
-
|
|
548
|
+
const cookies = this.getCookiesList();
|
|
545
549
|
cookies.forEach((item) => {
|
|
546
550
|
item = item.trim();
|
|
547
|
-
|
|
548
|
-
|
|
551
|
+
const itemSplit = item.split("=");
|
|
552
|
+
const itemName = itemSplit[0];
|
|
549
553
|
itemSplit.splice(0, 1);
|
|
550
|
-
|
|
551
|
-
|
|
554
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
555
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
552
556
|
? defaultOption.name
|
|
553
|
-
: new RegExp(
|
|
557
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
554
558
|
if (itemName.match(nameRegexp)) {
|
|
555
559
|
resultData.push({
|
|
556
560
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -584,7 +588,7 @@
|
|
|
584
588
|
if (option == null) {
|
|
585
589
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
586
590
|
}
|
|
587
|
-
|
|
591
|
+
const resultData = [];
|
|
588
592
|
let defaultOption = {
|
|
589
593
|
url: this.windowApi.window.location.href,
|
|
590
594
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -592,16 +596,16 @@
|
|
|
592
596
|
path: "/",
|
|
593
597
|
};
|
|
594
598
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
595
|
-
|
|
599
|
+
const cookies = this.getCookiesList();
|
|
596
600
|
cookies.forEach((item) => {
|
|
597
601
|
item = item.trim();
|
|
598
|
-
|
|
599
|
-
|
|
602
|
+
const itemSplit = item.split("=");
|
|
603
|
+
const itemName = itemSplit[0];
|
|
600
604
|
itemSplit.splice(0, 1);
|
|
601
|
-
|
|
602
|
-
|
|
605
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
606
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
603
607
|
? defaultOption.name
|
|
604
|
-
: new RegExp(
|
|
608
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
605
609
|
if (itemName.match(nameRegexp)) {
|
|
606
610
|
resultData.push({
|
|
607
611
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -641,17 +645,12 @@
|
|
|
641
645
|
expirationDate: Math.floor(Date.now()) + 60 * 60 * 24 * 30,
|
|
642
646
|
};
|
|
643
647
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
644
|
-
|
|
648
|
+
const life = defaultOption.expirationDate
|
|
645
649
|
? defaultOption.expirationDate
|
|
646
650
|
: Math.floor(Date.now()) + 60 * 60 * 24 * 30;
|
|
647
|
-
let cookieStr = defaultOption.name
|
|
648
|
-
"=" +
|
|
649
|
-
decodeURIComponent(defaultOption.value) +
|
|
650
|
-
";expires=" +
|
|
651
|
-
new Date(life).toGMTString() +
|
|
652
|
-
"; path=/";
|
|
651
|
+
let cookieStr = `${defaultOption.name}=${decodeURIComponent(defaultOption.value)};expires=${new Date(life).toGMTString()}; path=/`;
|
|
653
652
|
if (commonUtil.isNull(defaultOption.domain)) {
|
|
654
|
-
cookieStr +=
|
|
653
|
+
cookieStr += `; domain=${defaultOption.domain}`;
|
|
655
654
|
}
|
|
656
655
|
this.windowApi.document.cookie = cookieStr;
|
|
657
656
|
}
|
|
@@ -703,14 +702,14 @@
|
|
|
703
702
|
if (cookieStr.trim() === "") {
|
|
704
703
|
return [];
|
|
705
704
|
}
|
|
706
|
-
|
|
707
|
-
|
|
705
|
+
const cookies = cookieStr.split(";");
|
|
706
|
+
const result = [];
|
|
708
707
|
for (const cookieItem of cookies) {
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
708
|
+
const item = cookieItem.trim();
|
|
709
|
+
const itemSplit = item.split("=");
|
|
710
|
+
const itemName = itemSplit[0];
|
|
712
711
|
itemSplit.splice(0, 1);
|
|
713
|
-
|
|
712
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
714
713
|
result.push({
|
|
715
714
|
key: itemName,
|
|
716
715
|
value: itemValue,
|
|
@@ -720,6 +719,7 @@
|
|
|
720
719
|
}
|
|
721
720
|
}
|
|
722
721
|
|
|
722
|
+
/* eslint-disable */
|
|
723
723
|
// ==UserScript==
|
|
724
724
|
// @name ajaxHooker
|
|
725
725
|
// @author cxxjackie
|
|
@@ -1770,15 +1770,15 @@
|
|
|
1770
1770
|
*/
|
|
1771
1771
|
init() {
|
|
1772
1772
|
for (let index = 0; index < this.$data.data.length; index++) {
|
|
1773
|
-
|
|
1773
|
+
const menuOption = this.$data.data[index]["data"];
|
|
1774
1774
|
menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
|
|
1775
1775
|
if (typeof menuOption.showText !== "function") {
|
|
1776
1776
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1777
1777
|
if (menuEnable) {
|
|
1778
|
-
return this.$emoji.success
|
|
1778
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1779
1779
|
}
|
|
1780
1780
|
else {
|
|
1781
|
-
return this.$emoji.error
|
|
1781
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1782
1782
|
}
|
|
1783
1783
|
};
|
|
1784
1784
|
}
|
|
@@ -1789,7 +1789,7 @@
|
|
|
1789
1789
|
* @param menuOptions 如果存在,使用它
|
|
1790
1790
|
*/
|
|
1791
1791
|
register(menuOptions) {
|
|
1792
|
-
|
|
1792
|
+
const that = this;
|
|
1793
1793
|
if (menuOptions == null) {
|
|
1794
1794
|
throw new TypeError("register菜单数据不能为空");
|
|
1795
1795
|
}
|
|
@@ -1797,9 +1797,9 @@
|
|
|
1797
1797
|
menuOptions = [menuOptions];
|
|
1798
1798
|
}
|
|
1799
1799
|
for (let index = 0; index < menuOptions.length; index++) {
|
|
1800
|
-
|
|
1800
|
+
const cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
|
|
1801
1801
|
const { showText, clickCallBack } = this.handleMenuData(cloneMenuOptionData);
|
|
1802
|
-
|
|
1802
|
+
const menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
|
|
1803
1803
|
menuOptions[index].id = menuId;
|
|
1804
1804
|
cloneMenuOptionData.deleteMenu = function () {
|
|
1805
1805
|
that.context.GM_Api.unregisterMenuCommand(menuId);
|
|
@@ -1813,7 +1813,7 @@
|
|
|
1813
1813
|
* @param {string} key 键
|
|
1814
1814
|
*/
|
|
1815
1815
|
getLocalMenuData(key, defaultValue) {
|
|
1816
|
-
|
|
1816
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1817
1817
|
if (key in localData) {
|
|
1818
1818
|
return localData[key];
|
|
1819
1819
|
}
|
|
@@ -1827,7 +1827,7 @@
|
|
|
1827
1827
|
* @param value 值
|
|
1828
1828
|
*/
|
|
1829
1829
|
setLocalMenuData(key, value) {
|
|
1830
|
-
|
|
1830
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1831
1831
|
localData[key] = value;
|
|
1832
1832
|
this.context.GM_Api.setValue(this.$data.key, localData);
|
|
1833
1833
|
},
|
|
@@ -1840,10 +1840,10 @@
|
|
|
1840
1840
|
if (typeof menuOption.showText !== "function") {
|
|
1841
1841
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1842
1842
|
if (menuEnable) {
|
|
1843
|
-
return this.$emoji.success
|
|
1843
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1844
1844
|
}
|
|
1845
1845
|
else {
|
|
1846
|
-
return this.$emoji.error
|
|
1846
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1847
1847
|
}
|
|
1848
1848
|
};
|
|
1849
1849
|
}
|
|
@@ -1854,12 +1854,12 @@
|
|
|
1854
1854
|
* @param menuOption
|
|
1855
1855
|
*/
|
|
1856
1856
|
handleMenuData(menuOption) {
|
|
1857
|
-
|
|
1858
|
-
|
|
1857
|
+
const that = this;
|
|
1858
|
+
const menuLocalDataItemKey = menuOption.key;
|
|
1859
1859
|
/* 菜单默认开启的状态 */
|
|
1860
|
-
|
|
1860
|
+
const defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
|
|
1861
1861
|
/** 油猴菜单上显示的文本 */
|
|
1862
|
-
|
|
1862
|
+
const showText = menuOption.showText(menuOption.text, defaultEnable);
|
|
1863
1863
|
// const GMMenuOptions = {
|
|
1864
1864
|
// /**
|
|
1865
1865
|
// * 菜单的id
|
|
@@ -1889,7 +1889,7 @@
|
|
|
1889
1889
|
* @param event
|
|
1890
1890
|
*/
|
|
1891
1891
|
function clickCallBack(event) {
|
|
1892
|
-
|
|
1892
|
+
const localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
|
|
1893
1893
|
if (menuOption.isStoreValue) {
|
|
1894
1894
|
that.setLocalMenuData(menuLocalDataItemKey, !localEnable);
|
|
1895
1895
|
}
|
|
@@ -2002,7 +2002,7 @@
|
|
|
2002
2002
|
menuOptionList = [...menuOptionList, options];
|
|
2003
2003
|
}
|
|
2004
2004
|
menuOptionList.forEach((menuOption) => {
|
|
2005
|
-
|
|
2005
|
+
const oldMenuOption = this.MenuHandle.getMenuOption(menuOption.key);
|
|
2006
2006
|
if (oldMenuOption) {
|
|
2007
2007
|
// 覆盖
|
|
2008
2008
|
Object.assign(oldMenuOption, menuOption);
|
|
@@ -2170,42 +2170,42 @@
|
|
|
2170
2170
|
* 在Function原型上添加自定义方法.hook和.unhook
|
|
2171
2171
|
*/
|
|
2172
2172
|
initEnv() {
|
|
2173
|
-
Function.prototype.hook = function (
|
|
2173
|
+
Function.prototype.hook = function (_, hookFunc, context) {
|
|
2174
2174
|
let _context = null; //函数上下文
|
|
2175
2175
|
let _funcName = null; //函数名
|
|
2176
2176
|
_context = context || window;
|
|
2177
2177
|
_funcName = getFuncName(this);
|
|
2178
|
-
_context[
|
|
2178
|
+
_context[`realFunc_${_funcName}`] = this;
|
|
2179
2179
|
if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
|
|
2180
2180
|
console.log("Already has been hooked,unhook first");
|
|
2181
2181
|
return false;
|
|
2182
2182
|
}
|
|
2183
2183
|
function getFuncName(fn) {
|
|
2184
2184
|
// 获取函数名
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2185
|
+
const strFunc = fn.toString();
|
|
2186
|
+
const _regex = /function\s+(\w+)\s*\(/;
|
|
2187
|
+
const patten = strFunc.match(_regex);
|
|
2188
2188
|
if (patten) {
|
|
2189
2189
|
return patten[1];
|
|
2190
2190
|
}
|
|
2191
2191
|
return "";
|
|
2192
2192
|
}
|
|
2193
2193
|
try {
|
|
2194
|
-
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2195
|
-
let args = Array.prototype.slice.call(arguments, 0);
|
|
2196
|
-
let obj = this;
|
|
2197
|
-
hookFunc.apply(obj, args);
|
|
2198
|
-
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2194
|
+
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2195
|
+
let args = Array.prototype.slice.call(arguments, 0);
|
|
2196
|
+
let obj = this;
|
|
2197
|
+
hookFunc.apply(obj, args);
|
|
2198
|
+
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2199
2199
|
};`)(_context, _funcName, hookFunc);
|
|
2200
2200
|
_context[_funcName].prototype.isHooked = true;
|
|
2201
2201
|
return true;
|
|
2202
2202
|
}
|
|
2203
2203
|
catch (e) {
|
|
2204
|
-
console.log("Hook failed,check the params.");
|
|
2204
|
+
console.log("Hook failed,check the params.", e);
|
|
2205
2205
|
return false;
|
|
2206
2206
|
}
|
|
2207
2207
|
};
|
|
2208
|
-
Function.prototype.unhook = function (
|
|
2208
|
+
Function.prototype.unhook = function (_, funcName, context) {
|
|
2209
2209
|
let _context = null;
|
|
2210
2210
|
let _funcName = null;
|
|
2211
2211
|
_context = context || window;
|
|
@@ -2214,8 +2214,8 @@
|
|
|
2214
2214
|
console.log("No function is hooked on");
|
|
2215
2215
|
return false;
|
|
2216
2216
|
}
|
|
2217
|
-
_context[_funcName] = _context[
|
|
2218
|
-
Reflect.deleteProperty(_context,
|
|
2217
|
+
_context[_funcName] = _context[`realFunc${_funcName}`];
|
|
2218
|
+
Reflect.deleteProperty(_context, `realFunc_${_funcName}`);
|
|
2219
2219
|
return true;
|
|
2220
2220
|
};
|
|
2221
2221
|
}
|
|
@@ -2223,10 +2223,10 @@
|
|
|
2223
2223
|
* 删除在Function原型上添加的自定义方法.hook和.unhook
|
|
2224
2224
|
*/
|
|
2225
2225
|
cleanEnv() {
|
|
2226
|
-
if (
|
|
2226
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "hook")) {
|
|
2227
2227
|
Reflect.deleteProperty(Function.prototype, "hook");
|
|
2228
2228
|
}
|
|
2229
|
-
if (
|
|
2229
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "unhook")) {
|
|
2230
2230
|
Reflect.deleteProperty(Function.prototype, "unhook");
|
|
2231
2231
|
}
|
|
2232
2232
|
return true;
|
|
@@ -2242,7 +2242,7 @@
|
|
|
2242
2242
|
}
|
|
2243
2243
|
else {
|
|
2244
2244
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (charStr) {
|
|
2245
|
-
|
|
2245
|
+
const randomValue = (Math.random() * 16) | 0, randomCharValue = charStr === "x" ? randomValue : (randomValue & 0x3) | 0x8;
|
|
2246
2246
|
return randomCharValue.toString(16);
|
|
2247
2247
|
});
|
|
2248
2248
|
}
|
|
@@ -2284,9 +2284,9 @@
|
|
|
2284
2284
|
}
|
|
2285
2285
|
}
|
|
2286
2286
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2287
|
-
|
|
2287
|
+
const item = this.$config.configList[index];
|
|
2288
2288
|
if (typeof item.fn === "function") {
|
|
2289
|
-
|
|
2289
|
+
const result = await item.fn(details);
|
|
2290
2290
|
if (result == null) {
|
|
2291
2291
|
return;
|
|
2292
2292
|
}
|
|
@@ -2299,7 +2299,7 @@
|
|
|
2299
2299
|
*/
|
|
2300
2300
|
add(fn) {
|
|
2301
2301
|
if (typeof fn === "function") {
|
|
2302
|
-
|
|
2302
|
+
const uuid = GenerateUUID();
|
|
2303
2303
|
this.$config.configList.push({
|
|
2304
2304
|
id: uuid,
|
|
2305
2305
|
fn: fn,
|
|
@@ -2316,7 +2316,7 @@
|
|
|
2316
2316
|
*/
|
|
2317
2317
|
delete(id) {
|
|
2318
2318
|
if (typeof id === "string") {
|
|
2319
|
-
|
|
2319
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2320
2320
|
if (findIndex !== -1) {
|
|
2321
2321
|
this.$config.configList.splice(findIndex, 1);
|
|
2322
2322
|
return true;
|
|
@@ -2362,9 +2362,9 @@
|
|
|
2362
2362
|
}
|
|
2363
2363
|
}
|
|
2364
2364
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2365
|
-
|
|
2365
|
+
const item = this.$config.configList[index];
|
|
2366
2366
|
if (typeof item.successFn === "function") {
|
|
2367
|
-
|
|
2367
|
+
const result = await item.successFn(response, details);
|
|
2368
2368
|
if (result == null) {
|
|
2369
2369
|
return;
|
|
2370
2370
|
}
|
|
@@ -2397,9 +2397,9 @@
|
|
|
2397
2397
|
}
|
|
2398
2398
|
}
|
|
2399
2399
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2400
|
-
|
|
2400
|
+
const item = this.$config.configList[index];
|
|
2401
2401
|
if (typeof item.errorFn === "function") {
|
|
2402
|
-
|
|
2402
|
+
const result = await item.errorFn(data);
|
|
2403
2403
|
if (result == null) {
|
|
2404
2404
|
return;
|
|
2405
2405
|
}
|
|
@@ -2411,7 +2411,7 @@
|
|
|
2411
2411
|
* 添加请求前的回调处理配置
|
|
2412
2412
|
*/
|
|
2413
2413
|
add(successFn, errorFn) {
|
|
2414
|
-
|
|
2414
|
+
const id = GenerateUUID();
|
|
2415
2415
|
this.$config.configList.push({
|
|
2416
2416
|
id: id,
|
|
2417
2417
|
successFn: successFn,
|
|
@@ -2425,7 +2425,7 @@
|
|
|
2425
2425
|
*/
|
|
2426
2426
|
delete(id) {
|
|
2427
2427
|
if (typeof id === "string") {
|
|
2428
|
-
|
|
2428
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2429
2429
|
if (findIndex !== -1) {
|
|
2430
2430
|
this.$config.configList.splice(findIndex, 1);
|
|
2431
2431
|
return true;
|
|
@@ -2446,23 +2446,23 @@
|
|
|
2446
2446
|
* 对请求的参数进行合并处理
|
|
2447
2447
|
*/
|
|
2448
2448
|
handleBeforeRequestOptionArgs(...args) {
|
|
2449
|
-
|
|
2449
|
+
const option = {
|
|
2450
2450
|
url: void 0,
|
|
2451
2451
|
};
|
|
2452
2452
|
if (typeof args[0] === "string") {
|
|
2453
2453
|
/* 传入的是url,转为配置 */
|
|
2454
|
-
|
|
2454
|
+
const url = args[0];
|
|
2455
2455
|
option.url = url;
|
|
2456
2456
|
if (typeof args[1] === "object") {
|
|
2457
2457
|
/* 处理第二个参数details */
|
|
2458
|
-
|
|
2458
|
+
const optionArg = args[1];
|
|
2459
2459
|
commonUtil.assign(option, optionArg, true);
|
|
2460
2460
|
option.url = url;
|
|
2461
2461
|
}
|
|
2462
2462
|
}
|
|
2463
2463
|
else {
|
|
2464
2464
|
/* 传入的是配置 */
|
|
2465
|
-
|
|
2465
|
+
const optionArg = args[0];
|
|
2466
2466
|
commonUtil.assign(option, optionArg, true);
|
|
2467
2467
|
}
|
|
2468
2468
|
return option;
|
|
@@ -2475,7 +2475,7 @@
|
|
|
2475
2475
|
* @param reject promise抛出错误回调
|
|
2476
2476
|
*/
|
|
2477
2477
|
getRequestOption(method, userRequestOption, resolve, reject) {
|
|
2478
|
-
|
|
2478
|
+
const that = this;
|
|
2479
2479
|
let url = userRequestOption.url || this.context.#defaultRequestOption.url;
|
|
2480
2480
|
if (typeof url === "string") {
|
|
2481
2481
|
// 去除左右空格
|
|
@@ -2488,7 +2488,7 @@
|
|
|
2488
2488
|
}
|
|
2489
2489
|
}
|
|
2490
2490
|
}
|
|
2491
|
-
|
|
2491
|
+
const requestOption = {
|
|
2492
2492
|
url: url,
|
|
2493
2493
|
method: (method || "GET").toString().toUpperCase().trim(),
|
|
2494
2494
|
timeout: userRequestOption.timeout || this.context.#defaultRequestOption.timeout,
|
|
@@ -2510,9 +2510,12 @@
|
|
|
2510
2510
|
/* 对象使用深拷贝 */
|
|
2511
2511
|
fetchInit: commonUtil.deepClone(this.context.#defaultRequestOption.fetchInit),
|
|
2512
2512
|
allowInterceptConfig: {
|
|
2513
|
-
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2514
|
-
|
|
2515
|
-
|
|
2513
|
+
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2514
|
+
.beforeRequest,
|
|
2515
|
+
afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2516
|
+
.afterResponseSuccess,
|
|
2517
|
+
afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2518
|
+
.afterResponseError,
|
|
2516
2519
|
},
|
|
2517
2520
|
user: userRequestOption.user || this.context.#defaultRequestOption.user,
|
|
2518
2521
|
password: userRequestOption.password || this.context.#defaultRequestOption.password,
|
|
@@ -2540,15 +2543,17 @@
|
|
|
2540
2543
|
};
|
|
2541
2544
|
// 补全allowInterceptConfig参数
|
|
2542
2545
|
if (typeof userRequestOption.allowInterceptConfig === "boolean") {
|
|
2543
|
-
Object.keys(requestOption.allowInterceptConfig)
|
|
2546
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2547
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2544
2548
|
Reflect.set(requestOption.allowInterceptConfig, keyName, userRequestOption.allowInterceptConfig);
|
|
2545
2549
|
});
|
|
2546
2550
|
}
|
|
2547
2551
|
else {
|
|
2548
2552
|
if (typeof userRequestOption.allowInterceptConfig === "object" &&
|
|
2549
2553
|
userRequestOption.allowInterceptConfig != null) {
|
|
2550
|
-
Object.keys(
|
|
2551
|
-
|
|
2554
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2555
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2556
|
+
const value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
|
|
2552
2557
|
if (typeof value === "boolean" &&
|
|
2553
2558
|
Reflect.has(requestOption.allowInterceptConfig, keyName)) {
|
|
2554
2559
|
Reflect.set(requestOption.allowInterceptConfig, keyName, value);
|
|
@@ -2562,7 +2567,8 @@
|
|
|
2562
2567
|
}
|
|
2563
2568
|
if (typeof requestOption.headers === "object") {
|
|
2564
2569
|
if (typeof userRequestOption.headers === "object") {
|
|
2565
|
-
Object.keys(
|
|
2570
|
+
const headerKeys = Object.keys(requestOption.headers);
|
|
2571
|
+
headerKeys.forEach((keyName) => {
|
|
2566
2572
|
if (keyName in requestOption.headers && userRequestOption.headers?.[keyName] == null) {
|
|
2567
2573
|
/* 在默认的header中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2568
2574
|
Reflect.deleteProperty(requestOption.headers, keyName);
|
|
@@ -2580,8 +2586,9 @@
|
|
|
2580
2586
|
if (typeof requestOption.fetchInit === "object") {
|
|
2581
2587
|
/* 使用assign替换且添加 */
|
|
2582
2588
|
if (typeof userRequestOption.fetchInit === "object") {
|
|
2583
|
-
Object.keys(
|
|
2584
|
-
|
|
2589
|
+
const fetchInitKeys = Object.keys(requestOption.fetchInit);
|
|
2590
|
+
fetchInitKeys.forEach((keyName) => {
|
|
2591
|
+
if (keyName in requestOption.fetchInit && Reflect.get(userRequestOption.fetchInit ?? {}, keyName) == null) {
|
|
2585
2592
|
/* 在默认的fetchInit中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2586
2593
|
Reflect.deleteProperty(requestOption.fetchInit, keyName);
|
|
2587
2594
|
}
|
|
@@ -2606,7 +2613,7 @@
|
|
|
2606
2613
|
try {
|
|
2607
2614
|
new URL(requestOption.url);
|
|
2608
2615
|
}
|
|
2609
|
-
catch
|
|
2616
|
+
catch {
|
|
2610
2617
|
if (requestOption.url.startsWith("//")) {
|
|
2611
2618
|
// 补充https:
|
|
2612
2619
|
requestOption.url = globalThis.location.protocol + requestOption.url;
|
|
@@ -2617,7 +2624,7 @@
|
|
|
2617
2624
|
}
|
|
2618
2625
|
else {
|
|
2619
2626
|
// 补充origin+/
|
|
2620
|
-
requestOption.url = globalThis.location.origin
|
|
2627
|
+
requestOption.url = `${globalThis.location.origin}/${requestOption.url}`;
|
|
2621
2628
|
}
|
|
2622
2629
|
}
|
|
2623
2630
|
if (requestOption.fetchInit && !requestOption.fetch) {
|
|
@@ -2627,12 +2634,12 @@
|
|
|
2627
2634
|
// 转换data类型
|
|
2628
2635
|
try {
|
|
2629
2636
|
/** 是否对数据进行处理 */
|
|
2630
|
-
|
|
2637
|
+
const processData = userRequestOption.processData ?? true;
|
|
2631
2638
|
if (requestOption.data != null && processData) {
|
|
2632
|
-
|
|
2639
|
+
const method = requestOption.method;
|
|
2633
2640
|
if (method === "GET" || method === "HEAD") {
|
|
2634
2641
|
// GET类型,data如果有,那么需要转为searchParams
|
|
2635
|
-
|
|
2642
|
+
const urlObj = new URL(requestOption.url);
|
|
2636
2643
|
let urlSearch = "";
|
|
2637
2644
|
let isHandler = false;
|
|
2638
2645
|
if (typeof requestOption.data === "string") {
|
|
@@ -2642,7 +2649,7 @@
|
|
|
2642
2649
|
else if (typeof requestOption.data === "object") {
|
|
2643
2650
|
isHandler = true;
|
|
2644
2651
|
// URLSearchParams参数可以转普通的string:string,包括FormData
|
|
2645
|
-
|
|
2652
|
+
const searchParams = new URLSearchParams(requestOption.data);
|
|
2646
2653
|
urlSearch = searchParams.toString();
|
|
2647
2654
|
}
|
|
2648
2655
|
if (isHandler) {
|
|
@@ -2663,7 +2670,7 @@
|
|
|
2663
2670
|
}
|
|
2664
2671
|
else {
|
|
2665
2672
|
// xxx=xxx&xxx=
|
|
2666
|
-
urlObj.search = urlObj.search
|
|
2673
|
+
urlObj.search = `${urlObj.search}&${urlSearch}`;
|
|
2667
2674
|
}
|
|
2668
2675
|
}
|
|
2669
2676
|
}
|
|
@@ -2671,14 +2678,14 @@
|
|
|
2671
2678
|
}
|
|
2672
2679
|
else if (method === "POST" && requestOption.headers != null) {
|
|
2673
2680
|
// POST类型,data如果是FormData,那么需要转为string
|
|
2674
|
-
|
|
2675
|
-
|
|
2681
|
+
const headersKeyList = Object.keys(requestOption.headers);
|
|
2682
|
+
const ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
|
|
2676
2683
|
return (headerKey.trim().toLowerCase() === "content-type" &&
|
|
2677
2684
|
typeof requestOption.headers[headerKey] === "string");
|
|
2678
2685
|
});
|
|
2679
2686
|
if (ContentTypeIndex !== -1) {
|
|
2680
|
-
|
|
2681
|
-
|
|
2687
|
+
const ContentTypeKey = headersKeyList[ContentTypeIndex];
|
|
2688
|
+
const ContentType = requestOption.headers[ContentTypeKey];
|
|
2682
2689
|
// 设置了Content-Type
|
|
2683
2690
|
if (ContentType.includes("application/json")) {
|
|
2684
2691
|
// application/json
|
|
@@ -2719,10 +2726,10 @@
|
|
|
2719
2726
|
* @param option 请求配置
|
|
2720
2727
|
*/
|
|
2721
2728
|
removeRequestNullOption(option) {
|
|
2722
|
-
Object.keys(option)
|
|
2723
|
-
|
|
2724
|
-
|
|
2725
|
-
|
|
2729
|
+
const optionKeys = Object.keys(option);
|
|
2730
|
+
optionKeys.forEach((keyName) => {
|
|
2731
|
+
const optionValue = option[keyName];
|
|
2732
|
+
if (optionValue == null || (optionValue instanceof Function && commonUtil.isNull(optionValue))) {
|
|
2726
2733
|
Reflect.deleteProperty(option, keyName);
|
|
2727
2734
|
return;
|
|
2728
2735
|
}
|
|
@@ -2740,14 +2747,14 @@
|
|
|
2740
2747
|
/**
|
|
2741
2748
|
* fetch的请求配置
|
|
2742
2749
|
**/
|
|
2743
|
-
|
|
2750
|
+
const fetchRequestOption = {};
|
|
2744
2751
|
if ((option.method === "GET" || option.method === "HEAD") && option.data != null) {
|
|
2745
2752
|
/* GET 或 HEAD 方法的请求不能包含 body 信息 */
|
|
2746
2753
|
Reflect.deleteProperty(option, "data");
|
|
2747
2754
|
}
|
|
2748
2755
|
/* 中止信号控制器 */
|
|
2749
|
-
|
|
2750
|
-
|
|
2756
|
+
const abortController = new AbortController();
|
|
2757
|
+
const signal = abortController.signal;
|
|
2751
2758
|
signal.onabort = () => {
|
|
2752
2759
|
option.onabort({
|
|
2753
2760
|
isFetch: true,
|
|
@@ -2792,10 +2799,10 @@
|
|
|
2792
2799
|
* onabort请求被取消-触发
|
|
2793
2800
|
* @param details 配置
|
|
2794
2801
|
* @param resolve promise回调
|
|
2795
|
-
* @param
|
|
2802
|
+
* @param _reject promise抛出错误回调
|
|
2796
2803
|
* @param argsResult 返回的参数列表
|
|
2797
2804
|
*/
|
|
2798
|
-
async onAbort(details, resolve,
|
|
2805
|
+
async onAbort(details, resolve, _reject, argsResult) {
|
|
2799
2806
|
// console.log(argsResult);
|
|
2800
2807
|
if (typeof details?.onabort === "function") {
|
|
2801
2808
|
details.onabort.apply(this, argsResult);
|
|
@@ -2832,7 +2839,7 @@
|
|
|
2832
2839
|
* @param reject 抛出错误
|
|
2833
2840
|
* @param argsResult 返回的参数列表
|
|
2834
2841
|
*/
|
|
2835
|
-
async onTimeout(details, resolve,
|
|
2842
|
+
async onTimeout(details, resolve, _reject, argsResult) {
|
|
2836
2843
|
// console.log(argsResult);
|
|
2837
2844
|
if (typeof details?.ontimeout === "function") {
|
|
2838
2845
|
// 执行配置中的ontime回调
|
|
@@ -2870,10 +2877,10 @@
|
|
|
2870
2877
|
* onerror请求异常-触发
|
|
2871
2878
|
* @param details 配置
|
|
2872
2879
|
* @param resolve 回调
|
|
2873
|
-
* @param
|
|
2880
|
+
* @param _reject 抛出错误
|
|
2874
2881
|
* @param argsResult 返回的参数列表
|
|
2875
2882
|
*/
|
|
2876
|
-
async onError(details, resolve,
|
|
2883
|
+
async onError(details, resolve, _reject, argsResult) {
|
|
2877
2884
|
// console.log(argsResult);
|
|
2878
2885
|
if (typeof details?.onerror === "function") {
|
|
2879
2886
|
details.onerror.apply(this, argsResult);
|
|
@@ -2907,16 +2914,15 @@
|
|
|
2907
2914
|
* onload加载完毕-触发
|
|
2908
2915
|
* @param details 请求的配置
|
|
2909
2916
|
* @param resolve 回调
|
|
2910
|
-
* @param
|
|
2917
|
+
* @param _reject 抛出错误
|
|
2911
2918
|
* @param argsResult 返回的参数列表
|
|
2912
2919
|
*/
|
|
2913
|
-
async onLoad(details, resolve,
|
|
2920
|
+
async onLoad(details, resolve, _reject, argsResult) {
|
|
2914
2921
|
// console.log(argsResult);
|
|
2915
2922
|
/* X浏览器会因为设置了responseType导致不返回responseText */
|
|
2916
|
-
|
|
2923
|
+
const originResponse = argsResult[0];
|
|
2917
2924
|
/* responseText为空,response不为空的情况 */
|
|
2918
|
-
if (commonUtil.isNull(originResponse["responseText"]) &&
|
|
2919
|
-
commonUtil.isNotNull(originResponse["response"])) {
|
|
2925
|
+
if (commonUtil.isNull(originResponse["responseText"]) && commonUtil.isNotNull(originResponse["response"])) {
|
|
2920
2926
|
if (typeof originResponse["response"] === "object") {
|
|
2921
2927
|
TryCatch().run(() => {
|
|
2922
2928
|
originResponse["responseText"] = JSON.stringify(originResponse["response"]);
|
|
@@ -2931,51 +2937,51 @@
|
|
|
2931
2937
|
typeof originResponse["responseText"] === "string" &&
|
|
2932
2938
|
originResponse["responseText"].trim() !== "") {
|
|
2933
2939
|
/** 原始的请求text */
|
|
2934
|
-
|
|
2940
|
+
const httpxResponseText = originResponse.responseText;
|
|
2935
2941
|
// 自定义个新的response
|
|
2936
2942
|
let httpxResponse = httpxResponseText;
|
|
2937
2943
|
if (details.responseType === "json") {
|
|
2938
2944
|
httpxResponse = commonUtil.toJSON(httpxResponseText);
|
|
2939
2945
|
}
|
|
2940
2946
|
else if (details.responseType === "document") {
|
|
2941
|
-
|
|
2947
|
+
const parser = new DOMParser();
|
|
2942
2948
|
httpxResponse = parser.parseFromString(httpxResponseText, "text/html");
|
|
2943
2949
|
}
|
|
2944
2950
|
else if (details.responseType === "arraybuffer") {
|
|
2945
|
-
|
|
2946
|
-
|
|
2951
|
+
const encoder = new TextEncoder();
|
|
2952
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2947
2953
|
httpxResponse = arrayBuffer;
|
|
2948
2954
|
}
|
|
2949
2955
|
else if (details.responseType === "blob") {
|
|
2950
|
-
|
|
2951
|
-
|
|
2956
|
+
const encoder = new TextEncoder();
|
|
2957
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2952
2958
|
httpxResponse = new Blob([arrayBuffer]);
|
|
2953
2959
|
}
|
|
2954
2960
|
// 尝试覆盖原response
|
|
2955
2961
|
try {
|
|
2956
|
-
|
|
2962
|
+
const setStatus = Reflect.set(originResponse, "response", httpxResponse);
|
|
2957
2963
|
if (!setStatus) {
|
|
2958
2964
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 覆盖原始 response 失败,尝试添加新的httpxResponse");
|
|
2959
2965
|
try {
|
|
2960
2966
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2961
2967
|
}
|
|
2962
|
-
catch
|
|
2968
|
+
catch {
|
|
2963
2969
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2964
2970
|
}
|
|
2965
2971
|
}
|
|
2966
2972
|
}
|
|
2967
|
-
catch
|
|
2973
|
+
catch {
|
|
2968
2974
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 原始 response 无法被覆盖,尝试添加新的httpxResponse");
|
|
2969
2975
|
try {
|
|
2970
2976
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2971
2977
|
}
|
|
2972
|
-
catch
|
|
2978
|
+
catch {
|
|
2973
2979
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2974
2980
|
}
|
|
2975
2981
|
}
|
|
2976
2982
|
}
|
|
2977
2983
|
/* Stay扩展中没有finalUrl,对应的是responseURL */
|
|
2978
|
-
|
|
2984
|
+
const originResponseURL = Reflect.get(originResponse, "responseURL");
|
|
2979
2985
|
if (originResponse["finalUrl"] == null && originResponseURL != null) {
|
|
2980
2986
|
Reflect.set(originResponse, "finalUrl", originResponseURL);
|
|
2981
2987
|
}
|
|
@@ -2995,7 +3001,7 @@
|
|
|
2995
3001
|
});
|
|
2996
3002
|
}
|
|
2997
3003
|
else {
|
|
2998
|
-
this.context.HttpxResponseCallBack.onError(details, resolve,
|
|
3004
|
+
this.context.HttpxResponseCallBack.onError(details, resolve, _reject, argsResult);
|
|
2999
3005
|
}
|
|
3000
3006
|
},
|
|
3001
3007
|
/**
|
|
@@ -3052,7 +3058,7 @@
|
|
|
3052
3058
|
console.log("[Httpx-HttpxRequest.request] 请求前的配置👇", details);
|
|
3053
3059
|
}
|
|
3054
3060
|
if (typeof this.context.HttpxRequestHook.beforeRequestCallBack === "function") {
|
|
3055
|
-
|
|
3061
|
+
const hookResult = await this.context.HttpxRequestHook.beforeRequestCallBack(details);
|
|
3056
3062
|
if (hookResult == null) {
|
|
3057
3063
|
return;
|
|
3058
3064
|
}
|
|
@@ -3084,7 +3090,7 @@
|
|
|
3084
3090
|
fetch(option.url, fetchRequestOption)
|
|
3085
3091
|
.then(async (fetchResponse) => {
|
|
3086
3092
|
/** 自定义的response */
|
|
3087
|
-
|
|
3093
|
+
const httpxResponse = {
|
|
3088
3094
|
isFetch: true,
|
|
3089
3095
|
finalUrl: fetchResponse.url,
|
|
3090
3096
|
readyState: 4,
|
|
@@ -3099,9 +3105,9 @@
|
|
|
3099
3105
|
};
|
|
3100
3106
|
Object.assign(httpxResponse, option.context || {});
|
|
3101
3107
|
// 把headers转为字符串
|
|
3102
|
-
|
|
3108
|
+
fetchResponse.headers.forEach((value, key) => {
|
|
3103
3109
|
httpxResponse.responseHeaders += `${key}: ${value}\n`;
|
|
3104
|
-
}
|
|
3110
|
+
});
|
|
3105
3111
|
/** 请求返回的类型 */
|
|
3106
3112
|
const fetchResponseType = fetchResponse.headers.get("Content-Type");
|
|
3107
3113
|
/* 如果需要stream,且获取到的是stream,那直接返回 */
|
|
@@ -3122,11 +3128,11 @@
|
|
|
3122
3128
|
/** 响应xml文档 */
|
|
3123
3129
|
let responseXML = "";
|
|
3124
3130
|
/** 先获取二进制数据 */
|
|
3125
|
-
|
|
3131
|
+
const arrayBuffer = await fetchResponse.arrayBuffer();
|
|
3126
3132
|
/** 数据编码 */
|
|
3127
3133
|
let encoding = "utf-8";
|
|
3128
3134
|
if (fetchResponse.headers.has("Content-Type")) {
|
|
3129
|
-
|
|
3135
|
+
const charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
|
|
3130
3136
|
if (charsetMatched) {
|
|
3131
3137
|
encoding = charsetMatched[1];
|
|
3132
3138
|
encoding = encoding.toLowerCase();
|
|
@@ -3136,7 +3142,7 @@
|
|
|
3136
3142
|
// 去除引号
|
|
3137
3143
|
encoding = encoding.replace(/('|")/gi, "");
|
|
3138
3144
|
// 编码
|
|
3139
|
-
|
|
3145
|
+
const textDecoder = new TextDecoder(encoding);
|
|
3140
3146
|
responseText = textDecoder.decode(arrayBuffer);
|
|
3141
3147
|
response = responseText;
|
|
3142
3148
|
if (option.responseType === "arraybuffer") {
|
|
@@ -3154,11 +3160,11 @@
|
|
|
3154
3160
|
}
|
|
3155
3161
|
else if (option.responseType === "document" || option.responseType == null) {
|
|
3156
3162
|
// response返回格式是文档格式
|
|
3157
|
-
|
|
3163
|
+
const parser = new DOMParser();
|
|
3158
3164
|
response = parser.parseFromString(responseText, "text/html");
|
|
3159
3165
|
}
|
|
3160
3166
|
// 转为XML结构
|
|
3161
|
-
|
|
3167
|
+
const parser = new DOMParser();
|
|
3162
3168
|
responseXML = parser.parseFromString(responseText, "text/xml");
|
|
3163
3169
|
httpxResponse.response = response;
|
|
3164
3170
|
httpxResponse.responseText = responseText;
|
|
@@ -3232,6 +3238,9 @@
|
|
|
3232
3238
|
onreadystatechange() { },
|
|
3233
3239
|
onprogress() { },
|
|
3234
3240
|
};
|
|
3241
|
+
/**
|
|
3242
|
+
* 实例化的默认配置
|
|
3243
|
+
*/
|
|
3235
3244
|
#defaultInitOption = {
|
|
3236
3245
|
/**
|
|
3237
3246
|
* `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
|
|
@@ -3347,7 +3356,7 @@
|
|
|
3347
3356
|
* @param details 配置
|
|
3348
3357
|
*/
|
|
3349
3358
|
get(...args) {
|
|
3350
|
-
|
|
3359
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3351
3360
|
useRequestOption.method = "GET";
|
|
3352
3361
|
return this.request(useRequestOption, (option) => {
|
|
3353
3362
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3357,7 +3366,7 @@
|
|
|
3357
3366
|
* POST 请求
|
|
3358
3367
|
*/
|
|
3359
3368
|
post(...args) {
|
|
3360
|
-
|
|
3369
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3361
3370
|
useRequestOption.method = "POST";
|
|
3362
3371
|
return this.request(useRequestOption);
|
|
3363
3372
|
}
|
|
@@ -3365,7 +3374,7 @@
|
|
|
3365
3374
|
* HEAD 请求
|
|
3366
3375
|
*/
|
|
3367
3376
|
head(...args) {
|
|
3368
|
-
|
|
3377
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3369
3378
|
useRequestOption.method = "HEAD";
|
|
3370
3379
|
return this.request(useRequestOption, (option) => {
|
|
3371
3380
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3375,7 +3384,7 @@
|
|
|
3375
3384
|
* OPTIONS 请求
|
|
3376
3385
|
*/
|
|
3377
3386
|
options(...args) {
|
|
3378
|
-
|
|
3387
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3379
3388
|
useRequestOption.method = "OPTIONS";
|
|
3380
3389
|
return this.request(useRequestOption, (option) => {
|
|
3381
3390
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3385,7 +3394,7 @@
|
|
|
3385
3394
|
* DELETE 请求
|
|
3386
3395
|
*/
|
|
3387
3396
|
delete(...args) {
|
|
3388
|
-
|
|
3397
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3389
3398
|
useRequestOption.method = "DELETE";
|
|
3390
3399
|
return this.request(useRequestOption, (option) => {
|
|
3391
3400
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3395,7 +3404,7 @@
|
|
|
3395
3404
|
* PUT 请求
|
|
3396
3405
|
*/
|
|
3397
3406
|
put(...args) {
|
|
3398
|
-
|
|
3407
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3399
3408
|
userRequestOption.method = "PUT";
|
|
3400
3409
|
return this.request(userRequestOption);
|
|
3401
3410
|
}
|
|
@@ -3405,18 +3414,30 @@
|
|
|
3405
3414
|
* @param beforeRequestOption 处理请求前的配置
|
|
3406
3415
|
*/
|
|
3407
3416
|
request(details, beforeRequestOption) {
|
|
3408
|
-
|
|
3409
|
-
|
|
3417
|
+
// 对请求的参数进行合并处理
|
|
3418
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
|
|
3419
|
+
/**
|
|
3420
|
+
* 取消请求
|
|
3421
|
+
*/
|
|
3410
3422
|
let abortFn = null;
|
|
3411
|
-
|
|
3412
|
-
|
|
3423
|
+
const promise = new globalThis.Promise(async (resolve, reject) => {
|
|
3424
|
+
// 请求配置
|
|
3425
|
+
let requestOption = this.HttpxRequestOption.getRequestOption(userRequestOption.method, userRequestOption, (resultOption) => {
|
|
3426
|
+
resolve(resultOption);
|
|
3427
|
+
}, (...args) => {
|
|
3428
|
+
reject(...args);
|
|
3429
|
+
});
|
|
3430
|
+
requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
|
|
3413
3431
|
if (typeof beforeRequestOption === "function") {
|
|
3414
3432
|
beforeRequestOption(requestOption);
|
|
3415
3433
|
}
|
|
3416
|
-
|
|
3434
|
+
// 处理重试逻辑
|
|
3417
3435
|
const requestResult = await this.HttpxRequest.request(requestOption);
|
|
3418
3436
|
if (requestResult != null && typeof requestResult.abort === "function") {
|
|
3419
|
-
abortFn =
|
|
3437
|
+
abortFn = () => {
|
|
3438
|
+
// 取消请求
|
|
3439
|
+
requestResult.abort();
|
|
3440
|
+
};
|
|
3420
3441
|
}
|
|
3421
3442
|
});
|
|
3422
3443
|
promise.abort = () => {
|
|
@@ -3435,10 +3456,7 @@
|
|
|
3435
3456
|
/* websql的版本号,由于ios的问题,版本号的写法不一样 */
|
|
3436
3457
|
// #slqVersion = "1";
|
|
3437
3458
|
/* 监听IndexDB */
|
|
3438
|
-
#indexedDB =
|
|
3439
|
-
window.mozIndexedDB ||
|
|
3440
|
-
window.webkitIndexedDB ||
|
|
3441
|
-
window.msIndexedDB;
|
|
3459
|
+
#indexedDB = globalThis.indexedDB || globalThis.mozIndexedDB || globalThis.webkitIndexedDB || globalThis.msIndexedDB;
|
|
3442
3460
|
/* 缓存数据库,避免同一个页面重复创建和销毁 */
|
|
3443
3461
|
#db = {};
|
|
3444
3462
|
// #store: IDBObjectStore = null as any;
|
|
@@ -3473,7 +3491,7 @@
|
|
|
3473
3491
|
this.#storeName = storeName;
|
|
3474
3492
|
this.#dbVersion = dbVersion;
|
|
3475
3493
|
if (!this.#indexedDB) {
|
|
3476
|
-
alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3494
|
+
window.alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3477
3495
|
throw new TypeError("很抱歉,您的浏览器不支持indexedDB");
|
|
3478
3496
|
}
|
|
3479
3497
|
}
|
|
@@ -3482,10 +3500,9 @@
|
|
|
3482
3500
|
* @param dbName 表名
|
|
3483
3501
|
*/
|
|
3484
3502
|
createStore(dbName) {
|
|
3485
|
-
|
|
3486
|
-
txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3503
|
+
const txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3487
3504
|
/* IndexDB的读写权限 */
|
|
3488
|
-
store = txn.objectStore(this.#storeName);
|
|
3505
|
+
const store = txn.objectStore(this.#storeName);
|
|
3489
3506
|
// this.#store = store;
|
|
3490
3507
|
return store;
|
|
3491
3508
|
}
|
|
@@ -3495,12 +3512,12 @@
|
|
|
3495
3512
|
* @param dbName 数据库名
|
|
3496
3513
|
*/
|
|
3497
3514
|
open(callback, dbName) {
|
|
3498
|
-
|
|
3515
|
+
const that = this;
|
|
3499
3516
|
/* 打开数据库 */
|
|
3500
3517
|
/* 如果支持IndexDB */
|
|
3501
3518
|
if (!that.#db[dbName]) {
|
|
3502
3519
|
/* 如果缓存中没有,则进行数据库的创建或打开,提高效率 */
|
|
3503
|
-
|
|
3520
|
+
const request = that.#indexedDB.open(dbName, that.#dbVersion);
|
|
3504
3521
|
request.onerror = function (event) {
|
|
3505
3522
|
callback(null, {
|
|
3506
3523
|
code: that.#statusCode.openFailed.code,
|
|
@@ -3510,26 +3527,26 @@
|
|
|
3510
3527
|
};
|
|
3511
3528
|
request.onsuccess = function (event) {
|
|
3512
3529
|
if (!that.#db[dbName]) {
|
|
3513
|
-
|
|
3530
|
+
const target = event.target;
|
|
3514
3531
|
that.#db[dbName] = target.result;
|
|
3515
3532
|
}
|
|
3516
|
-
|
|
3533
|
+
const store = that.createStore(dbName);
|
|
3517
3534
|
callback(store);
|
|
3518
3535
|
};
|
|
3519
3536
|
request.onupgradeneeded = function (event) {
|
|
3520
|
-
|
|
3537
|
+
const target = event.target;
|
|
3521
3538
|
that.#db[dbName] = target.result;
|
|
3522
|
-
|
|
3539
|
+
const store = that.#db[dbName].createObjectStore(that.#storeName, {
|
|
3523
3540
|
keyPath: "key",
|
|
3524
3541
|
});
|
|
3525
|
-
store.transaction.oncomplete = function (
|
|
3542
|
+
store.transaction.oncomplete = function () {
|
|
3526
3543
|
callback(store);
|
|
3527
3544
|
};
|
|
3528
3545
|
};
|
|
3529
3546
|
}
|
|
3530
3547
|
else {
|
|
3531
3548
|
/* 如果缓存中已经打开了数据库,就直接使用 */
|
|
3532
|
-
|
|
3549
|
+
const store = this.createStore(dbName);
|
|
3533
3550
|
callback(store);
|
|
3534
3551
|
}
|
|
3535
3552
|
}
|
|
@@ -3539,10 +3556,10 @@
|
|
|
3539
3556
|
* @param value 数据值
|
|
3540
3557
|
*/
|
|
3541
3558
|
async save(key, value) {
|
|
3542
|
-
|
|
3559
|
+
const that = this;
|
|
3543
3560
|
return new Promise((resolve) => {
|
|
3544
|
-
|
|
3545
|
-
|
|
3561
|
+
const dbName = this.#dbName;
|
|
3562
|
+
const inData = {
|
|
3546
3563
|
key: key,
|
|
3547
3564
|
value: value,
|
|
3548
3565
|
};
|
|
@@ -3555,7 +3572,7 @@
|
|
|
3555
3572
|
});
|
|
3556
3573
|
}
|
|
3557
3574
|
else {
|
|
3558
|
-
|
|
3575
|
+
const request = idbStore.put(inData);
|
|
3559
3576
|
request.onsuccess = function (event) {
|
|
3560
3577
|
/* 保存成功有success 字段 */
|
|
3561
3578
|
resolve({
|
|
@@ -3582,9 +3599,9 @@
|
|
|
3582
3599
|
* @param key 数据key
|
|
3583
3600
|
*/
|
|
3584
3601
|
async has(key) {
|
|
3585
|
-
|
|
3602
|
+
const that = this;
|
|
3586
3603
|
return new Promise((resolve) => {
|
|
3587
|
-
|
|
3604
|
+
const dbName = this.#dbName;
|
|
3588
3605
|
this.open(function (idbStore) {
|
|
3589
3606
|
/* 判断返回的数据中是否有error字段 */
|
|
3590
3607
|
if (idbStore == null) {
|
|
@@ -3595,7 +3612,7 @@
|
|
|
3595
3612
|
});
|
|
3596
3613
|
}
|
|
3597
3614
|
else {
|
|
3598
|
-
|
|
3615
|
+
const request = idbStore.get(key);
|
|
3599
3616
|
request.onsuccess = function (event) {
|
|
3600
3617
|
/* result 返回的是 {key: string, value: any} */
|
|
3601
3618
|
/* 键值对存储 */
|
|
@@ -3623,9 +3640,9 @@
|
|
|
3623
3640
|
* @param key 数据key
|
|
3624
3641
|
*/
|
|
3625
3642
|
async get(key) {
|
|
3626
|
-
|
|
3643
|
+
const that = this;
|
|
3627
3644
|
return new Promise((resolve) => {
|
|
3628
|
-
|
|
3645
|
+
const dbName = this.#dbName;
|
|
3629
3646
|
this.open(function (idbStore) {
|
|
3630
3647
|
/* 判断返回的数据中是否有error字段 */
|
|
3631
3648
|
if (idbStore == null) {
|
|
@@ -3637,13 +3654,13 @@
|
|
|
3637
3654
|
});
|
|
3638
3655
|
}
|
|
3639
3656
|
else {
|
|
3640
|
-
|
|
3657
|
+
const request = idbStore.get(key);
|
|
3641
3658
|
request.onsuccess = function (event) {
|
|
3642
|
-
|
|
3643
|
-
|
|
3659
|
+
const target = event.target;
|
|
3660
|
+
const result = target.result;
|
|
3644
3661
|
/* result 返回的是 {key: string, value: any} */
|
|
3645
3662
|
/* 键值对存储 */
|
|
3646
|
-
|
|
3663
|
+
const data = result ? result.value : void 0;
|
|
3647
3664
|
if (data == null) {
|
|
3648
3665
|
resolve({
|
|
3649
3666
|
success: true,
|
|
@@ -3684,10 +3701,10 @@
|
|
|
3684
3701
|
*/
|
|
3685
3702
|
async regexpGet(key) {
|
|
3686
3703
|
let list = [];
|
|
3687
|
-
|
|
3704
|
+
const that = this;
|
|
3688
3705
|
return new Promise((resolve) => {
|
|
3689
3706
|
/* 正则查询 */
|
|
3690
|
-
|
|
3707
|
+
const dbName = that.#dbName;
|
|
3691
3708
|
this.open(function (idbStore) {
|
|
3692
3709
|
/* 判断返回的数据中是否有error字段 */
|
|
3693
3710
|
if (idbStore == null) {
|
|
@@ -3699,16 +3716,16 @@
|
|
|
3699
3716
|
});
|
|
3700
3717
|
}
|
|
3701
3718
|
else {
|
|
3702
|
-
|
|
3719
|
+
const request = idbStore.getAll();
|
|
3703
3720
|
request.onsuccess = function (event) {
|
|
3704
|
-
|
|
3705
|
-
|
|
3721
|
+
const target = event.target;
|
|
3722
|
+
const result = target.result;
|
|
3706
3723
|
if (result.length !== 0) {
|
|
3707
|
-
result.forEach((dataItem
|
|
3724
|
+
result.forEach((dataItem) => {
|
|
3708
3725
|
// 当前项的key
|
|
3709
|
-
|
|
3726
|
+
const __key = dataItem["key"];
|
|
3710
3727
|
// 当前项的value
|
|
3711
|
-
|
|
3728
|
+
const __value = dataItem["value"];
|
|
3712
3729
|
if (__key.match(key)) {
|
|
3713
3730
|
list = list.concat(__value);
|
|
3714
3731
|
}
|
|
@@ -3740,10 +3757,10 @@
|
|
|
3740
3757
|
* @param key 数据key
|
|
3741
3758
|
*/
|
|
3742
3759
|
async delete(key) {
|
|
3743
|
-
|
|
3760
|
+
const that = this;
|
|
3744
3761
|
return new Promise((resolve) => {
|
|
3745
3762
|
/* 根据key删除某条数据 */
|
|
3746
|
-
|
|
3763
|
+
const dbName = that.#dbName;
|
|
3747
3764
|
this.open(function (idbStore) {
|
|
3748
3765
|
if (idbStore == null) {
|
|
3749
3766
|
resolve({
|
|
@@ -3754,7 +3771,7 @@
|
|
|
3754
3771
|
}
|
|
3755
3772
|
else {
|
|
3756
3773
|
// 删除键
|
|
3757
|
-
|
|
3774
|
+
const request = idbStore.delete(key);
|
|
3758
3775
|
request.onsuccess = function (event) {
|
|
3759
3776
|
resolve({
|
|
3760
3777
|
success: true,
|
|
@@ -3779,10 +3796,10 @@
|
|
|
3779
3796
|
* 删除所有数据
|
|
3780
3797
|
*/
|
|
3781
3798
|
async deleteAll() {
|
|
3782
|
-
|
|
3799
|
+
const that = this;
|
|
3783
3800
|
return new Promise((resolve) => {
|
|
3784
3801
|
/* 清空数据库 */
|
|
3785
|
-
|
|
3802
|
+
const dbName = that.#dbName;
|
|
3786
3803
|
this.open(function (idbStore) {
|
|
3787
3804
|
if (idbStore == null) {
|
|
3788
3805
|
resolve({
|
|
@@ -3793,7 +3810,7 @@
|
|
|
3793
3810
|
}
|
|
3794
3811
|
else {
|
|
3795
3812
|
// 清空
|
|
3796
|
-
|
|
3813
|
+
const operateResult = idbStore.clear();
|
|
3797
3814
|
operateResult.onsuccess = function (event) {
|
|
3798
3815
|
resolve({
|
|
3799
3816
|
success: true,
|
|
@@ -3826,7 +3843,7 @@
|
|
|
3826
3843
|
run;
|
|
3827
3844
|
isLock;
|
|
3828
3845
|
constructor(callback, context, delayTime) {
|
|
3829
|
-
|
|
3846
|
+
const that = this;
|
|
3830
3847
|
this.#callback = callback;
|
|
3831
3848
|
if (typeof context === "number") {
|
|
3832
3849
|
this.#delayTime = context;
|
|
@@ -3916,14 +3933,14 @@
|
|
|
3916
3933
|
* @param stack
|
|
3917
3934
|
*/
|
|
3918
3935
|
parseErrorStack(stack) {
|
|
3919
|
-
|
|
3936
|
+
const result = {
|
|
3920
3937
|
name: "",
|
|
3921
3938
|
position: "",
|
|
3922
3939
|
};
|
|
3923
3940
|
for (let stackString of stack) {
|
|
3924
3941
|
stackString = stackString.trim();
|
|
3925
|
-
|
|
3926
|
-
|
|
3942
|
+
const stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
|
|
3943
|
+
const stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
|
|
3927
3944
|
if (stackFunctionNameMatch == null) {
|
|
3928
3945
|
continue;
|
|
3929
3946
|
}
|
|
@@ -3931,8 +3948,8 @@
|
|
|
3931
3948
|
continue;
|
|
3932
3949
|
}
|
|
3933
3950
|
/* 获取最后一个,因为第一个是包含了at */
|
|
3934
|
-
|
|
3935
|
-
|
|
3951
|
+
const stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
|
|
3952
|
+
const stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
|
|
3936
3953
|
if (stackFunctionName === "" ||
|
|
3937
3954
|
stackFunctionName.match(/^(Utils\.|)Log(\.|)|.<anonymous>$|^Function.each|^NodeList.forEach|^k.fn.init.each/g)) {
|
|
3938
3955
|
continue;
|
|
@@ -3944,9 +3961,9 @@
|
|
|
3944
3961
|
}
|
|
3945
3962
|
}
|
|
3946
3963
|
if (result.position === "") {
|
|
3947
|
-
|
|
3964
|
+
const lastStackString = stack[stack.length - 1].trim();
|
|
3948
3965
|
if (lastStackString.startsWith("at chrome-extension://")) {
|
|
3949
|
-
|
|
3966
|
+
const lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
|
|
3950
3967
|
if (lastStackMatch) {
|
|
3951
3968
|
result.position = lastStackMatch[lastStackMatch.length - 1];
|
|
3952
3969
|
}
|
|
@@ -3976,16 +3993,18 @@
|
|
|
3976
3993
|
printContent(msg, color, otherStyle) {
|
|
3977
3994
|
this.checkClearConsole();
|
|
3978
3995
|
otherStyle = otherStyle || "";
|
|
3979
|
-
|
|
3996
|
+
const stackSplit = new Error().stack.split("\n");
|
|
3980
3997
|
stackSplit.splice(0, 2);
|
|
3981
|
-
|
|
3982
|
-
|
|
3983
|
-
|
|
3998
|
+
const { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
|
|
3999
|
+
const tagName = this.tag;
|
|
4000
|
+
const that = this;
|
|
3984
4001
|
/** tag的html输出格式 */
|
|
3985
|
-
|
|
4002
|
+
const tagNameHTML = `%c[${tagName}%c`;
|
|
3986
4003
|
/** 调用的函数名的html输出格式 */
|
|
3987
4004
|
let callerNameHTML = `%c${callerName}%c]%c`;
|
|
3988
|
-
callerName.trim()
|
|
4005
|
+
if (callerName.trim() === "") {
|
|
4006
|
+
callerNameHTML = `-${callerNameHTML}`;
|
|
4007
|
+
}
|
|
3989
4008
|
/**
|
|
3990
4009
|
* 输出消息到控制台
|
|
3991
4010
|
* @param message
|
|
@@ -4071,14 +4090,14 @@
|
|
|
4071
4090
|
if (this.#disable)
|
|
4072
4091
|
return;
|
|
4073
4092
|
this.checkClearConsole();
|
|
4074
|
-
|
|
4093
|
+
const stack = new Error().stack.split("\n");
|
|
4075
4094
|
stack.splice(0, 1);
|
|
4076
|
-
|
|
4095
|
+
const errorStackParse = this.parseErrorStack(stack);
|
|
4077
4096
|
/** 堆栈函数名 */
|
|
4078
|
-
|
|
4097
|
+
const stackFunctionName = errorStackParse.name;
|
|
4079
4098
|
/** 堆栈位置 */
|
|
4080
|
-
|
|
4081
|
-
|
|
4099
|
+
const stackFunctionNamePosition = errorStackParse.position;
|
|
4100
|
+
const callerName = stackFunctionName;
|
|
4082
4101
|
this.#console.log(`%c[${this.tag}%c-%c${callerName}%c]%c`, ...this.#msgColorDetails, `color: ${this.#details.infoColor};`);
|
|
4083
4102
|
this.#console.table(msg);
|
|
4084
4103
|
if (this.#details.debug) {
|
|
@@ -4141,9 +4160,9 @@
|
|
|
4141
4160
|
*/
|
|
4142
4161
|
circleRadius: 50,
|
|
4143
4162
|
};
|
|
4144
|
-
#ctx
|
|
4145
|
-
#width
|
|
4146
|
-
#height
|
|
4163
|
+
#ctx;
|
|
4164
|
+
#width;
|
|
4165
|
+
#height;
|
|
4147
4166
|
/**
|
|
4148
4167
|
*
|
|
4149
4168
|
* @param paramConfig 配置信息
|
|
@@ -4153,14 +4172,8 @@
|
|
|
4153
4172
|
if (!(this.#config.canvasNode instanceof HTMLCanvasElement)) {
|
|
4154
4173
|
throw new Error("Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement");
|
|
4155
4174
|
}
|
|
4156
|
-
this.init();
|
|
4157
|
-
}
|
|
4158
|
-
/**
|
|
4159
|
-
* 初始化
|
|
4160
|
-
*/
|
|
4161
|
-
init() {
|
|
4162
4175
|
/* 获取画笔 */
|
|
4163
|
-
|
|
4176
|
+
const ctx = this.#config.canvasNode.getContext("2d");
|
|
4164
4177
|
if (ctx == null) {
|
|
4165
4178
|
throw new Error("Utils.Progress 获取画笔失败");
|
|
4166
4179
|
}
|
|
@@ -4171,8 +4184,8 @@
|
|
|
4171
4184
|
this.#height = this.#config.canvasNode.height;
|
|
4172
4185
|
/* 清除锯齿 */
|
|
4173
4186
|
if (window.devicePixelRatio) {
|
|
4174
|
-
this.#config.canvasNode.style.width = this.#width
|
|
4175
|
-
this.#config.canvasNode.style.height = this.#height
|
|
4187
|
+
this.#config.canvasNode.style.width = `${this.#width}px`;
|
|
4188
|
+
this.#config.canvasNode.style.height = `${this.#height}px`;
|
|
4176
4189
|
this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
|
|
4177
4190
|
this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
|
|
4178
4191
|
this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
|
|
@@ -4184,7 +4197,7 @@
|
|
|
4184
4197
|
* 绘制
|
|
4185
4198
|
*/
|
|
4186
4199
|
draw() {
|
|
4187
|
-
|
|
4200
|
+
const degActive = (this.#config.progress * 360) / 100;
|
|
4188
4201
|
/* 清除画布 */
|
|
4189
4202
|
this.#ctx.clearRect(0, 0, this.#width, this.#height);
|
|
4190
4203
|
/* 开始绘制底圆 */
|
|
@@ -4198,11 +4211,11 @@
|
|
|
4198
4211
|
this.#ctx.strokeStyle = this.#config.lineColor;
|
|
4199
4212
|
this.#ctx.stroke();
|
|
4200
4213
|
/* 获取百分比 */
|
|
4201
|
-
|
|
4202
|
-
this.#ctx.font = this.#config.fontSize
|
|
4214
|
+
const txt = `${parseInt(this.#config.progress.toString())}%`;
|
|
4215
|
+
this.#ctx.font = `${this.#config.fontSize}px SimHei`;
|
|
4203
4216
|
/* 获取文本宽度 */
|
|
4204
|
-
|
|
4205
|
-
|
|
4217
|
+
const w = this.#ctx.measureText(txt).width;
|
|
4218
|
+
const h = this.#config.fontSize / 2;
|
|
4206
4219
|
this.#ctx.fillStyle = this.#config.textColor;
|
|
4207
4220
|
this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h / 2);
|
|
4208
4221
|
}
|
|
@@ -4226,9 +4239,9 @@
|
|
|
4226
4239
|
* 迭代器
|
|
4227
4240
|
*/
|
|
4228
4241
|
get entries() {
|
|
4229
|
-
|
|
4242
|
+
const that = this;
|
|
4230
4243
|
return function* () {
|
|
4231
|
-
|
|
4244
|
+
const itemKeys = Object.keys(that.getItems());
|
|
4232
4245
|
for (const keyName of itemKeys) {
|
|
4233
4246
|
yield [keyName, that.get(keyName)];
|
|
4234
4247
|
}
|
|
@@ -4238,9 +4251,8 @@
|
|
|
4238
4251
|
* 是否可遍历
|
|
4239
4252
|
*/
|
|
4240
4253
|
get [Symbol.iterator]() {
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
return that.entries();
|
|
4254
|
+
return () => {
|
|
4255
|
+
return this.entries();
|
|
4244
4256
|
};
|
|
4245
4257
|
}
|
|
4246
4258
|
/**
|
|
@@ -4327,7 +4339,7 @@
|
|
|
4327
4339
|
* @param callbackfn 回调函数
|
|
4328
4340
|
*/
|
|
4329
4341
|
forEach(callbackfn) {
|
|
4330
|
-
this.items.forEach((value, key
|
|
4342
|
+
this.items.forEach((value, key) => {
|
|
4331
4343
|
callbackfn(value, key, this);
|
|
4332
4344
|
});
|
|
4333
4345
|
}
|
|
@@ -4419,6 +4431,7 @@
|
|
|
4419
4431
|
}
|
|
4420
4432
|
}
|
|
4421
4433
|
|
|
4434
|
+
// @ts-nocheck
|
|
4422
4435
|
const VueUtils = {
|
|
4423
4436
|
/** 标签 */
|
|
4424
4437
|
ReactiveFlags: {
|
|
@@ -4457,10 +4470,10 @@
|
|
|
4457
4470
|
deps = [];
|
|
4458
4471
|
active = true;
|
|
4459
4472
|
fn;
|
|
4460
|
-
|
|
4473
|
+
scheduler;
|
|
4461
4474
|
constructor(fn, scheduler) {
|
|
4462
4475
|
this.fn = fn;
|
|
4463
|
-
|
|
4476
|
+
this.scheduler = scheduler;
|
|
4464
4477
|
}
|
|
4465
4478
|
run(cb) {
|
|
4466
4479
|
if (!this.active) {
|
|
@@ -4532,7 +4545,7 @@
|
|
|
4532
4545
|
if (VueUtils.isReactive(target)) {
|
|
4533
4546
|
return target;
|
|
4534
4547
|
}
|
|
4535
|
-
|
|
4548
|
+
const exisProxy = this.reactMap.get(target);
|
|
4536
4549
|
if (exisProxy) {
|
|
4537
4550
|
return exisProxy;
|
|
4538
4551
|
}
|
|
@@ -4545,8 +4558,8 @@
|
|
|
4545
4558
|
return Reflect.get(target, key, receiver);
|
|
4546
4559
|
},
|
|
4547
4560
|
set(target, key, value, receiver) {
|
|
4548
|
-
|
|
4549
|
-
|
|
4561
|
+
const oldValue = target[key];
|
|
4562
|
+
const result = Reflect.set(target, key, value, receiver);
|
|
4550
4563
|
if (oldValue !== value) {
|
|
4551
4564
|
that.trigger(target, "set", key, oldValue, value);
|
|
4552
4565
|
}
|
|
@@ -4596,11 +4609,12 @@
|
|
|
4596
4609
|
}
|
|
4597
4610
|
toRefs(object) {
|
|
4598
4611
|
const result = VueUtils.isArray(object) ? new Array(object.length) : {};
|
|
4599
|
-
for (
|
|
4612
|
+
for (const key in object) {
|
|
4600
4613
|
result[key] = this.toRef(object, key);
|
|
4601
4614
|
}
|
|
4602
4615
|
return result;
|
|
4603
4616
|
}
|
|
4617
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4604
4618
|
trigger(target, type, key, oldValue, value) {
|
|
4605
4619
|
const depsMap = this.targetMap.get(target);
|
|
4606
4620
|
if (!depsMap)
|
|
@@ -4608,8 +4622,9 @@
|
|
|
4608
4622
|
const effects = depsMap.get(key);
|
|
4609
4623
|
this.triggerEffect(effects, "effects");
|
|
4610
4624
|
}
|
|
4625
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4611
4626
|
triggerEffect(effects, name) {
|
|
4612
|
-
effects
|
|
4627
|
+
if (effects) {
|
|
4613
4628
|
effects.forEach((effect) => {
|
|
4614
4629
|
if (effect.scheduler) {
|
|
4615
4630
|
effect.scheduler();
|
|
@@ -4618,6 +4633,7 @@
|
|
|
4618
4633
|
effect.run();
|
|
4619
4634
|
}
|
|
4620
4635
|
});
|
|
4636
|
+
}
|
|
4621
4637
|
}
|
|
4622
4638
|
track(target, type, key) {
|
|
4623
4639
|
if (!this.activeEffect)
|
|
@@ -4634,7 +4650,7 @@
|
|
|
4634
4650
|
}
|
|
4635
4651
|
trackEffect(dep) {
|
|
4636
4652
|
if (this.activeEffect) {
|
|
4637
|
-
|
|
4653
|
+
const shouldTrack = !dep.has(this.activeEffect);
|
|
4638
4654
|
if (shouldTrack) {
|
|
4639
4655
|
dep.add(this.activeEffect);
|
|
4640
4656
|
this.activeEffect.deps.push(dep);
|
|
@@ -4648,7 +4664,7 @@
|
|
|
4648
4664
|
return value;
|
|
4649
4665
|
}
|
|
4650
4666
|
set.add(value);
|
|
4651
|
-
for (
|
|
4667
|
+
for (const key in value) {
|
|
4652
4668
|
this.traversal(value[key], set);
|
|
4653
4669
|
}
|
|
4654
4670
|
return value;
|
|
@@ -4900,6 +4916,7 @@
|
|
|
4900
4916
|
const setInterval = (...args) => loadOrReturnBroker().setInterval(...args);
|
|
4901
4917
|
const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
|
|
4902
4918
|
|
|
4919
|
+
/* eslint-disable */
|
|
4903
4920
|
// ==UserScript==
|
|
4904
4921
|
// @name ModuleRaid.js
|
|
4905
4922
|
// @namespace http://tampermonkey.net/
|
|
@@ -5317,28 +5334,26 @@
|
|
|
5317
5334
|
return $ele?.innerHTML?.trim() === "";
|
|
5318
5335
|
});
|
|
5319
5336
|
}
|
|
5320
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5321
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5337
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5322
5338
|
// contains 语法
|
|
5323
|
-
|
|
5324
|
-
|
|
5339
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5340
|
+
const text = textMatch[2];
|
|
5325
5341
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5326
5342
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5327
5343
|
return ($ele?.textContent || $ele?.innerText)?.includes(text);
|
|
5328
5344
|
});
|
|
5329
5345
|
}
|
|
5330
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5331
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5346
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5332
5347
|
// regexp 语法
|
|
5333
|
-
|
|
5348
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5334
5349
|
let pattern = textMatch[2];
|
|
5335
|
-
|
|
5350
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5336
5351
|
let flags = "";
|
|
5337
5352
|
if (flagMatch) {
|
|
5338
5353
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5339
5354
|
flags = flagMatch[3];
|
|
5340
5355
|
}
|
|
5341
|
-
|
|
5356
|
+
const regexp = new RegExp(pattern, flags);
|
|
5342
5357
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5343
5358
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5344
5359
|
return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
|
|
@@ -5380,11 +5395,10 @@
|
|
|
5380
5395
|
selector = selector.replace(/:empty$/gi, "");
|
|
5381
5396
|
return $el.matches(selector) && $el?.innerHTML?.trim() === "";
|
|
5382
5397
|
}
|
|
5383
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5384
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5398
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5385
5399
|
// contains 语法
|
|
5386
|
-
|
|
5387
|
-
|
|
5400
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5401
|
+
const text = textMatch[2];
|
|
5388
5402
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5389
5403
|
let content = $el?.textContent || $el?.innerText;
|
|
5390
5404
|
if (typeof content !== "string") {
|
|
@@ -5392,18 +5406,17 @@
|
|
|
5392
5406
|
}
|
|
5393
5407
|
return $el.matches(selector) && content?.includes(text);
|
|
5394
5408
|
}
|
|
5395
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5396
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5409
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5397
5410
|
// regexp 语法
|
|
5398
|
-
|
|
5411
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5399
5412
|
let pattern = textMatch[2];
|
|
5400
|
-
|
|
5413
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5401
5414
|
let flags = "";
|
|
5402
5415
|
if (flagMatch) {
|
|
5403
5416
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5404
5417
|
flags = flagMatch[3];
|
|
5405
5418
|
}
|
|
5406
|
-
|
|
5419
|
+
const regexp = new RegExp(pattern, flags);
|
|
5407
5420
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5408
5421
|
let content = $el?.textContent || $el?.innerText;
|
|
5409
5422
|
if (typeof content !== "string") {
|
|
@@ -5421,43 +5434,41 @@
|
|
|
5421
5434
|
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
5422
5435
|
// empty 语法
|
|
5423
5436
|
selector = selector.replace(/:empty$/gi, "");
|
|
5424
|
-
|
|
5437
|
+
const $closest = $el?.closest(selector);
|
|
5425
5438
|
if ($closest && $closest?.innerHTML?.trim() === "") {
|
|
5426
5439
|
return $closest;
|
|
5427
5440
|
}
|
|
5428
5441
|
return null;
|
|
5429
5442
|
}
|
|
5430
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5431
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5443
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5432
5444
|
// contains 语法
|
|
5433
|
-
|
|
5434
|
-
|
|
5445
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5446
|
+
const text = textMatch[2];
|
|
5435
5447
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5436
|
-
|
|
5448
|
+
const $closest = $el?.closest(selector);
|
|
5437
5449
|
if ($closest) {
|
|
5438
|
-
|
|
5450
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5439
5451
|
if (typeof content === "string" && content.includes(text)) {
|
|
5440
5452
|
return $closest;
|
|
5441
5453
|
}
|
|
5442
5454
|
}
|
|
5443
5455
|
return null;
|
|
5444
5456
|
}
|
|
5445
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5446
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5457
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5447
5458
|
// regexp 语法
|
|
5448
|
-
|
|
5459
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5449
5460
|
let pattern = textMatch[2];
|
|
5450
|
-
|
|
5461
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5451
5462
|
let flags = "";
|
|
5452
5463
|
if (flagMatch) {
|
|
5453
5464
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5454
5465
|
flags = flagMatch[3];
|
|
5455
5466
|
}
|
|
5456
|
-
|
|
5467
|
+
const regexp = new RegExp(pattern, flags);
|
|
5457
5468
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5458
|
-
|
|
5469
|
+
const $closest = $el?.closest(selector);
|
|
5459
5470
|
if ($closest) {
|
|
5460
|
-
|
|
5471
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5461
5472
|
if (typeof content === "string" && content.match(regexp)) {
|
|
5462
5473
|
return $closest;
|
|
5463
5474
|
}
|
|
@@ -5466,12 +5477,14 @@
|
|
|
5466
5477
|
}
|
|
5467
5478
|
else {
|
|
5468
5479
|
// 普通语法
|
|
5469
|
-
|
|
5480
|
+
const $closest = $el?.closest(selector);
|
|
5470
5481
|
return $closest;
|
|
5471
5482
|
}
|
|
5472
5483
|
}
|
|
5473
5484
|
}
|
|
5474
|
-
|
|
5485
|
+
const domUtils = new DOMUtils();
|
|
5486
|
+
|
|
5487
|
+
const version = "2.8.2";
|
|
5475
5488
|
|
|
5476
5489
|
class Utils {
|
|
5477
5490
|
windowApi;
|
|
@@ -5479,12 +5492,12 @@
|
|
|
5479
5492
|
this.windowApi = new WindowApi(option);
|
|
5480
5493
|
}
|
|
5481
5494
|
/** 版本号 */
|
|
5482
|
-
version =
|
|
5495
|
+
version = version;
|
|
5483
5496
|
addStyle(cssText) {
|
|
5484
5497
|
if (typeof cssText !== "string") {
|
|
5485
5498
|
throw new Error("Utils.addStyle 参数cssText 必须为String类型");
|
|
5486
5499
|
}
|
|
5487
|
-
|
|
5500
|
+
const cssNode = this.windowApi.document.createElement("style");
|
|
5488
5501
|
cssNode.setAttribute("type", "text/css");
|
|
5489
5502
|
cssNode.innerHTML = cssText;
|
|
5490
5503
|
if (this.windowApi.document.head) {
|
|
@@ -5506,23 +5519,23 @@
|
|
|
5506
5519
|
return cssNode;
|
|
5507
5520
|
}
|
|
5508
5521
|
/**
|
|
5509
|
-
|
|
5510
|
-
|
|
5511
|
-
|
|
5512
|
-
|
|
5513
|
-
|
|
5514
|
-
|
|
5515
|
-
|
|
5516
|
-
|
|
5517
|
-
|
|
5518
|
-
|
|
5519
|
-
|
|
5520
|
-
|
|
5521
|
-
|
|
5522
|
-
|
|
5522
|
+
* JSON数据从源端替换到目标端中,如果目标端存在该数据则替换,不添加,返回结果为目标端替换完毕的结果
|
|
5523
|
+
* @param target 目标数据
|
|
5524
|
+
* @param source 源数据
|
|
5525
|
+
* @param isAdd 是否可以追加键,默认false
|
|
5526
|
+
* @example
|
|
5527
|
+
* Utils.assign({"1":1,"2":{"3":3}}, {"2":{"3":4}});
|
|
5528
|
+
* >
|
|
5529
|
+
* {
|
|
5530
|
+
"1": 1,
|
|
5531
|
+
"2": {
|
|
5532
|
+
"3": 4
|
|
5533
|
+
}
|
|
5534
|
+
}
|
|
5535
|
+
*/
|
|
5523
5536
|
assign = commonUtil.assign.bind(commonUtil);
|
|
5524
5537
|
async asyncReplaceAll(string, pattern, asyncFn) {
|
|
5525
|
-
|
|
5538
|
+
const UtilsContext = this;
|
|
5526
5539
|
if (typeof string !== "string") {
|
|
5527
5540
|
throw new TypeError("string必须是字符串");
|
|
5528
5541
|
}
|
|
@@ -5594,18 +5607,18 @@
|
|
|
5594
5607
|
canvasElement.dispatchEvent(new MouseEvent("mouseup", eventInit));
|
|
5595
5608
|
}
|
|
5596
5609
|
checkUserClickInNode(element) {
|
|
5597
|
-
|
|
5610
|
+
const UtilsContext = this;
|
|
5598
5611
|
if (!UtilsContext.isDOM(element)) {
|
|
5599
5612
|
throw new Error("Utils.checkUserClickInNode 参数 targetNode 必须为 Element|Node 类型");
|
|
5600
5613
|
}
|
|
5601
|
-
|
|
5602
|
-
|
|
5603
|
-
|
|
5614
|
+
const clickEvent = UtilsContext.windowApi.window.event;
|
|
5615
|
+
const touchEvent = UtilsContext.windowApi.window.event;
|
|
5616
|
+
const $click = clickEvent?.composedPath()?.[0];
|
|
5604
5617
|
// 点击的x坐标
|
|
5605
|
-
|
|
5618
|
+
const clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
|
|
5606
5619
|
// 点击的y坐标
|
|
5607
|
-
|
|
5608
|
-
|
|
5620
|
+
const clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
|
|
5621
|
+
const {
|
|
5609
5622
|
/* 要检测的元素的相对屏幕的横坐标最左边 */
|
|
5610
5623
|
left: elementPosXLeft,
|
|
5611
5624
|
/* 要检测的元素的相对屏幕的横坐标最右边 */
|
|
@@ -5633,32 +5646,32 @@
|
|
|
5633
5646
|
* @param formData 需要clone的数据
|
|
5634
5647
|
*/
|
|
5635
5648
|
cloneFormData(formData, filterFn) {
|
|
5636
|
-
|
|
5637
|
-
|
|
5638
|
-
|
|
5649
|
+
const clonedFormData = new FormData();
|
|
5650
|
+
formData.forEach((value, key) => {
|
|
5651
|
+
const isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
|
|
5639
5652
|
if (typeof isFilter === "boolean" && isFilter) {
|
|
5640
|
-
|
|
5653
|
+
return;
|
|
5641
5654
|
}
|
|
5642
5655
|
clonedFormData.append(key, value);
|
|
5643
|
-
}
|
|
5656
|
+
});
|
|
5644
5657
|
return clonedFormData;
|
|
5645
5658
|
}
|
|
5646
5659
|
createOverload() {
|
|
5647
|
-
|
|
5660
|
+
const fnMap = new Map();
|
|
5648
5661
|
function overload(...args) {
|
|
5649
|
-
|
|
5650
|
-
|
|
5662
|
+
const key = args.map((it) => typeof it).join(",");
|
|
5663
|
+
const fn = fnMap.get(key);
|
|
5651
5664
|
if (!fn) {
|
|
5652
5665
|
throw new TypeError("没有找到对应的实现");
|
|
5653
5666
|
}
|
|
5654
5667
|
return fn.apply(this, args);
|
|
5655
5668
|
}
|
|
5656
5669
|
overload.addImpl = function (...args) {
|
|
5657
|
-
|
|
5670
|
+
const fn = args.pop();
|
|
5658
5671
|
if (typeof fn !== "function") {
|
|
5659
5672
|
throw new TypeError("最后一个参数必须是函数");
|
|
5660
5673
|
}
|
|
5661
|
-
|
|
5674
|
+
const key = args.join(",");
|
|
5662
5675
|
fnMap.set(key, fn);
|
|
5663
5676
|
};
|
|
5664
5677
|
return overload;
|
|
@@ -5675,7 +5688,7 @@
|
|
|
5675
5688
|
deepClone = commonUtil.deepClone.bind(commonUtil);
|
|
5676
5689
|
debounce(fn, delay = 0) {
|
|
5677
5690
|
let timer = null;
|
|
5678
|
-
|
|
5691
|
+
const UtilsContext = this;
|
|
5679
5692
|
return function (...args) {
|
|
5680
5693
|
UtilsContext.workerClearTimeout(timer);
|
|
5681
5694
|
timer = UtilsContext.workerSetTimeout(function () {
|
|
@@ -5684,7 +5697,7 @@
|
|
|
5684
5697
|
};
|
|
5685
5698
|
}
|
|
5686
5699
|
deleteParentNode(element, targetSelector) {
|
|
5687
|
-
|
|
5700
|
+
const UtilsContext = this;
|
|
5688
5701
|
if (element == null) {
|
|
5689
5702
|
return;
|
|
5690
5703
|
}
|
|
@@ -5695,7 +5708,7 @@
|
|
|
5695
5708
|
throw new Error("Utils.deleteParentNode 参数 targetSelector 必须为 string 类型");
|
|
5696
5709
|
}
|
|
5697
5710
|
let result = false;
|
|
5698
|
-
|
|
5711
|
+
const needRemoveDOM = domUtils.closest(element, targetSelector);
|
|
5699
5712
|
if (needRemoveDOM) {
|
|
5700
5713
|
needRemoveDOM.remove();
|
|
5701
5714
|
result = true;
|
|
@@ -5725,7 +5738,7 @@
|
|
|
5725
5738
|
eventNameList = [...eventName];
|
|
5726
5739
|
}
|
|
5727
5740
|
eventNameList.forEach((_eventName_) => {
|
|
5728
|
-
|
|
5741
|
+
const event = new Event(_eventName_);
|
|
5729
5742
|
if (details) {
|
|
5730
5743
|
Object.assign(event, details);
|
|
5731
5744
|
}
|
|
@@ -5733,7 +5746,7 @@
|
|
|
5733
5746
|
});
|
|
5734
5747
|
}
|
|
5735
5748
|
downloadBase64(base64Data, fileName, isIFrame = false) {
|
|
5736
|
-
|
|
5749
|
+
const UtilsContext = this;
|
|
5737
5750
|
if (typeof base64Data !== "string") {
|
|
5738
5751
|
throw new Error("Utils.downloadBase64 参数 base64Data 必须为 string 类型");
|
|
5739
5752
|
}
|
|
@@ -5765,7 +5778,7 @@
|
|
|
5765
5778
|
let strFound;
|
|
5766
5779
|
if (this.windowApi.globalThis.find) {
|
|
5767
5780
|
/* CODE FOR BROWSERS THAT SUPPORT window.find */
|
|
5768
|
-
|
|
5781
|
+
const windowFind = this.windowApi.self.find;
|
|
5769
5782
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
5770
5783
|
if (strFound && this.windowApi.self.getSelection && !this.windowApi.self.getSelection().anchorNode) {
|
|
5771
5784
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
@@ -5799,19 +5812,19 @@
|
|
|
5799
5812
|
return strFound ? true : false;
|
|
5800
5813
|
}
|
|
5801
5814
|
*findElementsWithText(element, text, filter) {
|
|
5802
|
-
|
|
5815
|
+
const that = this;
|
|
5803
5816
|
if (element.outerHTML.includes(text)) {
|
|
5804
5817
|
if (element.children.length === 0) {
|
|
5805
|
-
|
|
5818
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5806
5819
|
if (!filterResult) {
|
|
5807
5820
|
yield element;
|
|
5808
5821
|
}
|
|
5809
5822
|
}
|
|
5810
5823
|
else {
|
|
5811
|
-
|
|
5812
|
-
for (
|
|
5824
|
+
const textElement = Array.from(element.childNodes).filter((ele) => ele.nodeType === Node.TEXT_NODE);
|
|
5825
|
+
for (const $child of textElement) {
|
|
5813
5826
|
if ($child.textContent.includes(text)) {
|
|
5814
|
-
|
|
5827
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5815
5828
|
if (!filterResult) {
|
|
5816
5829
|
yield $child;
|
|
5817
5830
|
}
|
|
@@ -5820,7 +5833,7 @@
|
|
|
5820
5833
|
}
|
|
5821
5834
|
}
|
|
5822
5835
|
for (let index = 0; index < element.children.length; index++) {
|
|
5823
|
-
|
|
5836
|
+
const $child = element.children[index];
|
|
5824
5837
|
yield* that.findElementsWithText($child, text, filter);
|
|
5825
5838
|
}
|
|
5826
5839
|
}
|
|
@@ -5834,8 +5847,8 @@
|
|
|
5834
5847
|
findVisibleElement(element) {
|
|
5835
5848
|
let currentElement = element;
|
|
5836
5849
|
while (currentElement) {
|
|
5837
|
-
|
|
5838
|
-
if (
|
|
5850
|
+
const elementRect = currentElement.getBoundingClientRect();
|
|
5851
|
+
if (elementRect.length) {
|
|
5839
5852
|
return currentElement;
|
|
5840
5853
|
}
|
|
5841
5854
|
currentElement = currentElement.parentElement;
|
|
@@ -5849,7 +5862,7 @@
|
|
|
5849
5862
|
}
|
|
5850
5863
|
let result = 0;
|
|
5851
5864
|
let resultType = "KB";
|
|
5852
|
-
|
|
5865
|
+
const sizeData = {};
|
|
5853
5866
|
sizeData.B = 1;
|
|
5854
5867
|
sizeData.KB = 1024;
|
|
5855
5868
|
sizeData.MB = sizeData.KB * sizeData.KB;
|
|
@@ -5862,7 +5875,7 @@
|
|
|
5862
5875
|
sizeData.BB = sizeData.YB * sizeData.KB;
|
|
5863
5876
|
sizeData.NB = sizeData.BB * sizeData.KB;
|
|
5864
5877
|
sizeData.DB = sizeData.NB * sizeData.KB;
|
|
5865
|
-
for (
|
|
5878
|
+
for (const key in sizeData) {
|
|
5866
5879
|
result = byteSize / sizeData[key];
|
|
5867
5880
|
resultType = key;
|
|
5868
5881
|
if (sizeData.KB >= result) {
|
|
@@ -5875,7 +5888,7 @@
|
|
|
5875
5888
|
}
|
|
5876
5889
|
getNodeListValue(...args) {
|
|
5877
5890
|
let resultArray = [];
|
|
5878
|
-
for (
|
|
5891
|
+
for (const arg of args) {
|
|
5879
5892
|
let value = arg;
|
|
5880
5893
|
if (typeof arg === "function") {
|
|
5881
5894
|
/* 方法 */
|
|
@@ -5890,7 +5903,7 @@
|
|
|
5890
5903
|
}
|
|
5891
5904
|
getNonNullValue(...args) {
|
|
5892
5905
|
let resultValue = args[args.length - 1];
|
|
5893
|
-
|
|
5906
|
+
const UtilsContext = this;
|
|
5894
5907
|
for (const argValue of args) {
|
|
5895
5908
|
if (UtilsContext.isNotNull(argValue)) {
|
|
5896
5909
|
resultValue = argValue;
|
|
@@ -5900,7 +5913,7 @@
|
|
|
5900
5913
|
return resultValue;
|
|
5901
5914
|
}
|
|
5902
5915
|
formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
|
|
5903
|
-
|
|
5916
|
+
const time = text == null ? new Date() : new Date(text);
|
|
5904
5917
|
/**
|
|
5905
5918
|
* 校验时间补0
|
|
5906
5919
|
* @param timeNum
|
|
@@ -5908,7 +5921,7 @@
|
|
|
5908
5921
|
*/
|
|
5909
5922
|
function checkTime(timeNum) {
|
|
5910
5923
|
if (timeNum < 10)
|
|
5911
|
-
return
|
|
5924
|
+
return `0${timeNum}`;
|
|
5912
5925
|
return timeNum;
|
|
5913
5926
|
}
|
|
5914
5927
|
/**
|
|
@@ -5919,7 +5932,7 @@
|
|
|
5919
5932
|
function timeSystemChange(hourNum) {
|
|
5920
5933
|
return hourNum > 12 ? hourNum - 12 : hourNum;
|
|
5921
5934
|
}
|
|
5922
|
-
|
|
5935
|
+
const timeRegexp = {
|
|
5923
5936
|
yyyy: time.getFullYear(),
|
|
5924
5937
|
/* 年 */
|
|
5925
5938
|
MM: checkTime(time.getMonth() + 1),
|
|
@@ -5936,7 +5949,7 @@
|
|
|
5936
5949
|
/* 秒 */
|
|
5937
5950
|
};
|
|
5938
5951
|
Object.keys(timeRegexp).forEach(function (key) {
|
|
5939
|
-
|
|
5952
|
+
const replaecRegexp = new RegExp(key, "g");
|
|
5940
5953
|
formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
|
|
5941
5954
|
});
|
|
5942
5955
|
return formatType;
|
|
@@ -5948,12 +5961,12 @@
|
|
|
5948
5961
|
}
|
|
5949
5962
|
if (text.length === 8) {
|
|
5950
5963
|
/* 该字符串只有时分秒 */
|
|
5951
|
-
|
|
5952
|
-
text = today.getFullYear()
|
|
5964
|
+
const today = new Date();
|
|
5965
|
+
text = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()} ${text}`;
|
|
5953
5966
|
}
|
|
5954
5967
|
text = text.substring(0, 19);
|
|
5955
5968
|
text = text.replace(/-/g, "/");
|
|
5956
|
-
|
|
5969
|
+
const timestamp = new Date(text).getTime();
|
|
5957
5970
|
return timestamp;
|
|
5958
5971
|
}
|
|
5959
5972
|
/**
|
|
@@ -6003,16 +6016,16 @@
|
|
|
6003
6016
|
if (timestamp2.toString().length === 10) {
|
|
6004
6017
|
timestamp2 = timestamp2 * 1000;
|
|
6005
6018
|
}
|
|
6006
|
-
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
|
|
6010
|
-
|
|
6011
|
-
|
|
6012
|
-
|
|
6013
|
-
|
|
6014
|
-
|
|
6015
|
-
|
|
6019
|
+
const smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
|
|
6020
|
+
const bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
|
|
6021
|
+
const oneSecond = 1000; /* 一秒的毫秒数 */
|
|
6022
|
+
const oneMinute = 60 * oneSecond; /* 一分钟的毫秒数 */
|
|
6023
|
+
const oneHour = 60 * oneMinute; /* 一小时的毫秒数 */
|
|
6024
|
+
const oneDay = 24 * oneHour; /* 一天的毫秒数 */
|
|
6025
|
+
const oneMonth = 30 * oneDay; /* 一个月的毫秒数(30天) */
|
|
6026
|
+
const oneYear = 12 * oneMonth; /* 一年的毫秒数 */
|
|
6027
|
+
const bigDate = new Date(bigTimeStamp);
|
|
6028
|
+
const smallDate = new Date(smallTimeStamp);
|
|
6016
6029
|
let remainderValue = 1;
|
|
6017
6030
|
if (type === "年") {
|
|
6018
6031
|
remainderValue = oneYear;
|
|
@@ -6034,30 +6047,30 @@
|
|
|
6034
6047
|
}
|
|
6035
6048
|
let diffValue = Math.round(Math.abs((bigDate - smallDate) / remainderValue));
|
|
6036
6049
|
if (type === "auto") {
|
|
6037
|
-
|
|
6050
|
+
const timeDifference = bigTimeStamp - smallTimeStamp;
|
|
6038
6051
|
diffValue = Math.floor(timeDifference / (24 * 3600 * 1000));
|
|
6039
6052
|
if (diffValue > 0) {
|
|
6040
|
-
diffValue = diffValue
|
|
6053
|
+
diffValue = `${diffValue}天`;
|
|
6041
6054
|
}
|
|
6042
6055
|
else {
|
|
6043
6056
|
/* 计算出小时数 */
|
|
6044
|
-
|
|
6045
|
-
|
|
6057
|
+
const leave1 = timeDifference % (24 * 3600 * 1000); /* 计算天数后剩余的毫秒数 */
|
|
6058
|
+
const hours = Math.floor(leave1 / (3600 * 1000));
|
|
6046
6059
|
if (hours > 0) {
|
|
6047
|
-
diffValue = hours
|
|
6060
|
+
diffValue = `${hours}小时`;
|
|
6048
6061
|
}
|
|
6049
6062
|
else {
|
|
6050
6063
|
/* 计算相差分钟数 */
|
|
6051
|
-
|
|
6052
|
-
|
|
6064
|
+
const leave2 = leave1 % (3600 * 1000); /* 计算小时数后剩余的毫秒数 */
|
|
6065
|
+
const minutes = Math.floor(leave2 / (60 * 1000));
|
|
6053
6066
|
if (minutes > 0) {
|
|
6054
|
-
diffValue = minutes
|
|
6067
|
+
diffValue = `${minutes}分钟`;
|
|
6055
6068
|
}
|
|
6056
6069
|
else {
|
|
6057
6070
|
/* 计算相差秒数 */
|
|
6058
|
-
|
|
6059
|
-
|
|
6060
|
-
diffValue = seconds
|
|
6071
|
+
const leave3 = leave2 % (60 * 1000); /* 计算分钟数后剩余的毫秒数 */
|
|
6072
|
+
const seconds = Math.round(leave3 / 1000);
|
|
6073
|
+
diffValue = `${seconds}秒`;
|
|
6061
6074
|
}
|
|
6062
6075
|
}
|
|
6063
6076
|
}
|
|
@@ -6065,14 +6078,14 @@
|
|
|
6065
6078
|
return diffValue;
|
|
6066
6079
|
}
|
|
6067
6080
|
getElementSelector(element) {
|
|
6068
|
-
|
|
6081
|
+
const UtilsContext = this;
|
|
6069
6082
|
if (!element)
|
|
6070
6083
|
return void 0;
|
|
6071
6084
|
if (!element.parentElement)
|
|
6072
6085
|
return void 0;
|
|
6073
6086
|
/* 如果元素有id属性,则直接返回id选择器 */
|
|
6074
6087
|
if (element.id)
|
|
6075
|
-
return
|
|
6088
|
+
return `#${element.id}`;
|
|
6076
6089
|
/* 递归地获取父元素的选择器 */
|
|
6077
6090
|
let selector = UtilsContext.getElementSelector(element.parentElement);
|
|
6078
6091
|
if (!selector) {
|
|
@@ -6080,11 +6093,11 @@
|
|
|
6080
6093
|
}
|
|
6081
6094
|
/* 如果有多个相同类型的兄弟元素,则需要添加索引 */
|
|
6082
6095
|
if (element.parentElement.querySelectorAll(element.tagName).length > 1) {
|
|
6083
|
-
|
|
6084
|
-
selector +=
|
|
6096
|
+
const index = Array.prototype.indexOf.call(element.parentElement.children, element) + 1;
|
|
6097
|
+
selector += ` > ${element.tagName.toLowerCase()}:nth-child(${index})`;
|
|
6085
6098
|
}
|
|
6086
6099
|
else {
|
|
6087
|
-
selector +=
|
|
6100
|
+
selector += ` > ${element.tagName.toLowerCase()}`;
|
|
6088
6101
|
}
|
|
6089
6102
|
return selector;
|
|
6090
6103
|
}
|
|
@@ -6095,15 +6108,15 @@
|
|
|
6095
6108
|
* > 2
|
|
6096
6109
|
*/
|
|
6097
6110
|
getMaxValue(...args) {
|
|
6098
|
-
|
|
6111
|
+
const result = [...args];
|
|
6099
6112
|
let newResult = [];
|
|
6100
6113
|
if (result.length === 0) {
|
|
6101
6114
|
return void 0;
|
|
6102
6115
|
}
|
|
6103
6116
|
if (result.length > 1) {
|
|
6104
6117
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6105
|
-
|
|
6106
|
-
|
|
6118
|
+
const data = result[0];
|
|
6119
|
+
const handleDataFunc = result[1];
|
|
6107
6120
|
Object.keys(data).forEach((keyName) => {
|
|
6108
6121
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6109
6122
|
});
|
|
@@ -6151,7 +6164,7 @@
|
|
|
6151
6164
|
*/
|
|
6152
6165
|
function queryMaxZIndex($ele) {
|
|
6153
6166
|
if (typeof ignoreCallBack === "function") {
|
|
6154
|
-
|
|
6167
|
+
const ignoreResult = ignoreCallBack($ele);
|
|
6155
6168
|
if (typeof ignoreResult === "boolean" && !ignoreResult) {
|
|
6156
6169
|
return;
|
|
6157
6170
|
}
|
|
@@ -6160,7 +6173,7 @@
|
|
|
6160
6173
|
const nodeStyle = UtilsContext.windowApi.window.getComputedStyle($ele);
|
|
6161
6174
|
/* 不对position为static和display为none的元素进行获取它们的z-index */
|
|
6162
6175
|
if (isVisibleNode(nodeStyle)) {
|
|
6163
|
-
|
|
6176
|
+
const nodeZIndex = parseInt(nodeStyle.zIndex);
|
|
6164
6177
|
if (!isNaN(nodeZIndex)) {
|
|
6165
6178
|
if (nodeZIndex > zIndex) {
|
|
6166
6179
|
// 赋值到全局
|
|
@@ -6176,7 +6189,7 @@
|
|
|
6176
6189
|
}
|
|
6177
6190
|
}
|
|
6178
6191
|
}
|
|
6179
|
-
target.querySelectorAll("*").forEach(($ele
|
|
6192
|
+
target.querySelectorAll("*").forEach(($ele) => {
|
|
6180
6193
|
queryMaxZIndex($ele);
|
|
6181
6194
|
});
|
|
6182
6195
|
zIndex += deviation;
|
|
@@ -6193,15 +6206,15 @@
|
|
|
6193
6206
|
return this.getMaxZIndexNodeInfo(deviation, target, ignoreCallBack).zIndex;
|
|
6194
6207
|
}
|
|
6195
6208
|
getMinValue(...args) {
|
|
6196
|
-
|
|
6209
|
+
const result = [...args];
|
|
6197
6210
|
let newResult = [];
|
|
6198
6211
|
if (result.length === 0) {
|
|
6199
6212
|
return void 0;
|
|
6200
6213
|
}
|
|
6201
6214
|
if (result.length > 1) {
|
|
6202
6215
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6203
|
-
|
|
6204
|
-
|
|
6216
|
+
const data = result[0];
|
|
6217
|
+
const handleDataFunc = result[1];
|
|
6205
6218
|
Object.keys(data).forEach((keyName) => {
|
|
6206
6219
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6207
6220
|
});
|
|
@@ -6231,8 +6244,8 @@
|
|
|
6231
6244
|
* > 'Mozilla/5.0 (Linux; Android 10; MI 13 Build/OPR1.170623.027; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.3490.40 Mobile Safari/537.36'
|
|
6232
6245
|
**/
|
|
6233
6246
|
getRandomAndroidUA() {
|
|
6234
|
-
|
|
6235
|
-
|
|
6247
|
+
const UtilsContext = this;
|
|
6248
|
+
const mobileNameList = [
|
|
6236
6249
|
"LDN-LX3",
|
|
6237
6250
|
"RNE-L03",
|
|
6238
6251
|
"ASUS_X00ID Build/NMF26F",
|
|
@@ -6249,14 +6262,14 @@
|
|
|
6249
6262
|
"MI 13 Build/OPR1.170623.027; wv",
|
|
6250
6263
|
];
|
|
6251
6264
|
/* 安卓版本 */
|
|
6252
|
-
|
|
6265
|
+
const androidVersion = UtilsContext.getRandomValue(12, 14);
|
|
6253
6266
|
/* 手机型号 */
|
|
6254
|
-
|
|
6267
|
+
const randomMobile = UtilsContext.getRandomValue(mobileNameList);
|
|
6255
6268
|
/* chrome大版本号 */
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
|
|
6269
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6270
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6271
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6272
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6260
6273
|
return `Mozilla/5.0 (Linux; Android ${androidVersion}; ${randomMobile}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Mobile Safari/537.36`;
|
|
6261
6274
|
}
|
|
6262
6275
|
/**
|
|
@@ -6278,20 +6291,20 @@
|
|
|
6278
6291
|
* > 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5068.19 Safari/537.36'
|
|
6279
6292
|
**/
|
|
6280
6293
|
getRandomPCUA() {
|
|
6281
|
-
|
|
6294
|
+
const UtilsContext = this;
|
|
6282
6295
|
/* chrome大版本号 */
|
|
6283
|
-
|
|
6284
|
-
|
|
6285
|
-
|
|
6286
|
-
|
|
6296
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6297
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6298
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6299
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6287
6300
|
return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Safari/537.36`;
|
|
6288
6301
|
}
|
|
6289
6302
|
getRandomValue(...args) {
|
|
6290
|
-
|
|
6303
|
+
const result = [...args];
|
|
6291
6304
|
if (result.length > 1) {
|
|
6292
6305
|
if (result.length === 2 && typeof result[0] === "number" && typeof result[1] === "number") {
|
|
6293
|
-
|
|
6294
|
-
|
|
6306
|
+
const leftNumber = result[0] > result[1] ? result[1] : result[0];
|
|
6307
|
+
const rightNumber = result[0] > result[1] ? result[0] : result[1];
|
|
6295
6308
|
return Math.round(Math.random() * (rightNumber - leftNumber)) + leftNumber;
|
|
6296
6309
|
}
|
|
6297
6310
|
else {
|
|
@@ -6299,12 +6312,12 @@
|
|
|
6299
6312
|
}
|
|
6300
6313
|
}
|
|
6301
6314
|
else if (result.length === 1) {
|
|
6302
|
-
|
|
6315
|
+
const paramData = result[0];
|
|
6303
6316
|
if (Array.isArray(paramData)) {
|
|
6304
6317
|
return paramData[Math.floor(Math.random() * paramData.length)];
|
|
6305
6318
|
}
|
|
6306
6319
|
else if (typeof paramData === "object" && Object.keys(paramData).length > 0) {
|
|
6307
|
-
|
|
6320
|
+
const paramObjDataKey = Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)];
|
|
6308
6321
|
return paramData[paramObjDataKey];
|
|
6309
6322
|
}
|
|
6310
6323
|
else {
|
|
@@ -6320,7 +6333,7 @@
|
|
|
6320
6333
|
* Utils.getReactObj(document.querySelector("input"))?.reactProps?.onChange({target:{value:"123"}});
|
|
6321
6334
|
*/
|
|
6322
6335
|
getReactObj(element) {
|
|
6323
|
-
|
|
6336
|
+
const result = {};
|
|
6324
6337
|
if (element == null) {
|
|
6325
6338
|
return result;
|
|
6326
6339
|
}
|
|
@@ -6346,9 +6359,9 @@
|
|
|
6346
6359
|
if (typeof target !== "object") {
|
|
6347
6360
|
throw new TypeError("target不是一个对象");
|
|
6348
6361
|
}
|
|
6349
|
-
|
|
6362
|
+
const objectsSymbols = Object.getOwnPropertySymbols(target);
|
|
6350
6363
|
if (typeof keyName === "string") {
|
|
6351
|
-
|
|
6364
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6352
6365
|
return key.toString() === keyName;
|
|
6353
6366
|
});
|
|
6354
6367
|
if (findSymbol) {
|
|
@@ -6356,7 +6369,7 @@
|
|
|
6356
6369
|
}
|
|
6357
6370
|
}
|
|
6358
6371
|
else if (typeof keyName === "symbol") {
|
|
6359
|
-
|
|
6372
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6360
6373
|
return key === keyName;
|
|
6361
6374
|
});
|
|
6362
6375
|
if (findSymbol) {
|
|
@@ -6364,7 +6377,7 @@
|
|
|
6364
6377
|
}
|
|
6365
6378
|
}
|
|
6366
6379
|
else {
|
|
6367
|
-
|
|
6380
|
+
const result = {};
|
|
6368
6381
|
objectsSymbols.forEach((item) => {
|
|
6369
6382
|
result[item] = target[item];
|
|
6370
6383
|
});
|
|
@@ -6379,12 +6392,12 @@
|
|
|
6379
6392
|
* > 12
|
|
6380
6393
|
*/
|
|
6381
6394
|
getTextLength(text) {
|
|
6382
|
-
|
|
6383
|
-
|
|
6395
|
+
const encoder = new TextEncoder();
|
|
6396
|
+
const bytes = encoder.encode(text);
|
|
6384
6397
|
return bytes.length;
|
|
6385
6398
|
}
|
|
6386
6399
|
getTextStorageSize(text, addType = true) {
|
|
6387
|
-
|
|
6400
|
+
const UtilsContext = this;
|
|
6388
6401
|
return UtilsContext.formatByteToSize(UtilsContext.getTextLength(text), addType);
|
|
6389
6402
|
}
|
|
6390
6403
|
getThunderUrl(url) {
|
|
@@ -6397,88 +6410,75 @@
|
|
|
6397
6410
|
if (url.trim() === "") {
|
|
6398
6411
|
throw new TypeError("url不能为空字符串或纯空格");
|
|
6399
6412
|
}
|
|
6400
|
-
return `thunder://${this.windowApi.globalThis.btoa(
|
|
6413
|
+
return `thunder://${this.windowApi.globalThis.btoa(`AA${url}ZZ`)}`;
|
|
6401
6414
|
}
|
|
6402
6415
|
/**
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
6408
|
-
|
|
6409
|
-
|
|
6410
|
-
|
|
6411
|
-
|
|
6412
|
-
|
|
6413
|
-
|
|
6414
|
-
|
|
6415
|
-
|
|
6416
|
-
|
|
6417
|
-
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
|
|
6416
|
+
* 对于GM_cookie的兼容写法,当无法使用GM_cookie时可以使用这个,但是并不完全兼容,有些写不出来且限制了httponly是无法访问的
|
|
6417
|
+
* @example
|
|
6418
|
+
let GM_cookie = new Utils.GM_Cookie();
|
|
6419
|
+
GM_cookie.list({name:"xxx_cookie_xxx"},function(cookies,error){
|
|
6420
|
+
if (!error) {
|
|
6421
|
+
console.log(cookies);
|
|
6422
|
+
console.log(cookies.value);
|
|
6423
|
+
} else {
|
|
6424
|
+
console.error(error);
|
|
6425
|
+
}
|
|
6426
|
+
});
|
|
6427
|
+
GM_cookie.set({name:"xxx_cookie_test_xxx",value:"这是Cookie测试值"},function(error){
|
|
6428
|
+
if (error) {
|
|
6429
|
+
console.error(error);
|
|
6430
|
+
} else {
|
|
6431
|
+
console.log('Cookie set successfully.');
|
|
6432
|
+
}
|
|
6433
|
+
})
|
|
6434
|
+
GM_cookie.delete({name:"xxx_cookie_test_xxx"},function(error){
|
|
6435
|
+
if (error) {
|
|
6436
|
+
console.error(error);
|
|
6437
|
+
} else {
|
|
6438
|
+
console.log('Cookie set successfully.');
|
|
6439
|
+
}
|
|
6440
|
+
})
|
|
6441
|
+
**/
|
|
6429
6442
|
GM_Cookie = UtilsGMCookie;
|
|
6430
6443
|
/**
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6437
|
-
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
|
|
6441
|
-
|
|
6442
|
-
|
|
6444
|
+
* 注册油猴菜单,要求本地存储的键名不能存在其它键名`GM_Menu_Local_Map`会冲突/覆盖
|
|
6445
|
+
* @example
|
|
6446
|
+
let GM_Menu = new Utils.GM_Menu({
|
|
6447
|
+
data: [
|
|
6448
|
+
{
|
|
6449
|
+
menu_key: "menu_key",
|
|
6450
|
+
text: "测试按钮",
|
|
6451
|
+
enable: true,
|
|
6452
|
+
accessKey: "a",
|
|
6453
|
+
autoClose: false,
|
|
6454
|
+
showText(text, enable) {
|
|
6455
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6456
|
+
},
|
|
6457
|
+
callback(data) {
|
|
6458
|
+
console.log("点击菜单,值修改为", data.enable);
|
|
6459
|
+
},
|
|
6443
6460
|
},
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6448
|
-
|
|
6449
|
-
|
|
6450
|
-
|
|
6451
|
-
|
|
6452
|
-
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
6465
|
-
// 添加键为menu_key2的菜单项
|
|
6466
|
-
GM_Menu.add({
|
|
6467
|
-
key:"menu_key2",
|
|
6468
|
-
text: "测试按钮2",
|
|
6469
|
-
enable: false,
|
|
6470
|
-
showText(text,enable){
|
|
6471
|
-
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6472
|
-
},
|
|
6473
|
-
callback(data){
|
|
6474
|
-
console.log("点击菜单,值修改为",data.enable);
|
|
6475
|
-
}
|
|
6476
|
-
});
|
|
6477
|
-
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6478
|
-
GM_Menu.add([
|
|
6479
|
-
{
|
|
6480
|
-
key:"menu_key3",
|
|
6481
|
-
text: "测试按钮3",
|
|
6461
|
+
],
|
|
6462
|
+
autoReload: false,
|
|
6463
|
+
GM_getValue,
|
|
6464
|
+
GM_setValue,
|
|
6465
|
+
GM_registerMenuCommand,
|
|
6466
|
+
GM_unregisterMenuCommand,
|
|
6467
|
+
});
|
|
6468
|
+
|
|
6469
|
+
|
|
6470
|
+
// 获取某个菜单项的值
|
|
6471
|
+
GM_Menu.get("menu_key");
|
|
6472
|
+
> true
|
|
6473
|
+
|
|
6474
|
+
// 获取某个菜单项的开启/关闭后显示的文本
|
|
6475
|
+
GM_Menu.getShowTextValue("menu_key");
|
|
6476
|
+
> √测试按钮
|
|
6477
|
+
|
|
6478
|
+
// 添加键为menu_key2的菜单项
|
|
6479
|
+
GM_Menu.add({
|
|
6480
|
+
key:"menu_key2",
|
|
6481
|
+
text: "测试按钮2",
|
|
6482
6482
|
enable: false,
|
|
6483
6483
|
showText(text,enable){
|
|
6484
6484
|
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
@@ -6486,152 +6486,165 @@
|
|
|
6486
6486
|
callback(data){
|
|
6487
6487
|
console.log("点击菜单,值修改为",data.enable);
|
|
6488
6488
|
}
|
|
6489
|
-
}
|
|
6490
|
-
|
|
6491
|
-
|
|
6492
|
-
|
|
6493
|
-
|
|
6494
|
-
|
|
6495
|
-
|
|
6489
|
+
});
|
|
6490
|
+
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6491
|
+
GM_Menu.add([
|
|
6492
|
+
{
|
|
6493
|
+
key:"menu_key3",
|
|
6494
|
+
text: "测试按钮3",
|
|
6495
|
+
enable: false,
|
|
6496
|
+
showText(text,enable){
|
|
6497
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6498
|
+
},
|
|
6499
|
+
callback(data){
|
|
6500
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6501
|
+
}
|
|
6496
6502
|
},
|
|
6497
|
-
|
|
6498
|
-
|
|
6503
|
+
{
|
|
6504
|
+
key:"menu_key4",
|
|
6505
|
+
text: "测试按钮4",
|
|
6506
|
+
enable: false,
|
|
6507
|
+
showText(text,enable){
|
|
6508
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6509
|
+
},
|
|
6510
|
+
callback(data){
|
|
6511
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6512
|
+
}
|
|
6499
6513
|
}
|
|
6500
|
-
|
|
6501
|
-
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
|
|
6505
|
-
|
|
6506
|
-
|
|
6507
|
-
|
|
6508
|
-
|
|
6509
|
-
|
|
6510
|
-
|
|
6511
|
-
|
|
6512
|
-
|
|
6514
|
+
]);
|
|
6515
|
+
|
|
6516
|
+
// 更新键为menu_key的显示文字和点击回调
|
|
6517
|
+
GM_Menu.update({
|
|
6518
|
+
menu_key:{
|
|
6519
|
+
text: "更新后的测试按钮",
|
|
6520
|
+
enable: true,
|
|
6521
|
+
showText(text,enable){
|
|
6522
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6523
|
+
},
|
|
6524
|
+
callback(data){
|
|
6525
|
+
console.log("点击菜单更新后的测试按钮,新值修改为",data.enable);
|
|
6526
|
+
}
|
|
6513
6527
|
}
|
|
6514
|
-
}
|
|
6515
|
-
|
|
6516
|
-
|
|
6517
|
-
|
|
6518
|
-
|
|
6519
|
-
**/
|
|
6528
|
+
});
|
|
6529
|
+
|
|
6530
|
+
// 删除键为menu_key的菜单
|
|
6531
|
+
GM_Menu.delete("menu_key");
|
|
6532
|
+
**/
|
|
6520
6533
|
GM_Menu = GMMenu;
|
|
6521
6534
|
/**
|
|
6522
|
-
|
|
6523
|
-
|
|
6524
|
-
|
|
6525
|
-
|
|
6526
|
-
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6539
|
-
|
|
6540
|
-
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
|
|
6535
|
+
* 基于Function prototype,能够勾住和释放任何函数
|
|
6536
|
+
*
|
|
6537
|
+
* .hook
|
|
6538
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6539
|
+
* + hookFunc {string} 替换的hook函数
|
|
6540
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6541
|
+
* + methodName {string} 匿名函数需显式传入目标函数名eg:this.Begin = function(){....};}
|
|
6542
|
+
*
|
|
6543
|
+
* .unhook
|
|
6544
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6545
|
+
* + funcName {string} 被Hook的函数名称
|
|
6546
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6547
|
+
* @example
|
|
6548
|
+
let hook = new Utils.Hooks();
|
|
6549
|
+
hook.initEnv();
|
|
6550
|
+
function myFunction(){
|
|
6551
|
+
console.log("我自己需要执行的函数");
|
|
6552
|
+
}
|
|
6553
|
+
function testFunction(){
|
|
6554
|
+
console.log("正常执行的函数");
|
|
6555
|
+
}
|
|
6556
|
+
testFunction.hook(testFunction,myFunction,window);
|
|
6557
|
+
**/
|
|
6545
6558
|
Hooks = Hooks;
|
|
6546
6559
|
/**
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
|
|
6576
|
-
|
|
6577
|
-
|
|
6578
|
-
|
|
6579
|
-
|
|
6580
|
-
|
|
6581
|
-
|
|
6582
|
-
|
|
6583
|
-
|
|
6560
|
+
* 为减少代码量和回调,把GM_xmlhttpRequest封装
|
|
6561
|
+
* 文档地址: https://www.tampermonkey.net/documentation.php?ext=iikm
|
|
6562
|
+
* 其中onloadstart、onprogress、onreadystatechange是回调形式,onabort、ontimeout、onerror可以设置全局回调函数
|
|
6563
|
+
* @param _GM_xmlHttpRequest_ 油猴中的GM_xmlhttpRequest
|
|
6564
|
+
* @example
|
|
6565
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6566
|
+
let postResp = await httpx.post({
|
|
6567
|
+
url:url,
|
|
6568
|
+
data:JSON.stringify({
|
|
6569
|
+
test:1
|
|
6570
|
+
}),
|
|
6571
|
+
timeout: 5000
|
|
6572
|
+
});
|
|
6573
|
+
console.log(postResp);
|
|
6574
|
+
> {
|
|
6575
|
+
status: true,
|
|
6576
|
+
data: {responseText: "...", response: xxx,...},
|
|
6577
|
+
msg: "请求完毕",
|
|
6578
|
+
type: "onload",
|
|
6579
|
+
}
|
|
6580
|
+
|
|
6581
|
+
if(postResp === "onload" && postResp.status){
|
|
6582
|
+
// onload
|
|
6583
|
+
}else if(postResp === "ontimeout"){
|
|
6584
|
+
// ontimeout
|
|
6585
|
+
}
|
|
6586
|
+
* @example
|
|
6587
|
+
// 也可以先配置全局参数
|
|
6588
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6589
|
+
httpx.config({
|
|
6590
|
+
timeout: 5000,
|
|
6591
|
+
async: false,
|
|
6592
|
+
responseType: "html",
|
|
6593
|
+
redirect: "follow",
|
|
6594
|
+
})
|
|
6595
|
+
// 优先级为 默认details < 全局details < 单独的details
|
|
6596
|
+
*/
|
|
6584
6597
|
Httpx = Httpx;
|
|
6585
6598
|
/**
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6605
|
-
|
|
6606
|
-
|
|
6607
|
-
|
|
6608
|
-
|
|
6609
|
-
|
|
6599
|
+
* 浏览器端的indexedDB操作封装
|
|
6600
|
+
* @example
|
|
6601
|
+
let db = new Utils.indexedDB('web_DB', 'nav_text')
|
|
6602
|
+
let data = {name:'管理员', roleId: 1, type: 1};
|
|
6603
|
+
db.save('list',data).then((resolve)=>{
|
|
6604
|
+
console.log(resolve,'存储成功')
|
|
6605
|
+
})
|
|
6606
|
+
|
|
6607
|
+
db.get('list').then((resolve)=>{
|
|
6608
|
+
console.log(resolve,'查询成功')
|
|
6609
|
+
})
|
|
6610
|
+
|
|
6611
|
+
db.getPaging('list',20,10).then((resolve)=>{
|
|
6612
|
+
console.log(resolve,'查询分页偏移第20,一共10行成功');
|
|
6613
|
+
})
|
|
6614
|
+
|
|
6615
|
+
db.delete('list').then(resolve=>{
|
|
6616
|
+
console.log(resolve,'删除成功---->>>>>>name')
|
|
6617
|
+
})
|
|
6618
|
+
|
|
6619
|
+
db.deleteAll().then(resolve=>{
|
|
6620
|
+
console.log(resolve,'清除数据库---->>>>>>name')
|
|
6621
|
+
})
|
|
6622
|
+
**/
|
|
6610
6623
|
indexedDB = indexedDB;
|
|
6611
6624
|
isNativeFunc(target) {
|
|
6612
6625
|
return Boolean(target.toString().match(/^function .*\(\) { \[native code\] }$/));
|
|
6613
6626
|
}
|
|
6614
6627
|
isNearBottom(...args) {
|
|
6615
6628
|
let nearBottomHeight = 50;
|
|
6616
|
-
|
|
6629
|
+
const checkWindow = () => {
|
|
6617
6630
|
// 已滚动的距离
|
|
6618
|
-
|
|
6631
|
+
const scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
|
|
6619
6632
|
// 视窗高度
|
|
6620
|
-
|
|
6633
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6621
6634
|
// 最大滚动距离
|
|
6622
|
-
|
|
6635
|
+
const maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
|
|
6623
6636
|
return scrollTop + viewportHeight >= maxScrollHeight;
|
|
6624
6637
|
};
|
|
6625
|
-
|
|
6638
|
+
const checkNode = ($ele) => {
|
|
6626
6639
|
// 已滚动的距离
|
|
6627
|
-
|
|
6640
|
+
const scrollTop = $ele.scrollTop;
|
|
6628
6641
|
// 视窗高度
|
|
6629
|
-
|
|
6642
|
+
const viewportHeight = $ele.clientHeight;
|
|
6630
6643
|
// 最大滚动距离
|
|
6631
|
-
|
|
6644
|
+
const maxScrollHeight = $ele.scrollHeight - viewportHeight - nearBottomHeight;
|
|
6632
6645
|
return scrollTop >= maxScrollHeight;
|
|
6633
6646
|
};
|
|
6634
|
-
|
|
6647
|
+
const firstArg = args[0];
|
|
6635
6648
|
if (args.length === 0 || typeof args[0] === "number") {
|
|
6636
6649
|
// nearBottomHeight
|
|
6637
6650
|
//
|
|
@@ -6646,7 +6659,7 @@
|
|
|
6646
6659
|
return checkNode(args[0]);
|
|
6647
6660
|
}
|
|
6648
6661
|
else {
|
|
6649
|
-
throw new TypeError(
|
|
6662
|
+
throw new TypeError(`参数1类型错误${typeof firstArg}`);
|
|
6650
6663
|
}
|
|
6651
6664
|
}
|
|
6652
6665
|
/**
|
|
@@ -6676,7 +6689,7 @@
|
|
|
6676
6689
|
}
|
|
6677
6690
|
if (typeof target === "object") {
|
|
6678
6691
|
/* 也有种可能,这个jQuery对象是1.8.3版本的,页面中的jQuery是3.4.1版本的 */
|
|
6679
|
-
|
|
6692
|
+
const jQueryProps = [
|
|
6680
6693
|
"add",
|
|
6681
6694
|
"addBack",
|
|
6682
6695
|
"addClass",
|
|
@@ -6860,50 +6873,50 @@
|
|
|
6860
6873
|
*/
|
|
6861
6874
|
isNotNull = commonUtil.isNotNull.bind(commonUtil);
|
|
6862
6875
|
/**
|
|
6863
|
-
|
|
6864
|
-
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
|
|
6869
|
-
|
|
6870
|
-
|
|
6871
|
-
|
|
6872
|
-
|
|
6873
|
-
|
|
6874
|
-
|
|
6875
|
-
|
|
6876
|
-
|
|
6877
|
-
|
|
6878
|
-
|
|
6879
|
-
|
|
6880
|
-
|
|
6881
|
-
|
|
6882
|
-
|
|
6883
|
-
|
|
6884
|
-
|
|
6885
|
-
|
|
6886
|
-
|
|
6887
|
-
|
|
6888
|
-
|
|
6889
|
-
|
|
6890
|
-
|
|
6891
|
-
|
|
6892
|
-
|
|
6893
|
-
|
|
6894
|
-
|
|
6895
|
-
|
|
6896
|
-
|
|
6897
|
-
|
|
6898
|
-
|
|
6899
|
-
|
|
6900
|
-
|
|
6901
|
-
|
|
6902
|
-
|
|
6903
|
-
|
|
6904
|
-
|
|
6905
|
-
|
|
6906
|
-
|
|
6876
|
+
* 判断对象或数据是否为空
|
|
6877
|
+
* + `String`判空的值,如 ""、"null"、"undefined"、" "
|
|
6878
|
+
* + `Number`判空的值,如 0
|
|
6879
|
+
* + `Object`判空的值,如 {}、null、undefined
|
|
6880
|
+
* + `Array`(存在属性Symbol.iterator)判空的值,如 []
|
|
6881
|
+
* + `Boolean`判空的值,如false
|
|
6882
|
+
* + `Function`判空的值,如()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){}
|
|
6883
|
+
* @returns
|
|
6884
|
+
* + true 为空
|
|
6885
|
+
* + false 不为空
|
|
6886
|
+
* @example
|
|
6887
|
+
Utils.isNull({});
|
|
6888
|
+
> true
|
|
6889
|
+
* @example
|
|
6890
|
+
Utils.isNull([]);
|
|
6891
|
+
> true
|
|
6892
|
+
* @example
|
|
6893
|
+
Utils.isNull(" ");
|
|
6894
|
+
> true
|
|
6895
|
+
* @example
|
|
6896
|
+
Utils.isNull(function(){});
|
|
6897
|
+
> true
|
|
6898
|
+
* @example
|
|
6899
|
+
Utils.isNull(()=>{}));
|
|
6900
|
+
> true
|
|
6901
|
+
* @example
|
|
6902
|
+
Utils.isNull("undefined");
|
|
6903
|
+
> true
|
|
6904
|
+
* @example
|
|
6905
|
+
Utils.isNull("null");
|
|
6906
|
+
> true
|
|
6907
|
+
* @example
|
|
6908
|
+
Utils.isNull(" ", false);
|
|
6909
|
+
> true
|
|
6910
|
+
* @example
|
|
6911
|
+
Utils.isNull([1],[]);
|
|
6912
|
+
> false
|
|
6913
|
+
* @example
|
|
6914
|
+
Utils.isNull([],[1]);
|
|
6915
|
+
> false
|
|
6916
|
+
* @example
|
|
6917
|
+
Utils.isNull(false,[123]);
|
|
6918
|
+
> false
|
|
6919
|
+
**/
|
|
6907
6920
|
isNull = commonUtil.isNull.bind(commonUtil);
|
|
6908
6921
|
isThemeDark() {
|
|
6909
6922
|
return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
@@ -6932,15 +6945,15 @@
|
|
|
6932
6945
|
}
|
|
6933
6946
|
let result = true;
|
|
6934
6947
|
for (const domItem of needCheckDomList) {
|
|
6935
|
-
|
|
6948
|
+
const domDisplay = this.windowApi.window.getComputedStyle(domItem);
|
|
6936
6949
|
if (domDisplay.display === "none") {
|
|
6937
6950
|
result = false;
|
|
6938
6951
|
}
|
|
6939
6952
|
else {
|
|
6940
|
-
|
|
6953
|
+
const domClientRect = domItem.getBoundingClientRect();
|
|
6941
6954
|
if (inView) {
|
|
6942
|
-
|
|
6943
|
-
|
|
6955
|
+
const viewportWidth = this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
|
|
6956
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6944
6957
|
result = !(domClientRect.right < 0 ||
|
|
6945
6958
|
domClientRect.left > viewportWidth ||
|
|
6946
6959
|
domClientRect.bottom < 0 ||
|
|
@@ -6959,11 +6972,11 @@
|
|
|
6959
6972
|
}
|
|
6960
6973
|
isWebView_Via() {
|
|
6961
6974
|
let result = true;
|
|
6962
|
-
|
|
6975
|
+
const UtilsContext = this;
|
|
6963
6976
|
if (typeof this.windowApi.top.window.via === "object") {
|
|
6964
6977
|
for (const key in Object.values(this.windowApi.top.window.via)) {
|
|
6965
6978
|
if (Reflect.has(this.windowApi.top.window.via, key)) {
|
|
6966
|
-
|
|
6979
|
+
const objValueFunc = this.windowApi.top.window.via[key];
|
|
6967
6980
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6968
6981
|
result = true;
|
|
6969
6982
|
}
|
|
@@ -6981,11 +6994,11 @@
|
|
|
6981
6994
|
}
|
|
6982
6995
|
isWebView_X() {
|
|
6983
6996
|
let result = true;
|
|
6984
|
-
|
|
6997
|
+
const UtilsContext = this;
|
|
6985
6998
|
if (typeof this.windowApi.top.window.mbrowser === "object") {
|
|
6986
6999
|
for (const key in Object.values(this.windowApi.top.window.mbrowser)) {
|
|
6987
7000
|
if (Reflect.has(this.windowApi.top.window.mbrowser, key)) {
|
|
6988
|
-
|
|
7001
|
+
const objValueFunc = this.windowApi.top.window.mbrowser[key];
|
|
6989
7002
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6990
7003
|
result = true;
|
|
6991
7004
|
}
|
|
@@ -7012,46 +7025,46 @@
|
|
|
7012
7025
|
return result;
|
|
7013
7026
|
}
|
|
7014
7027
|
/**
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7019
|
-
|
|
7020
|
-
|
|
7021
|
-
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7028
|
+
* 自动锁对象,用于循环判断运行的函数,在循环外new后使用,注意,如果函数内部存在异步操作,需要使用await
|
|
7029
|
+
* @example
|
|
7030
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}))
|
|
7031
|
+
lock.run();
|
|
7032
|
+
> 1
|
|
7033
|
+
* @example
|
|
7034
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}),true) -- 异步操作
|
|
7035
|
+
await lock.run();
|
|
7036
|
+
> 1
|
|
7037
|
+
**/
|
|
7025
7038
|
LockFunction = LockFunction;
|
|
7026
7039
|
/**
|
|
7027
|
-
|
|
7028
|
-
|
|
7029
|
-
|
|
7030
|
-
|
|
7031
|
-
|
|
7032
|
-
|
|
7033
|
-
|
|
7034
|
-
|
|
7035
|
-
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
|
|
7040
|
-
|
|
7041
|
-
|
|
7042
|
-
|
|
7043
|
-
|
|
7044
|
-
|
|
7045
|
-
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
7049
|
-
|
|
7050
|
-
|
|
7051
|
-
|
|
7052
|
-
|
|
7053
|
-
|
|
7054
|
-
|
|
7040
|
+
* 日志对象
|
|
7041
|
+
* @param _GM_info_ 油猴管理器的API GM_info,或者是一个对象,如{"script":{name:"Utils.Log"}}
|
|
7042
|
+
* @example
|
|
7043
|
+
let log = new Utils.Log(GM_info);
|
|
7044
|
+
log.info("普通输出");
|
|
7045
|
+
> 普通输出
|
|
7046
|
+
|
|
7047
|
+
log.success("成功输出");
|
|
7048
|
+
> 成功输出
|
|
7049
|
+
|
|
7050
|
+
log.error("错误输出");
|
|
7051
|
+
> 错误输出
|
|
7052
|
+
|
|
7053
|
+
log.warn("警告输出");
|
|
7054
|
+
> 警告输出
|
|
7055
|
+
|
|
7056
|
+
log.tag = "自定义tag信息";
|
|
7057
|
+
log.info("自定义info的颜色","#e0e0e0");
|
|
7058
|
+
> 自定义info的颜色
|
|
7059
|
+
|
|
7060
|
+
log.config({
|
|
7061
|
+
successColor: "#31dc02",
|
|
7062
|
+
errorColor: "#e02d2d",
|
|
7063
|
+
infoColor: "black",
|
|
7064
|
+
})
|
|
7065
|
+
log.success("颜色为#31dc02");
|
|
7066
|
+
> 颜色为#31dc02
|
|
7067
|
+
*/
|
|
7055
7068
|
Log = Log;
|
|
7056
7069
|
mergeArrayToString(data, handleFunc) {
|
|
7057
7070
|
if (!(data instanceof Array)) {
|
|
@@ -7080,8 +7093,8 @@
|
|
|
7080
7093
|
return content;
|
|
7081
7094
|
}
|
|
7082
7095
|
mutationObserver(target, observer_config) {
|
|
7083
|
-
|
|
7084
|
-
|
|
7096
|
+
const UtilsContext = this;
|
|
7097
|
+
const default_obverser_config = {
|
|
7085
7098
|
/* 监听到元素有反馈,需执行的函数 */
|
|
7086
7099
|
callback: () => { },
|
|
7087
7100
|
config: {
|
|
@@ -7123,11 +7136,11 @@
|
|
|
7123
7136
|
immediate: false,
|
|
7124
7137
|
};
|
|
7125
7138
|
observer_config = UtilsContext.assign(default_obverser_config, observer_config);
|
|
7126
|
-
|
|
7139
|
+
const windowMutationObserver = this.windowApi.window.MutationObserver ||
|
|
7127
7140
|
this.windowApi.window.webkitMutationObserver ||
|
|
7128
7141
|
this.windowApi.window.MozMutationObserver;
|
|
7129
7142
|
// 观察者对象
|
|
7130
|
-
|
|
7143
|
+
const mutationObserver = new windowMutationObserver(function (mutations, observer) {
|
|
7131
7144
|
if (typeof observer_config.callback === "function") {
|
|
7132
7145
|
observer_config.callback(mutations, observer);
|
|
7133
7146
|
}
|
|
@@ -7140,7 +7153,7 @@
|
|
|
7140
7153
|
}
|
|
7141
7154
|
else if (UtilsContext.isJQuery(target)) {
|
|
7142
7155
|
/* 传入的参数是jQuery对象 */
|
|
7143
|
-
target.each((
|
|
7156
|
+
target.each((_, item) => {
|
|
7144
7157
|
mutationObserver.observe(item, observer_config.config);
|
|
7145
7158
|
});
|
|
7146
7159
|
}
|
|
@@ -7178,7 +7191,7 @@
|
|
|
7178
7191
|
threshold: [0.01, 0.99],
|
|
7179
7192
|
};
|
|
7180
7193
|
defaultOptions = this.assign(defaultOptions, options || {});
|
|
7181
|
-
|
|
7194
|
+
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
|
7182
7195
|
if (entries[0].isIntersecting) {
|
|
7183
7196
|
if (typeof callback === "function") {
|
|
7184
7197
|
callback(entries, observer);
|
|
@@ -7208,7 +7221,7 @@
|
|
|
7208
7221
|
return utils;
|
|
7209
7222
|
}
|
|
7210
7223
|
noConflictFunc(needReleaseObject, needReleaseName, functionNameList = [], release = true) {
|
|
7211
|
-
|
|
7224
|
+
const UtilsContext = this;
|
|
7212
7225
|
if (typeof needReleaseObject !== "object") {
|
|
7213
7226
|
throw new Error("Utils.noConflictFunc 参数 needReleaseObject 必须为 object 类型");
|
|
7214
7227
|
}
|
|
@@ -7218,7 +7231,7 @@
|
|
|
7218
7231
|
if (!Array.isArray(functionNameList)) {
|
|
7219
7232
|
throw new Error("Utils.noConflictFunc 参数 functionNameList 必须为 Array 类型");
|
|
7220
7233
|
}
|
|
7221
|
-
|
|
7234
|
+
const needReleaseKey = `__${needReleaseName}`;
|
|
7222
7235
|
/**
|
|
7223
7236
|
* 释放所有
|
|
7224
7237
|
*/
|
|
@@ -7306,7 +7319,9 @@
|
|
|
7306
7319
|
if (typeof dataUri !== "string") {
|
|
7307
7320
|
throw new Error("Utils.parseBase64ToBlob 参数 dataUri 必须为 string 类型");
|
|
7308
7321
|
}
|
|
7309
|
-
|
|
7322
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7323
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7324
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7310
7325
|
while (dataUriLength--) {
|
|
7311
7326
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7312
7327
|
}
|
|
@@ -7321,7 +7336,9 @@
|
|
|
7321
7336
|
if (typeof fileName !== "string") {
|
|
7322
7337
|
throw new Error("Utils.parseBase64ToFile 参数 fileName 必须为 string 类型");
|
|
7323
7338
|
}
|
|
7324
|
-
|
|
7339
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7340
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7341
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7325
7342
|
while (dataUriLength--) {
|
|
7326
7343
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7327
7344
|
}
|
|
@@ -7355,15 +7372,15 @@
|
|
|
7355
7372
|
}
|
|
7356
7373
|
parseCDATA(text = "") {
|
|
7357
7374
|
let result = "";
|
|
7358
|
-
|
|
7359
|
-
|
|
7375
|
+
const cdataRegexp = /<!\[CDATA\[([\s\S]*)\]\]>/;
|
|
7376
|
+
const cdataMatch = cdataRegexp.exec(text.trim());
|
|
7360
7377
|
if (cdataMatch && cdataMatch.length > 1) {
|
|
7361
7378
|
result = cdataMatch[cdataMatch.length - 1];
|
|
7362
7379
|
}
|
|
7363
7380
|
return result;
|
|
7364
7381
|
}
|
|
7365
7382
|
async parseFileToBase64(fileObj) {
|
|
7366
|
-
|
|
7383
|
+
const reader = new FileReader();
|
|
7367
7384
|
reader.readAsDataURL(fileObj);
|
|
7368
7385
|
return new Promise((resolve) => {
|
|
7369
7386
|
reader.onload = function (event) {
|
|
@@ -7372,14 +7389,14 @@
|
|
|
7372
7389
|
});
|
|
7373
7390
|
}
|
|
7374
7391
|
parseFromString(text, mimeType = "text/html") {
|
|
7375
|
-
|
|
7392
|
+
const parser = new DOMParser();
|
|
7376
7393
|
return parser.parseFromString(text, mimeType);
|
|
7377
7394
|
}
|
|
7378
7395
|
parseStringToRegExpString(text) {
|
|
7379
7396
|
if (typeof text !== "string") {
|
|
7380
7397
|
throw new TypeError("string必须是字符串");
|
|
7381
7398
|
}
|
|
7382
|
-
|
|
7399
|
+
const regString = text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
|
|
7383
7400
|
return regString;
|
|
7384
7401
|
}
|
|
7385
7402
|
preventEvent(element, eventNameList = [], capture) {
|
|
@@ -7394,6 +7411,7 @@
|
|
|
7394
7411
|
}
|
|
7395
7412
|
if (arguments.length === 1) {
|
|
7396
7413
|
/* 直接阻止事件 */
|
|
7414
|
+
// eslint-disable-next-line prefer-rest-params
|
|
7397
7415
|
return stopEvent(arguments[0]);
|
|
7398
7416
|
}
|
|
7399
7417
|
else {
|
|
@@ -7409,11 +7427,11 @@
|
|
|
7409
7427
|
}
|
|
7410
7428
|
}
|
|
7411
7429
|
/**
|
|
7412
|
-
|
|
7413
|
-
|
|
7414
|
-
|
|
7415
|
-
|
|
7416
|
-
|
|
7430
|
+
* 在canvas元素节点上绘制进度圆圈
|
|
7431
|
+
* @example
|
|
7432
|
+
let progress = new Utils.Process({canvasNode:document.querySelector("canvas")});
|
|
7433
|
+
progress.draw();
|
|
7434
|
+
* **/
|
|
7417
7435
|
Progress = Progress;
|
|
7418
7436
|
registerTrustClickEvent(isTrustValue = true, filter) {
|
|
7419
7437
|
function trustEvent(event) {
|
|
@@ -7435,8 +7453,8 @@
|
|
|
7435
7453
|
}
|
|
7436
7454
|
const originalListener = EventTarget.prototype.addEventListener;
|
|
7437
7455
|
EventTarget.prototype.addEventListener = function (...args) {
|
|
7438
|
-
|
|
7439
|
-
|
|
7456
|
+
const type = args[0];
|
|
7457
|
+
const callback = args[1];
|
|
7440
7458
|
// let options = args[2];
|
|
7441
7459
|
if (filter(type)) {
|
|
7442
7460
|
if (typeof callback === "function") {
|
|
@@ -7445,7 +7463,7 @@
|
|
|
7445
7463
|
};
|
|
7446
7464
|
}
|
|
7447
7465
|
else if (typeof callback === "object" && "handleEvent" in callback) {
|
|
7448
|
-
|
|
7466
|
+
const oldHandleEvent = callback["handleEvent"];
|
|
7449
7467
|
args[1]["handleEvent"] = function (event) {
|
|
7450
7468
|
if (event == null) {
|
|
7451
7469
|
return;
|
|
@@ -7456,7 +7474,7 @@
|
|
|
7456
7474
|
event instanceof Proxy;
|
|
7457
7475
|
oldHandleEvent.call(this, trustEvent(event));
|
|
7458
7476
|
}
|
|
7459
|
-
catch
|
|
7477
|
+
catch {
|
|
7460
7478
|
Reflect.set(event, "isTrusted", isTrustValue);
|
|
7461
7479
|
}
|
|
7462
7480
|
};
|
|
@@ -7479,7 +7497,7 @@
|
|
|
7479
7497
|
return isNegative ? -reversedNum : reversedNum;
|
|
7480
7498
|
}
|
|
7481
7499
|
selectElementText(element, childTextNode, startIndex, endIndex) {
|
|
7482
|
-
|
|
7500
|
+
const range = this.windowApi.document.createRange();
|
|
7483
7501
|
range.selectNodeContents(element);
|
|
7484
7502
|
if (childTextNode) {
|
|
7485
7503
|
if (childTextNode.nodeType !== Node.TEXT_NODE) {
|
|
@@ -7490,7 +7508,7 @@
|
|
|
7490
7508
|
range.setEnd(childTextNode, endIndex);
|
|
7491
7509
|
}
|
|
7492
7510
|
}
|
|
7493
|
-
|
|
7511
|
+
const selection = this.windowApi.globalThis.getSelection();
|
|
7494
7512
|
if (selection) {
|
|
7495
7513
|
selection.removeAllRanges();
|
|
7496
7514
|
selection.addRange(range);
|
|
@@ -7518,7 +7536,7 @@
|
|
|
7518
7536
|
else {
|
|
7519
7537
|
textType = "text/plain";
|
|
7520
7538
|
}
|
|
7521
|
-
|
|
7539
|
+
const UtilsContext = this;
|
|
7522
7540
|
class UtilsClipboard {
|
|
7523
7541
|
#resolve;
|
|
7524
7542
|
#copyData;
|
|
@@ -7530,7 +7548,7 @@
|
|
|
7530
7548
|
}
|
|
7531
7549
|
async init() {
|
|
7532
7550
|
let copyStatus = false;
|
|
7533
|
-
|
|
7551
|
+
const requestPermissionStatus = await this.requestClipboardPermission();
|
|
7534
7552
|
console.log(requestPermissionStatus);
|
|
7535
7553
|
if (this.hasClipboard() && (this.hasClipboardWrite() || this.hasClipboardWriteText())) {
|
|
7536
7554
|
try {
|
|
@@ -7569,7 +7587,7 @@
|
|
|
7569
7587
|
*/
|
|
7570
7588
|
copyTextByTextArea() {
|
|
7571
7589
|
try {
|
|
7572
|
-
|
|
7590
|
+
const copyElement = UtilsContext.windowApi.document.createElement("textarea");
|
|
7573
7591
|
copyElement.value = this.#copyData;
|
|
7574
7592
|
copyElement.setAttribute("type", "text");
|
|
7575
7593
|
copyElement.setAttribute("style", "opacity:0;position:absolute;");
|
|
@@ -7589,20 +7607,17 @@
|
|
|
7589
7607
|
* 申请剪贴板权限
|
|
7590
7608
|
*/
|
|
7591
7609
|
requestClipboardPermission() {
|
|
7592
|
-
return new Promise((resolve
|
|
7610
|
+
return new Promise((resolve) => {
|
|
7593
7611
|
if (navigator.permissions && navigator.permissions.query) {
|
|
7594
7612
|
navigator.permissions
|
|
7595
7613
|
.query({
|
|
7596
7614
|
name: "clipboard-write",
|
|
7597
7615
|
})
|
|
7598
|
-
.then((
|
|
7616
|
+
.then(() => {
|
|
7599
7617
|
resolve(true);
|
|
7600
7618
|
})
|
|
7601
7619
|
.catch((error) => {
|
|
7602
|
-
console.error([
|
|
7603
|
-
"申请剪贴板权限失败,尝试直接写入👉",
|
|
7604
|
-
error.message ?? error.name ?? error.stack,
|
|
7605
|
-
]);
|
|
7620
|
+
console.error(["申请剪贴板权限失败,尝试直接写入👉", error.message ?? error.name ?? error.stack]);
|
|
7606
7621
|
resolve(false);
|
|
7607
7622
|
});
|
|
7608
7623
|
}
|
|
@@ -7629,7 +7644,7 @@
|
|
|
7629
7644
|
}
|
|
7630
7645
|
else {
|
|
7631
7646
|
/* 可复制对象 */
|
|
7632
|
-
|
|
7647
|
+
const textBlob = new Blob([this.#copyData], {
|
|
7633
7648
|
type: this.#copyDataType,
|
|
7634
7649
|
});
|
|
7635
7650
|
navigator.clipboard
|
|
@@ -7661,7 +7676,7 @@
|
|
|
7661
7676
|
});
|
|
7662
7677
|
}
|
|
7663
7678
|
setTimeout(callback, delayTime = 0) {
|
|
7664
|
-
|
|
7679
|
+
const UtilsContext = this;
|
|
7665
7680
|
if (typeof callback !== "function" && typeof callback !== "string") {
|
|
7666
7681
|
throw new TypeError("Utils.setTimeout 参数 callback 必须为 function|string 类型");
|
|
7667
7682
|
}
|
|
@@ -7675,7 +7690,7 @@
|
|
|
7675
7690
|
});
|
|
7676
7691
|
}
|
|
7677
7692
|
sleep(delayTime = 0) {
|
|
7678
|
-
|
|
7693
|
+
const UtilsContext = this;
|
|
7679
7694
|
if (typeof delayTime !== "number") {
|
|
7680
7695
|
throw new Error("Utils.sleep 参数 delayTime 必须为 number 类型");
|
|
7681
7696
|
}
|
|
@@ -7686,18 +7701,18 @@
|
|
|
7686
7701
|
});
|
|
7687
7702
|
}
|
|
7688
7703
|
dragSlider(selector, offsetX = this.windowApi.window.innerWidth) {
|
|
7689
|
-
|
|
7704
|
+
const UtilsContext = this;
|
|
7690
7705
|
function initMouseEvent(eventName, offSetX, offSetY) {
|
|
7691
|
-
|
|
7692
|
-
|
|
7706
|
+
const win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
|
|
7707
|
+
const mouseEvent = UtilsContext.windowApi.document.createEvent("MouseEvents");
|
|
7693
7708
|
mouseEvent.initMouseEvent(eventName, true, true, win, 0, offSetX, offSetY, offSetX, offSetY, false, false, false, false, 0, null);
|
|
7694
7709
|
return mouseEvent;
|
|
7695
7710
|
}
|
|
7696
|
-
|
|
7711
|
+
const sliderElement = typeof selector === "string" ? domUtils.selector(selector) : selector;
|
|
7697
7712
|
if (!(sliderElement instanceof Node) || !(sliderElement instanceof Element)) {
|
|
7698
7713
|
throw new Error("Utils.dragSlider 参数selector 必须为Node/Element类型");
|
|
7699
7714
|
}
|
|
7700
|
-
|
|
7715
|
+
const rect = sliderElement.getBoundingClientRect(), x0 = rect.x || rect.left, y0 = rect.y || rect.top, x1 = x0 + offsetX, y1 = y0;
|
|
7701
7716
|
sliderElement.dispatchEvent(initMouseEvent("mousedown", x0, y0));
|
|
7702
7717
|
sliderElement.dispatchEvent(initMouseEvent("mousemove", x1, y1));
|
|
7703
7718
|
sliderElement.dispatchEvent(initMouseEvent("mouseleave", x1, y1));
|
|
@@ -7725,34 +7740,34 @@
|
|
|
7725
7740
|
console.error(err);
|
|
7726
7741
|
}
|
|
7727
7742
|
}
|
|
7728
|
-
exitFullScreen(
|
|
7729
|
-
if (
|
|
7730
|
-
return
|
|
7743
|
+
exitFullScreen($el = this.windowApi.document.documentElement) {
|
|
7744
|
+
if ($el.exitFullscreen) {
|
|
7745
|
+
return $el.exitFullscreen();
|
|
7731
7746
|
}
|
|
7732
|
-
else if (
|
|
7733
|
-
return
|
|
7747
|
+
else if ($el.msExitFullscreen) {
|
|
7748
|
+
return $el.msExitFullscreen();
|
|
7734
7749
|
}
|
|
7735
|
-
else if (
|
|
7736
|
-
return
|
|
7750
|
+
else if ($el.mozCancelFullScreen) {
|
|
7751
|
+
return $el.mozCancelFullScreen();
|
|
7737
7752
|
}
|
|
7738
|
-
else if (
|
|
7739
|
-
return
|
|
7753
|
+
else if ($el.webkitCancelFullScreen) {
|
|
7754
|
+
return $el.webkitCancelFullScreen();
|
|
7740
7755
|
}
|
|
7741
7756
|
else {
|
|
7742
|
-
return new Promise((
|
|
7757
|
+
return new Promise((_, reject) => {
|
|
7743
7758
|
reject(new TypeError("该浏览器不支持全屏API"));
|
|
7744
7759
|
});
|
|
7745
7760
|
}
|
|
7746
7761
|
}
|
|
7747
7762
|
sortListByProperty(data, getPropertyValueFunc, sortByDesc = true) {
|
|
7748
|
-
|
|
7763
|
+
const UtilsContext = this;
|
|
7749
7764
|
if (typeof getPropertyValueFunc !== "function" && typeof getPropertyValueFunc !== "string") {
|
|
7750
7765
|
throw new Error("Utils.sortListByProperty 参数 getPropertyValueFunc 必须为 function|string 类型");
|
|
7751
7766
|
}
|
|
7752
7767
|
if (typeof sortByDesc !== "boolean") {
|
|
7753
7768
|
throw new Error("Utils.sortListByProperty 参数 sortByDesc 必须为 boolean 类型");
|
|
7754
7769
|
}
|
|
7755
|
-
|
|
7770
|
+
const getObjValue = function (obj) {
|
|
7756
7771
|
return typeof getPropertyValueFunc === "string" ? obj[getPropertyValueFunc] : getPropertyValueFunc(obj);
|
|
7757
7772
|
};
|
|
7758
7773
|
/**
|
|
@@ -7761,9 +7776,9 @@
|
|
|
7761
7776
|
* @param {any} before_obj
|
|
7762
7777
|
* @returns
|
|
7763
7778
|
*/
|
|
7764
|
-
|
|
7765
|
-
|
|
7766
|
-
|
|
7779
|
+
const sortFunc = function (after_obj, before_obj) {
|
|
7780
|
+
const beforeValue = getObjValue(before_obj); /* 前 */
|
|
7781
|
+
const afterValue = getObjValue(after_obj); /* 后 */
|
|
7767
7782
|
if (sortByDesc) {
|
|
7768
7783
|
if (afterValue > beforeValue) {
|
|
7769
7784
|
return -1;
|
|
@@ -7792,19 +7807,18 @@
|
|
|
7792
7807
|
* @param nodeList 元素列表
|
|
7793
7808
|
* @param getNodeListFunc 获取元素列表的函数
|
|
7794
7809
|
*/
|
|
7795
|
-
|
|
7796
|
-
|
|
7810
|
+
const sortNodeFunc = function (nodeList, getNodeListFunc) {
|
|
7811
|
+
const nodeListLength = nodeList.length;
|
|
7797
7812
|
for (let i = 0; i < nodeListLength - 1; i++) {
|
|
7798
7813
|
for (let j = 0; j < nodeListLength - 1 - i; j++) {
|
|
7799
|
-
|
|
7800
|
-
|
|
7801
|
-
|
|
7802
|
-
|
|
7803
|
-
if ((sortByDesc == true && beforeValue < afterValue) ||
|
|
7804
|
-
(sortByDesc == false && beforeValue > afterValue)) {
|
|
7814
|
+
const beforeNode = nodeList[j];
|
|
7815
|
+
const afterNode = nodeList[j + 1];
|
|
7816
|
+
const beforeValue = getObjValue(beforeNode); /* 前 */
|
|
7817
|
+
const afterValue = getObjValue(afterNode); /* 后 */
|
|
7818
|
+
if ((sortByDesc == true && beforeValue < afterValue) || (sortByDesc == false && beforeValue > afterValue)) {
|
|
7805
7819
|
/* 升序/降序 */
|
|
7806
7820
|
/* 相邻元素两两对比 */
|
|
7807
|
-
|
|
7821
|
+
const temp = beforeNode.nextElementSibling;
|
|
7808
7822
|
afterNode.after(beforeNode);
|
|
7809
7823
|
if (temp == null) {
|
|
7810
7824
|
/* 如果为空,那么是最后一个元素,使用append */
|
|
@@ -7862,7 +7876,7 @@
|
|
|
7862
7876
|
return newTargetString;
|
|
7863
7877
|
}
|
|
7864
7878
|
startsWith(target, searchString, position = 0) {
|
|
7865
|
-
|
|
7879
|
+
const UtilsContext = this;
|
|
7866
7880
|
if (position > target.length) {
|
|
7867
7881
|
/* 超出目标字符串的长度 */
|
|
7868
7882
|
return false;
|
|
@@ -7906,7 +7920,7 @@
|
|
|
7906
7920
|
*/
|
|
7907
7921
|
toJSON = commonUtil.toJSON.bind(commonUtil);
|
|
7908
7922
|
toSearchParamsStr(obj, addPrefix) {
|
|
7909
|
-
|
|
7923
|
+
const UtilsContext = this;
|
|
7910
7924
|
let searhParamsStr = "";
|
|
7911
7925
|
if (Array.isArray(obj)) {
|
|
7912
7926
|
obj.forEach((item) => {
|
|
@@ -7914,7 +7928,7 @@
|
|
|
7914
7928
|
searhParamsStr += UtilsContext.toSearchParamsStr(item);
|
|
7915
7929
|
}
|
|
7916
7930
|
else {
|
|
7917
|
-
searhParamsStr +=
|
|
7931
|
+
searhParamsStr += `&${UtilsContext.toSearchParamsStr(item)}`;
|
|
7918
7932
|
}
|
|
7919
7933
|
});
|
|
7920
7934
|
}
|
|
@@ -7922,7 +7936,7 @@
|
|
|
7922
7936
|
searhParamsStr = new URLSearchParams(Object.entries(obj)).toString();
|
|
7923
7937
|
}
|
|
7924
7938
|
if (addPrefix && !searhParamsStr.startsWith("?")) {
|
|
7925
|
-
searhParamsStr =
|
|
7939
|
+
searhParamsStr = `?${searhParamsStr}`;
|
|
7926
7940
|
}
|
|
7927
7941
|
return searhParamsStr;
|
|
7928
7942
|
}
|
|
@@ -7970,7 +7984,7 @@
|
|
|
7970
7984
|
}
|
|
7971
7985
|
}
|
|
7972
7986
|
waitArrayLoopToEnd(data, handleFunc) {
|
|
7973
|
-
|
|
7987
|
+
const UtilsContext = this;
|
|
7974
7988
|
if (typeof handleFunc !== "function" && typeof handleFunc !== "string") {
|
|
7975
7989
|
throw new Error("Utils.waitArrayLoopToEnd 参数 handleDataFunction 必须为 function|string 类型");
|
|
7976
7990
|
}
|
|
@@ -7980,17 +7994,17 @@
|
|
|
7980
7994
|
}
|
|
7981
7995
|
wait(checkFn, timeout, parent) {
|
|
7982
7996
|
const UtilsContext = this;
|
|
7983
|
-
|
|
7997
|
+
const __timeout__ = typeof timeout === "number" ? timeout : 0;
|
|
7984
7998
|
return new Promise((resolve) => {
|
|
7985
|
-
|
|
7999
|
+
const observer = UtilsContext.mutationObserver(parent || UtilsContext.windowApi.document, {
|
|
7986
8000
|
config: {
|
|
7987
8001
|
subtree: true,
|
|
7988
8002
|
childList: true,
|
|
7989
8003
|
attributes: true,
|
|
7990
8004
|
},
|
|
7991
8005
|
immediate: true,
|
|
7992
|
-
callback(
|
|
7993
|
-
|
|
8006
|
+
callback(_, __observer__) {
|
|
8007
|
+
const result = checkFn();
|
|
7994
8008
|
if (result.success) {
|
|
7995
8009
|
// 取消观察器
|
|
7996
8010
|
if (typeof __observer__?.disconnect === "function") {
|
|
@@ -8014,9 +8028,9 @@
|
|
|
8014
8028
|
waitNode(...args) {
|
|
8015
8029
|
// 过滤掉undefined
|
|
8016
8030
|
args = args.filter((arg) => arg !== void 0);
|
|
8017
|
-
|
|
8031
|
+
const UtilsContext = this;
|
|
8018
8032
|
// 选择器
|
|
8019
|
-
|
|
8033
|
+
const selector = args[0];
|
|
8020
8034
|
// 父元素(监听的元素)
|
|
8021
8035
|
let parent = UtilsContext.windowApi.document;
|
|
8022
8036
|
// 超时时间
|
|
@@ -8026,7 +8040,7 @@
|
|
|
8026
8040
|
}
|
|
8027
8041
|
if (args.length === 1) ;
|
|
8028
8042
|
else if (args.length === 2) {
|
|
8029
|
-
|
|
8043
|
+
const secondParam = args[1];
|
|
8030
8044
|
if (typeof secondParam === "number") {
|
|
8031
8045
|
// "div",10000
|
|
8032
8046
|
timeout = secondParam;
|
|
@@ -8042,9 +8056,9 @@
|
|
|
8042
8056
|
else if (args.length === 3) {
|
|
8043
8057
|
// "div",document,10000
|
|
8044
8058
|
// 第二个参数,parent
|
|
8045
|
-
|
|
8059
|
+
const secondParam = args[1];
|
|
8046
8060
|
// 第三个参数,timeout
|
|
8047
|
-
|
|
8061
|
+
const thirdParam = args[2];
|
|
8048
8062
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8049
8063
|
parent = secondParam;
|
|
8050
8064
|
if (typeof thirdParam === "number") {
|
|
@@ -8063,9 +8077,9 @@
|
|
|
8063
8077
|
}
|
|
8064
8078
|
function getNode() {
|
|
8065
8079
|
if (Array.isArray(selector)) {
|
|
8066
|
-
|
|
8080
|
+
const result = [];
|
|
8067
8081
|
for (let index = 0; index < selector.length; index++) {
|
|
8068
|
-
|
|
8082
|
+
const node = domUtils.selector(selector[index]);
|
|
8069
8083
|
if (node) {
|
|
8070
8084
|
result.push(node);
|
|
8071
8085
|
}
|
|
@@ -8082,7 +8096,7 @@
|
|
|
8082
8096
|
}
|
|
8083
8097
|
}
|
|
8084
8098
|
return UtilsContext.wait(() => {
|
|
8085
|
-
|
|
8099
|
+
const node = getNode();
|
|
8086
8100
|
if (node) {
|
|
8087
8101
|
return {
|
|
8088
8102
|
success: true,
|
|
@@ -8100,9 +8114,9 @@
|
|
|
8100
8114
|
waitAnyNode(...args) {
|
|
8101
8115
|
// 过滤掉undefined
|
|
8102
8116
|
args = args.filter((arg) => arg !== void 0);
|
|
8103
|
-
|
|
8117
|
+
const UtilsContext = this;
|
|
8104
8118
|
// 选择器
|
|
8105
|
-
|
|
8119
|
+
const selectorList = args[0];
|
|
8106
8120
|
// 父元素(监听的元素)
|
|
8107
8121
|
let parent = UtilsContext.windowApi.document;
|
|
8108
8122
|
// 超时时间
|
|
@@ -8112,7 +8126,7 @@
|
|
|
8112
8126
|
}
|
|
8113
8127
|
if (args.length === 1) ;
|
|
8114
8128
|
else if (args.length === 2) {
|
|
8115
|
-
|
|
8129
|
+
const secondParam = args[1];
|
|
8116
8130
|
if (typeof secondParam === "number") {
|
|
8117
8131
|
// "div",10000
|
|
8118
8132
|
timeout = secondParam;
|
|
@@ -8128,9 +8142,9 @@
|
|
|
8128
8142
|
else if (args.length === 3) {
|
|
8129
8143
|
// "div",document,10000
|
|
8130
8144
|
// 第二个参数,parent
|
|
8131
|
-
|
|
8145
|
+
const secondParam = args[1];
|
|
8132
8146
|
// 第三个参数,timeout
|
|
8133
|
-
|
|
8147
|
+
const thirdParam = args[2];
|
|
8134
8148
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8135
8149
|
parent = secondParam;
|
|
8136
8150
|
if (typeof thirdParam === "number") {
|
|
@@ -8147,7 +8161,7 @@
|
|
|
8147
8161
|
else {
|
|
8148
8162
|
throw new TypeError("Utils.waitAnyNode 参数个数错误");
|
|
8149
8163
|
}
|
|
8150
|
-
|
|
8164
|
+
const promiseList = selectorList.map((selector) => {
|
|
8151
8165
|
return UtilsContext.waitNode(selector, parent, timeout);
|
|
8152
8166
|
});
|
|
8153
8167
|
return Promise.any(promiseList);
|
|
@@ -8155,9 +8169,9 @@
|
|
|
8155
8169
|
waitNodeList(...args) {
|
|
8156
8170
|
// 过滤掉undefined
|
|
8157
8171
|
args = args.filter((arg) => arg !== void 0);
|
|
8158
|
-
|
|
8172
|
+
const UtilsContext = this;
|
|
8159
8173
|
// 选择器数组
|
|
8160
|
-
|
|
8174
|
+
const selector = args[0];
|
|
8161
8175
|
// 父元素(监听的元素)
|
|
8162
8176
|
let parent = UtilsContext.windowApi.document;
|
|
8163
8177
|
// 超时时间
|
|
@@ -8167,7 +8181,7 @@
|
|
|
8167
8181
|
}
|
|
8168
8182
|
if (args.length === 1) ;
|
|
8169
8183
|
else if (args.length === 2) {
|
|
8170
|
-
|
|
8184
|
+
const secondParam = args[1];
|
|
8171
8185
|
if (typeof secondParam === "number") {
|
|
8172
8186
|
// "div",10000
|
|
8173
8187
|
timeout = secondParam;
|
|
@@ -8183,9 +8197,9 @@
|
|
|
8183
8197
|
else if (args.length === 3) {
|
|
8184
8198
|
// "div",document,10000
|
|
8185
8199
|
// 第二个参数,parent
|
|
8186
|
-
|
|
8200
|
+
const secondParam = args[1];
|
|
8187
8201
|
// 第三个参数,timeout
|
|
8188
|
-
|
|
8202
|
+
const thirdParam = args[2];
|
|
8189
8203
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8190
8204
|
parent = secondParam;
|
|
8191
8205
|
if (typeof thirdParam === "number") {
|
|
@@ -8204,9 +8218,9 @@
|
|
|
8204
8218
|
}
|
|
8205
8219
|
function getNodeList() {
|
|
8206
8220
|
if (Array.isArray(selector)) {
|
|
8207
|
-
|
|
8221
|
+
const result = [];
|
|
8208
8222
|
for (let index = 0; index < selector.length; index++) {
|
|
8209
|
-
|
|
8223
|
+
const nodeList = domUtils.selectorAll(selector[index], parent);
|
|
8210
8224
|
if (nodeList.length) {
|
|
8211
8225
|
result.push(nodeList);
|
|
8212
8226
|
}
|
|
@@ -8216,14 +8230,14 @@
|
|
|
8216
8230
|
}
|
|
8217
8231
|
}
|
|
8218
8232
|
else {
|
|
8219
|
-
|
|
8233
|
+
const nodeList = domUtils.selectorAll(selector, parent);
|
|
8220
8234
|
if (nodeList.length) {
|
|
8221
8235
|
return nodeList;
|
|
8222
8236
|
}
|
|
8223
8237
|
}
|
|
8224
8238
|
}
|
|
8225
8239
|
return UtilsContext.wait(() => {
|
|
8226
|
-
|
|
8240
|
+
const node = getNodeList();
|
|
8227
8241
|
if (node) {
|
|
8228
8242
|
return {
|
|
8229
8243
|
success: true,
|
|
@@ -8241,9 +8255,9 @@
|
|
|
8241
8255
|
waitAnyNodeList(...args) {
|
|
8242
8256
|
// 过滤掉undefined
|
|
8243
8257
|
args = args.filter((arg) => arg !== void 0);
|
|
8244
|
-
|
|
8258
|
+
const UtilsContext = this;
|
|
8245
8259
|
// 选择器数组
|
|
8246
|
-
|
|
8260
|
+
const selectorList = args[0];
|
|
8247
8261
|
// 父元素(监听的元素)
|
|
8248
8262
|
let parent = UtilsContext.windowApi.document;
|
|
8249
8263
|
// 超时时间
|
|
@@ -8253,7 +8267,7 @@
|
|
|
8253
8267
|
}
|
|
8254
8268
|
if (args.length === 1) ;
|
|
8255
8269
|
else if (args.length === 2) {
|
|
8256
|
-
|
|
8270
|
+
const secondParam = args[1];
|
|
8257
8271
|
if (typeof secondParam === "number") {
|
|
8258
8272
|
// "div",10000
|
|
8259
8273
|
timeout = secondParam;
|
|
@@ -8269,9 +8283,9 @@
|
|
|
8269
8283
|
else if (args.length === 3) {
|
|
8270
8284
|
// "div",document,10000
|
|
8271
8285
|
// 第二个参数,parent
|
|
8272
|
-
|
|
8286
|
+
const secondParam = args[1];
|
|
8273
8287
|
// 第三个参数,timeout
|
|
8274
|
-
|
|
8288
|
+
const thirdParam = args[2];
|
|
8275
8289
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8276
8290
|
parent = secondParam;
|
|
8277
8291
|
if (typeof thirdParam === "number") {
|
|
@@ -8288,7 +8302,7 @@
|
|
|
8288
8302
|
else {
|
|
8289
8303
|
throw new TypeError("Utils.waitAnyNodeList 参数个数错误");
|
|
8290
8304
|
}
|
|
8291
|
-
|
|
8305
|
+
const promiseList = selectorList.map((selector) => {
|
|
8292
8306
|
return UtilsContext.waitNodeList(selector, parent, timeout);
|
|
8293
8307
|
});
|
|
8294
8308
|
return Promise.any(promiseList);
|
|
@@ -8317,13 +8331,13 @@
|
|
|
8317
8331
|
});
|
|
8318
8332
|
}
|
|
8319
8333
|
waitPropertyByInterval(checkObj, checkPropertyName, intervalTimer = 250, maxTime = -1) {
|
|
8320
|
-
|
|
8334
|
+
const UtilsContext = this;
|
|
8321
8335
|
if (checkObj == null) {
|
|
8322
8336
|
throw new TypeError("checkObj 不能为空对象 ");
|
|
8323
8337
|
}
|
|
8324
8338
|
let isResolve = false;
|
|
8325
8339
|
return new Promise((resolve, reject) => {
|
|
8326
|
-
|
|
8340
|
+
const interval = UtilsContext.workerSetInterval(() => {
|
|
8327
8341
|
let obj = checkObj;
|
|
8328
8342
|
if (typeof checkObj === "function") {
|
|
8329
8343
|
obj = checkObj();
|
|
@@ -8356,7 +8370,7 @@
|
|
|
8356
8370
|
throw new Error("Utils.waitVueByInterval 参数element 不能为空");
|
|
8357
8371
|
}
|
|
8358
8372
|
let flag = false;
|
|
8359
|
-
|
|
8373
|
+
const UtilsContext = this;
|
|
8360
8374
|
try {
|
|
8361
8375
|
await UtilsContext.waitPropertyByInterval(element, function (targetElement) {
|
|
8362
8376
|
if (targetElement == null) {
|
|
@@ -8368,7 +8382,7 @@
|
|
|
8368
8382
|
if (propertyName == null) {
|
|
8369
8383
|
return true;
|
|
8370
8384
|
}
|
|
8371
|
-
|
|
8385
|
+
const vueObject = targetElement[vueName];
|
|
8372
8386
|
if (typeof propertyName === "string") {
|
|
8373
8387
|
if (propertyName in vueObject) {
|
|
8374
8388
|
flag = true;
|
|
@@ -8384,6 +8398,7 @@
|
|
|
8384
8398
|
}
|
|
8385
8399
|
return false;
|
|
8386
8400
|
}, timer, maxTime);
|
|
8401
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8387
8402
|
}
|
|
8388
8403
|
catch (error) {
|
|
8389
8404
|
return flag;
|
|
@@ -8442,7 +8457,7 @@
|
|
|
8442
8457
|
if (target == null) {
|
|
8443
8458
|
return;
|
|
8444
8459
|
}
|
|
8445
|
-
|
|
8460
|
+
const handleResult = handler(target);
|
|
8446
8461
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8447
8462
|
return handleResult.data;
|
|
8448
8463
|
}
|
|
@@ -8455,10 +8470,10 @@
|
|
|
8455
8470
|
*/
|
|
8456
8471
|
async asyncQueryProperty(target, handler) {
|
|
8457
8472
|
if (target == null) {
|
|
8458
|
-
// @ts-
|
|
8473
|
+
// @ts-expect-error 空返回
|
|
8459
8474
|
return;
|
|
8460
8475
|
}
|
|
8461
|
-
|
|
8476
|
+
const handleResult = await handler(target);
|
|
8462
8477
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8463
8478
|
return handleResult.data;
|
|
8464
8479
|
}
|
|
@@ -8566,6 +8581,7 @@
|
|
|
8566
8581
|
workerSetTimeout(callback, timeout = 0) {
|
|
8567
8582
|
try {
|
|
8568
8583
|
return setTimeout$1(callback, timeout);
|
|
8584
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8569
8585
|
}
|
|
8570
8586
|
catch (error) {
|
|
8571
8587
|
return this.windowApi.setTimeout(callback, timeout);
|
|
@@ -8580,8 +8596,10 @@
|
|
|
8580
8596
|
if (timeId != null) {
|
|
8581
8597
|
clearTimeout$1(timeId);
|
|
8582
8598
|
}
|
|
8599
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8583
8600
|
}
|
|
8584
8601
|
catch (error) {
|
|
8602
|
+
// console.log(error);
|
|
8585
8603
|
}
|
|
8586
8604
|
finally {
|
|
8587
8605
|
this.windowApi.clearTimeout(timeId);
|
|
@@ -8595,6 +8613,7 @@
|
|
|
8595
8613
|
workerSetInterval(callback, timeout = 0) {
|
|
8596
8614
|
try {
|
|
8597
8615
|
return setInterval(callback, timeout);
|
|
8616
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8598
8617
|
}
|
|
8599
8618
|
catch (error) {
|
|
8600
8619
|
return this.windowApi.setInterval(callback, timeout);
|
|
@@ -8609,8 +8628,10 @@
|
|
|
8609
8628
|
if (timeId != null) {
|
|
8610
8629
|
clearInterval(timeId);
|
|
8611
8630
|
}
|
|
8631
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8612
8632
|
}
|
|
8613
8633
|
catch (error) {
|
|
8634
|
+
// console.log(error);
|
|
8614
8635
|
}
|
|
8615
8636
|
finally {
|
|
8616
8637
|
this.windowApi.clearInterval(timeId);
|
|
@@ -8644,10 +8665,10 @@
|
|
|
8644
8665
|
.query({
|
|
8645
8666
|
name: "clipboard-read",
|
|
8646
8667
|
})
|
|
8647
|
-
.then((
|
|
8668
|
+
.then(() => {
|
|
8648
8669
|
readClipboardText();
|
|
8649
8670
|
})
|
|
8650
|
-
.catch((
|
|
8671
|
+
.catch(() => {
|
|
8651
8672
|
/* 该权限申请Api可能在该环境下不生效,尝试直接读取剪贴板 */
|
|
8652
8673
|
readClipboardText();
|
|
8653
8674
|
});
|
|
@@ -8684,7 +8705,7 @@
|
|
|
8684
8705
|
});
|
|
8685
8706
|
}
|
|
8686
8707
|
}
|
|
8687
|
-
|
|
8708
|
+
const utils = new Utils();
|
|
8688
8709
|
|
|
8689
8710
|
return utils;
|
|
8690
8711
|
|