atr-components 0.2.417 → 2.0.1
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/atr-components.module.d.ts +9 -9
- package/atr-public-api.d.ts +53 -53
- package/core/animations/animations.d.ts +1 -1
- package/core/animations/fly-in.d.ts +1 -1
- package/core/animations/scroll-screen.d.ts +1 -1
- package/core/auth/auth.guard.d.ts +11 -11
- package/core/base/atr-common.d.ts +347 -347
- package/core/directive/error-img.directive.d.ts +10 -10
- package/core/directive/hq-spin.directive.d.ts +13 -13
- package/core/directive/role.directive.d.ts +16 -16
- package/core/interceptor/base.interceptor.d.ts +17 -17
- package/core/ngz-module/cus-zorro-antd.module.d.ts +75 -75
- package/core/pipe/china-num.pipe.d.ts +7 -7
- package/core/pipe/count.pipe.d.ts +7 -7
- package/core/pipe/day.pipe.d.ts +8 -8
- package/core/pipe/defaultVal.pipe.d.ts +7 -7
- package/core/pipe/dicts.pipe.d.ts +10 -10
- package/core/pipe/image-pipe.pipe.d.ts +8 -8
- package/core/pipe/is-empty.pipe.d.ts +7 -7
- package/core/pipe/is-not-empty.pipe.d.ts +7 -7
- package/core/pipe/oss.pipe.d.ts +7 -7
- package/core/pipe/ossStatic.pipe.d.ts +7 -7
- package/core/pipe/pipe-module.module.d.ts +21 -21
- package/core/pipe/remove-html.pipe.d.ts +10 -10
- package/core/pipe/safe-compute.pipe.d.ts +7 -7
- package/core/pipe/safe-html.pipe.d.ts +10 -10
- package/core/pipe/safe-url.pipe.d.ts +10 -10
- package/core/routereuse/atr-reuse-strategy.d.ts +19 -19
- package/core/services/dict/dict.service.d.ts +20 -20
- package/core/services/http.service.d.ts +31 -31
- package/core/services/menu.service.d.ts +29 -29
- package/core/services/upload-oss.service.d.ts +14 -14
- package/core/utils/ToolsUtil.d.ts +180 -180
- package/core/utils/localstorage.util.d.ts +15 -15
- package/core/utils/sessionstorage.util.d.ts +15 -15
- package/{esm2020 → esm2022}/atr-components.mjs +4 -4
- package/esm2022/atr-components.module.mjs +36 -0
- package/{esm2020 → esm2022}/atr-public-api.mjs +54 -54
- package/{esm2020 → esm2022}/core/animations/animations.mjs +9 -9
- package/{esm2020 → esm2022}/core/animations/fly-in.mjs +18 -18
- package/{esm2020 → esm2022}/core/animations/scroll-screen.mjs +22 -22
- package/{esm2020 → esm2022}/core/auth/auth.guard.mjs +37 -37
- package/esm2022/core/base/atr-common.mjs +47 -0
- package/{esm2020 → esm2022}/core/directive/error-img.directive.mjs +31 -31
- package/{esm2020 → esm2022}/core/directive/hq-spin.directive.mjs +48 -48
- package/esm2022/core/directive/role.directive.mjs +69 -0
- package/{esm2020 → esm2022}/core/interceptor/base.interceptor.mjs +165 -165
- package/{esm2020 → esm2022}/core/ngz-module/cus-zorro-antd.module.mjs +292 -292
- package/{esm2020 → esm2022}/core/pipe/china-num.pipe.mjs +36 -36
- package/{esm2020 → esm2022}/core/pipe/count.pipe.mjs +34 -34
- package/{esm2020 → esm2022}/core/pipe/day.pipe.mjs +24 -24
- package/{esm2020 → esm2022}/core/pipe/defaultVal.pipe.mjs +23 -23
- package/{esm2020 → esm2022}/core/pipe/dicts.pipe.mjs +28 -28
- package/{esm2020 → esm2022}/core/pipe/image-pipe.pipe.mjs +17 -17
- package/{esm2020 → esm2022}/core/pipe/is-empty.pipe.mjs +20 -20
- package/{esm2020 → esm2022}/core/pipe/is-not-empty.pipe.mjs +17 -17
- package/{esm2020 → esm2022}/core/pipe/oss.pipe.mjs +17 -17
- package/{esm2020 → esm2022}/core/pipe/ossStatic.pipe.mjs +17 -17
- package/esm2022/core/pipe/pipe-module.module.mjs +38 -0
- package/{esm2020 → esm2022}/core/pipe/remove-html.pipe.mjs +21 -21
- package/{esm2020 → esm2022}/core/pipe/safe-compute.pipe.mjs +23 -23
- package/{esm2020 → esm2022}/core/pipe/safe-html.pipe.mjs +20 -20
- package/{esm2020 → esm2022}/core/pipe/safe-url.pipe.mjs +20 -20
- package/esm2022/core/routereuse/atr-reuse-strategy.mjs +79 -0
- package/esm2022/core/services/dict/dict.service.mjs +152 -0
- package/{esm2020 → esm2022}/core/services/http.service.mjs +306 -306
- package/{esm2020 → esm2022}/core/services/menu.service.mjs +130 -130
- package/{esm2020 → esm2022}/core/services/upload-oss.service.mjs +74 -74
- package/esm2022/core/utils/ToolsUtil.mjs +622 -0
- package/{esm2020 → esm2022}/core/utils/localstorage.util.mjs +94 -94
- package/{esm2020 → esm2022}/core/utils/sessionstorage.util.mjs +72 -72
- package/{esm2020 → esm2022}/lib/hello/hello.component.mjs +15 -15
- package/esm2022/lib/hello/hello.module.mjs +20 -0
- package/esm2022/lib/shared/atr-shared.module.mjs +204 -0
- package/esm2022/lib/shared/echarts/echarts.component.mjs +77 -0
- package/esm2022/lib/shared/form/form.component.mjs +574 -0
- package/esm2022/lib/shared/img-canvas/img-canvas.component.mjs +132 -0
- package/esm2022/lib/shared/local-upload/local-upload.component.mjs +68 -0
- package/esm2022/lib/shared/quill-editor/quill-editor.component.mjs +248 -0
- package/esm2022/lib/shared/select-icons/select-icons.component.mjs +90 -0
- package/{esm2020 → esm2022}/lib/shared/select-tree/select-tree.component.mjs +55 -55
- package/{esm2020 → esm2022}/lib/shared/service/busi.service.mjs +69 -69
- package/{esm2020 → esm2022}/lib/shared/share.service.mjs +107 -107
- package/esm2022/lib/shared/table/table-form-item/table-form-item.component.mjs +96 -0
- package/esm2022/lib/shared/table/table-td/table-td.component.mjs +165 -0
- package/esm2022/lib/shared/table/table.component.mjs +749 -0
- package/{esm2020 → esm2022}/lib/shared/upload/upload.component.mjs +274 -274
- package/{esm2020 → esm2022}/lib/shared/validators/atr-validtors.mjs +8 -8
- package/esm2022/lib/shared/video/video.component.mjs +16 -0
- package/esm2022/lib/shared/view-form/view-form.component.mjs +181 -0
- package/{fesm2020 → fesm2022}/atr-components.mjs +5311 -5312
- package/fesm2022/atr-components.mjs.map +1 -0
- package/{atr-components.d.ts → index.d.ts} +5 -5
- package/lib/hello/hello.component.d.ts +8 -8
- package/lib/hello/hello.module.d.ts +8 -8
- package/lib/shared/atr-shared.module.d.ts +36 -33
- package/lib/shared/echarts/echarts.component.d.ts +34 -34
- package/lib/shared/form/form.component.d.ts +45 -45
- package/lib/shared/img-canvas/img-canvas.component.d.ts +28 -28
- package/lib/shared/local-upload/local-upload.component.d.ts +22 -22
- package/lib/shared/quill-editor/quill-editor.component.d.ts +45 -45
- package/lib/shared/select-icons/select-icons.component.d.ts +24 -24
- package/lib/shared/select-tree/select-tree.component.d.ts +23 -23
- package/lib/shared/service/busi.service.d.ts +20 -20
- package/lib/shared/share.service.d.ts +14 -14
- package/lib/shared/table/table-form-item/table-form-item.component.d.ts +25 -25
- package/lib/shared/table/table-td/table-td.component.d.ts +26 -26
- package/lib/shared/table/table.component.d.ts +94 -94
- package/lib/shared/upload/upload.component.d.ts +53 -53
- package/lib/shared/validators/atr-validtors.d.ts +2 -2
- package/lib/shared/video/video.component.d.ts +7 -7
- package/lib/shared/view-form/view-form.component.d.ts +28 -28
- package/package.json +14 -22
- package/esm2020/atr-components.module.mjs +0 -38
- package/esm2020/core/base/atr-common.mjs +0 -47
- package/esm2020/core/directive/role.directive.mjs +0 -69
- package/esm2020/core/pipe/pipe-module.module.mjs +0 -40
- package/esm2020/core/routereuse/atr-reuse-strategy.mjs +0 -79
- package/esm2020/core/services/dict/dict.service.mjs +0 -152
- package/esm2020/core/utils/ToolsUtil.mjs +0 -622
- package/esm2020/lib/hello/hello.module.mjs +0 -22
- package/esm2020/lib/shared/atr-shared.module.mjs +0 -199
- package/esm2020/lib/shared/echarts/echarts.component.mjs +0 -77
- package/esm2020/lib/shared/form/form.component.mjs +0 -574
- package/esm2020/lib/shared/img-canvas/img-canvas.component.mjs +0 -132
- package/esm2020/lib/shared/local-upload/local-upload.component.mjs +0 -68
- package/esm2020/lib/shared/quill-editor/quill-editor.component.mjs +0 -248
- package/esm2020/lib/shared/select-icons/select-icons.component.mjs +0 -90
- package/esm2020/lib/shared/table/table-form-item/table-form-item.component.mjs +0 -96
- package/esm2020/lib/shared/table/table-td/table-td.component.mjs +0 -165
- package/esm2020/lib/shared/table/table.component.mjs +0 -749
- package/esm2020/lib/shared/video/video.component.mjs +0 -15
- package/esm2020/lib/shared/view-form/view-form.component.mjs +0 -181
- package/fesm2015/atr-components.mjs +0 -5522
- package/fesm2015/atr-components.mjs.map +0 -1
- package/fesm2020/atr-components.mjs.map +0 -1
|
@@ -0,0 +1,622 @@
|
|
|
1
|
+
import { atr_static_datas } from '../base/atr-common';
|
|
2
|
+
import { Validators } from "@angular/forms";
|
|
3
|
+
import { SessionStorageUtil } from './sessionstorage.util';
|
|
4
|
+
import { ulid } from 'ulid';
|
|
5
|
+
export class ToolsUtil {
|
|
6
|
+
static { this.ossPrefix = ''; }
|
|
7
|
+
static { this.getOrgCode = function () {
|
|
8
|
+
// var orgCode = '';
|
|
9
|
+
// var hrefs = window.location.href.split('?')
|
|
10
|
+
// if (hrefs.length >= 2) {
|
|
11
|
+
// var paramStr = hrefs[1];
|
|
12
|
+
// //参数字符串里有没带 =?/#
|
|
13
|
+
// orgCode = paramStr.split('=')[0];
|
|
14
|
+
// orgCode = orgCode.split('?')[0];
|
|
15
|
+
// orgCode = orgCode.split('/')[0];
|
|
16
|
+
// orgCode = orgCode.split('#')[0];
|
|
17
|
+
// orgCode = orgCode.split('/')[0];
|
|
18
|
+
// }
|
|
19
|
+
return '';
|
|
20
|
+
}; }
|
|
21
|
+
static getUlid() {
|
|
22
|
+
return ulid();
|
|
23
|
+
}
|
|
24
|
+
static isBase64(string) {
|
|
25
|
+
let reg = /^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i;
|
|
26
|
+
return reg.test(string);
|
|
27
|
+
}
|
|
28
|
+
static dataURItoBlob(code) {
|
|
29
|
+
const parts = code.split(';base64,');
|
|
30
|
+
const contentType = parts[0].split(':')[1];
|
|
31
|
+
const raw = window.atob(parts[1]);
|
|
32
|
+
const rawLength = raw.length;
|
|
33
|
+
const uInt8Array = new Uint8Array(rawLength);
|
|
34
|
+
for (let i = 0; i < rawLength; ++i) {
|
|
35
|
+
uInt8Array[i] = raw.charCodeAt(i);
|
|
36
|
+
}
|
|
37
|
+
return new Blob([uInt8Array], { type: contentType });
|
|
38
|
+
}
|
|
39
|
+
static isNull(val) {
|
|
40
|
+
if (val || ['boolean', 'string', 'number'].some(v => typeof val == v)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
static getControlsConfig(dataFrom, requiredRule) {
|
|
46
|
+
let controlsConfig = {};
|
|
47
|
+
for (const key in dataFrom) {
|
|
48
|
+
if (requiredRule.some(item => item == key)) {
|
|
49
|
+
controlsConfig[key] = [dataFrom[key], [Validators.required]];
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
controlsConfig[key] = [dataFrom[key]];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return controlsConfig;
|
|
56
|
+
}
|
|
57
|
+
static httpSucces(res) {
|
|
58
|
+
return ['200', '201', '204'].some(v => res.status == v);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 计算两点坐标距离
|
|
62
|
+
* @param point1
|
|
63
|
+
* @param point2
|
|
64
|
+
*/
|
|
65
|
+
static getDistance(point1, point2) {
|
|
66
|
+
let distance = Math.sqrt((point2.x - point1.x) * (point2.x - point1.x) + (point2.y - point1.y) * (point2.y - point1.y));
|
|
67
|
+
return distance;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 判断线段是否相交,相交返回交点坐标
|
|
71
|
+
* @param p1
|
|
72
|
+
* @param p2
|
|
73
|
+
*/
|
|
74
|
+
static checkIntersect(lineArr1, lineArr2) {
|
|
75
|
+
//解线性方程组求线段交点
|
|
76
|
+
//如果父母为0,则不需要计算交点 两线平行
|
|
77
|
+
let a = lineArr1[0], b = lineArr1[1], c = lineArr2[0], d = lineArr2[1];
|
|
78
|
+
a = { x: parseFloat(a.x.toFixed(2)), y: parseFloat(a.y.toFixed(2)) };
|
|
79
|
+
b = { x: parseFloat(b.x.toFixed(2)), y: parseFloat(b.y.toFixed(2)) };
|
|
80
|
+
c = { x: parseFloat(c.x.toFixed(2)), y: parseFloat(c.y.toFixed(2)) };
|
|
81
|
+
d = { x: parseFloat(d.x.toFixed(2)), y: parseFloat(d.y.toFixed(2)) };
|
|
82
|
+
console.log((b.y - a.y));
|
|
83
|
+
console.log((d.x - c.x));
|
|
84
|
+
console.log((a.x - b.x));
|
|
85
|
+
console.log((c.y - d.y));
|
|
86
|
+
let denominator = (b.y - a.y) * (d.x - c.x) - (a.x - b.x) * (c.y - d.y);
|
|
87
|
+
if (denominator == 0) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
let x = ((b.x - a.x) * (d.x - c.x) * (c.y - a.y)
|
|
91
|
+
+ (b.y - a.y) * (d.x - c.x) * a.x
|
|
92
|
+
- (d.y - c.y) * (b.x - a.x) * c.x) / denominator, y = -((b.y - a.y) * (d.y - c.y) * (c.x - a.x)
|
|
93
|
+
+ (b.x - a.x) * (d.y - c.y) * a.y
|
|
94
|
+
- (d.x - c.x) * (b.y - a.y) * c.y) / denominator;
|
|
95
|
+
//判断交点是否在两条线段上
|
|
96
|
+
if (
|
|
97
|
+
//交点在线段1
|
|
98
|
+
(x - a.x) * (x - b.x) <= 0 && (y - a.y) * (y - b.y) <= 0 &&
|
|
99
|
+
//并且交点在线段2上
|
|
100
|
+
(x - c.x) * (x - d.x) <= 0 && (y - c.y) * (y - d.y) <= 0) {
|
|
101
|
+
return { x: x, y: y };
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
*
|
|
107
|
+
* @param num1
|
|
108
|
+
* @param num2
|
|
109
|
+
* @param error 误差
|
|
110
|
+
*/
|
|
111
|
+
static equalNum(num1, num2, error = 5) {
|
|
112
|
+
let num = num1 - num2;
|
|
113
|
+
return num < error && num > -error;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 坐标对比
|
|
117
|
+
* @param point1
|
|
118
|
+
* @param point2
|
|
119
|
+
* @param error
|
|
120
|
+
*/
|
|
121
|
+
static equalPoint(point1, point2, error = 5) {
|
|
122
|
+
return ToolsUtil.equalNum(point1.x, point2.x, error) && ToolsUtil.equalNum(point1.y, point2.y, error);
|
|
123
|
+
}
|
|
124
|
+
//判断点是否在线段上
|
|
125
|
+
/**
|
|
126
|
+
*
|
|
127
|
+
* @param startP
|
|
128
|
+
* @param endP
|
|
129
|
+
* @param a
|
|
130
|
+
* @param error 误差
|
|
131
|
+
*/
|
|
132
|
+
static checkInLine(startP, endP, a, error = 5) {
|
|
133
|
+
//点和端点重合
|
|
134
|
+
if (ToolsUtil.equalPoint(startP, endP, error)
|
|
135
|
+
|| ToolsUtil.equalPoint(startP, a)
|
|
136
|
+
|| ToolsUtil.equalPoint(endP, a)) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
if (ToolsUtil.equalNum(startP.x, endP.x, error)
|
|
140
|
+
&& !ToolsUtil.equalNum(startP.x, a.x, error)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
else if (ToolsUtil.equalNum(startP.x, endP.x, error)
|
|
144
|
+
&& ToolsUtil.equalNum(startP.x, a.x, error)) {
|
|
145
|
+
if (startP.y > endP.y) {
|
|
146
|
+
return startP.y > a.y && endP.y < a.y;
|
|
147
|
+
}
|
|
148
|
+
return startP.y < a.y && endP.y > a.y;
|
|
149
|
+
}
|
|
150
|
+
//判断点在线段上
|
|
151
|
+
//斜率是否一致
|
|
152
|
+
let k1 = (endP.y - startP.y) / (endP.x - startP.x);
|
|
153
|
+
let b = startP.y - k1 * startP.x;
|
|
154
|
+
let y = k1 * a.x + b;
|
|
155
|
+
if (ToolsUtil.equalNum(y, a.y, error)) {
|
|
156
|
+
//5像素的误差
|
|
157
|
+
let startLen = ToolsUtil.getLength(startP, a);
|
|
158
|
+
let endLen = ToolsUtil.getLength(a, endP);
|
|
159
|
+
let len = ToolsUtil.getLength(startP, endP);
|
|
160
|
+
return len >= startLen && len >= endLen;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 点斜式
|
|
166
|
+
*/
|
|
167
|
+
static getSlopePoint(startP, endP) {
|
|
168
|
+
//计算斜率
|
|
169
|
+
if (startP.x == endP.x) {
|
|
170
|
+
return { k: Infinity, x: startP.x };
|
|
171
|
+
}
|
|
172
|
+
let k = (endP.y - startP.y) / (endP.x - startP.x);
|
|
173
|
+
let b = startP.y - k * startP.x;
|
|
174
|
+
return { k: k, b: b };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
*判断点是否在坐标区域内
|
|
178
|
+
* @param p 判定的点
|
|
179
|
+
* @param pointsArr
|
|
180
|
+
*/
|
|
181
|
+
static judgeInRec(p, pointsArr) {
|
|
182
|
+
pointsArr = pointsArr.map(item => {
|
|
183
|
+
return { x1: Number(item.x1 || item.x || 0), y1: Number(item.y1 || item.y || 0) };
|
|
184
|
+
});
|
|
185
|
+
p = { x1: p.x1 || p.x || 0, y1: p.y1 || p.y || 0 };
|
|
186
|
+
let px = Number(p.x1), py = Number(p.y1), flag = false, //穿越边框
|
|
187
|
+
inRect = false; //是否在多边形的边或者端点上
|
|
188
|
+
let start = pointsArr[0];
|
|
189
|
+
//如果数组首尾没有相连,手动添加};
|
|
190
|
+
let end = pointsArr[pointsArr.length - 1];
|
|
191
|
+
//如果数组首尾没有相连,手动添加
|
|
192
|
+
pointsArr = start.x1 != end.x1 || start.y1 != end.y1 ? pointsArr.concat(start) : pointsArr;
|
|
193
|
+
//射线选取Y坐标不变,x正方向
|
|
194
|
+
pointsArr.forEach((item, index) => {
|
|
195
|
+
if (index == pointsArr.length - 1
|
|
196
|
+
|| inRect //在多边形的边或者端点上视为在区域内
|
|
197
|
+
) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
let endPoint = pointsArr[index + 1];
|
|
201
|
+
const startX = Number(item.x1), startY = Number(item.y1), endX = Number(endPoint.x1), endY = Number(endPoint.y1);
|
|
202
|
+
//判断点是否在端点上
|
|
203
|
+
if ((px == startX && py == startY)
|
|
204
|
+
|| (px == endX && px == endY)) {
|
|
205
|
+
inRect = true;
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
//判断射线重合并且点在边上
|
|
209
|
+
if ((startY == endY && endY == py)
|
|
210
|
+
&& ((px > endX && px < startX
|
|
211
|
+
|| (px < endX && px > startX)))) {
|
|
212
|
+
inRect = true;
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if ((startY < py && endY >= py)
|
|
216
|
+
|| (startY >= py && endY < py)) {
|
|
217
|
+
//求射线与线段交点的x坐标,y坐标还是py
|
|
218
|
+
let x = startX + (py - startY) * (endX - startX) / (endY - startY);
|
|
219
|
+
//点在边上
|
|
220
|
+
if (x == px) {
|
|
221
|
+
inRect = true;
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
//x大于px来保证射线朝右
|
|
225
|
+
if (x > px) {
|
|
226
|
+
flag = !flag;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
return inRect || flag;
|
|
231
|
+
}
|
|
232
|
+
static diffInput(chng, action) {
|
|
233
|
+
if (chng === undefined)
|
|
234
|
+
return;
|
|
235
|
+
let cur = JSON.stringify(chng.currentValue);
|
|
236
|
+
let prev = JSON.stringify(chng.previousValue);
|
|
237
|
+
if (cur !== prev) {
|
|
238
|
+
action();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
static deepCopy(obj) {
|
|
242
|
+
return JSON.parse(JSON.stringify(obj));
|
|
243
|
+
}
|
|
244
|
+
static diffInputs(chng, action) {
|
|
245
|
+
if (chng === undefined)
|
|
246
|
+
return;
|
|
247
|
+
if (chng.length == 0)
|
|
248
|
+
return;
|
|
249
|
+
for (let i = 0; i < chng.length; i++) {
|
|
250
|
+
let item = chng[i];
|
|
251
|
+
if (item === undefined)
|
|
252
|
+
continue;
|
|
253
|
+
let cur = JSON.stringify(item.currentValue);
|
|
254
|
+
let prev = JSON.stringify(item.previousValue);
|
|
255
|
+
if (cur !== prev) {
|
|
256
|
+
action();
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
static dataURLtoBlob(dataurl) {
|
|
262
|
+
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
|
|
263
|
+
while (n--) {
|
|
264
|
+
u8arr[n] = bstr.charCodeAt(n);
|
|
265
|
+
}
|
|
266
|
+
return new Blob([u8arr], { type: mime });
|
|
267
|
+
}
|
|
268
|
+
static dataURLtoFile(dataurl, filename) {
|
|
269
|
+
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
|
|
270
|
+
while (n--) {
|
|
271
|
+
u8arr[n] = bstr.charCodeAt(n);
|
|
272
|
+
}
|
|
273
|
+
return new File([u8arr], (filename || ToolsUtil.getRandomFileName()), { type: mime });
|
|
274
|
+
}
|
|
275
|
+
static getYesterday(day) {
|
|
276
|
+
let time = day.getTime() - 1000 * 60 * 60 * 24;
|
|
277
|
+
day = new Date(time);
|
|
278
|
+
return day;
|
|
279
|
+
}
|
|
280
|
+
static getTomorrowday(day) {
|
|
281
|
+
let time = day.getTime() + 1000 * 60 * 60 * 24;
|
|
282
|
+
return new Date(time);
|
|
283
|
+
}
|
|
284
|
+
static getNextMonth(day) {
|
|
285
|
+
let ds = new Date(day).setMonth(day.getMonth() + 1);
|
|
286
|
+
return new Date(ds);
|
|
287
|
+
}
|
|
288
|
+
static getVideoCover(url) {
|
|
289
|
+
return ToolsUtil.getOssUrl(url) + "?x-oss-process=video/snapshot,t_10000,m_fast";
|
|
290
|
+
}
|
|
291
|
+
static fistDayOfMonth(day) {
|
|
292
|
+
return new Date(new Date(day).setDate(1));
|
|
293
|
+
}
|
|
294
|
+
static lastDayOfMonth(day) {
|
|
295
|
+
return new Date(ToolsUtil.getNextMonth(day).setDate(0));
|
|
296
|
+
}
|
|
297
|
+
static { this.getRandomFileName = function () {
|
|
298
|
+
const expect = 16;
|
|
299
|
+
let str = Math.random().toString(36).substring(2);
|
|
300
|
+
while (str.length < expect) {
|
|
301
|
+
str += Math.random().toString(36).substring(2);
|
|
302
|
+
}
|
|
303
|
+
return str.substring(0, expect);
|
|
304
|
+
}; }
|
|
305
|
+
static { this.getFileExt = function (fileName) {
|
|
306
|
+
var index = fileName.lastIndexOf(".");
|
|
307
|
+
var suffix = fileName.substr(index + 1);
|
|
308
|
+
return suffix;
|
|
309
|
+
}; }
|
|
310
|
+
static getHttpOptions() {
|
|
311
|
+
return { isCommonHttpHeader: true };
|
|
312
|
+
}
|
|
313
|
+
static resetFormValue(opt, json) {
|
|
314
|
+
for (let item of opt.items) {
|
|
315
|
+
item.value = "";
|
|
316
|
+
for (const key of Object.keys(json)) {
|
|
317
|
+
if (json.hasOwnProperty(key) && json[key] != null && json[key] != undefined && key == item.key) {
|
|
318
|
+
if (item.type == 'date')
|
|
319
|
+
item.value = new Date(json[key]);
|
|
320
|
+
else if (item.type == 'dateTime') {
|
|
321
|
+
item.value = new Date(json[key]);
|
|
322
|
+
}
|
|
323
|
+
else
|
|
324
|
+
item.value = json[key];
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return opt;
|
|
329
|
+
}
|
|
330
|
+
static getFormatDate(date) {
|
|
331
|
+
let month = date.getMonth() + 1;
|
|
332
|
+
let strDate = date.getDate();
|
|
333
|
+
if (month <= 9) {
|
|
334
|
+
month = "0" + month;
|
|
335
|
+
}
|
|
336
|
+
if (strDate <= 9) {
|
|
337
|
+
strDate = "0" + strDate;
|
|
338
|
+
}
|
|
339
|
+
return date.getFullYear() + "-" + month + "-" + strDate;
|
|
340
|
+
// + " "
|
|
341
|
+
// + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
|
|
342
|
+
}
|
|
343
|
+
static getFormatDateFull(date) {
|
|
344
|
+
let month = date.getMonth() + 1;
|
|
345
|
+
let strDate = date.getDate();
|
|
346
|
+
if (month <= 9) {
|
|
347
|
+
month = "0" + month;
|
|
348
|
+
}
|
|
349
|
+
if (strDate <= 9) {
|
|
350
|
+
strDate = "0" + strDate;
|
|
351
|
+
}
|
|
352
|
+
return date.getFullYear() + "-" + month + "-" + strDate + " " + (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ":" + (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ":" + (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
|
|
353
|
+
}
|
|
354
|
+
static getFormatDateWithoutS(date) {
|
|
355
|
+
let month = date.getMonth() + 1;
|
|
356
|
+
let strDate = date.getDate();
|
|
357
|
+
let hours = date.getHours();
|
|
358
|
+
let seconds = date.getMinutes();
|
|
359
|
+
if (month <= 9) {
|
|
360
|
+
month = "0" + month;
|
|
361
|
+
}
|
|
362
|
+
if (strDate <= 9) {
|
|
363
|
+
strDate = "0" + strDate;
|
|
364
|
+
}
|
|
365
|
+
if (hours <= 9) {
|
|
366
|
+
hours = "0" + hours;
|
|
367
|
+
}
|
|
368
|
+
if (seconds <= 9) {
|
|
369
|
+
seconds = "0" + seconds;
|
|
370
|
+
}
|
|
371
|
+
return date.getFullYear() + "-" + month + "-" + strDate + " " + hours + ":" + seconds;
|
|
372
|
+
}
|
|
373
|
+
static getFormatDateHour(date) {
|
|
374
|
+
let month = date.getMonth() + 1;
|
|
375
|
+
let strDate = date.getDate();
|
|
376
|
+
let hours = date.getHours();
|
|
377
|
+
let seconds = date.getMinutes();
|
|
378
|
+
if (month <= 9) {
|
|
379
|
+
month = "0" + month;
|
|
380
|
+
}
|
|
381
|
+
if (strDate <= 9) {
|
|
382
|
+
strDate = "0" + strDate;
|
|
383
|
+
}
|
|
384
|
+
if (hours <= 9) {
|
|
385
|
+
hours = "0" + hours;
|
|
386
|
+
}
|
|
387
|
+
if (seconds <= 9) {
|
|
388
|
+
seconds = "0" + seconds;
|
|
389
|
+
}
|
|
390
|
+
return date.getFullYear() + "" + month + strDate + hours;
|
|
391
|
+
}
|
|
392
|
+
static getOssUrl(url, needTime = false) {
|
|
393
|
+
if (!url) {
|
|
394
|
+
return "";
|
|
395
|
+
}
|
|
396
|
+
if (needTime) {
|
|
397
|
+
// url = url + "?v=" + ToolsUtil.getFormatDateHour(new Date());
|
|
398
|
+
url = url + "?v=" + new Date().getTime();
|
|
399
|
+
}
|
|
400
|
+
if (url.startsWith("http")) {
|
|
401
|
+
return url;
|
|
402
|
+
}
|
|
403
|
+
if (!url.startsWith("/") && !atr_static_datas.OSS_URL.endsWith('/')) {
|
|
404
|
+
url = '/' + url;
|
|
405
|
+
}
|
|
406
|
+
let result = atr_static_datas.OSS_URL + url;
|
|
407
|
+
return result;
|
|
408
|
+
}
|
|
409
|
+
static getStaticOssUrl(url) {
|
|
410
|
+
if (!url) {
|
|
411
|
+
return "";
|
|
412
|
+
}
|
|
413
|
+
if (url.startsWith("http")) {
|
|
414
|
+
return url;
|
|
415
|
+
}
|
|
416
|
+
return atr_static_datas.STATIC_OSS_URL + url;
|
|
417
|
+
}
|
|
418
|
+
static removeHtml(value) {
|
|
419
|
+
if (!value) {
|
|
420
|
+
return '';
|
|
421
|
+
}
|
|
422
|
+
return value.replace(/<[^<>]+>/g, '').replace(/ /ig, '');
|
|
423
|
+
}
|
|
424
|
+
static mul(...numbers) {
|
|
425
|
+
if (numbers.length < 2) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
let m = this.getDigit(numbers);
|
|
429
|
+
let result = 1;
|
|
430
|
+
numbers.forEach((num) => {
|
|
431
|
+
let s = num.toString();
|
|
432
|
+
result *= Number(s.replace(".", ""));
|
|
433
|
+
});
|
|
434
|
+
return result / Math.pow(10, m);
|
|
435
|
+
}
|
|
436
|
+
static getDigit(...numbers) {
|
|
437
|
+
let m = 0;
|
|
438
|
+
numbers.forEach(num => {
|
|
439
|
+
let s = num.toString();
|
|
440
|
+
try {
|
|
441
|
+
m += s.split(".")[1].length;
|
|
442
|
+
}
|
|
443
|
+
catch (e) {
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
return m;
|
|
447
|
+
}
|
|
448
|
+
static downloadImg(data, fileName, endpoint) {
|
|
449
|
+
// // 下载类型 xls
|
|
450
|
+
// const contentType = 'image/jpeg';
|
|
451
|
+
// // const contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
|
|
452
|
+
// // 下载类型:csv
|
|
453
|
+
// const debug = {hello: "world"};
|
|
454
|
+
// const blob = new Blob([],{type : 'image/jpeg'});
|
|
455
|
+
// const url = window.URL.createObjectURL(blob);
|
|
456
|
+
//
|
|
457
|
+
// // 打开新窗口方式进行下载
|
|
458
|
+
// // window.open(url);
|
|
459
|
+
//
|
|
460
|
+
// // 以动态创建a标签进行下载
|
|
461
|
+
const a = document.createElement('a');
|
|
462
|
+
a.href = data;
|
|
463
|
+
// a.download = fileName;
|
|
464
|
+
a.download = fileName ? fileName : "" + endpoint;
|
|
465
|
+
a.click();
|
|
466
|
+
}
|
|
467
|
+
static downloadXls(url, params) {
|
|
468
|
+
if (params) {
|
|
469
|
+
url += "?";
|
|
470
|
+
for (const key of Object.keys(params)) {
|
|
471
|
+
if (params[key]) {
|
|
472
|
+
url += key + "=" + params[key] + "&&";
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// window.open(url);
|
|
477
|
+
const a = document.createElement('a');
|
|
478
|
+
a.href = url;
|
|
479
|
+
// // a.download = fileName;
|
|
480
|
+
// a.download = "3321.xls";
|
|
481
|
+
a.click();
|
|
482
|
+
}
|
|
483
|
+
static getImg(url, param = {
|
|
484
|
+
imgW: 0, imgH: 0,
|
|
485
|
+
needTime: false, isFullUrl: false
|
|
486
|
+
}) {
|
|
487
|
+
return new Promise((resolve, reject) => {
|
|
488
|
+
let dataUrl = SessionStorageUtil.getImg(url);
|
|
489
|
+
let img = new Image();
|
|
490
|
+
img.setAttribute('crossOrigin', 'anonymous');
|
|
491
|
+
if (!dataUrl) {
|
|
492
|
+
img.src = param.isFullUrl ? url : ToolsUtil.getOssUrl(url, param.needTime);
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
let index = dataUrl.indexOf("}") + 1;
|
|
496
|
+
img.src = dataUrl.slice(0, 50) + dataUrl.slice(index);
|
|
497
|
+
}
|
|
498
|
+
img.onload = () => {
|
|
499
|
+
let c = document.createElement('canvas');
|
|
500
|
+
let context2 = c.getContext("2d");
|
|
501
|
+
c.width = param.imgW || img.width;
|
|
502
|
+
c.height = param.imgH || img.height;
|
|
503
|
+
context2.drawImage(img, 0, 0, c.width, c.height);
|
|
504
|
+
let dataUrl = c.toDataURL();
|
|
505
|
+
let str = c.width + "," + c.height + "}";
|
|
506
|
+
dataUrl = dataUrl.slice(0, 50) + str + dataUrl.slice(50);
|
|
507
|
+
//不保存
|
|
508
|
+
// SessionStorageUtil.setImg(url, dataUrl)
|
|
509
|
+
resolve(img);
|
|
510
|
+
};
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
static pixelToNum(width) {
|
|
514
|
+
const re = /px/gi;
|
|
515
|
+
let widthStr = width.replace(re, "");
|
|
516
|
+
return Number(widthStr);
|
|
517
|
+
}
|
|
518
|
+
static { this.allEqual = (...array) => array.every(item => item === array[0]); }
|
|
519
|
+
/**
|
|
520
|
+
* array所有参数满足fn函数返回true
|
|
521
|
+
* all(x => x > 1,1,2,3); // true
|
|
522
|
+
* @param callback
|
|
523
|
+
* @param array
|
|
524
|
+
*/
|
|
525
|
+
static { this.satisfiedFn = (callback, ...array) => array.every(callback); }
|
|
526
|
+
//全部不空为true
|
|
527
|
+
static notEmpty(...arr) {
|
|
528
|
+
return arr.every(item => !!item);
|
|
529
|
+
}
|
|
530
|
+
//包含空为true
|
|
531
|
+
static hasEmpty(...arr) {
|
|
532
|
+
return arr.some(item => !item);
|
|
533
|
+
}
|
|
534
|
+
static allEmpty(...arr) {
|
|
535
|
+
return arr.every(item => !item);
|
|
536
|
+
}
|
|
537
|
+
static isArray(obj) {
|
|
538
|
+
return obj instanceof Array;
|
|
539
|
+
}
|
|
540
|
+
static isEmpty(obj) {
|
|
541
|
+
if (obj === undefined) {
|
|
542
|
+
return true;
|
|
543
|
+
}
|
|
544
|
+
if (obj === null) {
|
|
545
|
+
return true;
|
|
546
|
+
}
|
|
547
|
+
if (typeof obj == 'boolean') {
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
550
|
+
if (obj === 0) {
|
|
551
|
+
return false;
|
|
552
|
+
}
|
|
553
|
+
if (typeof obj == "string" && obj.trim() === '') {
|
|
554
|
+
return true;
|
|
555
|
+
}
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
static encodeValue(params) {
|
|
559
|
+
Object.keys(params).forEach(key => params[key] = encodeURIComponent(params[key]));
|
|
560
|
+
return params;
|
|
561
|
+
}
|
|
562
|
+
static windowHeight() {
|
|
563
|
+
return document.documentElement.clientHeight;
|
|
564
|
+
}
|
|
565
|
+
static windowWidth() {
|
|
566
|
+
return document.documentElement.clientWidth;
|
|
567
|
+
}
|
|
568
|
+
static modaleStyle() {
|
|
569
|
+
return { 'maxHeight': ToolsUtil.windowHeight() - 200 + 'px', 'overflow-y': 'auto' };
|
|
570
|
+
}
|
|
571
|
+
static getLength(pointA, pointB) {
|
|
572
|
+
pointA.x1 = pointA.x || pointA.x1 || 0;
|
|
573
|
+
pointA.y1 = pointA.y || pointA.y1 || 0;
|
|
574
|
+
pointB.y1 = pointB.y || pointB.y1 || 0;
|
|
575
|
+
pointB.x1 = pointB.x || pointB.x1 || 0;
|
|
576
|
+
var lengthAB = Math.sqrt(Math.pow(pointA.x1 - pointB.x1, 2) +
|
|
577
|
+
Math.pow(pointA.y1 - pointB.y1, 2));
|
|
578
|
+
return lengthAB;
|
|
579
|
+
}
|
|
580
|
+
static getRotateNum(pointB, pointC, pointA) {
|
|
581
|
+
pointA.x1 = pointA.x || pointA.x1 || 0;
|
|
582
|
+
pointA.y1 = pointA.y || pointA.y1 || 0;
|
|
583
|
+
pointB.x1 = pointB.y || pointB.x1 || 0;
|
|
584
|
+
pointB.y1 = pointB.x || pointB.x1 || 0;
|
|
585
|
+
pointC.x1 = pointC.y || pointC.x1 || 0;
|
|
586
|
+
pointC.y1 = pointC.x || pointC.x1 || 0;
|
|
587
|
+
//ABC中心点,起始点,终点
|
|
588
|
+
let AB = {};
|
|
589
|
+
let AC = {};
|
|
590
|
+
AB.x1 = pointB.x1 - pointA.x1;
|
|
591
|
+
AB.y1 = pointB.y1 - pointA.y1;
|
|
592
|
+
AC.x1 = pointC.x1 - pointA.x1;
|
|
593
|
+
AC.y1 = pointC.y1 - pointA.y1;
|
|
594
|
+
var direct = AB.x1 * AC.y1 - AB.y1 * AC.y1;
|
|
595
|
+
var lengthAB = this.getLength(pointB, pointA);
|
|
596
|
+
var lengthAC = this.getLength(pointC, pointA);
|
|
597
|
+
var lengthBC = this.getLength(pointB, pointC);
|
|
598
|
+
var cosA = (Math.pow(lengthAB, 2) + Math.pow(lengthAC, 2) -
|
|
599
|
+
Math.pow(lengthBC, 2)) / (2 * lengthAB * lengthAC);
|
|
600
|
+
var angleA = Math.round(Math.acos(cosA) * 180 / Math.PI);
|
|
601
|
+
if (direct < 0) {
|
|
602
|
+
return -angleA;
|
|
603
|
+
}
|
|
604
|
+
else {
|
|
605
|
+
return angleA;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
//绕center点旋转rotate角度
|
|
609
|
+
static getRotatePoint(p, center, rotate) {
|
|
610
|
+
let startX = p.x1;
|
|
611
|
+
let startY = p.y1;
|
|
612
|
+
let a = center.x1;
|
|
613
|
+
let b = center.y1;
|
|
614
|
+
let x1 = a - Math.cos(rotate * Math.PI / 180) * (a - startX) + Math.sin(rotate * Math.PI / 180) * (b - startY);
|
|
615
|
+
let y1 = b - Math.cos(rotate * Math.PI / 180) * (b - startY) - Math.sin(rotate * Math.PI / 180) * (a - startX);
|
|
616
|
+
return {
|
|
617
|
+
x1: x1,
|
|
618
|
+
y1: y1
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9vbHNVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvY29yZS91dGlscy9Ub29sc1V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQixnQkFBZ0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXRFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTFCLE1BQU0sT0FBTyxTQUFTO2FBQ2IsY0FBUyxHQUFXLEVBQUUsQ0FBQzthQUN2QixlQUFVLEdBQUc7UUFDbEIsb0JBQW9CO1FBQ3BCLDhDQUE4QztRQUM5QywyQkFBMkI7UUFDM0IsNkJBQTZCO1FBQzdCLHFCQUFxQjtRQUNyQixzQ0FBc0M7UUFDdEMscUNBQXFDO1FBQ3JDLHFDQUFxQztRQUNyQyxxQ0FBcUM7UUFDckMscUNBQXFDO1FBQ3JDLElBQUk7UUFFSixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQTtJQUVELE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQVc7UUFDekIsSUFBSSxHQUFHLEdBQUcsNEdBQTRHLENBQUM7UUFDdkgsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQVM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMs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TyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7UUFDbkUsQ0FBQyxHQUFHLEVBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQ25FLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQTtRQUNsRSxDQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7UUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUE7U0FDYjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2NBQzFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztjQUMvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFDbEQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7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LElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUE7UUFDakIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQTtRQUM5RyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFBO1FBQzlHLE9BQU87WUFDTCxFQUFFLEVBQUUsRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFO1NBQ1AsQ0FBQTtJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2pzb24sIEF0ckZvcm1PcHQsIGF0cl9zdGF0aWNfZGF0YXN9IGZyb20gJy4uL2Jhc2UvYXRyLWNvbW1vbic7XHJcbmltcG9ydCB7U2ltcGxlQ2hhbmdlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtWYWxpZGF0b3JzfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtTZXNzaW9uU3RvcmFnZVV0aWx9IGZyb20gJy4vc2Vzc2lvbnN0b3JhZ2UudXRpbCc7XHJcbmltcG9ydCB7dWxpZH0gZnJvbSAndWxpZCc7XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbHNVdGlsIHtcclxuICBzdGF0aWMgb3NzUHJlZml4OiBzdHJpbmcgPSAnJztcclxuICBzdGF0aWMgZ2V0T3JnQ29kZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIC8vIHZhciBvcmdDb2RlID0gJyc7XHJcbiAgICAvLyB2YXIgaHJlZnMgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnPycpXHJcbiAgICAvLyBpZiAoaHJlZnMubGVuZ3RoID49IDIpIHtcclxuICAgIC8vICAgdmFyIHBhcmFtU3RyID0gaHJlZnNbMV07XHJcbiAgICAvLyAgIC8v5Y+C5pWw5a2X56ym5Liy6YeM5pyJ5rKh5bimID0/LyNcclxuICAgIC8vICAgb3JnQ29kZSA9IHBhcmFtU3RyLnNwbGl0KCc9JylbMF07XHJcbiAgICAvLyAgIG9yZ0NvZGUgPSBvcmdDb2RlLnNwbGl0KCc/JylbMF07XHJcbiAgICAvLyAgIG9yZ0NvZGUgPSBvcmdDb2RlLnNwbGl0KCcvJylbMF07XHJcbiAgICAvLyAgIG9yZ0NvZGUgPSBvcmdDb2RlLnNwbGl0KCcjJylbMF07XHJcbiAgICAvLyAgIG9yZ0NvZGUgPSBvcmdDb2RlLnNwbGl0KCcvJylbMF07XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFVsaWQoKSB7XHJcbiAgICByZXR1cm4gdWxpZCgpXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaXNCYXNlNjQoc3RyaW5nOiBhbnkpIHtcclxuICAgIGxldCByZWcgPSAvXlxccypkYXRhOihbYS16XStcXC9bYS16MC05LSsuXSsoO1thLXotXSs9W2EtejAtOS1dKyk/KT8oO2Jhc2U2NCk/LChbYS16MC05ISQmJywoKSorOz1cXC0uX346QFxcLz8lXFxzXSo/KVxccyokL2k7XHJcbiAgICByZXR1cm4gcmVnLnRlc3Qoc3RyaW5nKVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRhdGFVUkl0b0Jsb2IoY29kZTogYW55KSB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IGNvZGUuc3BsaXQoJztiYXNlNjQsJyk7XHJcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnRzWzBdLnNwbGl0KCc6JylbMV07XHJcbiAgICBjb25zdCByYXcgPSB3aW5kb3cuYXRvYihwYXJ0c1sxXSk7XHJcbiAgICBjb25zdCByYXdMZW5ndGggPSByYXcubGVuZ3RoO1xyXG4gICAgY29uc3QgdUludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHJhd0xlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0xlbmd0aDsgKytpKSB7XHJcbiAgICAgIHVJbnQ4QXJyYXlbaV0gPSByYXcuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbdUludDhBcnJheV0sIHt0eXBlOiBjb250ZW50VHlwZX0pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzTnVsbCh2YWw6IGFueSkge1xyXG4gICAgaWYgKHZhbCB8fCBbJ2Jvb2xlYW4nLCAnc3RyaW5nJywgJ251bWJlciddLnNvbWUodiA9PiB0eXBlb2YgdmFsID09IHYpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRDb250cm9sc0NvbmZpZyhkYXRhRnJvbTogYW55LCByZXF1aXJlZFJ1bGU6IHN0cmluZ1tdKSB7XHJcbiAgICBsZXQgY29udHJvbHNDb25maWc6IGFueSA9IHt9XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhRnJvbSkge1xyXG4gICAgICBpZiAocmVxdWlyZWRSdWxlLnNvbWUoaXRlbSA9PiBpdGVtID09IGtleSkpIHtcclxuICAgICAgICBjb250cm9sc0NvbmZpZ1trZXldID0gW2RhdGFGcm9tW2tleV0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb250cm9sc0NvbmZpZ1trZXldID0gW2RhdGFGcm9tW2tleV1dXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb250cm9sc0NvbmZpZztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBodHRwU3VjY2VzKHJlczogYW55KSB7XHJcbiAgICByZXR1cm4gWycyMDAnLCAnMjAxJywgJzIwNCddLnNvbWUodiA9PiByZXMuc3RhdHVzID09IHYpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDorqHnrpfkuKTngrnlnZDmoIfot53nprtcclxuICAgKiBAcGFyYW0gcG9pbnQxXHJcbiAgICogQHBhcmFtIHBvaW50MlxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXREaXN0YW5jZShwb2ludDE6IHsgeDogYW55LCB5OiBhbnkgfSwgcG9pbnQyOiB7IHg6IGFueSwgeTogYW55IH0pIHtcclxuICAgIGxldCBkaXN0YW5jZSA9IE1hdGguc3FydCgocG9pbnQyLnggLSBwb2ludDEueCkgKiAocG9pbnQyLnggLSBwb2ludDEueCkgKyAocG9pbnQyLnkgLSBwb2ludDEueSkgKiAocG9pbnQyLnkgLSBwb2ludDEueSkpO1xyXG4gICAgcmV0dXJuIGRpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5Yik5pat57q/5q615piv5ZCm55u45LqkLOebuOS6pOi/lOWbnuS6pOeCueWdkOagh1xyXG4gICAqIEBwYXJhbSBwMVxyXG4gICAqIEBwYXJhbSBwMlxyXG4gICAqL1xyXG4gIHN0YXRpYyBjaGVja0ludGVyc2VjdChsaW5lQXJyMTogeyB4OiBhbnksIHk6IGFueSB9W10sIGxpbmVBcnIyOiB7IHg6IGFueSwgeTogYW55IH1bXSkge1xyXG4gICAgLy/op6Pnur/mgKfmlrnnqIvnu4TmsYLnur/mrrXkuqTngrlcclxuICAgIC8v5aaC5p6c54i25q+N5Li6MO+8jOWImeS4jemcgOimgeiuoeeul+S6pOeCuSDkuKTnur/lubPooYxcclxuICAgIGxldCBhID0gbGluZUFycjFbMF0sIGIgPSBsaW5lQXJyMVsxXSwgYyA9IGxpbmVBcnIyWzBdLCBkID0gbGluZUFycjJbMV1cclxuXHJcbiAgICBhID0ge3g6IHBhcnNlRmxvYXQoYS54LnRvRml4ZWQoMikpLCB5OiBwYXJzZUZsb2F0KGEueS50b0ZpeGVkKDIpKX07XHJcbiAgICBiID0ge3g6IHBhcnNlRmxvYXQoYi54LnRvRml4ZWQoMikpLCB5OiBwYXJzZUZsb2F0KGIueS50b0ZpeGVkKDIpKX07XHJcbiAgICBjID0ge3g6IHBhcnNlRmxvYXQoYy54LnRvRml4ZWQoMikpLCB5OiBwYXJzZUZsb2F0KGMueS50b0ZpeGVkKDIpKX1cclxuICAgIGQgPSB7eDogcGFyc2VGbG9hdChkLngudG9GaXhlZCgyKSksIHk6IHBhcnNlRmxvYXQoZC55LnRvRml4ZWQoMikpfTtcclxuICAgIGNvbnNvbGUubG9nKChiLnkgLSBhLnkpKVxyXG4gICAgY29uc29sZS5sb2coKGQueCAtIGMueCkpXHJcbiAgICBjb25zb2xlLmxvZygoYS54IC0gYi54KSlcclxuICAgIGNvbnNvbGUubG9nKChjLnkgLSBkLnkpKVxyXG4gICAgbGV0IGRlbm9taW5hdG9yID0gKGIueSAtIGEueSkgKiAoZC54IC0gYy54KSAtIChhLnggLSBiLngpICogKGMueSAtIGQueSk7XHJcbiAgICBpZiAoZGVub21pbmF0b3IgPT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGxldCB4ID0gKChiLnggLSBhLngpICogKGQueCAtIGMueCkgKiAoYy55IC0gYS55KVxyXG4gICAgICAgICsgKGIueSAtIGEueSkgKiAoZC54IC0gYy54KSAqIGEueFxyXG4gICAgICAgIC0gKGQueSAtIGMueSkgKiAoYi54IC0gYS54KSAqIGMueCkgLyBkZW5vbWluYXRvcixcclxuICAgICAgeSA9IC0oKGIueSAtIGEueSkgKiAoZC55IC0gYy55KSAqIChjLnggLSBhLngpXHJcbiAgICAgICAgKyAoYi54IC0gYS54KSAqIChkLnkgLSBjLnkpICogYS55XHJcbiAgICAgICAgLSAoZC54IC0gYy54KSAqIChiLnkgLSBhLnkpICogYy55KSAvIGRlbm9taW5hdG9yO1xyXG4gICAgLy/liKTmlq3kuqTngrnmmK/lkKblnKjkuKTmnaHnur/mrrXkuIpcclxuICAgIGlmIChcclxuICAgICAgLy/kuqTngrnlnKjnur/mrrUxXHJcbiAgICAgICh4IC0gYS54KSAqICh4IC0gYi54KSA8PSAwICYmICh5IC0gYS55KSAqICh5IC0gYi55KSA8PSAwICYmXHJcbiAgICAgIC8v5bm25LiU5Lqk54K55Zyo57q/5q61MuS4ilxyXG4gICAgICAoeCAtIGMueCkgKiAoeCAtIGQueCkgPD0gMCAmJiAoeSAtIGMueSkgKiAoeSAtIGQueSkgPD0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB7eDogeCwgeTogeX1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBudW0xXHJcbiAgICogQHBhcmFtIG51bTJcclxuICAgKiBAcGFyYW0gZXJyb3Ig6K+v5beuXHJcbiAgICovXHJcbiAgc3RhdGljIGVxdWFsTnVtKG51bTE6IGFueSwgbnVtMjogYW55LCBlcnJvciA9IDUpIHtcclxuICAgIGxldCBudW0gPSBudW0xIC0gbnVtMjtcclxuICAgIHJldHVybiBudW0gPCBlcnJvciAmJiBudW0gPiAtZXJyb3I7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDlnZDmoIflr7nmr5RcclxuICAgKiBAcGFyYW0gcG9pbnQxXHJcbiAgICogQHBhcmFtIHBvaW50MlxyXG4gICAqIEBwYXJhbSBlcnJvclxyXG4gICAqL1xyXG4gIHN0YXRpYyBlcXVhbFBvaW50KHBvaW50MTogeyB4OiBhbnksIHk6IGFueSB9LCBwb2ludDI6IHsgeDogYW55LCB5OiBhbnkgfSwgZXJyb3IgPSA1KSB7XHJcbiAgICByZXR1cm4gVG9vbHNVdGlsLmVxdWFsTnVtKHBvaW50MS54LCBwb2ludDIueCwgZXJyb3IpICYmIFRvb2xzVXRpbC5lcXVhbE51bShwb2ludDEueSwgcG9pbnQyLnksIGVycm9yKVxyXG4gIH1cclxuXHJcblxyXG4gIC8v5Yik5pat54K55piv5ZCm5Zyo57q/5q615LiKXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc3RhcnRQXHJcbiAgICogQHBhcmFtIGVuZFBcclxuICAgKiBAcGFyYW0gYVxyXG4gICAqIEBwYXJhbSBlcnJvciDor6/lt65cclxuICAgKi9cclxuICBzdGF0aWMgY2hlY2tJbkxpbmUoc3RhcnRQOiBhbnksIGVuZFA6IGFueSwgYTogYW55LCBlcnJvciA9IDUpIHtcclxuICAgIC8v54K55ZKM56uv54K56YeN5ZCIXHJcbiAgICBpZiAoVG9vbHNVdGlsLmVxdWFsUG9pbnQoc3RhcnRQLCBlbmRQLCBlcnJvcilcclxuICAgICAgfHwgVG9vbHNVdGlsLmVxdWFsUG9pbnQoc3RhcnRQLCBhKVxyXG4gICAgICB8fCBUb29sc1V0aWwuZXF1YWxQb2ludChlbmRQLCBhKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChUb29sc1V0aWwuZXF1YWxOdW0oc3RhcnRQLngsIGVuZFAueCwgZXJyb3IpXHJcbiAgICAgICYmICFUb29sc1V0aWwuZXF1YWxOdW0oc3RhcnRQLngsIGEueCwgZXJyb3IpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfSBlbHNlIGlmIChUb29sc1V0aWwuZXF1YWxOdW0oc3RhcnRQLngsIGVuZFAueCwgZXJyb3IpXHJcbiAgICAgICYmIFRvb2xzVXRpbC5lcXVhbE51bShzdGFydFAueCwgYS54LCBlcnJvcikpIHtcclxuICAgICAgaWYgKHN0YXJ0UC55ID4gZW5kUC55KSB7XHJcbiAgICAgICAgcmV0dXJuIHN0YXJ0UC55ID4gYS55ICYmIGVuZFAueSA8IGEueVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzdGFydFAueSA8IGEueSAmJiBlbmRQLnkgPiBhLnlcclxuICAgIH1cclxuICAgIC8v5Yik5pat54K55Zyo57q/5q615LiKXHJcbiAgICAvL+aWnOeOh+aYr+WQpuS4gOiHtFxyXG4gICAgbGV0IGsxID0gKGVuZFAueSAtIHN0YXJ0UC55KSAvIChlbmRQLnggLSBzdGFydFAueCk7XHJcbiAgICBsZXQgYiA9IHN0YXJ0UC55IC0gazEgKiBzdGFydFAueDtcclxuICAgIGxldCB5ID0gazEgKiBhLnggKyBiO1xyXG4gICAgaWYgKFRvb2xzVXRpbC5lcXVhbE51bSh5LCBhLnksIGVycm9yKSkge1xyXG4gICAgICAvLzXlg4/ntKDnmoTor6/lt65cclxuICAgICAgbGV0IHN0YXJ0TGVuID0gVG9vbHNVdGlsLmdldExlbmd0aChzdGFydFAsIGEpXHJcbiAgICAgIGxldCBlbmRMZW4gPSBUb29sc1V0aWwuZ2V0TGVuZ3RoKGEsIGVuZFApXHJcbiAgICAgIGxldCBsZW4gPSBUb29sc1V0aWwuZ2V0TGVuZ3RoKHN0YXJ0UCwgZW5kUClcclxuICAgICAgcmV0dXJuIGxlbiA+PSBzdGFydExlbiAmJiBsZW4gPj0gZW5kTGVuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOeCueaWnOW8j1xyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXRTbG9wZVBvaW50KHN0YXJ0UDogYW55LCBlbmRQOiBhbnkpIHtcclxuICAgIC8v6K6h566X5pac546HXHJcbiAgICBpZiAoc3RhcnRQLnggPT0gZW5kUC54KSB7XHJcbiAgICAgIHJldHVybiB7azogSW5maW5pdHksIHg6IHN0YXJ0UC54fTtcclxuICAgIH1cclxuICAgIGxldCBrID0gKGVuZFAueSAtIHN0YXJ0UC55KSAvIChlbmRQLnggLSBzdGFydFAueCk7XHJcbiAgICBsZXQgYiA9IHN0YXJ0UC55IC0gayAqIHN0YXJ0UC54O1xyXG4gICAgcmV0dXJuIHtrOiBrLCBiOiBifVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICrliKTmlq3ngrnmmK/lkKblnKjlnZDmoIfljLrln5/lhoVcclxuICAgKiBAcGFyYW0gcCDliKTlrprnmoTngrlcclxuICAgKiBAcGFyYW0gcG9pbnRzQXJyXHJcbiAgICovXHJcbiAgc3RhdGljIGp1ZGdlSW5SZWMocDogeyB4MT86IGFueSwgeTE/OiBhbnksIHg/OiBhbnksIHk/OiBhbnkgfSwgcG9pbnRzQXJyOiB7IHgxPzogYW55LCB5MT86IGFueSwgeD86IGFueSwgeT86IGFueSB9W10pIHtcclxuICAgIHBvaW50c0FyciA9IHBvaW50c0Fyci5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIHJldHVybiB7eDE6IE51bWJlcihpdGVtLngxIHx8IGl0ZW0ueCB8fCAwKSwgeTE6IE51bWJlcihpdGVtLnkxIHx8IGl0ZW0ueSB8fCAwKX1cclxuICAgIH0pXHJcbiAgICBwID0ge3gxOiBwLngxIHx8IHAueCB8fCAwLCB5MTogcC55MSB8fCBwLnkgfHwgMH1cclxuICAgIGxldCBweCA9IE51bWJlcihwLngxKSwgcHkgPSBOdW1iZXIocC55MSksXHJcbiAgICAgIGZsYWcgPSBmYWxzZSwvL+epv+i2iui+ueahhlxyXG4gICAgICBpblJlY3QgPSBmYWxzZTsvL+aYr+WQpuWcqOWkmui+ueW9oueahOi+ueaIluiAheerr+eCueS4ilxyXG4gICAgbGV0IHN0YXJ0ID0gcG9pbnRzQXJyWzBdXHJcbiAgICAvL+WmguaenOaVsOe7hOmmluWwvuayoeacieebuOi/nizmiYvliqjmt7vliqB9O1xyXG4gICAgbGV0IGVuZCA9IHBvaW50c0Fycltwb2ludHNBcnIubGVuZ3RoIC0gMV07XHJcbiAgICAvL+WmguaenOaVsOe7hOmmluWwvuayoeacieebuOi/nizmiYvliqjmt7vliqBcclxuICAgIHBvaW50c0FyciA9IHN0YXJ0LngxICE9IGVuZC54MSB8fCBzdGFydC55MSAhPSBlbmQueTEgPyBwb2ludHNBcnIuY29uY2F0KHN0YXJ0KSA6IHBvaW50c0FycjtcclxuICAgIC8v5bCE57q/6YCJ5Y+WWeWdkOagh+S4jeWPmCx45q2j5pa55ZCRXHJcbiAgICBwb2ludHNBcnIuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKGluZGV4ID09IHBvaW50c0Fyci5sZW5ndGggLSAxXHJcbiAgICAgICAgfHwgaW5SZWN0Ly/lnKjlpJrovrnlvaLnmoTovrnmiJbogIXnq6/ngrnkuIrop4bkuLrlnKjljLrln5/lhoVcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGVuZFBvaW50ID0gcG9pbnRzQXJyW2luZGV4ICsgMV1cclxuICAgICAgY29uc3Qgc3RhcnRYID0gTnVtYmVyKGl0ZW0ueDEpLCBzdGFydFkgPSBOdW1iZXIoaXRlbS55MSksXHJcbiAgICAgICAgZW5kWCA9IE51bWJlcihlbmRQb2ludC54MSksIGVuZFkgPSBOdW1iZXIoZW5kUG9pbnQueTEpO1xyXG4gICAgICAvL+WIpOaWreeCueaYr+WQpuWcqOerr+eCueS4ilxyXG4gICAgICBpZiAoKHB4ID09IHN0YXJ0WCAmJiBweSA9PSBzdGFydFkpXHJcbiAgICAgICAgfHwgKHB4ID09IGVuZFggJiYgcHggPT0gZW5kWSkpIHtcclxuICAgICAgICBpblJlY3QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy/liKTmlq3lsITnur/ph43lkIjlubbkuJTngrnlnKjovrnkuIpcclxuICAgICAgaWYgKChzdGFydFkgPT0gZW5kWSAmJiBlbmRZID09IHB5KVxyXG4gICAgICAgICYmICgocHggPiBlbmRYICYmIHB4IDwgc3RhcnRYXHJcbiAgICAgICAgICB8fCAocHggPCBlbmRYICYmIHB4ID4gc3RhcnRYKSkpKSB7XHJcbiAgICAgICAgaW5SZWN0ID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgoc3RhcnRZIDwgcHkgJiYgZW5kWSA+PSBweSlcclxuICAgICAgICB8fCAoc3RhcnRZID49IHB5ICYmIGVuZFkgPCBweSkpIHtcclxuXHJcbiAgICAgICAgLy/msYLlsITnur/kuI7nur/mrrXkuqTngrnnmoR45Z2Q5qCHLHnlnZDmoIfov5jmmK9weVxyXG4gICAgICAgIGxldCB4ID0gc3RhcnRYICsgKHB5IC0gc3RhcnRZKSAqIChlbmRYIC0gc3RhcnRYKSAvIChlbmRZIC0gc3RhcnRZKTtcclxuICAgICAgICAvL+eCueWcqOi+ueS4ilxyXG4gICAgICAgIGlmICh4ID09IHB4KSB7XHJcbiAgICAgICAgICBpblJlY3QgPSB0cnVlXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8veOWkp+S6jnB45p2l5L+d6K+B5bCE57q/5pyd5Y+zXHJcbiAgICAgICAgaWYgKHggPiBweCkge1xyXG4gICAgICAgICAgZmxhZyA9ICFmbGFnXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIGluUmVjdCB8fCBmbGFnO1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBkaWZmSW5wdXQoY2huZzogU2ltcGxlQ2hhbmdlLCBhY3Rpb246ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIGlmIChjaG5nID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICBsZXQgY3VyID0gSlNPTi5zdHJpbmdpZnkoY2huZy5jdXJyZW50VmFsdWUpO1xyXG4gICAgbGV0IHByZXYgPSBKU09OLnN0cmluZ2lmeShjaG5nLnByZXZpb3VzVmFsdWUpO1xyXG4gICAgaWYgKGN1ciAhPT0gcHJldikge1xyXG4gICAgICBhY3Rpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWVwQ29weShvYmo6IGFueSkge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGlmZklucHV0cyhjaG5nOiBTaW1wbGVDaGFuZ2VbXSwgYWN0aW9uOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBpZiAoY2huZyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICBpZiAoY2huZy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaG5nLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBpdGVtID0gY2huZ1tpXTtcclxuICAgICAgaWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XHJcbiAgICAgIGxldCBjdXIgPSBKU09OLnN0cmluZ2lmeShpdGVtLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIGxldCBwcmV2ID0gSlNPTi5zdHJpbmdpZnkoaXRlbS5wcmV2aW91c1ZhbHVlKTtcclxuICAgICAgaWYgKGN1ciAhPT0gcHJldikge1xyXG4gICAgICAgIGFjdGlvbigpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGF0YVVSTHRvQmxvYihkYXRhdXJsOiBhbnkpIHtcclxuICAgIHZhciBhcnIgPSBkYXRhdXJsLnNwbGl0KCcsJyksIG1pbWUgPSBhcnJbMF0ubWF0Y2goLzooLio/KTsvKVsxXSxcclxuICAgICAgYnN0ciA9IGF0b2IoYXJyWzFdKSwgbiA9IGJzdHIubGVuZ3RoLCB1OGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xyXG4gICAgd2hpbGUgKG4tLSkge1xyXG4gICAgICB1OGFycltuXSA9IGJzdHIuY2hhckNvZGVBdChuKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbdThhcnJdLCB7dHlwZTogbWltZX0pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRhdGFVUkx0b0ZpbGUoZGF0YXVybDogYW55LCBmaWxlbmFtZT86IHN0cmluZykge1xyXG4gICAgdmFyIGFyciA9IGRhdGF1cmwuc3BsaXQoJywnKSwgbWltZSA9IGFyclswXS5tYXRjaCgvOiguKj8pOy8pWzFdLFxyXG4gICAgICBic3RyID0gYXRvYihhcnJbMV0pLCBuID0gYnN0ci5sZW5ndGgsIHU4YXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XHJcbiAgICB3aGlsZSAobi0tKSB7XHJcbiAgICAgIHU4YXJyW25dID0gYnN0ci5jaGFyQ29kZUF0KG4pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBGaWxlKFt1OGFycl0sIChmaWxlbmFtZSB8fCBUb29sc1V0aWwuZ2V0UmFuZG9tRmlsZU5hbWUoKSksIHt0eXBlOiBtaW1lfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0WWVzdGVyZGF5KGRheTogRGF0ZSk6IERhdGUge1xyXG5cclxuICAgIGxldCB0aW1lID0gZGF5LmdldFRpbWUoKSAtIDEwMDAgKiA2MCAqIDYwICogMjQ7XHJcbiAgICBkYXkgPSBuZXcgRGF0ZSh0aW1lKTtcclxuXHJcbiAgICByZXR1cm4gZGF5O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFRvbW9ycm93ZGF5KGRheTogRGF0ZSk6IERhdGUge1xyXG4gICAgbGV0IHRpbWUgPSBkYXkuZ2V0VGltZSgpICsgMTAwMCAqIDYwICogNjAgKiAyNDtcclxuXHJcbiAgICByZXR1cm4gbmV3IERhdGUodGltZSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0TmV4dE1vbnRoKGRheTogRGF0ZSkge1xyXG4gICAgbGV0IGRzID0gbmV3IERhdGUoZGF5KS5zZXRNb250aChkYXkuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKGRzKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRWaWRlb0NvdmVyKHVybDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gVG9vbHNVdGlsLmdldE9zc1VybCh1cmwpICsgXCI/eC1vc3MtcHJvY2Vzcz12aWRlby9zbmFwc2hvdCx0XzEwMDAwLG1fZmFzdFwiO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZpc3REYXlPZk1vbnRoKGRheTogRGF0ZSkge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKG5ldyBEYXRlKGRheSkuc2V0RGF0ZSgxKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbGFzdERheU9mTW9udGgoZGF5OiBEYXRlKSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoVG9vbHNVdGlsLmdldE5leHRNb250aChkYXkpLnNldERhdGUoMCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFJhbmRvbUZpbGVOYW1lID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgZXhwZWN0ID0gMTY7XHJcbiAgICBsZXQgc3RyID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpO1xyXG4gICAgd2hpbGUgKHN0ci5sZW5ndGggPCBleHBlY3QpIHtcclxuICAgICAgc3RyICs9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGV4cGVjdCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0RmlsZUV4dCA9IGZ1bmN0aW9uIChmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICB2YXIgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZihcIi5cIik7XHJcbiAgICB2YXIgc3VmZml4ID0gZmlsZU5hbWUuc3Vic3RyKGluZGV4ICsgMSk7XHJcbiAgICByZXR1cm4gc3VmZml4O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldEh0dHBPcHRpb25zKCk6IGFueSB7XHJcbiAgICByZXR1cm4ge2lzQ29tbW9uSHR0cEhlYWRlcjogdHJ1ZX1cclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgcmVzZXRGb3JtVmFsdWUob3B0OiBBdHJGb3JtT3B0LCBqc29uOiBqc29uKTogQXRyRm9ybU9wdCB7XHJcbiAgICBmb3IgKGxldCBpdGVtIG9mIG9wdC5pdGVtcykge1xyXG4gICAgICBpdGVtLnZhbHVlID0gXCJcIjtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoanNvbikpIHtcclxuICAgICAgICBpZiAoanNvbi5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGpzb25ba2V5XSAhPSBudWxsICYmIGpzb25ba2V5XSAhPSB1bmRlZmluZWQgJiYga2V5ID09IGl0ZW0ua2V5KSB7XHJcbiAgICAgICAgICBpZiAoaXRlbS50eXBlID09ICdkYXRlJylcclxuICAgICAgICAgICAgaXRlbS52YWx1ZSA9IG5ldyBEYXRlKGpzb25ba2V5XSk7XHJcbiAgICAgICAgICBlbHNlIGlmIChpdGVtLnR5cGUgPT0gJ2RhdGVUaW1lJykge1xyXG4gICAgICAgICAgICBpdGVtLnZhbHVlID0gbmV3IERhdGUoanNvbltrZXldKTtcclxuICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICBpdGVtLnZhbHVlID0ganNvbltrZXldXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldEZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XHJcbiAgICBsZXQgbW9udGg6IHN0cmluZyB8IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICBsZXQgc3RyRGF0ZTogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXREYXRlKCk7XHJcblxyXG4gICAgaWYgKG1vbnRoIDw9IDkpIHtcclxuICAgICAgbW9udGggPSBcIjBcIiArIG1vbnRoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdHJEYXRlIDw9IDkpIHtcclxuICAgICAgc3RyRGF0ZSA9IFwiMFwiICsgc3RyRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCItXCIgKyBtb250aCArIFwiLVwiICsgc3RyRGF0ZVxyXG4gICAgLy8gKyBcIiBcIlxyXG4gICAgLy8gKyBkYXRlLmdldEhvdXJzKCkgKyBcIjpcIiArIGRhdGUuZ2V0TWludXRlcygpICsgXCI6XCIgKyBkYXRlLmdldFNlY29uZHMoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRGb3JtYXREYXRlRnVsbChkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBtb250aDogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgIGxldCBzdHJEYXRlOiBzdHJpbmcgfCBudW1iZXIgPSBkYXRlLmdldERhdGUoKTtcclxuXHJcbiAgICBpZiAobW9udGggPD0gOSkge1xyXG4gICAgICBtb250aCA9IFwiMFwiICsgbW9udGg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0ckRhdGUgPD0gOSkge1xyXG4gICAgICBzdHJEYXRlID0gXCIwXCIgKyBzdHJEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBzdHJEYXRlICsgXCIgXCIgKyAoZGF0ZS5nZXRIb3VycygpIDwgMTAgPyAnMCcgKyBkYXRlLmdldEhvdXJzKCkgOiBkYXRlLmdldEhvdXJzKCkpICsgXCI6XCIgKyAoZGF0ZS5nZXRNaW51dGVzKCkgPCAxMCA/ICcwJyArIGRhdGUuZ2V0TWludXRlcygpIDogZGF0ZS5nZXRNaW51dGVzKCkpICsgXCI6XCIgKyAoZGF0ZS5nZXRTZWNvbmRzKCkgPCAxMCA/ICcwJyArIGRhdGUuZ2V0U2Vjb25kcygpIDogZGF0ZS5nZXRTZWNvbmRzKCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldEZvcm1hdERhdGVXaXRob3V0UyhkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBtb250aDogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgIGxldCBzdHJEYXRlOiBzdHJpbmcgfCBudW1iZXIgPSBkYXRlLmdldERhdGUoKTtcclxuICAgIGxldCBob3Vyczogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgbGV0IHNlY29uZHM6IHN0cmluZyB8IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpO1xyXG4gICAgaWYgKG1vbnRoIDw9IDkpIHtcclxuICAgICAgbW9udGggPSBcIjBcIiArIG1vbnRoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdHJEYXRlIDw9IDkpIHtcclxuICAgICAgc3RyRGF0ZSA9IFwiMFwiICsgc3RyRGF0ZTtcclxuICAgIH1cclxuICAgIGlmIChob3VycyA8PSA5KSB7XHJcbiAgICAgIGhvdXJzID0gXCIwXCIgKyBob3VycztcclxuICAgIH1cclxuICAgIGlmIChzZWNvbmRzIDw9IDkpIHtcclxuICAgICAgc2Vjb25kcyA9IFwiMFwiICsgc2Vjb25kcztcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBzdHJEYXRlICsgXCIgXCIgKyBob3VycyArIFwiOlwiICsgc2Vjb25kcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRGb3JtYXREYXRlSG91cihkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBtb250aDogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgIGxldCBzdHJEYXRlOiBzdHJpbmcgfCBudW1iZXIgPSBkYXRlLmdldERhdGUoKTtcclxuICAgIGxldCBob3Vyczogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgbGV0IHNlY29uZHM6IHN0cmluZyB8IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpO1xyXG4gICAgaWYgKG1vbnRoIDw9IDkpIHtcclxuICAgICAgbW9udGggPSBcIjBcIiArIG1vbnRoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdHJEYXRlIDw9IDkpIHtcclxuICAgICAgc3RyRGF0ZSA9IFwiMFwiICsgc3RyRGF0ZTtcclxuICAgIH1cclxuICAgIGlmIChob3VycyA8PSA5KSB7XHJcbiAgICAgIGhvdXJzID0gXCIwXCIgKyBob3VycztcclxuICAgIH1cclxuICAgIGlmIChzZWNvbmRzIDw9IDkpIHtcclxuICAgICAgc2Vjb25kcyA9IFwiMFwiICsgc2Vjb25kcztcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgbW9udGggKyBzdHJEYXRlICsgaG91cnM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0T3NzVXJsKHVybDogc3RyaW5nLCBuZWVkVGltZSA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIXVybCkge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIGlmIChuZWVkVGltZSkge1xyXG4gICAgICAvLyB1cmwgPSB1cmwgKyBcIj92PVwiICsgVG9vbHNVdGlsLmdldEZvcm1hdERhdGVIb3VyKG5ldyBEYXRlKCkpO1xyXG4gICAgICB1cmwgPSB1cmwgKyBcIj92PVwiICsgbmV3IERhdGUoKS5nZXRUaW1lKClcclxuICAgIH1cclxuICAgIGlmICh1cmwuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcclxuICAgICAgcmV0dXJuIHVybFxyXG4gICAgfVxyXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aChcIi9cIikgJiYgIWF0cl9zdGF0aWNfZGF0YXMuT1NTX1VSTC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgIHVybCA9ICcvJyArIHVybFxyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdCA9IGF0cl9zdGF0aWNfZGF0YXMuT1NTX1VSTCArIHVybFxyXG5cclxuICAgIHJldHVybiByZXN1bHRcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRTdGF0aWNPc3NVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHVybC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xyXG4gICAgICByZXR1cm4gdXJsXHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXRyX3N0YXRpY19kYXRhcy5TVEFUSUNfT1NTX1VSTCArIHVybDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByZW1vdmVIdG1sKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLzxbXjw+XSs+L2csICcnKS5yZXBsYWNlKC8mbmJzcDsvaWcsICcnKVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIG11bCguLi5udW1iZXJzOiBhbnkpIHtcclxuICAgIGlmIChudW1iZXJzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IG0gPSB0aGlzLmdldERpZ2l0KG51bWJlcnMpO1xyXG4gICAgbGV0IHJlc3VsdCA9IDE7XHJcbiAgICBudW1iZXJzLmZvckVhY2goXHJcbiAgICAgIChudW06IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBzID0gbnVtLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcmVzdWx0ICo9IE51bWJlcihzLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQgLyBNYXRoLnBvdygxMCwgbSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0RGlnaXQoLi4ubnVtYmVyczogYW55W10pIHtcclxuICAgIGxldCBtID0gMDtcclxuICAgIG51bWJlcnMuZm9yRWFjaChcclxuICAgICAgbnVtID0+IHtcclxuICAgICAgICBsZXQgcyA9IG51bS50b1N0cmluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBtICs9IHMuc3BsaXQoXCIuXCIpWzFdLmxlbmd0aFxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICByZXR1cm4gbTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZEltZyhkYXRhOiBhbnksIGZpbGVOYW1lPzogc3RyaW5nLCBlbmRwb2ludD86IHN0cmluZykge1xyXG4gICAgLy8gLy8g5LiL6L2957G75Z6LIHhsc1xyXG4gICAgLy8gY29uc3QgY29udGVudFR5cGUgPSAnaW1hZ2UvanBlZyc7XHJcbiAgICAvLyAvLyBjb25zdCBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCc7XHJcbiAgICAvLyAvLyDkuIvovb3nsbvlnovvvJpjc3ZcclxuICAgIC8vIGNvbnN0IGRlYnVnID0ge2hlbGxvOiBcIndvcmxkXCJ9O1xyXG4gICAgLy8gY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtdLHt0eXBlIDogJ2ltYWdlL2pwZWcnfSk7XHJcbiAgICAvLyBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIC8vXHJcbiAgICAvLyAvLyDmiZPlvIDmlrDnqpflj6PmlrnlvI/ov5vooYzkuIvovb1cclxuICAgIC8vIC8vIHdpbmRvdy5vcGVuKHVybCk7XHJcbiAgICAvL1xyXG4gICAgLy8gLy8g5Lul5Yqo5oCB5Yib5bu6Yeagh+etvui/m+ihjOS4i+i9vVxyXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGEuaHJlZiA9IGRhdGE7XHJcbiAgICAvLyBhLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBhLmRvd25sb2FkID0gZmlsZU5hbWUgPyBmaWxlTmFtZSA6IFwiXCIgKyBlbmRwb2ludDtcclxuICAgIGEuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZFhscyh1cmw6IHN0cmluZywgcGFyYW1zPzogYW55LCkge1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICB1cmwgKz0gXCI/XCI7XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFtcykpIHtcclxuICAgICAgICBpZiAocGFyYW1zW2tleV0pIHtcclxuICAgICAgICAgIHVybCArPSBrZXkgKyBcIj1cIiArIHBhcmFtc1trZXldICsgXCImJlwiXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB3aW5kb3cub3Blbih1cmwpO1xyXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGEuaHJlZiA9IHVybDtcclxuICAgIC8vIC8vIGEuZG93bmxvYWQgPSBmaWxlTmFtZTtcclxuICAgIC8vIGEuZG93bmxvYWQgPSBcIjMzMjEueGxzXCI7XHJcbiAgICBhLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0SW1nKHVybDogc3RyaW5nLCBwYXJhbTogYW55ID0ge1xyXG4gICAgaW1nVzogMCwgaW1nSDogMCxcclxuICAgIG5lZWRUaW1lOiBmYWxzZSwgaXNGdWxsVXJsOiBmYWxzZVxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGxldCBkYXRhVXJsOiBhbnkgPSBTZXNzaW9uU3RvcmFnZVV0aWwuZ2V0SW1nKHVybClcclxuICAgICAgbGV0IGltZyA9IG5ldyBJbWFnZSgpXHJcbiAgICAgIGltZy5zZXRBdHRyaWJ1dGUoJ2Nyb3NzT3JpZ2luJywgJ2Fub255bW91cycpXHJcbiAgICAgIGlmICghZGF0YVVybCkge1xyXG4gICAgICAgIGltZy5zcmMgPSBwYXJhbS5pc0Z1bGxVcmwgPyB1cmwgOiBUb29sc1V0aWwuZ2V0T3NzVXJsKHVybCwgcGFyYW0ubmVlZFRpbWUpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gZGF0YVVybC5pbmRleE9mKFwifVwiKSArIDFcclxuICAgICAgICBpbWcuc3JjID0gZGF0YVVybC5zbGljZSgwLCA1MCkgKyBkYXRhVXJsLnNsaWNlKGluZGV4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBsZXQgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgbGV0IGNvbnRleHQyOiBhbnkgPSBjLmdldENvbnRleHQoXCIyZFwiKVxyXG4gICAgICAgIGMud2lkdGggPSBwYXJhbS5pbWdXIHx8IGltZy53aWR0aDtcclxuICAgICAgICBjLmhlaWdodCA9IHBhcmFtLmltZ0ggfHwgaW1nLmhlaWdodFxyXG4gICAgICAgIGNvbnRleHQyLmRyYXdJbWFnZShpbWcsIDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KVxyXG4gICAgICAgIGxldCBkYXRhVXJsID0gYy50b0RhdGFVUkwoKVxyXG4gICAgICAgIGxldCBzdHIgPSBjLndpZHRoICsgXCIsXCIgKyBjLmhlaWdodCArIFwifVwiXHJcbiAgICAgICAgZGF0YVVybCA9IGRhdGFVcmwuc2xpY2UoMCwgNTApICsgc3RyICsgZGF0YVVybC5zbGljZSg1MClcclxuLy/kuI3kv53lrZhcclxuLy8gICAgICAgICBTZXNzaW9uU3RvcmFnZVV0aWwuc2V0SW1nKHVybCwgZGF0YVVybClcclxuXHJcbiAgICAgICAgcmVzb2x2ZShpbWcpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgc3RhdGljIHBpeGVsVG9OdW0od2lkdGg6IGFueSkge1xyXG4gICAgY29uc3QgcmUgPSAvcHgvZ2k7XHJcbiAgICBsZXQgd2lkdGhTdHIgPSB3aWR0aC5yZXBsYWNlKHJlLCBcIlwiKTtcclxuICAgIHJldHVybiBOdW1iZXIod2lkdGhTdHIpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFsbEVxdWFsID0gKC4uLmFycmF5OiBhbnlbXSkgPT4gYXJyYXkuZXZlcnkoaXRlbSA9PiBpdGVtID09PSBhcnJheVswXSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIGFycmF55omA5pyJ5Y+C5pWw5ruh6LazZm7lh73mlbDov5Tlm550cnVlXHJcbiAgICogYWxsKHggPT4geCA+IDEsMSwyLDMpOyAvLyB0cnVlXHJcbiAgICogQHBhcmFtIGNhbGxiYWNrXHJcbiAgICogQHBhcmFtIGFycmF5XHJcbiAgICovXHJcbiAgc3RhdGljIHNhdGlzZmllZEZuID0gKGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGJvb2xlYW4sIC4uLmFycmF5OiBhbnlbXSkgPT4gYXJyYXkuZXZlcnkoY2FsbGJhY2spO1xyXG5cclxuICAvL+WFqOmDqOS4jeepuuS4unRydWVcclxuICBzdGF0aWMgbm90RW1wdHkoLi4uYXJyOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGFyci5ldmVyeShpdGVtID0+ICEhaXRlbSlcclxuICB9XHJcblxyXG4gIC8v5YyF5ZCr56m65Li6dHJ1ZVxyXG4gIHN0YXRpYyBoYXNFbXB0eSguLi5hcnI6IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYXJyLnNvbWUoaXRlbSA9PiAhaXRlbSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYWxsRW1wdHkoLi4uYXJyOiBhbnlbXSkge1xyXG4gICAgcmV0dXJuIGFyci5ldmVyeShpdGVtID0+ICFpdGVtKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0FycmF5KG9iajogYW55KSB7XHJcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQXJyYXlcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0VtcHR5KG9iajogYW55KSB7XHJcbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIGlmIChvYmogPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygb2JqID09ICdib29sZWFuJykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGlmIChvYmogPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIG9iaiA9PSBcInN0cmluZ1wiICYmIG9iai50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIHN0YXRpYyBlbmNvZGVWYWx1ZShwYXJhbXM6IGFueSkge1xyXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGtleSA9PiBwYXJhbXNba2V5XSA9IGVuY29kZVVSSUNvbXBvbmVudChwYXJhbXNba2V5XSkpO1xyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyB3aW5kb3dIZWlnaHQoKSB7XHJcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB3aW5kb3dXaWR0aCgpIHtcclxuXHJcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1vZGFsZVN0eWxlKCkge1xyXG4gICAgcmV0dXJuIHsnbWF4SGVpZ2h0JzogVG9vbHNVdGlsLndpbmRvd0hlaWdodCgpIC0gMjAwICsgJ3B4JywgJ292ZXJmbG93LXknOiAnYXV0byd9O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldExlbmd0aChwb2ludEE6IHsgeDE6IGFueSwgeTE6IGFueSwgeDogYW55LCB5OiBhbnkgfSwgcG9pbnRCOiB7IHg6IGFueSwgeTogYW55LCB4MTogYW55LCB5MTogYW55IH0pIHtcclxuICAgIHBvaW50QS54MSA9IHBvaW50QS54IHx8IHBvaW50QS54MSB8fCAwXHJcbiAgICBwb2ludEEueTEgPSBwb2ludEEueSB8fCBwb2ludEEueTEgfHwgMFxyXG4gICAgcG9pbnRCLnkxID0gcG9pbnRCLnkgfHwgcG9pbnRCLnkxIHx8IDA7XHJcbiAgICBwb2ludEIueDEgPSBwb2ludEIueCB8fCBwb2ludEIueDEgfHwgMDtcclxuICAgIHZhciBsZW5ndGhBQiA9IE1hdGguc3FydChNYXRoLnBvdyhwb2ludEEueDEgLSBwb2ludEIueDEsIDIpICtcclxuICAgICAgTWF0aC5wb3cocG9pbnRBLnkxIC0gcG9pbnRCLnkxLCAyKSlcclxuICAgIHJldHVybiBsZW5ndGhBQjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRSb3RhdGVOdW0ocG9pbnRCOiB7IHgxOiBhbnksIHkxOiBhbnksIHg6IGFueSwgeTogYW55IH0sIHBvaW50QzogeyB4MTogYW55LCB5MTogYW55LCB4OiBhbnksIHk6IGFueSB9LCBwb2ludEE6IHsgeDE6IGFueSwgeTE6IGFueSwgeDogYW55LCB5OiBhbnkgfSkge1xyXG4gICAgcG9pbnRBLngxID0gcG9pbnRBLnggfHwgcG9pbnRBLngxIHx8IDBcclxuICAgIHBvaW50QS55MSA9IHBvaW50QS55IHx8IHBvaW50QS55MSB8fCAwXHJcbiAgICBwb2ludEIueDEgPSBwb2ludEIueSB8fCBwb2ludEIueDEgfHwgMDtcclxuICAgIHBvaW50Qi55MSA9IHBvaW50Qi54IHx8IHBvaW50Qi54MSB8fCAwO1xyXG4gICAgcG9pbnRDLngxID0gcG9pbnRDLnkgfHwgcG9pbnRDLngxIHx8IDA7XHJcbiAgICBwb2ludEMueTEgPSBwb2ludEMueCB8fCBwb2ludEMueDEgfHwgMDtcclxuXHJcbiAgICAvL0FCQ+S4reW/g+eCuSzotbflp4vngrks57uI54K5XHJcbiAgICBsZXQgQUI6IGFueSA9IHt9O1xyXG4gICAgbGV0IEFDOiBhbnkgPSB7fTtcclxuICAgIEFCLngxID0gcG9pbnRCLngxIC0gcG9pbnRBLngxXHJcbiAgICBBQi55MSA9IHBvaW50Qi55MSAtIHBvaW50QS55MVxyXG4gICAgQUMueDEgPSBwb2ludEMueDEgLSBwb2ludEEueDFcclxuICAgIEFDLnkxID0gcG9pbnRDLnkxIC0gcG9pbnRBLnkxXHJcbiAgICB2YXIgZGlyZWN0ID0gQUIueDEgKiBBQy55MSAtIEFCLnkxICogQUMueTFcclxuICAgIHZhciBsZW5ndGhBQiA9IHRoaXMuZ2V0TGVuZ3RoKHBvaW50QiwgcG9pbnRBKVxyXG4gICAgdmFyIGxlbmd0aEFDID0gdGhpcy5nZXRMZW5ndGgocG9pbnRDLCBwb2ludEEpXHJcbiAgICB2YXIgbGVuZ3RoQkMgPSB0aGlzLmdldExlbmd0aChwb2ludEIsIHBvaW50QylcclxuICAgIHZhciBjb3NBID0gKE1hdGgucG93KGxlbmd0aEFCLCAyKSArIE1hdGgucG93KGxlbmd0aEFDLCAyKSAtXHJcbiAgICAgIE1hdGgucG93KGxlbmd0aEJDLCAyKSkgLyAoMiAqIGxlbmd0aEFCICogbGVuZ3RoQUMpXHJcbiAgICB2YXIgYW5nbGVBID0gTWF0aC5yb3VuZChNYXRoLmFjb3MoY29zQSkgKiAxODAgLyBNYXRoLlBJKVxyXG4gICAgaWYgKGRpcmVjdCA8IDApIHtcclxuICAgICAgcmV0dXJuIC1hbmdsZUFcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBhbmdsZUFcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvL+e7lWNlbnRlcueCueaXi+i9rHJvdGF0ZeinkuW6plxyXG4gIHN0YXRpYyBnZXRSb3RhdGVQb2ludChwOiB7IHgxOiBhbnksIHkxOiBhbnkgfSwgY2VudGVyOiB7IHgxOiBhbnksIHkxOiBhbnkgfSwgcm90YXRlOiBhbnkpIHtcclxuICAgIGxldCBzdGFydFggPSBwLngxXHJcbiAgICBsZXQgc3RhcnRZID0gcC55MVxyXG4gICAgbGV0IGEgPSBjZW50ZXIueDFcclxuICAgIGxldCBiID0gY2VudGVyLnkxXHJcbiAgICBsZXQgeDEgPSBhIC0gTWF0aC5jb3Mocm90YXRlICogTWF0aC5QSSAvIDE4MCkgKiAoYSAtIHN0YXJ0WCkgKyBNYXRoLnNpbihyb3RhdGUgKiBNYXRoLlBJIC8gMTgwKSAqIChiIC0gc3RhcnRZKVxyXG4gICAgbGV0IHkxID0gYiAtIE1hdGguY29zKHJvdGF0ZSAqIE1hdGguUEkgLyAxODApICogKGIgLSBzdGFydFkpIC0gTWF0aC5zaW4ocm90YXRlICogTWF0aC5QSSAvIDE4MCkgKiAoYSAtIHN0YXJ0WClcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHgxOiB4MSxcclxuICAgICAgeTE6IHkxXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|