@libs-ui/utils 0.2.282 → 0.2.284
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/esm2022/get-smart-axis-scale.mjs +130 -52
- package/esm2022/helpers.mjs +65 -1
- package/fesm2022/libs-ui-utils.mjs +193 -51
- package/fesm2022/libs-ui-utils.mjs.map +1 -1
- package/get-smart-axis-scale.d.ts +25 -14
- package/helpers.d.ts +64 -0
- package/package.json +2 -2
|
@@ -1,64 +1,58 @@
|
|
|
1
1
|
import { isNil } from "./helpers";
|
|
2
|
+
const DEFAULT_MIN_TICK_COUNT = 5;
|
|
3
|
+
const DEFAULT_MAX_TICK_COUNT = 10;
|
|
4
|
+
const MIN_DISTANCE_TO_ZERO = 3;
|
|
5
|
+
const NEGATIVE_THRESHOLD = -5;
|
|
6
|
+
const FALLBACK_NEGATIVE_VALUE = -4;
|
|
7
|
+
const MAX_POW_NUMBER = 14;
|
|
8
|
+
const MAX_TEMPLATE_NUMBER = 10;
|
|
2
9
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* @
|
|
10
|
-
* @
|
|
10
|
+
* Tính toán smart axis scale cho biểu đồ
|
|
11
|
+
*
|
|
12
|
+
* @param maxData - Giá trị tối đa của dữ liệu
|
|
13
|
+
* @param options - Các tùy chọn cấu hình axis scale
|
|
14
|
+
* @returns Cấu hình axis scale bao gồm stepSize, max, min, tickAmount
|
|
15
|
+
*
|
|
16
|
+
* @throws {Error} INVALID_NEGATIVE_DATA - khi maxData < 0 mà acceptNegative = false
|
|
17
|
+
* @throws {Error} MISSING_MIN_NEGATIVE - khi acceptNegative = true nhưng thiếu minNegative
|
|
18
|
+
* @throws {Error} INVALID_RANGE - khi maxData < minNegative
|
|
19
|
+
* @throws {Error} INVALID_MIN_NEGATIVE - khi minNegative >= 0
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const result = getSmartAxisScale(100, { minTickCount: 5, maxTickCount: 10 });
|
|
24
|
+
* // returns { stepSize: 20, max: 120, min: 0, tickAmount: 6 }
|
|
25
|
+
* ```
|
|
11
26
|
*/
|
|
12
|
-
export const getSmartAxisScale = (
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
stepCandidatesDefault.push(Math.pow(10, index) * (((templateNumber - 1) * 2 + 1) / 2));
|
|
21
|
-
}
|
|
22
|
-
stepCandidatesDefault.push(Math.pow(10, index) * templateNumber);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
const stepCandidates = options?.stepCandidates || stepCandidatesDefault;
|
|
26
|
-
let distanceToZero = maxData;
|
|
27
|
-
let reverse = 1;
|
|
28
|
-
if (maxData < 0 && !options?.acceptNegative) {
|
|
29
|
-
throw new Error("maxData is less than 0 and acceptNegative is false");
|
|
30
|
-
}
|
|
31
|
-
if (options?.acceptNegative) {
|
|
32
|
-
if (isNil(options.minNegative)) {
|
|
33
|
-
throw new Error("minNegative is required when acceptNegative is true");
|
|
34
|
-
}
|
|
35
|
-
if (maxData < options.minNegative) {
|
|
36
|
-
throw new Error("maxData is less than minNegative");
|
|
37
|
-
}
|
|
38
|
-
if (options.minNegative >= 0) {
|
|
39
|
-
throw new Error("minNegative must be negative");
|
|
40
|
-
}
|
|
27
|
+
export const getSmartAxisScale = (originalMaxData, options) => {
|
|
28
|
+
let maxData = originalMaxData;
|
|
29
|
+
validateInputs(maxData, options);
|
|
30
|
+
const minTickCount = options?.minTickCount || DEFAULT_MIN_TICK_COUNT;
|
|
31
|
+
const maxTickCount = options?.maxTickCount || DEFAULT_MAX_TICK_COUNT;
|
|
32
|
+
let scaleDirection = 1;
|
|
33
|
+
let rangeDistance = maxData;
|
|
34
|
+
if (options?.acceptNegative && !isNil(options.minNegative)) {
|
|
41
35
|
if (maxData === 0) {
|
|
42
36
|
maxData = -1;
|
|
43
37
|
}
|
|
44
|
-
stepCandidates.unshift(...stepCandidates.map(item => item * -1));
|
|
45
38
|
if (maxData <= 0) {
|
|
46
|
-
|
|
39
|
+
rangeDistance = options.minNegative;
|
|
47
40
|
}
|
|
48
|
-
if (
|
|
49
|
-
|
|
41
|
+
if (rangeDistance > NEGATIVE_THRESHOLD) {
|
|
42
|
+
rangeDistance = FALLBACK_NEGATIVE_VALUE;
|
|
50
43
|
}
|
|
51
44
|
if (maxData > 0) {
|
|
52
|
-
|
|
53
|
-
|
|
45
|
+
rangeDistance = maxData + Math.abs(options.minNegative);
|
|
46
|
+
scaleDirection = -1;
|
|
54
47
|
}
|
|
55
48
|
}
|
|
56
|
-
if (Math.abs(
|
|
57
|
-
|
|
49
|
+
if (Math.abs(rangeDistance) < MIN_DISTANCE_TO_ZERO) {
|
|
50
|
+
rangeDistance = MIN_DISTANCE_TO_ZERO;
|
|
58
51
|
}
|
|
52
|
+
const stepCandidates = getStepCandidates(maxData, minTickCount, options?.minNegative || 0, options?.acceptStepIsTypeFloat, options?.stepCandidates, options?.acceptNegative);
|
|
59
53
|
for (const step of stepCandidates) {
|
|
60
|
-
let tickCount = Math.abs(Math.ceil(
|
|
61
|
-
let maxValue = maxData <= 0 ? 0 : step * tickCount *
|
|
54
|
+
let tickCount = Math.abs(Math.ceil(rangeDistance / step)) + (scaleDirection === -1 ? 2 : 1);
|
|
55
|
+
let maxValue = maxData <= 0 ? 0 : step * tickCount * scaleDirection;
|
|
62
56
|
let minValue = 0;
|
|
63
57
|
if (tickCount >= minTickCount && tickCount <= maxTickCount) {
|
|
64
58
|
if (maxData < maxValue) {
|
|
@@ -69,8 +63,9 @@ export const getSmartAxisScale = (maxData, options) => {
|
|
|
69
63
|
tick++;
|
|
70
64
|
}
|
|
71
65
|
}
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
const maxValuePositive = maxValue - Math.abs(minValue);
|
|
67
|
+
tickCount = maxValuePositive - originalMaxData > Math.abs(step) && tickCount - 1 >= minTickCount ? tickCount - 1 : tickCount;
|
|
68
|
+
maxValue = (step * tickCount * scaleDirection) - (minValue * scaleDirection);
|
|
74
69
|
return {
|
|
75
70
|
stepSize: Math.abs(step),
|
|
76
71
|
max: maxValue,
|
|
@@ -80,9 +75,9 @@ export const getSmartAxisScale = (maxData, options) => {
|
|
|
80
75
|
}
|
|
81
76
|
}
|
|
82
77
|
}
|
|
83
|
-
let step = Math.ceil(
|
|
78
|
+
let step = Math.ceil(rangeDistance / minTickCount) || 1;
|
|
84
79
|
let maxValue = step * minTickCount;
|
|
85
|
-
if (
|
|
80
|
+
if (rangeDistance === maxValue) {
|
|
86
81
|
step = step + Math.ceil(step / 10);
|
|
87
82
|
maxValue = step * minTickCount;
|
|
88
83
|
}
|
|
@@ -93,4 +88,87 @@ export const getSmartAxisScale = (maxData, options) => {
|
|
|
93
88
|
tickAmount: minTickCount
|
|
94
89
|
};
|
|
95
90
|
};
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXNtYXJ0LWF4aXMtc2NhbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9nZXQtc21hcnQtYXhpcy1zY2FsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsT0FBZSxFQUFFLE9BT2xELEVBS0MsRUFBRTtJQUNGLE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDO0lBQ2hELE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDO0lBQ2pELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNsRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEwsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ3RELEtBQUssSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFLGNBQWMsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFF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QUksR0FBRyxZQUFZLENBQUM7SUFDbkMsSUFBSSxjQUFjLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNuQyxRQUFRLEdBQUcsSUFBSSxHQUFHLFlBQVksQ0FBQztJQUNqQyxDQUFDO0lBQ0QsT0FBTztRQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN4QixHQUFHLEVBQUUsUUFBUTtRQUNiLEdBQUcsRUFBRSxDQUFDO1FBQ04sVUFBVSxFQUFFLFlBQVk7S0FDekIsQ0FBQztBQUVKLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuLyoqXG4gKiBIw6BtIGPDsyB0aOG7gyB0cuG6oyB24buBIGzhu5dpIG7hur91OlxuICogLSBtYXhEYXRhIDwgMCB2w6AgYWNjZXB0TmVnYXRpdmUgbMOgIGZhbHNlXG4gKiAtIG1pbk5lZ2F0aXZlIGzDoCB1bmRlZmluZWQgdsOgIGFjY2VwdE5lZ2F0aXZlIGzDoCB0cnVlXG4gKiAtIG1heERhdGEgPCBtaW5OZWdhdGl2ZSAoY2jhu4kgeOG6o3kgcmEga2hpIGFjY2VwdE5lZ2F0aXZlIGzDoCB0cnVlKVxuICogLSBtaW5OZWdhdGl2ZSA+IDAgKGNo4buJIHjhuqN5IHJhIGtoaSBhY2NlcHROZWdhdGl2ZSBsw6AgdHJ1ZSlcbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogQHJlcXVpcmVkIGx1w7RuIMSR4bq3dCBow6BtIG7DoHkgdHJvbmcgdHJ5IGNhdGNoIHbDoCB44butIGzDvSBuZ2/huqFpIGzhu4dcbiAqIEBoaW50IFRydXnhu4FuIDMgdGhhbSBz4buROiBtaW4sbWF4IHbDoCB0aWNrXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTbWFydEF4aXNTY2FsZSA9IChtYXhEYXRhOiBudW1iZXIsIG9wdGlvbnM/OiB7XG4gIG1pblRpY2tDb3VudD86IG51bWJlcjtcbiAgbWF4VGlja0NvdW50PzogbnVtYmVyO1xuICBzdGVwQ2FuZGlkYXRlcz86IEFycmF5PG51bWJlcj47XG4gIGFjY2VwdE5lZ2F0aXZlPzogYm9vbGVhbjtcbiAgbWluTmVnYXRpdmU/OiBudW1iZXI7XG4gIGFjY2VwdFN0ZXBJc1R5cGVGbG9hdD86IGJvb2xlYW47XG59KToge1xuICBzdGVwU2l6ZTogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbiAgbWluOiBudW1iZXI7XG4gIHRpY2tBbW91bnQ6IG51bWJlcjtcbn0gPT4ge1xuICBjb25zdCBtaW5UaWNrQ291bnQgPSBvcHRpb25zPy5taW5UaWNrQ291bnQgfHwgNTtcbiAgY29uc3QgbWF4VGlja0NvdW50ID0gb3B0aW9ucz8ubWF4VGlja0NvdW50IHx8IDEwO1xuICBjb25zdCBzdGVwQ2FuZGlkYXRlc0RlZmF1bHQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICBjb25zdCBsb29wU3RlcENhbmRpZGF0ZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAoXywgaW5kZXgpID0+IE1hdGgucG93KDEwLCBpbmRleCkpLmZpbmRJbmRleChpdGVtID0+IGl0ZW0gPiBNYXRoLmFicyhNYXRoLm1heChtYXhEYXRhLCBNYXRoLmFicyhvcHRpb25zPy5taW5OZWdhdGl2ZSB8fCAwKSkpKSArIDE7XG5cbiAgQXJyYXkuZnJvbSh7IGxlbmd0aDogbG9vcFN0ZXBDYW5kaWRhdGVzIH0sIChfLCBpbmRleCkgPT4ge1xuICAgIGZvciAobGV0IHRlbXBsYXRlTnVtYmVyID0gMTsgdGVtcGxhdGVOdW1iZXIgPCAxMDsgdGVtcGxhdGVOdW1iZXIrKykge1xuICAgICAgaWYgKG9wdGlvbnM/LmFjY2VwdFN0ZXBJc1R5cGVGbG9hdCkge1xuICAgICAgICBzdGVwQ2FuZGlkYXRlc0RlZmF1bHQucHVzaChNYXRoLnBvdygxMCwgaW5kZXgpICogKCgodGVtcGxhdGVOdW1iZXIgLSAxKSAqIDIgKyAxKSAvIDIpKTtcbiAgICAgIH1cbiAgICAgIHN0ZXBDYW5kaWRhdGVzRGVmYXVsdC5wdXNoKE1hdGgucG93KDEwLCBpbmRleCkgKiB0ZW1wbGF0ZU51bWJlcik7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBzdGVwQ2FuZGlkYXRlcyA9IG9wdGlvbnM/LnN0ZXBDYW5kaWRhdGVzIHx8IHN0ZXBDYW5kaWRhdGVzRGVmYXVsdDtcbiAgbGV0IGRpc3RhbmNlVG9aZXJvID0gbWF4RGF0YTtcbiAgbGV0IHJldmVyc2UgPSAxO1xuXG4gIGlmIChtYXhEYXRhIDwgMCAmJiAhb3B0aW9ucz8uYWNjZXB0TmVnYXRpdmUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJtYXhEYXRhIGlzIGxlc3MgdGhhbiAwIGFuZCBhY2NlcHROZWdhdGl2ZSBpcyBmYWxzZVwiKTtcbiAgfVxuICBpZiAob3B0aW9ucz8uYWNjZXB0TmVnYXRpdmUpIHtcbiAgICBpZiAoaXNOaWwob3B0aW9ucy5taW5OZWdhdGl2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pbk5lZ2F0aXZlIGlzIHJlcXVpcmVkIHdoZW4gYWNjZXB0TmVnYXRpdmUgaXMgdHJ1ZVwiKTtcbiAgICB9XG5cbiAgICBpZiAobWF4RGF0YSA8IG9wdGlvbnMubWluTmVnYXRpdmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1heERhdGEgaXMgbGVzcyB0aGFuIG1pbk5lZ2F0aXZlXCIpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1pbk5lZ2F0aXZlID49IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pbk5lZ2F0aXZlIG11c3QgYmUgbmVnYXRpdmVcIik7XG4gICAgfVxuICAgIGlmIChtYXhEYXRhID09PSAwKSB7XG4gICAgICBtYXhEYXRhID0gLTE7XG4gICAgfVxuXG4gICAgc3RlcENhbmRpZGF0ZXMudW5zaGlmdCguLi5zdGVwQ2FuZGlkYXRlcy5tYXAoaXRlbSA9PiBpdGVtICogLTEpKTtcbiAgICBpZiAobWF4RGF0YSA8PSAwKSB7XG4gICAgICBkaXN0YW5jZVRvWmVybyA9IG9wdGlvbnMubWluTmVnYXRpdmU7XG4gICAgfVxuICAgIGlmIChkaXN0YW5jZVRvWmVybyA+IC01KSB7XG4gICAgICBkaXN0YW5jZVRvWmVybyA9IC00O1xuICAgIH1cbiAgICBpZiAobWF4RGF0YSA+IDApIHtcbiAgICAgIGRpc3RhbmNlVG9aZXJvID0gbWF4RGF0YSArIE1hdGguYWJzKG9wdGlvbnMubWluTmVnYXRpdmUpO1xuICAgICAgcmV2ZXJzZSA9IC0xO1xuICAgIH1cbiAgfVxuICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VUb1plcm8pIDwgMykge1xuICAgIGRpc3RhbmNlVG9aZXJvID0gMztcbiAgfVxuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwQ2FuZGlkYXRlcykge1xuICAgIGxldCB0aWNrQ291bnQgPSBNYXRoLmFicyhNYXRoLmNlaWwoZGlzdGFuY2VUb1plcm8gLyBzdGVwKSkgKyAocmV2ZXJzZSA9PT0gLTEgPyAyIDogMSk7XG4gICAgbGV0IG1heFZhbHVlID0gbWF4RGF0YSA8PSAwID8gMCA6IHN0ZXAgKiB0aWNrQ291bnQgKiByZXZlcnNlO1xuICAgIGxldCBtaW5WYWx1ZSA9IDA7XG5cbiAgICBpZiAodGlja0NvdW50ID49IG1pblRpY2tDb3VudCAmJiB0aWNrQ291bnQgPD0gbWF4VGlja0NvdW50KSB7XG4gICAgICBpZiAobWF4RGF0YSA8IG1heFZhbHVlKSB7XG4gICAgICAgIGlmIChvcHRpb25zPy5hY2NlcHROZWdhdGl2ZSkge1xuICAgICAgICAgIGxldCB0aWNrID0gMTtcbiAgICAgICAgICB3aGlsZSAoIWlzTmlsKG9wdGlvbnMubWluTmVnYXRpdmUpICYmIHRpY2sgPD0gdGlja0NvdW50ICYmIG1pblZhbHVlID49IG9wdGlvbnMubWluTmVnYXRpdmUpIHtcbiAgICAgICAgICAgIG1pblZhbHVlID0gdGljayAqIHN0ZXA7XG4gICAgICAgICAgICB0aWNrKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRpY2tDb3VudCA9IGRpc3RhbmNlVG9aZXJvIC0gKHRpY2tDb3VudCAtIDEpICogc3RlcCA8IC0xICogKHN0ZXAgLyA0KSA/IHRpY2tDb3VudCAtIDEgOiB0aWNrQ291bnQ7XG4gICAgICAgIG1heFZhbHVlID0gKHN0ZXAgKiB0aWNrQ291bnQgKiByZXZlcnNlKSAtIChtaW5WYWx1ZSAqIHJldmVyc2UpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0ZXBTaXplOiBNYXRoLmFicyhzdGVwKSxcbiAgICAgICAgICBtYXg6IG1heFZhbHVlLFxuICAgICAgICAgIG1pbjogbWluVmFsdWUsXG4gICAgICAgICAgdGlja0Ftb3VudDogdGlja0NvdW50XG4gICAgICAgIH07XG5cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IHN0ZXAgPSBNYXRoLmNlaWwoZGlzdGFuY2VUb1plcm8gLyBtaW5UaWNrQ291bnQpIHx8IDE7XG4gIGxldCBtYXhWYWx1ZSA9IHN0ZXAgKiBtaW5UaWNrQ291bnQ7XG4gIGlmIChkaXN0YW5jZVRvWmVybyA9PT0gbWF4VmFsdWUpIHtcbiAgICBzdGVwID0gc3RlcCArIE1hdGguY2VpbChzdGVwIC8gMTApO1xuICAgIG1heFZhbHVlID0gc3RlcCAqIG1pblRpY2tDb3VudDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0ZXBTaXplOiBNYXRoLmFicyhzdGVwKSxcbiAgICBtYXg6IG1heFZhbHVlLFxuICAgIG1pbjogMCxcbiAgICB0aWNrQW1vdW50OiBtaW5UaWNrQ291bnRcbiAgfTtcblxufSJdfQ==
|
|
91
|
+
// Cache cho các giá trị lũy thừa 10 để tối ưu hiệu suất
|
|
92
|
+
const POWER_CACHE = new Map();
|
|
93
|
+
/**
|
|
94
|
+
* Tạo danh sách các step candidates cho việc tính toán scale
|
|
95
|
+
* @param maxData - Giá trị dữ liệu tối đa
|
|
96
|
+
* @param minStep - Số bước tối thiểu
|
|
97
|
+
* @param minNegative - Giá trị âm tối thiểu
|
|
98
|
+
* @param acceptStepIsTypeFloat - Có chấp nhận step thập phân không
|
|
99
|
+
* @param stepCandidatesByOptions - Step candidates do người dùng cung cấp
|
|
100
|
+
* @param includeNegativeSteps - Có bao gồm các step âm không
|
|
101
|
+
* @returns Danh sách các step candidates
|
|
102
|
+
*/
|
|
103
|
+
const getStepCandidates = (maxData, minStep, minNegative, acceptStepIsTypeFloat = false, stepCandidatesByOptions, includeNegativeSteps = false) => {
|
|
104
|
+
// Nếu có step candidates tùy chỉnh, sử dụng chúng
|
|
105
|
+
if (stepCandidatesByOptions && stepCandidatesByOptions.length > 0) {
|
|
106
|
+
return stepCandidatesByOptions;
|
|
107
|
+
}
|
|
108
|
+
const stepCandidates = new Array();
|
|
109
|
+
const maxValueStep = Math.abs(Math.max(maxData, Math.abs(minNegative || 0))) / minStep;
|
|
110
|
+
// Tạo step candidates dựa trên lũy thừa của 10
|
|
111
|
+
for (let powNumber = 0; powNumber <= MAX_POW_NUMBER; powNumber++) {
|
|
112
|
+
// Sử dụng cache để tối ưu hiệu suất
|
|
113
|
+
if (!POWER_CACHE.has(powNumber)) {
|
|
114
|
+
POWER_CACHE.set(powNumber, Math.pow(10, powNumber));
|
|
115
|
+
}
|
|
116
|
+
const powValue = POWER_CACHE.get(powNumber);
|
|
117
|
+
for (let templateNumber = 1; templateNumber < MAX_TEMPLATE_NUMBER; templateNumber++) {
|
|
118
|
+
// Thêm step thập phân nếu được chấp nhận
|
|
119
|
+
if (acceptStepIsTypeFloat) {
|
|
120
|
+
const step = powValue * (((templateNumber - 1) * 2 + 1) / 2);
|
|
121
|
+
stepCandidates.push(step);
|
|
122
|
+
}
|
|
123
|
+
const step = powValue * templateNumber;
|
|
124
|
+
stepCandidates.push(step);
|
|
125
|
+
// Dừng khi step đã đủ lớn
|
|
126
|
+
if (step >= maxValueStep) {
|
|
127
|
+
checkAndSetNegativeSteps(stepCandidates, includeNegativeSteps, minNegative);
|
|
128
|
+
return stepCandidates;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
checkAndSetNegativeSteps(stepCandidates, includeNegativeSteps, minNegative);
|
|
133
|
+
return stepCandidates;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Kiểm tra và thêm các step âm vào danh sách candidates nếu cần
|
|
137
|
+
* @param stepCandidates - Danh sách step candidates hiện tại
|
|
138
|
+
* @param acceptNegative - Có chấp nhận giá trị âm không
|
|
139
|
+
* @param minNegative - Giá trị âm tối thiểu
|
|
140
|
+
*/
|
|
141
|
+
const checkAndSetNegativeSteps = (stepCandidates, acceptNegative, minNegative) => {
|
|
142
|
+
if (acceptNegative && minNegative < 0) {
|
|
143
|
+
// Tạo các step âm và thêm vào đầu danh sách
|
|
144
|
+
const negativeSteps = [...stepCandidates].map(step => -step);
|
|
145
|
+
stepCandidates.unshift(...negativeSteps);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Kiểm tra tính hợp lệ của các tham số đầu vào
|
|
150
|
+
* @param maxData - Giá trị dữ liệu tối đa
|
|
151
|
+
* @param options - Các tùy chọn cấu hình
|
|
152
|
+
* @throws {Error} Khi các tham số không hợp lệ
|
|
153
|
+
*/
|
|
154
|
+
const validateInputs = (maxData, options) => {
|
|
155
|
+
// Kiểm tra maxData âm khi không chấp nhận giá trị âm
|
|
156
|
+
if (maxData < 0 && !options?.acceptNegative) {
|
|
157
|
+
throw new Error("maxData is less than 0 and acceptNegative is false");
|
|
158
|
+
}
|
|
159
|
+
if (options?.acceptNegative) {
|
|
160
|
+
// Kiểm tra minNegative có được cung cấp không
|
|
161
|
+
if (isNil(options.minNegative)) {
|
|
162
|
+
throw new Error("minNegative is required when acceptNegative is true");
|
|
163
|
+
}
|
|
164
|
+
// Kiểm tra maxData phải >= minNegative
|
|
165
|
+
if (maxData < options.minNegative) {
|
|
166
|
+
throw new Error("maxData is less than minNegative");
|
|
167
|
+
}
|
|
168
|
+
// Kiểm tra minNegative phải là số âm
|
|
169
|
+
if (options.minNegative >= 0) {
|
|
170
|
+
throw new Error("minNegative must be negative");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXNtYXJ0LWF4aXMtc2NhbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9nZXQtc21hcnQtYXhpcy1zY2FsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFtQi9COzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsZUFBdUIsRUFBRSxPQUEwQixFQUFtQixFQUFFO0lBQ3hHLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQztJQUU5QixjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxZQUFZLElBQUksc0JBQXNCLENBQUM7SUFDckUsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLFlBQVksSUFBSSxzQkFBc0IsQ0FBQztJQUVyRSxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDdkIsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDO0lBRzVCLElBQUksT0FBTyxFQUFFLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLEdBQUcsQ0FBQyxD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fSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5jb25zdCBERUZBVUxUX01JTl9USUNLX0NPVU5UID0gNTtcbmNvbnN0IERFRkFVTFRfTUFYX1RJQ0tfQ09VTlQgPSAxMDtcbmNvbnN0IE1JTl9ESVNUQU5DRV9UT19aRVJPID0gMztcbmNvbnN0IE5FR0FUSVZFX1RIUkVTSE9MRCA9IC01O1xuY29uc3QgRkFMTEJBQ0tfTkVHQVRJVkVfVkFMVUUgPSAtNDtcbmNvbnN0IE1BWF9QT1dfTlVNQkVSID0gMTQ7XG5jb25zdCBNQVhfVEVNUExBVEVfTlVNQkVSID0gMTA7XG5cbi8vIOKchSBUaMOqbSBpbnRlcmZhY2VzIMSR4buDIHTEg25nIGPGsOG7nW5nIHR5cGUgc2FmZXR5XG5pbnRlcmZhY2UgQXhpc1NjYWxlT3B0aW9ucyB7XG4gIG1pblRpY2tDb3VudD86IG51bWJlcjsgLy8gU+G7kSBsxrDhu6NuZyB0aWNrIHThu5FpIHRoaeG7g3VcbiAgbWF4VGlja0NvdW50PzogbnVtYmVyOyAvLyBT4buRIGzGsOG7o25nIHRpY2sgdOG7kWkgxJFhXG4gIHN0ZXBDYW5kaWRhdGVzPzogbnVtYmVyW107IC8vIERhbmggc8OhY2ggY8OhYyBzdGVwIGNhbmRpZGF0ZXMgdMO5eSBjaOG7iW5oXG4gIGFjY2VwdE5lZ2F0aXZlPzogYm9vbGVhbjsgLy8gQ8OzIGNo4bqlcCBuaOG6rW4gZ2nDoSB0cuG7iyDDom0ga2jDtG5nXG4gIG1pbk5lZ2F0aXZlPzogbnVtYmVyOyAvLyBHacOhIHRy4buLIMOibSB04buRaSB0aGnhu4N1XG4gIGFjY2VwdFN0ZXBJc1R5cGVGbG9hdD86IGJvb2xlYW47IC8vIEPDsyBjaOG6pXAgbmjhuq1uIHN0ZXAgbMOgIHPhu5EgdGjhuq1wIHBow6JuIGtow7RuZ1xufVxuXG5pbnRlcmZhY2UgQXhpc1NjYWxlUmVzdWx0IHtcbiAgc3RlcFNpemU6IG51bWJlcjsgLy8gS8OtY2ggdGjGsOG7m2MgYsaw4bubY1xuICBtYXg6IG51bWJlcjsgLy8gR2nDoSB0cuG7iyB04buRaSDEkWEgY+G7p2EgdHLhu6VjXG4gIG1pbjogbnVtYmVyOyAvLyBHacOhIHRy4buLIHThu5FpIHRoaeG7g3UgY+G7p2EgdHLhu6VjXG4gIHRpY2tBbW91bnQ6IG51bWJlcjsgLy8gU+G7kSBsxrDhu6NuZyB0aWNrXG59XG5cbi8qKlxuICogVMOtbmggdG/DoW4gc21hcnQgYXhpcyBzY2FsZSBjaG8gYmnhu4N1IMSR4buTXG4gKiBcbiAqIEBwYXJhbSBtYXhEYXRhIC0gR2nDoSB0cuG7iyB04buRaSDEkWEgY+G7p2EgZOG7ryBsaeG7h3VcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ8OhYyB0w7l5IGNo4buNbiBj4bqldSBow6xuaCBheGlzIHNjYWxlXG4gKiBAcmV0dXJucyBD4bqldSBow6xuaCBheGlzIHNjYWxlIGJhbyBn4buTbSBzdGVwU2l6ZSwgbWF4LCBtaW4sIHRpY2tBbW91bnRcbiAqIFxuICogQHRocm93cyB7RXJyb3J9IElOVkFMSURfTkVHQVRJVkVfREFUQSAtIGtoaSBtYXhEYXRhIDwgMCBtw6AgYWNjZXB0TmVnYXRpdmUgPSBmYWxzZVxuICogQHRocm93cyB7RXJyb3J9IE1JU1NJTkdfTUlOX05FR0FUSVZFIC0ga2hpIGFjY2VwdE5lZ2F0aXZlID0gdHJ1ZSBuaMawbmcgdGhp4bq/dSBtaW5OZWdhdGl2ZVxuICogQHRocm93cyB7RXJyb3J9IElOVkFMSURfUkFOR0UgLSBraGkgbWF4RGF0YSA8IG1pbk5lZ2F0aXZlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSU5WQUxJRF9NSU5fTkVHQVRJVkUgLSBraGkgbWluTmVnYXRpdmUgPj0gMFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gZ2V0U21hcnRBeGlzU2NhbGUoMTAwLCB7IG1pblRpY2tDb3VudDogNSwgbWF4VGlja0NvdW50OiAxMCB9KTtcbiAqIC8vIHJldHVybnMgeyBzdGVwU2l6ZTogMjAsIG1heDogMTIwLCBtaW46IDAsIHRpY2tBbW91bnQ6IDYgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTbWFydEF4aXNTY2FsZSA9IChvcmlnaW5hbE1heERhdGE6IG51bWJlciwgb3B0aW9ucz86IEF4aXNTY2FsZU9wdGlvbnMpOiBBeGlzU2NhbGVSZXN1bHQgPT4ge1xuICBsZXQgbWF4RGF0YSA9IG9yaWdpbmFsTWF4RGF0YTtcbiAgXG4gIHZhbGlkYXRlSW5wdXRzKG1heERhdGEsIG9wdGlvbnMpO1xuICBjb25zdCBtaW5UaWNrQ291bnQgPSBvcHRpb25zPy5taW5UaWNrQ291bnQgfHwgREVGQVVMVF9NSU5fVElDS19DT1VOVDtcbiAgY29uc3QgbWF4VGlja0NvdW50ID0gb3B0aW9ucz8ubWF4VGlja0NvdW50IHx8IERFRkFVTFRfTUFYX1RJQ0tfQ09VTlQ7XG4gIFxuICBsZXQgc2NhbGVEaXJlY3Rpb24gPSAxO1xuICBsZXQgcmFuZ2VEaXN0YW5jZSA9IG1heERhdGE7XG4gIFxuICBcbiAgaWYgKG9wdGlvbnM/LmFjY2VwdE5lZ2F0aXZlICYmICFpc05pbChvcHRpb25zLm1pbk5lZ2F0aXZlKSkge1xuICAgIGlmIChtYXhEYXRhID09PSAwKSB7XG4gICAgICBtYXhEYXRhID0gLTE7XG4gICAgfVxuICAgIGlmIChtYXhEYXRhIDw9IDApIHtcbiAgICAgIHJhbmdlRGlzdGFuY2UgPSBvcHRpb25zLm1pbk5lZ2F0aXZlO1xuICAgIH1cbiAgICBpZiAocmFuZ2VEaXN0YW5jZSA+IE5FR0FUSVZFX1RIUkVTSE9MRCkge1xuICAgICAgcmFuZ2VEaXN0YW5jZSA9IEZBTExCQUNLX05FR0FUSVZFX1ZBTFVFO1xuICAgIH1cbiAgICBpZiAobWF4RGF0YSA+IDApIHtcbiAgICAgIHJhbmdlRGlzdGFuY2UgPSBtYXhEYXRhICsgTWF0aC5hYnMob3B0aW9ucy5taW5OZWdhdGl2ZSk7XG4gICAgICBzY2FsZURpcmVjdGlvbiA9IC0xO1xuICAgIH1cbiAgfVxuICBpZiAoTWF0aC5hYnMocmFuZ2VEaXN0YW5jZSkgPCBNSU5fRElTVEFOQ0VfVE9fWkVSTykge1xuICAgIHJhbmdlRGlzdGFuY2UgPSBNSU5fRElTVEFOQ0VfVE9fWkVSTztcbiAgfVxuICBcbiAgY29uc3Qgc3RlcENhbmRpZGF0ZXMgPSBnZXRTdGVwQ2FuZGlkYXRlcyhcbiAgICBtYXhEYXRhLFxuICAgIG1pblRpY2tDb3VudCxcbiAgICBvcHRpb25zPy5taW5OZWdhdGl2ZSB8fCAwLFxuICAgIG9wdGlvbnM/LmFjY2VwdFN0ZXBJc1R5cGVGbG9hdCxcbiAgICBvcHRpb25zPy5zdGVwQ2FuZGlkYXRlcyxcbiAgICBvcHRpb25zPy5hY2NlcHROZWdhdGl2ZVxuICApO1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcENhbmRpZGF0ZXMpIHtcbiAgICBsZXQgdGlja0NvdW50ID0gTWF0aC5hYnMoTWF0aC5jZWlsKHJhbmdlRGlzdGFuY2UgLyBzdGVwKSkgKyAoc2NhbGVEaXJlY3Rpb24gPT09IC0xID8gMiA6IDEpO1xuICAgIGxldCBtYXhWYWx1ZSA9IG1heERhdGEgPD0gMCA/IDAgOiBzdGVwICogdGlja0NvdW50ICogc2NhbGVEaXJlY3Rpb247XG4gICAgbGV0IG1pblZhbHVlID0gMDtcblxuICAgIGlmICh0aWNrQ291bnQgPj0gbWluVGlja0NvdW50ICYmIHRpY2tDb3VudCA8PSBtYXhUaWNrQ291bnQpIHtcbiAgICAgIGlmIChtYXhEYXRhIDwgbWF4VmFsdWUpIHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmFjY2VwdE5lZ2F0aXZlKSB7XG4gICAgICAgICAgbGV0IHRpY2sgPSAxO1xuICAgICAgICAgIHdoaWxlICghaXNOaWwob3B0aW9ucy5taW5OZWdhdGl2ZSkgJiYgdGljayA8PSB0aWNrQ291bnQgJiYgbWluVmFsdWUgPj0gb3B0aW9ucy5taW5OZWdhdGl2ZSkge1xuICAgICAgICAgICAgbWluVmFsdWUgPSB0aWNrICogc3RlcDtcbiAgICAgICAgICAgIHRpY2srKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF4VmFsdWVQb3NpdGl2ZSA9IG1heFZhbHVlIC0gTWF0aC5hYnMobWluVmFsdWUpO1xuICAgICAgICB0aWNrQ291bnQgPSBtYXhWYWx1ZVBvc2l0aXZlIC0gb3JpZ2luYWxNYXhEYXRhID4gTWF0aC5hYnMoc3RlcCkgJiYgdGlja0NvdW50IC0gMSA+PSBtaW5UaWNrQ291bnQgPyB0aWNrQ291bnQgLSAxIDogdGlja0NvdW50O1xuXG4gICAgICAgIG1heFZhbHVlID0gKHN0ZXAgKiB0aWNrQ291bnQgKiBzY2FsZURpcmVjdGlvbikgLSAobWluVmFsdWUgKiBzY2FsZURpcmVjdGlvbik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RlcFNpemU6IE1hdGguYWJzKHN0ZXApLFxuICAgICAgICAgIG1heDogbWF4VmFsdWUsXG4gICAgICAgICAgbWluOiBtaW5WYWx1ZSxcbiAgICAgICAgICB0aWNrQW1vdW50OiB0aWNrQ291bnRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgc3RlcCA9IE1hdGguY2VpbChyYW5nZURpc3RhbmNlIC8gbWluVGlja0NvdW50KSB8fCAxO1xuICBsZXQgbWF4VmFsdWUgPSBzdGVwICogbWluVGlja0NvdW50O1xuICBpZiAocmFuZ2VEaXN0YW5jZSA9PT0gbWF4VmFsdWUpIHtcbiAgICBzdGVwID0gc3RlcCArIE1hdGguY2VpbChzdGVwIC8gMTApO1xuICAgIG1heFZhbHVlID0gc3RlcCAqIG1pblRpY2tDb3VudDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0ZXBTaXplOiBNYXRoLmFicyhzdGVwKSxcbiAgICBtYXg6IG1heFZhbHVlLFxuICAgIG1pbjogMCxcbiAgICB0aWNrQW1vdW50OiBtaW5UaWNrQ291bnRcbiAgfTtcbn1cblxuLy8gQ2FjaGUgY2hvIGPDoWMgZ2nDoSB0cuG7iyBsxal5IHRo4burYSAxMCDEkeG7gyB04buRaSDGsHUgaGnhu4d1IHN14bqldFxuY29uc3QgUE9XRVJfQ0FDSEUgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG4vKipcbiAqIFThuqFvIGRhbmggc8OhY2ggY8OhYyBzdGVwIGNhbmRpZGF0ZXMgY2hvIHZp4buHYyB0w61uaCB0b8OhbiBzY2FsZVxuICogQHBhcmFtIG1heERhdGEgLSBHacOhIHRy4buLIGThu68gbGnhu4d1IHThu5FpIMSRYVxuICogQHBhcmFtIG1pblN0ZXAgLSBT4buRIGLGsOG7m2MgdOG7kWkgdGhp4buDdVxuICogQHBhcmFtIG1pbk5lZ2F0aXZlIC0gR2nDoSB0cuG7iyDDom0gdOG7kWkgdGhp4buDdVxuICogQHBhcmFtIGFjY2VwdFN0ZXBJc1R5cGVGbG9hdCAtIEPDsyBjaOG6pXAgbmjhuq1uIHN0ZXAgdGjhuq1wIHBow6JuIGtow7RuZ1xuICogQHBhcmFtIHN0ZXBDYW5kaWRhdGVzQnlPcHRpb25zIC0gU3RlcCBjYW5kaWRhdGVzIGRvIG5nxrDhu51pIGTDuW5nIGN1bmcgY+G6pXBcbiAqIEBwYXJhbSBpbmNsdWRlTmVnYXRpdmVTdGVwcyAtIEPDsyBiYW8gZ+G7k20gY8OhYyBzdGVwIMOibSBraMO0bmdcbiAqIEByZXR1cm5zIERhbmggc8OhY2ggY8OhYyBzdGVwIGNhbmRpZGF0ZXNcbiAqL1xuY29uc3QgZ2V0U3RlcENhbmRpZGF0ZXMgPSAoXG4gIG1heERhdGE6IG51bWJlcixcbiAgbWluU3RlcDogbnVtYmVyLFxuICBtaW5OZWdhdGl2ZTogbnVtYmVyLFxuICBhY2NlcHRTdGVwSXNUeXBlRmxvYXQgPSBmYWxzZSxcbiAgc3RlcENhbmRpZGF0ZXNCeU9wdGlvbnM/OiBudW1iZXJbXSxcbiAgaW5jbHVkZU5lZ2F0aXZlU3RlcHMgPSBmYWxzZVxuKTogbnVtYmVyW10gPT4ge1xuICAvLyBO4bq/dSBjw7Mgc3RlcCBjYW5kaWRhdGVzIHTDuXkgY2jhu4luaCwgc+G7rSBk4bulbmcgY2jDum5nXG4gIGlmKHN0ZXBDYW5kaWRhdGVzQnlPcHRpb25zICYmIHN0ZXBDYW5kaWRhdGVzQnlPcHRpb25zLmxlbmd0aCA+IDApe1xuICAgIHJldHVybiBzdGVwQ2FuZGlkYXRlc0J5T3B0aW9ucztcbiAgfVxuICBcbiAgY29uc3Qgc3RlcENhbmRpZGF0ZXM9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gIGNvbnN0IG1heFZhbHVlU3RlcCA9IE1hdGguYWJzKE1hdGgubWF4KG1heERhdGEsIE1hdGguYWJzKG1pbk5lZ2F0aXZlIHx8IDApKSkgLyBtaW5TdGVwO1xuXG4gIC8vIFThuqFvIHN0ZXAgY2FuZGlkYXRlcyBk4buxYSB0csOqbiBsxal5IHRo4burYSBj4bunYSAxMFxuICBmb3IgKGxldCBwb3dOdW1iZXIgPSAwOyBwb3dOdW1iZXIgPD0gTUFYX1BPV19OVU1CRVI7IHBvd051bWJlcisrKSB7XG4gICAgLy8gU+G7rSBk4bulbmcgY2FjaGUgxJHhu4MgdOG7kWkgxrB1IGhp4buHdSBzdeG6pXRcbiAgICBpZighUE9XRVJfQ0FDSEUuaGFzKHBvd051bWJlcikpe1xuICAgICAgUE9XRVJfQ0FDSEUuc2V0KHBvd051bWJlcixNYXRoLnBvdygxMCxwb3dOdW1iZXIpKTtcbiAgICB9XG4gICAgY29uc3QgcG93VmFsdWUgPSBQT1dFUl9DQUNIRS5nZXQocG93TnVtYmVyKSBhcyBudW1iZXI7XG4gICAgXG4gICAgZm9yIChsZXQgdGVtcGxhdGVOdW1iZXIgPSAxOyB0ZW1wbGF0ZU51bWJlciA8IE1BWF9URU1QTEFURV9OVU1CRVI7IHRlbXBsYXRlTnVtYmVyKyspIHtcbiAgICAgIC8vIFRow6ptIHN0ZXAgdGjhuq1wIHBow6JuIG7hur91IMSRxrDhu6NjIGNo4bqlcCBuaOG6rW5cbiAgICAgIGlmIChhY2NlcHRTdGVwSXNUeXBlRmxvYXQpIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IHBvd1ZhbHVlICogKCgodGVtcGxhdGVOdW1iZXIgLSAxKSAqIDIgKyAxKSAvIDIpO1xuICAgICAgICBzdGVwQ2FuZGlkYXRlcy5wdXNoKHN0ZXApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBzdGVwID0gcG93VmFsdWUgKiB0ZW1wbGF0ZU51bWJlcjtcbiAgICAgIHN0ZXBDYW5kaWRhdGVzLnB1c2goc3RlcCk7XG5cbiAgICAgIC8vIEThu6tuZyBraGkgc3RlcCDEkcOjIMSR4bunIGzhu5tuXG4gICAgICBpZiAoc3RlcCA+PSBtYXhWYWx1ZVN0ZXApIHtcbiAgICAgICAgY2hlY2tBbmRTZXROZWdhdGl2ZVN0ZXBzKHN0ZXBDYW5kaWRhdGVzLCBpbmNsdWRlTmVnYXRpdmVTdGVwcywgbWluTmVnYXRpdmUpO1xuICAgICAgICByZXR1cm4gc3RlcENhbmRpZGF0ZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICBjaGVja0FuZFNldE5lZ2F0aXZlU3RlcHMoc3RlcENhbmRpZGF0ZXMsIGluY2x1ZGVOZWdhdGl2ZVN0ZXBzLCBtaW5OZWdhdGl2ZSk7XG4gIHJldHVybiBzdGVwQ2FuZGlkYXRlcztcbn1cblxuLyoqXG4gKiBLaeG7g20gdHJhIHbDoCB0aMOqbSBjw6FjIHN0ZXAgw6JtIHbDoG8gZGFuaCBzw6FjaCBjYW5kaWRhdGVzIG7hur91IGPhuqduXG4gKiBAcGFyYW0gc3RlcENhbmRpZGF0ZXMgLSBEYW5oIHPDoWNoIHN0ZXAgY2FuZGlkYXRlcyBoaeG7h24gdOG6oWlcbiAqIEBwYXJhbSBhY2NlcHROZWdhdGl2ZSAtIEPDsyBjaOG6pXAgbmjhuq1uIGdpw6EgdHLhu4sgw6JtIGtow7RuZ1xuICogQHBhcmFtIG1pbk5lZ2F0aXZlIC0gR2nDoSB0cuG7iyDDom0gdOG7kWkgdGhp4buDdVxuICovXG5jb25zdCBjaGVja0FuZFNldE5lZ2F0aXZlU3RlcHMgPSAoc3RlcENhbmRpZGF0ZXM6IG51bWJlcltdLCBhY2NlcHROZWdhdGl2ZTogYm9vbGVhbiwgbWluTmVnYXRpdmU6IG51bWJlcik6IHZvaWQgPT4ge1xuICBpZiAoYWNjZXB0TmVnYXRpdmUgJiYgbWluTmVnYXRpdmUgPCAwKSB7XG4gICAgLy8gVOG6oW8gY8OhYyBzdGVwIMOibSB2w6AgdGjDqm0gdsOgbyDEkeG6p3UgZGFuaCBzw6FjaFxuICAgIGNvbnN0IG5lZ2F0aXZlU3RlcHMgPSBbLi4uc3RlcENhbmRpZGF0ZXNdLm1hcChzdGVwID0+IC1zdGVwKTtcbiAgICBzdGVwQ2FuZGlkYXRlcy51bnNoaWZ0KC4uLm5lZ2F0aXZlU3RlcHMpO1xuICB9XG59IFxuXG4vKipcbiAqIEtp4buDbSB0cmEgdMOtbmggaOG7o3AgbOG7hyBj4bunYSBjw6FjIHRoYW0gc+G7kSDEkeG6p3UgdsOgb1xuICogQHBhcmFtIG1heERhdGEgLSBHacOhIHRy4buLIGThu68gbGnhu4d1IHThu5FpIMSRYVxuICogQHBhcmFtIG9wdGlvbnMgLSBDw6FjIHTDuXkgY2jhu41uIGPhuqV1IGjDrG5oXG4gKiBAdGhyb3dzIHtFcnJvcn0gS2hpIGPDoWMgdGhhbSBz4buRIGtow7RuZyBo4bujcCBs4buHXG4gKi9cbmNvbnN0IHZhbGlkYXRlSW5wdXRzID0gKG1heERhdGE6IG51bWJlciwgb3B0aW9ucz86IEF4aXNTY2FsZU9wdGlvbnMpOiB2b2lkID0+IHtcbiAgLy8gS2nhu4NtIHRyYSBtYXhEYXRhIMOibSBraGkga2jDtG5nIGNo4bqlcCBuaOG6rW4gZ2nDoSB0cuG7iyDDom1cbiAgaWYgKG1heERhdGEgPCAwICYmICFvcHRpb25zPy5hY2NlcHROZWdhdGl2ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIm1heERhdGEgaXMgbGVzcyB0aGFuIDAgYW5kIGFjY2VwdE5lZ2F0aXZlIGlzIGZhbHNlXCIpO1xuICB9XG4gIFxuICBpZiAob3B0aW9ucz8uYWNjZXB0TmVnYXRpdmUpIHtcbiAgICAvLyBLaeG7g20gdHJhIG1pbk5lZ2F0aXZlIGPDsyDEkcaw4bujYyBjdW5nIGPhuqVwIGtow7RuZ1xuICAgIGlmIChpc05pbChvcHRpb25zLm1pbk5lZ2F0aXZlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWluTmVnYXRpdmUgaXMgcmVxdWlyZWQgd2hlbiBhY2NlcHROZWdhdGl2ZSBpcyB0cnVlXCIpO1xuICAgIH1cblxuICAgIC8vIEtp4buDbSB0cmEgbWF4RGF0YSBwaOG6o2kgPj0gbWluTmVnYXRpdmVcbiAgICBpZiAobWF4RGF0YSA8IG9wdGlvbnMubWluTmVnYXRpdmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1heERhdGEgaXMgbGVzcyB0aGFuIG1pbk5lZ2F0aXZlXCIpO1xuICAgIH1cblxuICAgIC8vIEtp4buDbSB0cmEgbWluTmVnYXRpdmUgcGjhuqNpIGzDoCBz4buRIMOibVxuICAgIGlmIChvcHRpb25zLm1pbk5lZ2F0aXZlID49IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pbk5lZ2F0aXZlIG11c3QgYmUgbmVnYXRpdmVcIik7XG4gICAgfVxuICB9XG59ICJdfQ==
|
package/esm2022/helpers.mjs
CHANGED
|
@@ -58,6 +58,70 @@ export const omitBy = (objData, predicate) => {
|
|
|
58
58
|
});
|
|
59
59
|
return newObj;
|
|
60
60
|
};
|
|
61
|
+
/**
|
|
62
|
+
* Lấy giá trị từ đối tượng theo đường dẫn chỉ định
|
|
63
|
+
*
|
|
64
|
+
* Hàm này giúp bạn truy cập vào các thuộc tính sâu bên trong một đối tượng một cách an toàn,
|
|
65
|
+
* tránh lỗi khi thuộc tính không tồn tại.
|
|
66
|
+
*
|
|
67
|
+
* @param obj Đối tượng nguồn cần lấy giá trị
|
|
68
|
+
* @param path Đường dẫn đến thuộc tính cần lấy. Có thể là:
|
|
69
|
+
* - Chuỗi: 'user.profile.name' hoặc 'items[0].title'
|
|
70
|
+
* - Mảng: ['user', 'profile', 'name'] hoặc ['items', '0', 'title']
|
|
71
|
+
* - Chuỗi rỗng '': trả về chính đối tượng gốc
|
|
72
|
+
* @param defaultValue Giá trị mặc định trả về khi không tìm thấy thuộc tính (mặc định: undefined)
|
|
73
|
+
* @param keepLastValueIfSignal Có giữ nguyên signal cuối cùng hay không (mặc định: false - sẽ gọi signal())
|
|
74
|
+
* @returns Giá trị tìm được hoặc giá trị mặc định
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* // Ví dụ cơ bản
|
|
78
|
+
* const user = { name: 'John', age: 30 };
|
|
79
|
+
* get(user, 'name'); // 'John'
|
|
80
|
+
* get(user, 'email'); // undefined
|
|
81
|
+
* get(user, 'email', 'no-email'); // 'no-email'
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* // Truyền path rỗng - trả về chính đối tượng gốc
|
|
85
|
+
* const data = { name: 'Alice', age: 25 };
|
|
86
|
+
* get(data, ''); // { name: 'Alice', age: 25 } (chính đối tượng data)
|
|
87
|
+
* get(data, '', 'default'); // { name: 'Alice', age: 25 } (bỏ qua defaultValue)
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* // Truy cập thuộc tính sâu
|
|
91
|
+
* const data = {
|
|
92
|
+
* user: {
|
|
93
|
+
* profile: {
|
|
94
|
+
* name: 'Alice',
|
|
95
|
+
* settings: { theme: 'dark' }
|
|
96
|
+
* }
|
|
97
|
+
* }
|
|
98
|
+
* };
|
|
99
|
+
* get(data, 'user.profile.name'); // 'Alice'
|
|
100
|
+
* get(data, 'user.profile.settings.theme'); // 'dark'
|
|
101
|
+
* get(data, 'user.profile.avatar', 'default.jpg'); // 'default.jpg'
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* // Truy cập mảng
|
|
105
|
+
* const items = [
|
|
106
|
+
* { name: 'Item 1', price: 100 },
|
|
107
|
+
* { name: 'Item 2', price: 200 }
|
|
108
|
+
* ];
|
|
109
|
+
* get(items, '[0].name'); // 'Item 1'
|
|
110
|
+
* get(items, '0.price'); // 100
|
|
111
|
+
* get(items, '[1].name'); // 'Item 2'
|
|
112
|
+
* get(items, '[2].name', 'Not found'); // 'Not found'
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* // Sử dụng với mảng path
|
|
116
|
+
* const nested = { a: { b: { c: 'deep value' } } };
|
|
117
|
+
* get(nested, ['a', 'b', 'c']); // 'deep value'
|
|
118
|
+
* get(nested, ['a', 'b', 'd'], 'default'); // 'default'
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* // Trường hợp đặc biệt
|
|
122
|
+
* get(null, 'any.path'); // undefined
|
|
123
|
+
* get(undefined, 'any.path', 'fallback'); // 'fallback'
|
|
124
|
+
*/
|
|
61
125
|
export const get = (obj, path, defaultValue = undefined, keepLastValueIfSignal) => {
|
|
62
126
|
if (isNil(obj)) {
|
|
63
127
|
return defaultValue;
|
|
@@ -456,4 +520,4 @@ export const generateInterface = (obj, interfaceName) => {
|
|
|
456
520
|
const interfaceStr = `interface ${interfaceName} ${generateType(obj)}`;
|
|
457
521
|
return interfaceStr;
|
|
458
522
|
};
|
|
459
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBa0IsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RCxzQ0FBc0M7QUFDdEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBYyxFQUE2QixFQUFFO0lBQ2pFLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFO0lBQ3hDLE9BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUM7UUFDckIsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3BLLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0s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QUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDckQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxZQUFZLElBQUksS0FBSyxHQUFHLEtBQUssU0FBUyxLQUFLLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1lBQ0QsWUFBWSxJQUFJLEdBQUcsQ0FBQztZQUNwQixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxhQUFhLGFBQWEsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUN2RSxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBFbGVtZW50UmVmLCBUZW1wbGF0ZVJlZiwgV3JpdGFibGVTaWduYWwsIGlzU2lnbmFsLCBzaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVFlQRV9PQkpFQ1QgfSBmcm9tIFwiQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0IH0gZnJvbSBcIi4vaHR0cC1wYXJhbXNcIjtcblxuLyoqQ8OhYyBow6BtIHTGsMahbmcgdOG7sSB0aMawIHZp4buHbiBsb2Rhc2ggKi9cbi8qKlxuICogS2nhu4NtIHRyYSB4ZW0gbeG7mXQgZ2nDoSB0cuG7iyBjw7MgcGjhuqNpIGzDoCBudWxsIGhv4bq3YyB1bmRlZmluZWQgaGF5IGtow7RuZ1xuICogQHBhcmFtIHZhbHVlIEdpw6EgdHLhu4sgY+G6p24ga2nhu4NtIHRyYVxuICogQHJldHVybnMgdHJ1ZSBu4bq/dSBnacOhIHRy4buLIGzDoCBudWxsIGhv4bq3YyB1bmRlZmluZWQsIGZhbHNlIG7hur91IGtow7RuZ1xuICogQGV4YW1wbGVcbiAqIGlzTmlsKG51bGwpOyAvLyB0cnVlXG4gKiBpc05pbCh1bmRlZmluZWQpOyAvLyB0cnVlXG4gKiBpc05pbCgwKTsgLy8gZmFsc2VcbiAqIGlzTmlsKCdoZWxsbycpOyAvLyBmYWxzZVxuICovXG5leHBvcnQgY29uc3QgaXNOaWwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEtp4buDbSB0cmEgeGVtIG3hu5l0IGdpw6EgdHLhu4sgY8OzIHBo4bqjaSBsw6AgcuG7l25nIGhheSBraMO0bmdcbiAqIEBwYXJhbSB2YWx1ZSBHacOhIHRy4buLIGPhuqduIGtp4buDbSB0cmFcbiAqIEByZXR1cm5zIHRydWUgbuG6v3UgZ2nDoSB0cuG7iyBsw6AgbnVsbCwgcuG7l25nIGhv4bq3YyB1bmRlZmluZWQsIGZhbHNlIG7hur91IGtow7RuZ1xuICogQGV4YW1wbGVcbiAqIGlzRW1wdHkobnVsbCk7IC8vIHRydWVcbiAqIGlzRW1wdHkoJycpOyAvLyB0cnVlXG4gKiBpc0VtcHR5KHVuZGVmaW5lZCk7IC8vIHRydWVcbiAqIGlzRW1wdHkoe30pOyAvLyB0cnVlXG4gKiBpc0VtcHR5KFtdKTsgLy8gdHJ1ZVxuICogaXNFbXB0eShbMSwgMiwgM10pOyAvLyBmYWxzZVxuICogaXNFbXB0eSh7IGE6IDEgfSk7IC8vIGZhbHNlXG4gKi9cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gIHdoaWxlKGlzU2lnbmFsKHZhbHVlKSl7XG4gICAgdmFsdWUgPSB2YWx1ZSgpO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAoSlNPTi5zdHJpbmdpZnkodmFsdWUpID09PSAne30nIHx8IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA9PT0gJ1tdJykpO1xufTtcblxuLyoqXG4gKiBMb+G6oWkgYuG7jyBjw6FjIHRodeG7mWMgdMOtbmggY+G7p2EgxJHhu5FpIHTGsOG7o25nIGThu7FhIHRyw6puIG3hu5l0IGjDoG0gxJFp4buBdSBraeG7h25cbiAqIEBwYXJhbSBvYmpEYXRhIMSQ4buRaSB0xrDhu6NuZyBj4bqnbiB44butIGzDvVxuICogQHBhcmFtIHByZWRpY2F0ZSBIw6BtIMSRaeG7gXUga2nhu4duIMSR4buDIGtp4buDbSB0cmEgZ2nDoSB0cuG7iyBj4bunYSB0aHXhu5ljIHTDrW5oLiBO4bq/dSBow6BtIHRy4bqjIHbhu4EgdHJ1ZSB0aMOsIHRodeG7mWMgdMOtbmggxJHDsyBz4bq9IGLhu4sgbG/huqFpIGLhu49cbiAqIEByZXR1cm5zIMSQ4buRaSB0xrDhu6NuZyBt4bubaSBzYXUga2hpIMSRw6MgbG/huqFpIGLhu48gY8OhYyB0aHXhu5ljIHTDrW5oIHRo4buPYSBtw6NuIMSRaeG7gXUga2nhu4duXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb2JqID0geyBhOiAxLCBiOiBudWxsLCBjOiAzLCBkOiB1bmRlZmluZWQgfTtcbiAqIG9taXRCeShvYmosIGlzTmlsKTsgLy8geyBhOiAxLCBjOiAzIH1cbiAqL1xuZXhwb3J0IGNvbnN0IG9taXRCeSA9IDxUPihvYmpEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcmVkaWNhdGU6ICh2YWw6IGFueSkgPT4gYm9vbGVhbik6IFQgPT4ge1xuICBpZiAoIW9iakRhdGEgfHwgdHlwZW9mIG9iakRhdGEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkob2JqRGF0YSkpIHtcbiAgICByZXR1cm4gb2JqRGF0YSBhcyBUO1xuICB9XG4gIGNvbnN0IG5ld09iaiA9IHt9IGFzIFQ7XG5cbiAgT2JqZWN0LmtleXMob2JqRGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgIGNvbnN0IHZhbHVlT2ZLZXkgPSBnZXQob2JqRGF0YSwga2V5KTtcbiAgICBpZiAoIXByZWRpY2F0ZSh2YWx1ZU9mS2V5KSkge1xuICAgICAgc2V0KG5ld09iaiwga2V5LCB2YWx1ZU9mS2V5KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG5ld09iajtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXQgPSA8VCA9IGFueT4ob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWU6IGFueSA9IHVuZGVmaW5lZCwga2VlcExhc3RWYWx1ZUlmU2lnbmFsPzogYm9vbGVhbik6IFQgPT4ge1xuICBpZiAoaXNOaWwob2JqKSkge1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbiAgd2hpbGUgKGlzU2lnbmFsKG9iaikpIHtcbiAgICBvYmogPSBvYmooKTtcbiAgfVxuICBpZiAocGF0aCA9PT0gJycpIHtcbiAgICByZXR1cm4gb2JqIGFzIFQ7XG4gIH1cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEh0dHBQYXJhbXMpIHtcbiAgICByZXR1cm4gb2JqLmdldChgJHtwYXRofWApIGFzIFQ7XG4gIH1cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIERPTVJlY3QpIHtcbiAgICByZXR1cm4gb2JqW3BhdGggYXMga2V5b2YgRE9NUmVjdF0gYXMgVDtcbiAgfVxuXG4gIGNvbnN0IHBhdGhzID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBwYXRoLnJlcGxhY2UoL1xcWyhcXGQrKV0vZywgJy4kMScpLnNwbGl0KCcuJykuZmlsdGVyKGtleSA9PiBrZXkpO1xuICBmb3IgKGNvbnN0IGluZGV4IGluIHBhdGhzKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0aHNbaW5kZXhdO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKSB7XG4gICAgICBvYmogPSBvYmpba2V5IGFzIGtleW9mIENTU1N0eWxlRGVjbGFyYXRpb25dIGFzIFQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIG9iaiA9IG9ialtrZXkgYXMga2V5b2YgSFRNTEVsZW1lbnRdIGFzIFQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGlzTmlsKG9iaikgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsID0gaXNTaWduYWwob2JqW2tleV0pICYmICFrZWVwTGFzdFZhbHVlSWZTaWduYWwgPyBvYmpba2V5XSgpIDogb2JqW2tleV07XG5cbiAgICBvYmogPSB2YWw7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBUaGnhur90IGzhuq1wIGdpw6EgdHLhu4sgY2hvIG3hu5l0IHRodeG7mWMgdMOtbmggdHJvbmcgxJHhu5FpIHTGsOG7o25nIHRoZW8gxJHGsOG7nW5nIGThuqtuIGNo4buJIMSR4buLbmhcbiAqIEBwYXJhbSBvYmogxJDhu5FpIHTGsOG7o25nIGPhuqduIHRoaeG6v3QgbOG6rXAgZ2nDoSB0cuG7i1xuICogQHBhcmFtIHBhdGggxJDGsOG7nW5nIGThuqtuIMSR4bq/biB0aHXhu5ljIHTDrW5oLCBjw7MgdGjhu4MgbMOgIGNodeG7l2kgKHZkOiAnYS5iLmMnKSBob+G6t2MgbeG6o25nICh2ZDogWydhJywgJ2InLCAnYyddKVxuICogQHBhcmFtIHZhbHVlIEdpw6EgdHLhu4sgY+G6p24gdGhp4bq/dCBs4bqtcFxuICogQHJldHVybnMgxJDhu5FpIHTGsOG7o25nIHNhdSBraGkgxJHDoyB0aGnhur90IGzhuq1wIGdpw6EgdHLhu4tcbiAqIEB0aHJvd3MgRXJyb3IgbuG6v3UgdGhhbSBz4buRIMSR4bqndSB0acOqbiBraMO0bmcgcGjhuqNpIGzDoCDEkeG7kWkgdMaw4bujbmdcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvYmogPSB7IGE6IHsgYjogMSB9IH07XG4gKiBzZXQob2JqLCAnYS5iJywgMik7IC8vIHsgYTogeyBiOiAyIH0gfVxuICovXG5leHBvcnQgY29uc3Qgc2V0ID0gPFQgPSBhbnk+KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgdmFsdWU6IGFueSk6IFQgPT4ge1xuICBpZiAoIW9iaiB8fCAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiAhaXNTaWduYWwob2JqKSkgfHwgKGlzU2lnbmFsKG9iaikgJiYgdHlwZW9mIG9iaigpICE9PSBcIm9iamVjdFwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcbiAgfVxuXG4gIGlmIChvYmogaW5zdGFuY2VvZiBIdHRwUGFyYW1zKSB7XG4gICAgcmV0dXJuIG9iai5zZXQoYCR7cGF0aH1gLCB2YWx1ZSkgYXMgVDtcbiAgfVxuXG4gIGNvbnN0IHBhdGhBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5yZXBsYWNlKC9cXFsoXFxkKyldL2csICcuWyQxXScpLnNwbGl0KCcuJykuZmlsdGVyKGtleSA9PiBrZXkpO1xuXG4gIGxldCBjdXJyZW50T2JqZWN0QnlLZXk6IGFueSA9IGlzU2lnbmFsKG9iaikgPyBvYmooKSA6IG9iajtcbiAgbGV0IHByZU9iamVjdEJ5S2V5ID0gb2JqO1xuXG4gIHBhdGhBcnJheS5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4IDwgcGF0aEFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgIGlmICghKGtleSBpbiBjdXJyZW50T2JqZWN0QnlLZXkpIHx8ICh0eXBlb2YgY3VycmVudE9iamVjdEJ5S2V5W2tleV0gIT09IFwib2JqZWN0XCIgJiYgIWlzU2lnbmFsKGN1cnJlbnRPYmplY3RCeUtleVtrZXldKSkpIHtcbiAgICAgICAgY29uc3QgbmV4dEtleSA9IHBhdGhBcnJheVtpbmRleCArIDFdO1xuICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxbKFxcZCspXS9nLCAnJDEnKTtcbiAgICAgICAgY3VycmVudE9iamVjdEJ5S2V5W2tleV0gPSAvXFxbKFxcZCspXS9nLnRlc3QobmV4dEtleSkgPyBbXSA6IHt9O1xuICAgICAgfVxuICAgICAgY3VycmVudE9iamVjdEJ5S2V5ID0ga2V5ID8gY3VycmVudE9iamVjdEJ5S2V5W2tleV0gOiBjdXJyZW50T2JqZWN0QnlLZXk7XG4gICAgICBwcmVPYmplY3RCeUtleSA9IGN1cnJlbnRPYmplY3RCeUtleTtcbiAgICAgIGN1cnJlbnRPYmplY3RCeUtleSA9IGlzU2lnbmFsKGN1cnJlbnRPYmplY3RCeUtleSkgPyBjdXJyZW50T2JqZWN0QnlLZXkoKSA6IGN1cnJlbnRPYmplY3RCeUtleTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGN1cnJlbnRPYmplY3RCeUtleSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEfDoW4gZ2nDoSB0cuG7iyDhu58gY3Xhu5FpIMSRxrDhu51uZyBk4bqrblxuICAgIGtleSA9IGtleS5yZXBsYWNlKC9cXFsoXFxkKyldL2csICckMScpO1xuICAgIGNvbnN0IHZhbHVlT2ZLZXkgPSBjdXJyZW50T2JqZWN0QnlLZXlba2V5XTtcbiAgICBjb25zdCB2YWx1ZU9mS2V5SXNTaWduYWwgPSBpc1NpZ25hbCh2YWx1ZU9mS2V5KTtcbiAgICBpZiAodmFsdWVPZktleUlzU2lnbmFsICYmICh0eXBlb2YgdmFsdWVPZktleSgpICE9PSAnb2JqZWN0JyB8fCB2YWx1ZU9mS2V5KCkgPT09IG51bGwpKSB7XG4gICAgICAodmFsdWVPZktleSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+KS5zZXQoaXNTaWduYWwodmFsdWUpID8gdmFsdWUoKSA6IHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzU2lnbmFsKHByZU9iamVjdEJ5S2V5KSkge1xuICAgICAgKHByZU9iamVjdEJ5S2V5IGFzIFdyaXRhYmxlU2lnbmFsPGFueT4pLnVwZGF0ZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFPZktleSA9IGRhdGFba2V5XTtcblxuICAgICAgICBpZiAoaXNOaWwoZGF0YU9mS2V5KSB8fCAhaXNTaWduYWwodmFsdWVPZktleSkpIHtcbiAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZU9mS2V5KSkge1xuICAgICAgICAgICh2YWx1ZU9mS2V5IGFzIFdyaXRhYmxlU2lnbmFsPGFueT4pLnNldChpc1NpZ25hbCh2YWx1ZSkgPyB2YWx1ZSgpIDogdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLmRhdGFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLmRhdGEgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdXJyZW50T2JqZWN0QnlLZXlba2V5XSA9IHZhbHVlO1xuICB9KTtcblxuICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBU4bqhbyBt4buZdCBi4bqjbiBzYW8gc8OidSBj4bunYSBt4buZdCDEkeG7kWkgdMaw4bujbmcgaG/hurdjIGdpw6EgdHLhu4sgYuG6pXQga+G7s1xuICogQHBhcmFtIGRhdGEgROG7ryBsaeG7h3UgY+G6p24gc2FvIGNow6lwXG4gKiBAcGFyYW0gb3B0aW9ucyBUw7l5IGNo4buNbiBj4bqldSBow6xuaFxuICogQHBhcmFtIG9wdGlvbnMuaWdub3JlU2lnbmFsIE7hur91IHRydWUsIHPhur0ga2jDtG5nIHNhbyBjaMOpcCBjw6FjIHNpZ25hbCBtw6AgdHLhuqMgduG7gSBzaWduYWwgZ+G7kWNcbiAqIEBwYXJhbSBzZWVuIFdlYWtNYXAgxJHhu4MgdGhlbyBkw7VpIGPDoWMgdGhhbSBjaGnhur91IMSRw6MgxJHGsOG7o2Mgc2FvIGNow6lwLCB0csOhbmggbOG6t3AgdsO0IGjhuqFuIHbhu5tpIGPDoWMgdGhhbSBjaGnhur91IHbDsm5nXG4gKiBAcmV0dXJucyBC4bqjbiBzYW8gc8OidSBj4bunYSBk4buvIGxp4buHdSDEkeG6p3UgdsOgb1xuICogQGV4YW1wbGVcbiAqIGNvbnN0IG9iaiA9IHtcbiAqICAgYTogMSxcbiAqICAgYjogeyBjOiAyIH0sXG4gKiAgIGQ6IFsxLCAyLCAzXVxuICogfTtcbiAqIGNvbnN0IGNsb25lID0gY2xvbmVEZWVwKG9iaik7XG4gKiAvLyBjbG9uZSBsw6AgbeG7mXQgYuG6o24gc2FvIGhvw6BuIHRvw6BuIMSR4buZYyBs4bqtcCBj4bunYSBvYmpcbiAqL1xuZXhwb3J0IGNvbnN0IGNsb25lRGVlcCA9IDxUID0gYW55PihkYXRhOiBhbnksIG9wdGlvbnMgPSB7IGlnbm9yZVNpZ25hbDogZmFsc2UgfSwgc2VlbiA9IG5ldyBXZWFrTWFwKCkpOiBUID0+IHtcbiAgaWYgKGRhdGEgPT09IG51bGwgfHwgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyAmJiAhaXNTaWduYWwoZGF0YSkpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBpZiAoc2Vlbi5oYXMoZGF0YSkpIHtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEh0dHBQYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3QodW5kZWZpbmVkLCBkYXRhKSBhcyBUO1xuICB9XG5cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGEuZ2V0VGltZSgpKSBhcyBUO1xuICB9XG5cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChkYXRhLnNvdXJjZSwgZGF0YS5mbGFncykgYXMgVDtcbiAgfVxuXG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgbWFwQ29weSA9IG5ldyBNYXAoKTtcbiAgICBzZWVuLnNldChkYXRhLCBtYXBDb3B5KTtcbiAgICBkYXRhLmZvckVhY2goKHZhbCwga2V5KSA9PiB7XG4gICAgICBtYXBDb3B5LnNldChjbG9uZURlZXAoa2V5LCBvcHRpb25zLCBzZWVuKSwgY2xvbmVEZWVwKHZhbCwgb3B0aW9ucywgc2VlbikpO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXBDb3B5IGFzIFQ7XG4gIH1cblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgIGNvbnN0IHNldENvcHkgPSBuZXcgU2V0KCk7XG4gICAgc2Vlbi5zZXQoZGF0YSwgc2V0Q29weSk7XG4gICAgZGF0YS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICBzZXRDb3B5LmFkZChjbG9uZURlZXAodmFsLCBvcHRpb25zLCBzZWVuKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNldENvcHkgYXMgVDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgc2Vlbi5zZXQoZGF0YSwgZGF0YS5tYXAoaXRlbSA9PiBjbG9uZURlZXAoaXRlbSwgb3B0aW9ucywgc2VlbikpIGFzIFQpO1xuICAgIHJldHVybiBzZWVuLmdldChkYXRhKSBhcyBUO1xuICB9XG5cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBGaWxlIHx8IGRhdGEgaW5zdGFuY2VvZiBCbG9iIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgRmlsZV0nKSB7XG4gICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgfVxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmIHx8IGRhdGEgaW5zdGFuY2VvZiBFbGVtZW50UmVmIHx8IGRhdGEgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGRhdGEgaW5zdGFuY2VvZiBQcm9taXNlIHx8IGRhdGEgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgfVxuICBpZiAoaXNTaWduYWwoZGF0YSkpIHtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlU2lnbmFsKSB7XG4gICAgICByZXR1cm4gZGF0YSBhcyBUO1xuICAgIH1cbiAgICBzZWVuLnNldChkYXRhLCBzaWduYWwoY2xvbmVEZWVwKGRhdGEoKSwgb3B0aW9ucywgc2VlbikpKTtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSkgYXMgVDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBzZWVuLnNldChkYXRhLCByZXN1bHQpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSHR0cFBhcmFtcykge1xuICAgICAgcmVzdWx0W2tleV0gPSBuZXcgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCh1bmRlZmluZWQsIHZhbHVlKSBhcyBUO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmIHx8IHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudFJlZiB8fCB2YWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gY2xvbmVEZWVwKHZhbHVlLCBvcHRpb25zLCBzZWVuKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IGFzIFQ7XG59O1xuXG4vKipcbiAqIENodXnhu4NuIMSR4buVaSBt4buZdCBt4bqjbmcgY8OhYyDEkeG7kWkgdMaw4bujbmcgdGjDoG5oIG3hu5l0IMSR4buRaSB0xrDhu6NuZyB24bubaSBraMOzYSDEkcaw4bujYyBjaOG7iSDEkeG7i25oXG4gKiBAcGFyYW0gZGF0YSBN4bqjbmcgY8OhYyDEkeG7kWkgdMaw4bujbmcgY+G6p24gY2h1eeG7g24gxJHhu5VpXG4gKiBAcGFyYW0ga2V5IFTDqm4gdGh14buZYyB0w61uaCDEkcaw4bujYyBz4butIGThu6VuZyBsw6BtIGtow7NhIHRyb25nIMSR4buRaSB0xrDhu6NuZyBr4bq/dCBxdeG6o1xuICogQHJldHVybnMgxJDhu5FpIHTGsOG7o25nIHbhu5tpIGPDoWMgZ2nDoSB0cuG7iyB04burIG3huqNuZyDEkcaw4bujYyDEkcOhbmgga2V5IHRoZW8gdGh14buZYyB0w61uaCDEkcOjIGNo4buJIMSR4buLbmhcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBkYXRhID0gW1xuICogICB7IGlkOiAxLCBuYW1lOiAnSm9obicgfSxcbiAqICAgeyBpZDogMiwgbmFtZTogJ0phbmUnIH1cbiAqIF07XG4gKiBrZXlCeShkYXRhLCAnaWQnKTsgXG4gKiAvLyBL4bq/dCBxdeG6ozogeyBcbiAqIC8vICAgJzEnOiB7IGlkOiAxLCBuYW1lOiAnSm9obicgfSxcbiAqIC8vICAgJzInOiB7IGlkOiAyLCBuYW1lOiAnSmFuZScgfVxuICogLy8gfVxuICovXG5leHBvcnQgY29uc3Qga2V5QnkgPSAoZGF0YTogQXJyYXk8VFlQRV9PQkpFQ1Q+LCBrZXk6IHN0cmluZyk6IFRZUEVfT0JKRUNUID0+IHtcbiAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCB8fCAha2V5KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiBkYXRhLnJlZHVjZSgoZGlyLCBuZXh0SXRlbSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlT2ZLZXkgPSBuZXh0SXRlbVtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWVPZktleSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlT2ZLZXkgIT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBkaXJbdmFsdWVPZktleV0gPSBuZXh0SXRlbTtcbiAgICByZXR1cm4gZGlyO1xuICB9LCB7fSk7XG59O1xuXG4vKipcbiAqIE5ow7NtIGPDoWMgxJHhu5FpIHTGsOG7o25nIHRyb25nIG3hu5l0IG3huqNuZyB0aMOgbmggY8OhYyBuaMOzbSBk4buxYSB0csOqbiBt4buZdCB0aHXhu5ljIHTDrW5oIGPhu6UgdGjhu4NcbiAqIEBwYXJhbSBkYXRhIE3huqNuZyBjw6FjIMSR4buRaSB0xrDhu6NuZyBj4bqnbiBuaMOzbVxuICogQHBhcmFtIGtleSBUw6puIHRodeG7mWMgdMOtbmggxJHGsOG7o2Mgc+G7rSBk4bulbmcgbMOgbSBraMOzYSBuaMOzbVxuICogQHJldHVybnMgxJDhu5FpIHTGsOG7o25nIHbhu5tpIGPDoWMgZ2nDoSB0cuG7iyB04burIG3huqNuZyDEkcaw4bujYyBuaMOzbSB0aGVvIHRodeG7mWMgdMOtbmggxJHDoyBjaOG7iSDEkeG7i25oXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IFtcbiAqICAgeyBpZDogMSwgbmFtZTogJ0pvaG4nIH0sXG4gKiAgIHsgaWQ6IDIsIG5hbWU6ICdKYW5lJyB9LFxuICogICB7IGlkOiAxLCBuYW1lOiAnSm9obicgfVxuICogXTtcbiAqIGdyb3VwQnkoZGF0YSwgJ2lkJyk7IFxuICogLy8gS+G6v3QgcXXhuqM6IHsgICAgXG4gKiAvLyAgICcxJzogW1xuICogLy8gICAgIHsgaWQ6IDEsIG5hbWU6ICdKb2huJyB9LFxuICogLy8gICAgIHsgaWQ6IDEsIG5hbWU6ICdKb2huJyB9XG4gKiAvLyAgIF0sXG4gKiAvLyAgICcyJzogW1xuICogLy8gICAgIHsgaWQ6IDIsIG5hbWU6ICdKYW5lJyB9IFxuICogLy8gfVxuICovXG5leHBvcnQgY29uc3QgZ3JvdXBCeSA9IChkYXRhOiBBcnJheTxUWVBFX09CSkVDVD4sIGtleTogc3RyaW5nKTogVFlQRV9PQkpFQ1QgPT4ge1xuICBpZiAoIWRhdGEgfHwgIU9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCB8fCAha2V5KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiBkYXRhLnJlZHVjZSgoZGlyLCBuZXh0SXRlbSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlT2ZLZXkgPSBuZXh0SXRlbVtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWVPZktleSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlT2ZLZXkgIT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBpZiAoIWRpclt2YWx1ZU9mS2V5XSkge1xuICAgICAgZGlyW3ZhbHVlT2ZLZXldID0gW107XG4gICAgfVxuICAgIGRpclt2YWx1ZU9mS2V5XS5wdXNoKG5leHRJdGVtKTtcbiAgICByZXR1cm4gZGlyO1xuICB9LCB7fSk7XG59O1xuXG5cbi8qKlxuICogVOG6oW8gbeG7mXQgbeG6o25nIGPDoWMgc+G7kSB04burIGdpw6EgdHLhu4sgYuG6r3QgxJHhuqd1IMSR4bq/biBnacOhIHRy4buLIGvhur90IHRow7pjIHbhu5tpIGLGsOG7m2MgbmjhuqN5IHTDuXkgY2jhu41uXG4gKiBAcGFyYW0gc3RhcnQgR2nDoSB0cuG7iyBi4bqvdCDEkeG6p3UgY+G7p2EgZMOjeSBz4buRLiBO4bq/dSBjaOG7iSBjw7MgbeG7mXQgdGhhbSBz4buRLCDEkcOieSBz4bq9IGzDoCBnacOhIHRy4buLIGvhur90IHRow7pjIHbDoCBnacOhIHRy4buLIGLhuq90IMSR4bqndSBz4bq9IGzDoCAwXG4gKiBAcGFyYW0gZW5kIEdpw6EgdHLhu4sga+G6v3QgdGjDumMgY+G7p2EgZMOjeSBz4buRICh0w7l5IGNo4buNbilcbiAqIEBwYXJhbSBzdGVwIELGsOG7m2MgbmjhuqN5IGdp4buvYSBjw6FjIHPhu5EgdHJvbmcgZMOjeSAodMO5eSBjaOG7jW4pLiBN4bq3YyDEkeG7i25oIGzDoCAxIG7hur91IGVuZCA+IHN0YXJ0LCAtMSBu4bq/dSBlbmQgPCBzdGFydFxuICogQHJldHVybnMgTeG6o25nIGPDoWMgc+G7kSB04burIHN0YXJ0IMSR4bq/biBlbmQgduG7m2kgYsaw4bubYyBuaOG6o3kgc3RlcFxuICogQGV4YW1wbGVcbiAqIHJhbmdlKDQpOyAgICAgIC8vIFswLCAxLCAyLCAzXVxuICogcmFuZ2UoMSwgNSk7ICAgLy8gWzEsIDIsIDMsIDRdXG4gKiByYW5nZSgwLCAyMCwgNSk7IC8vIFswLCA1LCAxMCwgMTVdXG4gKiByYW5nZSg1LCAyKTsgICAvLyBbNSwgNCwgM11cbiAqL1xuZXhwb3J0IGNvbnN0IHJhbmdlID0gKHN0YXJ0OiBudW1iZXIsIGVuZD86IG51bWJlciwgc3RlcD86IG51bWJlcik6IEFycmF5PG51bWJlcj4gPT4ge1xuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID09PSBudWxsKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gICAgc3RhcnQgPSAwO1xuICB9XG5cbiAgaWYgKCFzdGVwKSB7XG4gICAgc3RlcCA9IGVuZCA8IDAgPyAtMSA6IDE7XG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQgJiYgc3RlcCA+IDApIHtcbiAgICBzdGVwICo9IC0xO1xuICB9XG5cbiAgY29uc3QgdmFsdWVTdGFydEJ5U3RlcCA9IHN0ZXAgKyBzdGFydDtcbiAgY29uc3QgZGlyZWN0aW9uID0gc3RhcnQgPCBlbmQgPyAnYXNjJyA6ICdkZXNjJztcbiAgaWYgKChkaXJlY3Rpb24gPT09ICdhc2MnICYmICh2YWx1ZVN0YXJ0QnlTdGVwIDwgc3RhcnQgfHwgdmFsdWVTdGFydEJ5U3RlcCA+IGVuZCkpIHx8IChkaXJlY3Rpb24gPT09ICdkZXNjJyAmJiAodmFsdWVTdGFydEJ5U3RlcCA+IHN0YXJ0IHx8IHZhbHVlU3RhcnRCeVN0ZXAgPCBlbmQpKSkge1xuICAgIHJldHVybiBbc3RhcnRdO1xuICB9XG5cbiAgY29uc3QgYXJyID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTWF0aC5hYnMoZW5kIC0gc3RhcnQpOyBpbmRleCsrKSB7XG4gICAgbGV0IHZhbHVlID0gc3RhcnQgKyBpbmRleCAqIHN0ZXA7XG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICB2YWx1ZSA9IHN0YXJ0O1xuICAgIH1cblxuICAgIGlmICgoZGlyZWN0aW9uID09PSAnYXNjJyAmJiAodmFsdWUgPCBzdGFydCB8fCB2YWx1ZSA+IGVuZCkpIHx8IChkaXJlY3Rpb24gPT09ICdkZXNjJyAmJiAodmFsdWUgPiBzdGFydCB8fCB2YWx1ZSA8IGVuZCkpKSB7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIGFyci5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbi8qKlxuICogU28gc8OhbmggaGFpIGdpw6EgdHLhu4sgYuG6pXQga+G7syBjw7MgYuG6sW5nIG5oYXUgaGF5IGtow7RuZ1xuICogQHBhcmFtIHZhbHVlMSBHacOhIHRy4buLIHRo4bupIG5o4bqldCBj4bqnbiBzbyBzw6FuaFxuICogQHBhcmFtIHZhbHVlMiBHacOhIHRy4buLIHRo4bupIGhhaSBj4bqnbiBzbyBzw6FuaFxuICogQHBhcmFtIGV4YWN0bHlQb3NpdGlvbiBDw7Mgc28gc8OhbmggY2jDrW5oIHjDoWMgduG7iyB0csOtIGPDoWMgcGjhuqduIHThu60gdHJvbmcgbeG6o25nIGhheSBraMO0bmdcbiAqIEByZXR1cm5zIHRydWUgbuG6v3UgaGFpIGdpw6EgdHLhu4sgYuG6sW5nIG5oYXUsIGZhbHNlIG7hur91IGtow7RuZyBi4bqxbmcgbmhhdVxuICogQGV4YW1wbGVcbiAqIGlzRXF1YWwoWzEsMiwzXSwgWzEsMiwzXSk7IC8vIHRydWVcbiAqIGlzRXF1YWwoWzEsMiwzXSwgWzMsMiwxXSk7IC8vIHRydWUga2hpIGV4YWN0bHlQb3NpdGlvbiA9IGZhbHNlXG4gKiBpc0VxdWFsKFsxLDIsM10sIFszLDIsMV0pOyAvLyBmYWxzZSBraGkgZXhhY3RseVBvc2l0aW9uID0gdHJ1ZVxuICogaXNFcXVhbCh7YToxfSwge2E6MX0pOyAvLyB0cnVlXG4gKi9cbmV4cG9ydCBjb25zdCBpc0VxdWFsID0gKHZhbHVlMTogYW55LCB2YWx1ZTI6IGFueSwgZXhhY3RseVBvc2l0aW9uID0gZmFsc2UpOiBib29sZWFuID0+IHtcbiAgaWYgKHZhbHVlMSA9PT0gdmFsdWUyIHx8ICh2YWx1ZTEgPT09IG51bGwgJiYgdmFsdWUyID09PSBudWxsKSB8fCAodmFsdWUxID09PSB1bmRlZmluZWQgJiYgdmFsdWUyID09PSB1bmRlZmluZWQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgc2lnbmFsc1xuICB3aGlsZSAoaXNTaWduYWwodmFsdWUxKSkge1xuICAgIHZhbHVlMSA9IHZhbHVlMSgpO1xuICB9XG4gIHdoaWxlIChpc1NpZ25hbCh2YWx1ZTIpKSB7XG4gICAgdmFsdWUyID0gdmFsdWUyKCk7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlMSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlMiAhPT0gJ29iamVjdCcgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUxKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB8fCAoIUFycmF5LmlzQXJyYXkodmFsdWUxKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlMikpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUxKSkge1xuICAgIGlmICh2YWx1ZTEubGVuZ3RoICE9PSB2YWx1ZTIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFleGFjdGx5UG9zaXRpb24pIHtcbiAgICAgIHJldHVybiAhdmFsdWUxLnNvbWUoaXRlbSA9PiAhdmFsdWUyLmluY2x1ZGVzKGl0ZW0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXZhbHVlMS5zb21lKChpdGVtLCBpbmRleCkgPT4gIWlzRXF1YWwoaXRlbSwgdmFsdWUyW2luZGV4XSkpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHZhbHVlMSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyh2YWx1ZTIpLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gIU9iamVjdC5rZXlzKHZhbHVlMSkuc29tZSgoa2V5KSA9PiAhaXNFcXVhbCh2YWx1ZTFba2V5XSwgdmFsdWUyW2tleV0pKTtcbn1cblxuLyoqXG4gKiBMb+G6oWkgYuG7jyBjw6FjIHBo4bqnbiB04butIHRyw7luZyBs4bq3cCB0cm9uZyBt4bqjbmcgZOG7sWEgdHLDqm4gbeG7mXQgdGh14buZYyB0w61uaCBjaOG7iSDEkeG7i25oXG4gKiBAcGFyYW0gZGF0YSBN4bqjbmcgZOG7ryBsaeG7h3UgY+G6p24geOG7rSBsw71cbiAqIEBwYXJhbSBrZXkgVMOqbiB0aHXhu5ljIHTDrW5oIGTDuW5nIMSR4buDIHNvIHPDoW5oIHRyw7luZyBs4bq3cC4gTuG6v3Uga2jDtG5nIGPDsyBrZXkgdGjDrCBzbyBzw6FuaCB0cuG7sWMgdGnhur9wIGdpw6EgdHLhu4tcbiAqIEByZXR1cm5zIE3huqNuZyBt4bubaSBjaOG7qWEgY8OhYyBwaOG6p24gdOG7rSBraMO0bmcgdHLDuW5nIGzhurdwXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYXJyID0gW1xuICogICB7IGlkOiAxLCBuYW1lOiAnQScgfSxcbiAqICAgeyBpZDogMiwgbmFtZTogJ0InIH0sXG4gKiAgIHsgaWQ6IDEsIG5hbWU6ICdDJyB9XG4gKiBdO1xuICogdW5pcUJ5KGFyciwgJ2lkJyk7IC8vIFt7IGlkOiAxLCBuYW1lOiAnQScgfSwgeyBpZDogMiwgbmFtZTogJ0InIH1dXG4gKiBcbiAqIGNvbnN0IG51bWJlcnMgPSBbMSwgMiwgMiwgMywgM107XG4gKiB1bmlxQnkobnVtYmVycyk7IC8vIFsxLCAyLCAzXVxuICovXG5leHBvcnQgY29uc3QgdW5pcUJ5ID0gPFQ+KGRhdGE6IEFycmF5PFQ+LCBrZXk/OiBzdHJpbmcpOiBBcnJheTxUPiA9PiB7XG4gIGlmICgha2V5IHx8ICFkYXRhIHx8ICFkYXRhLmxlbmd0aCB8fCB0eXBlb2YgZGF0YVswXSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGRhdGEpKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGFVbmlxdWUgPSBrZXlCeShkYXRhIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+LCBrZXkpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhkYXRhVW5pcXVlKS5tYXAoa2V5ID0+IGRhdGFVbmlxdWVba2V5XSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUludGVyZmFjZSA9IChvYmo6IGFueSwgaW50ZXJmYWNlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZ2VuZXJhdGVUeXBlID0gKHZhbHVlOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gJ2FueSc7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuICdEYXRlJztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiAnUmVnRXhwJztcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdBcnJheTxhbnk+JztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgQXJyYXk8JHtnZW5lcmF0ZVR5cGUodmFsdWVbMF0pfT5gO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgbGV0IGludGVyZmFjZVN0ciA9ICd7XFxuJztcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSBnZW5lcmF0ZVR5cGUodmFsdWVba2V5XSk7XG4gICAgICAgICAgaW50ZXJmYWNlU3RyICs9IGAgICR7a2V5fTogJHt2YWx1ZVR5cGV9O1xcbmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGludGVyZmFjZVN0ciArPSAnfSc7XG4gICAgICByZXR1cm4gaW50ZXJmYWNlU3RyO1xuICAgIH1cblxuICAgIHJldHVybiAnYW55JztcbiAgfTtcblxuICBjb25zdCBpbnRlcmZhY2VTdHIgPSBgaW50ZXJmYWNlICR7aW50ZXJmYWNlTmFtZX0gJHtnZW5lcmF0ZVR5cGUob2JqKX1gO1xuICByZXR1cm4gaW50ZXJmYWNlU3RyO1xufTsiXX0=
|
|
523
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBa0IsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RCxzQ0FBc0M7QUFDdEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBYyxFQUE2QixFQUFFO0lBQ2pFLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFO0lBQ3hDLE9BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUM7UUFDckIsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3BLLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0s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QUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEYsQ0FBQyxDQUFBO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUksSUFBYyxFQUFFLEdBQVksRUFBWSxFQUFFO0lBQ2xFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBa0MsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVsRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFRLEVBQUUsYUFBcUIsRUFBVSxFQUFFO0lBQzNFLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBVSxFQUFVLEVBQUU7UUFDMUMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLE9BQU8sS0FBSyxDQUFDO1FBRTFCLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQzFCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLEtBQUssWUFBWSxNQUFNLEVBQUUsQ0FBQztZQUM1QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QixPQUFPLFlBQVksQ0FBQztZQUN0QixDQUFDO1lBQ0QsT0FBTyxTQUFTLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzVDLENBQUM7UUFFRCxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3JELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDM0MsWUFBWSxJQUFJLEtBQUssR0FBRyxLQUFLLFNBQVMsS0FBSyxDQUFDO2dCQUM5QyxDQUFDO1lBQ0gsQ0FBQztZQUNELFlBQVksSUFBSSxHQUFHLENBQUM7WUFDcEIsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUYsTUFBTSxZQUFZLEdBQUcsYUFBYSxhQUFhLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDdkUsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgRWxlbWVudFJlZiwgVGVtcGxhdGVSZWYsIFdyaXRhYmxlU2lnbmFsLCBpc1NpZ25hbCwgc2lnbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFRZUEVfT0JKRUNUIH0gZnJvbSBcIkBsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCB9IGZyb20gXCIuL2h0dHAtcGFyYW1zXCI7XG5cbi8qKkPDoWMgaMOgbSB0xrDGoW5nIHThu7EgdGjGsCB2aeG7h24gbG9kYXNoICovXG4vKipcbiAqIEtp4buDbSB0cmEgeGVtIG3hu5l0IGdpw6EgdHLhu4sgY8OzIHBo4bqjaSBsw6AgbnVsbCBob+G6t2MgdW5kZWZpbmVkIGhheSBraMO0bmdcbiAqIEBwYXJhbSB2YWx1ZSBHacOhIHRy4buLIGPhuqduIGtp4buDbSB0cmFcbiAqIEByZXR1cm5zIHRydWUgbuG6v3UgZ2nDoSB0cuG7iyBsw6AgbnVsbCBob+G6t2MgdW5kZWZpbmVkLCBmYWxzZSBu4bq/dSBraMO0bmdcbiAqIEBleGFtcGxlXG4gKiBpc05pbChudWxsKTsgLy8gdHJ1ZVxuICogaXNOaWwodW5kZWZpbmVkKTsgLy8gdHJ1ZVxuICogaXNOaWwoMCk7IC8vIGZhbHNlXG4gKiBpc05pbCgnaGVsbG8nKTsgLy8gZmFsc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBLaeG7g20gdHJhIHhlbSBt4buZdCBnacOhIHRy4buLIGPDsyBwaOG6o2kgbMOgIHLhu5duZyBoYXkga2jDtG5nXG4gKiBAcGFyYW0gdmFsdWUgR2nDoSB0cuG7iyBj4bqnbiBraeG7g20gdHJhXG4gKiBAcmV0dXJucyB0cnVlIG7hur91IGdpw6EgdHLhu4sgbMOgIG51bGwsIHLhu5duZyBob+G6t2MgdW5kZWZpbmVkLCBmYWxzZSBu4bq/dSBraMO0bmdcbiAqIEBleGFtcGxlXG4gKiBpc0VtcHR5KG51bGwpOyAvLyB0cnVlXG4gKiBpc0VtcHR5KCcnKTsgLy8gdHJ1ZVxuICogaXNFbXB0eSh1bmRlZmluZWQpOyAvLyB0cnVlXG4gKiBpc0VtcHR5KHt9KTsgLy8gdHJ1ZVxuICogaXNFbXB0eShbXSk7IC8vIHRydWVcbiAqIGlzRW1wdHkoWzEsIDIsIDNdKTsgLy8gZmFsc2VcbiAqIGlzRW1wdHkoeyBhOiAxIH0pOyAvLyBmYWxzZVxuICovXG5leHBvcnQgY29uc3QgaXNFbXB0eSA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICB3aGlsZShpc1NpZ25hbCh2YWx1ZSkpe1xuICAgIHZhbHVlID0gdmFsdWUoKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgKEpTT04uc3RyaW5naWZ5KHZhbHVlKSA9PT0gJ3t9JyB8fCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgPT09ICdbXScpKTtcbn07XG5cbi8qKlxuICogTG/huqFpIGLhu48gY8OhYyB0aHXhu5ljIHTDrW5oIGPhu6dhIMSR4buRaSB0xrDhu6NuZyBk4buxYSB0csOqbiBt4buZdCBow6BtIMSRaeG7gXUga2nhu4duXG4gKiBAcGFyYW0gb2JqRGF0YSDEkOG7kWkgdMaw4bujbmcgY+G6p24geOG7rSBsw71cbiAqIEBwYXJhbSBwcmVkaWNhdGUgSMOgbSDEkWnhu4F1IGtp4buHbiDEkeG7gyBraeG7g20gdHJhIGdpw6EgdHLhu4sgY+G7p2EgdGh14buZYyB0w61uaC4gTuG6v3UgaMOgbSB0cuG6oyB24buBIHRydWUgdGjDrCB0aHXhu5ljIHTDrW5oIMSRw7Mgc+G6vSBi4buLIGxv4bqhaSBi4buPXG4gKiBAcmV0dXJucyDEkOG7kWkgdMaw4bujbmcgbeG7m2kgc2F1IGtoaSDEkcOjIGxv4bqhaSBi4buPIGPDoWMgdGh14buZYyB0w61uaCB0aOG7j2EgbcOjbiDEkWnhu4F1IGtp4buHblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG9iaiA9IHsgYTogMSwgYjogbnVsbCwgYzogMywgZDogdW5kZWZpbmVkIH07XG4gKiBvbWl0Qnkob2JqLCBpc05pbCk7IC8vIHsgYTogMSwgYzogMyB9XG4gKi9cbmV4cG9ydCBjb25zdCBvbWl0QnkgPSA8VD4ob2JqRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiwgcHJlZGljYXRlOiAodmFsOiBhbnkpID0+IGJvb2xlYW4pOiBUID0+IHtcbiAgaWYgKCFvYmpEYXRhIHx8IHR5cGVvZiBvYmpEYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9iakRhdGEpKSB7XG4gICAgcmV0dXJuIG9iakRhdGEgYXMgVDtcbiAgfVxuICBjb25zdCBuZXdPYmogPSB7fSBhcyBUO1xuXG4gIE9iamVjdC5rZXlzKG9iakRhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCB2YWx1ZU9mS2V5ID0gZ2V0KG9iakRhdGEsIGtleSk7XG4gICAgaWYgKCFwcmVkaWNhdGUodmFsdWVPZktleSkpIHtcbiAgICAgIHNldChuZXdPYmosIGtleSwgdmFsdWVPZktleSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBuZXdPYmo7XG59O1xuXG4vKipcbiAqIEzhuqV5IGdpw6EgdHLhu4sgdOG7qyDEkeG7kWkgdMaw4bujbmcgdGhlbyDEkcaw4budbmcgZOG6q24gY2jhu4kgxJHhu4tuaFxuICogXG4gKiBIw6BtIG7DoHkgZ2nDunAgYuG6oW4gdHJ1eSBj4bqtcCB2w6BvIGPDoWMgdGh14buZYyB0w61uaCBzw6J1IGLDqm4gdHJvbmcgbeG7mXQgxJHhu5FpIHTGsOG7o25nIG3hu5l0IGPDoWNoIGFuIHRvw6BuLFxuICogdHLDoW5oIGzhu5dpIGtoaSB0aHXhu5ljIHTDrW5oIGtow7RuZyB04buTbiB04bqhaS5cbiAqIFxuICogQHBhcmFtIG9iaiDEkOG7kWkgdMaw4bujbmcgbmd14buTbiBj4bqnbiBs4bqleSBnacOhIHRy4buLXG4gKiBAcGFyYW0gcGF0aCDEkMaw4budbmcgZOG6q24gxJHhur9uIHRodeG7mWMgdMOtbmggY+G6p24gbOG6pXkuIEPDsyB0aOG7gyBsw6A6XG4gKiAgIC0gQ2h14buXaTogJ3VzZXIucHJvZmlsZS5uYW1lJyBob+G6t2MgJ2l0ZW1zWzBdLnRpdGxlJ1xuICogICAtIE3huqNuZzogWyd1c2VyJywgJ3Byb2ZpbGUnLCAnbmFtZSddIGhv4bq3YyBbJ2l0ZW1zJywgJzAnLCAndGl0bGUnXVxuICogICAtIENodeG7l2kgcuG7l25nICcnOiB0cuG6oyB24buBIGNow61uaCDEkeG7kWkgdMaw4bujbmcgZ+G7kWNcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgR2nDoSB0cuG7iyBt4bq3YyDEkeG7i25oIHRy4bqjIHbhu4Ega2hpIGtow7RuZyB0w6xtIHRo4bqleSB0aHXhu5ljIHTDrW5oICht4bq3YyDEkeG7i25oOiB1bmRlZmluZWQpXG4gKiBAcGFyYW0ga2VlcExhc3RWYWx1ZUlmU2lnbmFsIEPDsyBnaeG7ryBuZ3V5w6puIHNpZ25hbCBjdeG7kWkgY8O5bmcgaGF5IGtow7RuZyAobeG6t2MgxJHhu4tuaDogZmFsc2UgLSBz4bq9IGfhu41pIHNpZ25hbCgpKVxuICogQHJldHVybnMgR2nDoSB0cuG7iyB0w6xtIMSRxrDhu6NjIGhv4bq3YyBnacOhIHRy4buLIG3hurdjIMSR4buLbmhcbiAqIFxuICogQGV4YW1wbGVcbiAqIC8vIFbDrSBk4bulIGPGoSBi4bqjblxuICogY29uc3QgdXNlciA9IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH07XG4gKiBnZXQodXNlciwgJ25hbWUnKTsgLy8gJ0pvaG4nXG4gKiBnZXQodXNlciwgJ2VtYWlsJyk7IC8vIHVuZGVmaW5lZFxuICogZ2V0KHVzZXIsICdlbWFpbCcsICduby1lbWFpbCcpOyAvLyAnbm8tZW1haWwnXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBUcnV54buBbiBwYXRoIHLhu5duZyAtIHRy4bqjIHbhu4EgY2jDrW5oIMSR4buRaSB0xrDhu6NuZyBn4buRY1xuICogY29uc3QgZGF0YSA9IHsgbmFtZTogJ0FsaWNlJywgYWdlOiAyNSB9O1xuICogZ2V0KGRhdGEsICcnKTsgLy8geyBuYW1lOiAnQWxpY2UnLCBhZ2U6IDI1IH0gKGNow61uaCDEkeG7kWkgdMaw4bujbmcgZGF0YSlcbiAqIGdldChkYXRhLCAnJywgJ2RlZmF1bHQnKTsgLy8geyBuYW1lOiAnQWxpY2UnLCBhZ2U6IDI1IH0gKGLhu48gcXVhIGRlZmF1bHRWYWx1ZSlcbiAqIFxuICogQGV4YW1wbGVcbiAqIC8vIFRydXkgY+G6rXAgdGh14buZYyB0w61uaCBzw6J1XG4gKiBjb25zdCBkYXRhID0ge1xuICogICB1c2VyOiB7XG4gKiAgICAgcHJvZmlsZToge1xuICogICAgICAgbmFtZTogJ0FsaWNlJyxcbiAqICAgICAgIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycgfVxuICogICAgIH1cbiAqICAgfVxuICogfTtcbiAqIGdldChkYXRhLCAndXNlci5wcm9maWxlLm5hbWUnKTsgLy8gJ0FsaWNlJ1xuICogZ2V0KGRhdGEsICd1c2VyLnByb2ZpbGUuc2V0dGluZ3MudGhlbWUnKTsgLy8gJ2RhcmsnXG4gKiBnZXQoZGF0YSwgJ3VzZXIucHJvZmlsZS5hdmF0YXInLCAnZGVmYXVsdC5qcGcnKTsgLy8gJ2RlZmF1bHQuanBnJ1xuICogXG4gKiBAZXhhbXBsZVxuICogLy8gVHJ1eSBj4bqtcCBt4bqjbmdcbiAqIGNvbnN0IGl0ZW1zID0gW1xuICogICB7IG5hbWU6ICdJdGVtIDEnLCBwcmljZTogMTAwIH0sXG4gKiAgIHsgbmFtZTogJ0l0ZW0gMicsIHByaWNlOiAyMDAgfVxuICogXTtcbiAqIGdldChpdGVtcywgJ1swXS5uYW1lJyk7IC8vICdJdGVtIDEnXG4gKiBnZXQoaXRlbXMsICcwLnByaWNlJyk7IC8vIDEwMFxuICogZ2V0KGl0ZW1zLCAnWzFdLm5hbWUnKTsgLy8gJ0l0ZW0gMidcbiAqIGdldChpdGVtcywgJ1syXS5uYW1lJywgJ05vdCBmb3VuZCcpOyAvLyAnTm90IGZvdW5kJ1xuICogXG4gKiBAZXhhbXBsZVxuICogLy8gU+G7rSBk4bulbmcgduG7m2kgbeG6o25nIHBhdGhcbiAqIGNvbnN0IG5lc3RlZCA9IHsgYTogeyBiOiB7IGM6ICdkZWVwIHZhbHVlJyB9IH0gfTtcbiAqIGdldChuZXN0ZWQsIFsnYScsICdiJywgJ2MnXSk7IC8vICdkZWVwIHZhbHVlJ1xuICogZ2V0KG5lc3RlZCwgWydhJywgJ2InLCAnZCddLCAnZGVmYXVsdCcpOyAvLyAnZGVmYXVsdCdcbiAqIFxuICogQGV4YW1wbGVcbiAqIC8vIFRyxrDhu51uZyBo4bujcCDEkeG6t2MgYmnhu4d0XG4gKiBnZXQobnVsbCwgJ2FueS5wYXRoJyk7IC8vIHVuZGVmaW5lZFxuICogZ2V0KHVuZGVmaW5lZCwgJ2FueS5wYXRoJywgJ2ZhbGxiYWNrJyk7IC8vICdmYWxsYmFjaydcbiAqL1xuZXhwb3J0IGNvbnN0IGdldCA9IDxUID0gYW55PihvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIGRlZmF1bHRWYWx1ZTogYW55ID0gdW5kZWZpbmVkLCBrZWVwTGFzdFZhbHVlSWZTaWduYWw/OiBib29sZWFuKTogVCA9PiB7XG4gIGlmIChpc05pbChvYmopKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxuICB3aGlsZSAoaXNTaWduYWwob2JqKSkge1xuICAgIG9iaiA9IG9iaigpO1xuICB9XG4gIGlmIChwYXRoID09PSAnJykge1xuICAgIHJldHVybiBvYmogYXMgVDtcbiAgfVxuICBpZiAob2JqIGluc3RhbmNlb2YgSHR0cFBhcmFtcykge1xuICAgIHJldHVybiBvYmouZ2V0KGAke3BhdGh9YCkgYXMgVDtcbiAgfVxuICBpZiAob2JqIGluc3RhbmNlb2YgRE9NUmVjdCkge1xuICAgIHJldHVybiBvYmpbcGF0aCBhcyBrZXlvZiBET01SZWN0XSBhcyBUO1xuICB9XG5cbiAgY29uc3QgcGF0aHMgPSBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGgucmVwbGFjZSgvXFxbKFxcZCspXS9nLCAnLiQxJykuc3BsaXQoJy4nKS5maWx0ZXIoa2V5ID0+IGtleSk7XG4gIGZvciAoY29uc3QgaW5kZXggaW4gcGF0aHMpIHtcbiAgICBjb25zdCBrZXkgPSBwYXRoc1tpbmRleF07XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pIHtcbiAgICAgIG9iaiA9IG9ialtrZXkgYXMga2V5b2YgQ1NTU3R5bGVEZWNsYXJhdGlvbl0gYXMgVDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgb2JqID0gb2JqW2tleSBhcyBrZXlvZiBIVE1MRWxlbWVudF0gYXMgVDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaXNOaWwob2JqKSB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWwgPSBpc1NpZ25hbChvYmpba2V5XSkgJiYgIWtlZXBMYXN0VmFsdWVJZlNpZ25hbCA/IG9ialtrZXldKCkgOiBvYmpba2V5XTtcblxuICAgIG9iaiA9IHZhbDtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIFRoaeG6v3QgbOG6rXAgZ2nDoSB0cuG7iyBjaG8gbeG7mXQgdGh14buZYyB0w61uaCB0cm9uZyDEkeG7kWkgdMaw4bujbmcgdGhlbyDEkcaw4budbmcgZOG6q24gY2jhu4kgxJHhu4tuaFxuICogQHBhcmFtIG9iaiDEkOG7kWkgdMaw4bujbmcgY+G6p24gdGhp4bq/dCBs4bqtcCBnacOhIHRy4buLXG4gKiBAcGFyYW0gcGF0aCDEkMaw4budbmcgZOG6q24gxJHhur9uIHRodeG7mWMgdMOtbmgsIGPDsyB0aOG7gyBsw6AgY2h14buXaSAodmQ6ICdhLmIuYycpIGhv4bq3YyBt4bqjbmcgKHZkOiBbJ2EnLCAnYicsICdjJ10pXG4gKiBAcGFyYW0gdmFsdWUgR2nDoSB0cuG7iyBj4bqnbiB0aGnhur90IGzhuq1wXG4gKiBAcmV0dXJucyDEkOG7kWkgdMaw4bujbmcgc2F1IGtoaSDEkcOjIHRoaeG6v3QgbOG6rXAgZ2nDoSB0cuG7i1xuICogQHRocm93cyBFcnJvciBu4bq/dSB0aGFtIHPhu5EgxJHhuqd1IHRpw6puIGtow7RuZyBwaOG6o2kgbMOgIMSR4buRaSB0xrDhu6NuZ1xuICogQGV4YW1wbGVcbiAqIGNvbnN0IG9iaiA9IHsgYTogeyBiOiAxIH0gfTtcbiAqIHNldChvYmosICdhLmInLCAyKTsgLy8geyBhOiB7IGI6IDIgfSB9XG4gKi9cbmV4cG9ydCBjb25zdCBzZXQgPSA8VCA9IGFueT4ob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55KTogVCA9PiB7XG4gIGlmICghb2JqIHx8ICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmICFpc1NpZ25hbChvYmopKSB8fCAoaXNTaWduYWwob2JqKSAmJiB0eXBlb2Ygb2JqKCkgIT09IFwib2JqZWN0XCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0XCIpO1xuICB9XG5cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEh0dHBQYXJhbXMpIHtcbiAgICByZXR1cm4gb2JqLnNldChgJHtwYXRofWAsIHZhbHVlKSBhcyBUO1xuICB9XG5cbiAgY29uc3QgcGF0aEFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBwYXRoLnJlcGxhY2UoL1xcWyhcXGQrKV0vZywgJy5bJDFdJykuc3BsaXQoJy4nKS5maWx0ZXIoa2V5ID0+IGtleSk7XG5cbiAgbGV0IGN1cnJlbnRPYmplY3RCeUtleTogYW55ID0gaXNTaWduYWwob2JqKSA/IG9iaigpIDogb2JqO1xuICBsZXQgcHJlT2JqZWN0QnlLZXkgPSBvYmo7XG5cbiAgcGF0aEFycmF5LmZvckVhY2goKGtleSwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggPCBwYXRoQXJyYXkubGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKCEoa2V5IGluIGN1cnJlbnRPYmplY3RCeUtleSkgfHwgKHR5cGVvZiBjdXJyZW50T2JqZWN0QnlLZXlba2V5XSAhPT0gXCJvYmplY3RcIiAmJiAhaXNTaWduYWwoY3VycmVudE9iamVjdEJ5S2V5W2tleV0pKSkge1xuICAgICAgICBjb25zdCBuZXh0S2V5ID0gcGF0aEFycmF5W2luZGV4ICsgMV07XG4gICAgICAgIGtleSA9IGtleS5yZXBsYWNlKC9cXFsoXFxkKyldL2csICckMScpO1xuICAgICAgICBjdXJyZW50T2JqZWN0QnlLZXlba2V5XSA9IC9cXFsoXFxkKyldL2cudGVzdChuZXh0S2V5KSA/IFtdIDoge307XG4gICAgICB9XG4gICAgICBjdXJyZW50T2JqZWN0QnlLZXkgPSBrZXkgPyBjdXJyZW50T2JqZWN0QnlLZXlba2V5XSA6IGN1cnJlbnRPYmplY3RCeUtleTtcbiAgICAgIHByZU9iamVjdEJ5S2V5ID0gY3VycmVudE9iamVjdEJ5S2V5O1xuICAgICAgY3VycmVudE9iamVjdEJ5S2V5ID0gaXNTaWduYWwoY3VycmVudE9iamVjdEJ5S2V5KSA/IGN1cnJlbnRPYmplY3RCeUtleSgpIDogY3VycmVudE9iamVjdEJ5S2V5O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3VycmVudE9iamVjdEJ5S2V5ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR8OhbiBnacOhIHRy4buLIOG7nyBjdeG7kWkgxJHGsOG7nW5nIGThuqtuXG4gICAga2V5ID0ga2V5LnJlcGxhY2UoL1xcWyhcXGQrKV0vZywgJyQxJyk7XG4gICAgY29uc3QgdmFsdWVPZktleSA9IGN1cnJlbnRPYmplY3RCeUtleVtrZXldO1xuICAgIGNvbnN0IHZhbHVlT2ZLZXlJc1NpZ25hbCA9IGlzU2lnbmFsKHZhbHVlT2ZLZXkpO1xuICAgIGlmICh2YWx1ZU9mS2V5SXNTaWduYWwgJiYgKHR5cGVvZiB2YWx1ZU9mS2V5KCkgIT09ICdvYmplY3QnIHx8IHZhbHVlT2ZLZXkoKSA9PT0gbnVsbCkpIHtcbiAgICAgICh2YWx1ZU9mS2V5IGFzIFdyaXRhYmxlU2lnbmFsPGFueT4pLnNldChpc1NpZ25hbCh2YWx1ZSkgPyB2YWx1ZSgpIDogdmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNTaWduYWwocHJlT2JqZWN0QnlLZXkpKSB7XG4gICAgICAocHJlT2JqZWN0QnlLZXkgYXMgV3JpdGFibGVTaWduYWw8YW55PikudXBkYXRlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YU9mS2V5ID0gZGF0YVtrZXldO1xuXG4gICAgICAgIGlmIChpc05pbChkYXRhT2ZLZXkpIHx8ICFpc1NpZ25hbCh2YWx1ZU9mS2V5KSkge1xuICAgICAgICAgIGRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzU2lnbmFsKHZhbHVlT2ZLZXkpKSB7XG4gICAgICAgICAgKHZhbHVlT2ZLZXkgYXMgV3JpdGFibGVTaWduYWw8YW55Pikuc2V0KGlzU2lnbmFsKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgIHJldHVybiBbLi4uZGF0YV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4uZGF0YSB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN1cnJlbnRPYmplY3RCeUtleVtrZXldID0gdmFsdWU7XG4gIH0pO1xuXG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIFThuqFvIG3hu5l0IGLhuqNuIHNhbyBzw6J1IGPhu6dhIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBob+G6t2MgZ2nDoSB0cuG7iyBi4bqldCBr4buzXG4gKiBAcGFyYW0gZGF0YSBE4buvIGxp4buHdSBj4bqnbiBzYW8gY2jDqXBcbiAqIEBwYXJhbSBvcHRpb25zIFTDuXkgY2jhu41uIGPhuqV1IGjDrG5oXG4gKiBAcGFyYW0gb3B0aW9ucy5pZ25vcmVTaWduYWwgTuG6v3UgdHJ1ZSwgc+G6vSBraMO0bmcgc2FvIGNow6lwIGPDoWMgc2lnbmFsIG3DoCB0cuG6oyB24buBIHNpZ25hbCBn4buRY1xuICogQHBhcmFtIHNlZW4gV2Vha01hcCDEkeG7gyB0aGVvIGTDtWkgY8OhYyB0aGFtIGNoaeG6v3UgxJHDoyDEkcaw4bujYyBzYW8gY2jDqXAsIHRyw6FuaCBs4bq3cCB2w7QgaOG6oW4gduG7m2kgY8OhYyB0aGFtIGNoaeG6v3UgdsOybmdcbiAqIEByZXR1cm5zIELhuqNuIHNhbyBzw6J1IGPhu6dhIGThu68gbGnhu4d1IMSR4bqndSB2w6BvXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb2JqID0ge1xuICogICBhOiAxLFxuICogICBiOiB7IGM6IDIgfSxcbiAqICAgZDogWzEsIDIsIDNdXG4gKiB9O1xuICogY29uc3QgY2xvbmUgPSBjbG9uZURlZXAob2JqKTtcbiAqIC8vIGNsb25lIGzDoCBt4buZdCBi4bqjbiBzYW8gaG/DoG4gdG/DoG4gxJHhu5ljIGzhuq1wIGPhu6dhIG9ialxuICovXG5leHBvcnQgY29uc3QgY2xvbmVEZWVwID0gPFQgPSBhbnk+KGRhdGE6IGFueSwgb3B0aW9ucyA9IHsgaWdub3JlU2lnbmFsOiBmYWxzZSB9LCBzZWVuID0gbmV3IFdlYWtNYXAoKSk6IFQgPT4ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnICYmICFpc1NpZ25hbChkYXRhKSkpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGlmIChzZWVuLmhhcyhkYXRhKSkge1xuICAgIHJldHVybiBzZWVuLmdldChkYXRhKTtcbiAgfVxuXG4gIGlmIChkYXRhIGluc3RhbmNlb2YgSHR0cFBhcmFtcykge1xuICAgIHJldHVybiBuZXcgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCh1bmRlZmluZWQsIGRhdGEpIGFzIFQ7XG4gIH1cblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0YS5nZXRUaW1lKCkpIGFzIFQ7XG4gIH1cblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGRhdGEuc291cmNlLCBkYXRhLmZsYWdzKSBhcyBUO1xuICB9XG5cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBjb25zdCBtYXBDb3B5ID0gbmV3IE1hcCgpO1xuICAgIHNlZW4uc2V0KGRhdGEsIG1hcENvcHkpO1xuICAgIGRhdGEuZm9yRWFjaCgodmFsLCBrZXkpID0+IHtcbiAgICAgIG1hcENvcHkuc2V0KGNsb25lRGVlcChrZXksIG9wdGlvbnMsIHNlZW4pLCBjbG9uZURlZXAodmFsLCBvcHRpb25zLCBzZWVuKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcENvcHkgYXMgVDtcbiAgfVxuXG4gIGlmIChkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgY29uc3Qgc2V0Q29weSA9IG5ldyBTZXQoKTtcbiAgICBzZWVuLnNldChkYXRhLCBzZXRDb3B5KTtcbiAgICBkYXRhLmZvckVhY2godmFsID0+IHtcbiAgICAgIHNldENvcHkuYWRkKGNsb25lRGVlcCh2YWwsIG9wdGlvbnMsIHNlZW4pKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2V0Q29weSBhcyBUO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICBzZWVuLnNldChkYXRhLCBkYXRhLm1hcChpdGVtID0+IGNsb25lRGVlcChpdGVtLCBvcHRpb25zLCBzZWVuKSkgYXMgVCk7XG4gICAgcmV0dXJuIHNlZW4uZ2V0KGRhdGEpIGFzIFQ7XG4gIH1cblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEZpbGUgfHwgZGF0YSBpbnN0YW5jZW9mIEJsb2IgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBGaWxlXScpIHtcbiAgICByZXR1cm4gZGF0YSBhcyBUO1xuICB9XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHwgZGF0YSBpbnN0YW5jZW9mIEVsZW1lbnRSZWYgfHwgZGF0YSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZGF0YSBpbnN0YW5jZW9mIFByb21pc2UgfHwgZGF0YSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICByZXR1cm4gZGF0YSBhcyBUO1xuICB9XG4gIGlmIChpc1NpZ25hbChkYXRhKSkge1xuICAgIGlmIChvcHRpb25zPy5pZ25vcmVTaWduYWwpIHtcbiAgICAgIHJldHVybiBkYXRhIGFzIFQ7XG4gICAgfVxuICAgIHNlZW4uc2V0KGRhdGEsIHNpZ25hbChjbG9uZURlZXAoZGF0YSgpLCBvcHRpb25zLCBzZWVuKSkpO1xuICAgIHJldHVybiBzZWVuLmdldChkYXRhKSBhcyBUO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIHNlZW4uc2V0KGRhdGEsIHJlc3VsdCk7XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIdHRwUGFyYW1zKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG5ldyBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0KHVuZGVmaW5lZCwgdmFsdWUpIGFzIFQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHwgdmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50UmVmIHx8IHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgfHwgdmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBjbG9uZURlZXAodmFsdWUsIG9wdGlvbnMsIHNlZW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgYXMgVDtcbn07XG5cbi8qKlxuICogQ2h1eeG7g24gxJHhu5VpIG3hu5l0IG3huqNuZyBjw6FjIMSR4buRaSB0xrDhu6NuZyB0aMOgbmggbeG7mXQgxJHhu5FpIHTGsOG7o25nIHbhu5tpIGtow7NhIMSRxrDhu6NjIGNo4buJIMSR4buLbmhcbiAqIEBwYXJhbSBkYXRhIE3huqNuZyBjw6FjIMSR4buRaSB0xrDhu6NuZyBj4bqnbiBjaHV54buDbiDEkeG7lWlcbiAqIEBwYXJhbSBrZXkgVMOqbiB0aHXhu5ljIHTDrW5oIMSRxrDhu6NjIHPhu60gZOG7pW5nIGzDoG0ga2jDs2EgdHJvbmcgxJHhu5FpIHTGsOG7o25nIGvhur90IHF14bqjXG4gKiBAcmV0dXJucyDEkOG7kWkgdMaw4bujbmcgduG7m2kgY8OhYyBnacOhIHRy4buLIHThu6sgbeG6o25nIMSRxrDhu6NjIMSRw6FuaCBrZXkgdGhlbyB0aHXhu5ljIHTDrW5oIMSRw6MgY2jhu4kgxJHhu4tuaFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRhdGEgPSBbXG4gKiAgIHsgaWQ6IDEsIG5hbWU6ICdKb2huJyB9LFxuICogICB7IGlkOiAyLCBuYW1lOiAnSmFuZScgfVxuICogXTtcbiAqIGtleUJ5KGRhdGEsICdpZCcpOyBcbiAqIC8vIEvhur90IHF14bqjOiB7IFxuICogLy8gICAnMSc6IHsgaWQ6IDEsIG5hbWU6ICdKb2huJyB9LFxuICogLy8gICAnMic6IHsgaWQ6IDIsIG5hbWU6ICdKYW5lJyB9XG4gKiAvLyB9XG4gKi9cbmV4cG9ydCBjb25zdCBrZXlCeSA9IChkYXRhOiBBcnJheTxUWVBFX09CSkVDVD4sIGtleTogc3RyaW5nKTogVFlQRV9PQkpFQ1QgPT4ge1xuICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoIHx8ICFrZXkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgcmV0dXJuIGRhdGEucmVkdWNlKChkaXIsIG5leHRJdGVtKSA9PiB7XG4gICAgY29uc3QgdmFsdWVPZktleSA9IG5leHRJdGVtW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZU9mS2V5ICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWVPZktleSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuICAgIGRpclt2YWx1ZU9mS2V5XSA9IG5leHRJdGVtO1xuICAgIHJldHVybiBkaXI7XG4gIH0sIHt9KTtcbn07XG5cbi8qKlxuICogTmjDs20gY8OhYyDEkeG7kWkgdMaw4bujbmcgdHJvbmcgbeG7mXQgbeG6o25nIHRow6BuaCBjw6FjIG5ow7NtIGThu7FhIHRyw6puIG3hu5l0IHRodeG7mWMgdMOtbmggY+G7pSB0aOG7g1xuICogQHBhcmFtIGRhdGEgTeG6o25nIGPDoWMgxJHhu5FpIHTGsOG7o25nIGPhuqduIG5ow7NtXG4gKiBAcGFyYW0ga2V5IFTDqm4gdGh14buZYyB0w61uaCDEkcaw4bujYyBz4butIGThu6VuZyBsw6BtIGtow7NhIG5ow7NtXG4gKiBAcmV0dXJucyDEkOG7kWkgdMaw4bujbmcgduG7m2kgY8OhYyBnacOhIHRy4buLIHThu6sgbeG6o25nIMSRxrDhu6NjIG5ow7NtIHRoZW8gdGh14buZYyB0w61uaCDEkcOjIGNo4buJIMSR4buLbmhcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBkYXRhID0gW1xuICogICB7IGlkOiAxLCBuYW1lOiAnSm9obicgfSxcbiAqICAgeyBpZDogMiwgbmFtZTogJ0phbmUnIH0sXG4gKiAgIHsgaWQ6IDEsIG5hbWU6ICdKb2huJyB9XG4gKiBdO1xuICogZ3JvdXBCeShkYXRhLCAnaWQnKTsgXG4gKiAvLyBL4bq/dCBxdeG6ozogeyAgICBcbiAqIC8vICAgJzEnOiBbXG4gKiAvLyAgICAgeyBpZDogMSwgbmFtZTogJ0pvaG4nIH0sXG4gKiAvLyAgICAgeyBpZDogMSwgbmFtZTogJ0pvaG4nIH1cbiAqIC8vICAgXSxcbiAqIC8vICAgJzInOiBbXG4gKiAvLyAgICAgeyBpZDogMiwgbmFtZTogJ0phbmUnIH0gXG4gKiAvLyB9XG4gKi9cbmV4cG9ydCBjb25zdCBncm91cEJ5ID0gKGRhdGE6IEFycmF5PFRZUEVfT0JKRUNUPiwga2V5OiBzdHJpbmcpOiBUWVBFX09CSkVDVCA9PiB7XG4gIGlmICghZGF0YSB8fCAhT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoIHx8ICFrZXkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgcmV0dXJuIGRhdGEucmVkdWNlKChkaXIsIG5leHRJdGVtKSA9PiB7XG4gICAgY29uc3QgdmFsdWVPZktleSA9IG5leHRJdGVtW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZU9mS2V5ICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWVPZktleSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuICAgIGlmICghZGlyW3ZhbHVlT2ZLZXldKSB7XG4gICAgICBkaXJbdmFsdWVPZktleV0gPSBbXTtcbiAgICB9XG4gICAgZGlyW3ZhbHVlT2ZLZXldLnB1c2gobmV4dEl0ZW0pO1xuICAgIHJldHVybiBkaXI7XG4gIH0sIHt9KTtcbn07XG5cblxuLyoqXG4gKiBU4bqhbyBt4buZdCBt4bqjbmcgY8OhYyBz4buRIHThu6sgZ2nDoSB0cuG7iyBi4bqvdCDEkeG6p3UgxJHhur9uIGdpw6EgdHLhu4sga+G6v3QgdGjDumMgduG7m2kgYsaw4bubYyBuaOG6o3kgdMO5eSBjaOG7jW5cbiAqIEBwYXJhbSBzdGFydCBHacOhIHRy4buLIGLhuq90IMSR4bqndSBj4bunYSBkw6N5IHPhu5EuIE7hur91IGNo4buJIGPDsyBt4buZdCB0aGFtIHPhu5EsIMSRw6J5IHPhur0gbMOgIGdpw6EgdHLhu4sga+G6v3QgdGjDumMgdsOgIGdpw6EgdHLhu4sgYuG6r3QgxJHhuqd1IHPhur0gbMOgIDBcbiAqIEBwYXJhbSBlbmQgR2nDoSB0cuG7iyBr4bq/dCB0aMO6YyBj4bunYSBkw6N5IHPhu5EgKHTDuXkgY2jhu41uKVxuICogQHBhcmFtIHN0ZXAgQsaw4bubYyBuaOG6o3kgZ2nhu69hIGPDoWMgc+G7kSB0cm9uZyBkw6N5ICh0w7l5IGNo4buNbikuIE3hurdjIMSR4buLbmggbMOgIDEgbuG6v3UgZW5kID4gc3RhcnQsIC0xIG7hur91IGVuZCA8IHN0YXJ0XG4gKiBAcmV0dXJucyBN4bqjbmcgY8OhYyBz4buRIHThu6sgc3RhcnQgxJHhur9uIGVuZCB24bubaSBixrDhu5tjIG5o4bqjeSBzdGVwXG4gKiBAZXhhbXBsZVxuICogcmFuZ2UoNCk7ICAgICAgLy8gWzAsIDEsIDIsIDNdXG4gKiByYW5nZSgxLCA1KTsgICAvLyBbMSwgMiwgMywgNF1cbiAqIHJhbmdlKDAsIDIwLCA1KTsgLy8gWzAsIDUsIDEwLCAxNV1cbiAqIHJhbmdlKDUsIDIpOyAgIC8vIFs1LCA0LCAzXVxuICovXG5leHBvcnQgY29uc3QgcmFuZ2UgPSAoc3RhcnQ6IG51bWJlciwgZW5kPzogbnVtYmVyLCBzdGVwPzogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiA9PiB7XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPT09IG51bGwpIHtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IDA7XG4gIH1cblxuICBpZiAoIXN0ZXApIHtcbiAgICBzdGVwID0gZW5kIDwgMCA/IC0xIDogMTtcbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCAmJiBzdGVwID4gMCkge1xuICAgIHN0ZXAgKj0gLTE7XG4gIH1cblxuICBjb25zdCB2YWx1ZVN0YXJ0QnlTdGVwID0gc3RlcCArIHN0YXJ0O1xuICBjb25zdCBkaXJlY3Rpb24gPSBzdGFydCA8IGVuZCA/ICdhc2MnIDogJ2Rlc2MnO1xuICBpZiAoKGRpcmVjdGlvbiA9PT0gJ2FzYycgJiYgKHZhbHVlU3RhcnRCeVN0ZXAgPCBzdGFydCB8fCB2YWx1ZVN0YXJ0QnlTdGVwID4gZW5kKSkgfHwgKGRpcmVjdGlvbiA9PT0gJ2Rlc2MnICYmICh2YWx1ZVN0YXJ0QnlTdGVwID4gc3RhcnQgfHwgdmFsdWVTdGFydEJ5U3RlcCA8IGVuZCkpKSB7XG4gICAgcmV0dXJuIFtzdGFydF07XG4gIH1cblxuICBjb25zdCBhcnIgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBNYXRoLmFicyhlbmQgLSBzdGFydCk7IGluZGV4KyspIHtcbiAgICBsZXQgdmFsdWUgPSBzdGFydCArIGluZGV4ICogc3RlcDtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHZhbHVlID0gc3RhcnQ7XG4gICAgfVxuXG4gICAgaWYgKChkaXJlY3Rpb24gPT09ICdhc2MnICYmICh2YWx1ZSA8IHN0YXJ0IHx8IHZhbHVlID4gZW5kKSkgfHwgKGRpcmVjdGlvbiA9PT0gJ2Rlc2MnICYmICh2YWx1ZSA+IHN0YXJ0IHx8IHZhbHVlIDwgZW5kKSkpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgYXJyLnB1c2godmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqXG4gKiBTbyBzw6FuaCBoYWkgZ2nDoSB0cuG7iyBi4bqldCBr4buzIGPDsyBi4bqxbmcgbmhhdSBoYXkga2jDtG5nXG4gKiBAcGFyYW0gdmFsdWUxIEdpw6EgdHLhu4sgdGjhu6kgbmjhuqV0IGPhuqduIHNvIHPDoW5oXG4gKiBAcGFyYW0gdmFsdWUyIEdpw6EgdHLhu4sgdGjhu6kgaGFpIGPhuqduIHNvIHPDoW5oXG4gKiBAcGFyYW0gZXhhY3RseVBvc2l0aW9uIEPDsyBzbyBzw6FuaCBjaMOtbmggeMOhYyB24buLIHRyw60gY8OhYyBwaOG6p24gdOG7rSB0cm9uZyBt4bqjbmcgaGF5IGtow7RuZ1xuICogQHJldHVybnMgdHJ1ZSBu4bq/dSBoYWkgZ2nDoSB0cuG7iyBi4bqxbmcgbmhhdSwgZmFsc2UgbuG6v3Uga2jDtG5nIGLhurFuZyBuaGF1XG4gKiBAZXhhbXBsZVxuICogaXNFcXVhbChbMSwyLDNdLCBbMSwyLDNdKTsgLy8gdHJ1ZVxuICogaXNFcXVhbChbMSwyLDNdLCBbMywyLDFdKTsgLy8gdHJ1ZSBraGkgZXhhY3RseVBvc2l0aW9uID0gZmFsc2VcbiAqIGlzRXF1YWwoWzEsMiwzXSwgWzMsMiwxXSk7IC8vIGZhbHNlIGtoaSBleGFjdGx5UG9zaXRpb24gPSB0cnVlXG4gKiBpc0VxdWFsKHthOjF9LCB7YToxfSk7IC8vIHRydWVcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRXF1YWwgPSAodmFsdWUxOiBhbnksIHZhbHVlMjogYW55LCBleGFjdGx5UG9zaXRpb24gPSBmYWxzZSk6IGJvb2xlYW4gPT4ge1xuICBpZiAodmFsdWUxID09PSB2YWx1ZTIgfHwgKHZhbHVlMSA9PT0gbnVsbCAmJiB2YWx1ZTIgPT09IG51bGwpIHx8ICh2YWx1ZTEgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZTIgPT09IHVuZGVmaW5lZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzaWduYWxzXG4gIHdoaWxlIChpc1NpZ25hbCh2YWx1ZTEpKSB7XG4gICAgdmFsdWUxID0gdmFsdWUxKCk7XG4gIH1cbiAgd2hpbGUgKGlzU2lnbmFsKHZhbHVlMikpIHtcbiAgICB2YWx1ZTIgPSB2YWx1ZTIoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUxICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUyICE9PSAnb2JqZWN0JyB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZTEpICYmICFBcnJheS5pc0FycmF5KHZhbHVlMikpIHx8ICghQXJyYXkuaXNBcnJheSh2YWx1ZTEpICYmIEFycmF5LmlzQXJyYXkodmFsdWUyKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTEpKSB7XG4gICAgaWYgKHZhbHVlMS5sZW5ndGggIT09IHZhbHVlMi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWV4YWN0bHlQb3NpdGlvbikge1xuICAgICAgcmV0dXJuICF2YWx1ZTEuc29tZShpdGVtID0+ICF2YWx1ZTIuaW5jbHVkZXMoaXRlbSkpO1xuICAgIH1cblxuICAgIHJldHVybiAhdmFsdWUxLnNvbWUoKGl0ZW0sIGluZGV4KSA9PiAhaXNFcXVhbChpdGVtLCB2YWx1ZTJbaW5kZXhdKSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXModmFsdWUxKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKHZhbHVlMikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAhT2JqZWN0LmtleXModmFsdWUxKS5zb21lKChrZXkpID0+ICFpc0VxdWFsKHZhbHVlMVtrZXldLCB2YWx1ZTJba2V5XSkpO1xufVxuXG4vKipcbiAqIExv4bqhaSBi4buPIGPDoWMgcGjhuqduIHThu60gdHLDuW5nIGzhurdwIHRyb25nIG3huqNuZyBk4buxYSB0csOqbiBt4buZdCB0aHXhu5ljIHTDrW5oIGNo4buJIMSR4buLbmhcbiAqIEBwYXJhbSBkYXRhIE3huqNuZyBk4buvIGxp4buHdSBj4bqnbiB44butIGzDvVxuICogQHBhcmFtIGtleSBUw6puIHRodeG7mWMgdMOtbmggZMO5bmcgxJHhu4Mgc28gc8OhbmggdHLDuW5nIGzhurdwLiBO4bq/dSBraMO0bmcgY8OzIGtleSB0aMOsIHNvIHPDoW5oIHRy4buxYyB0aeG6v3AgZ2nDoSB0cuG7i1xuICogQHJldHVybnMgTeG6o25nIG3hu5tpIGNo4bupYSBjw6FjIHBo4bqnbiB04butIGtow7RuZyB0csO5bmcgbOG6t3BcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhcnIgPSBbXG4gKiAgIHsgaWQ6IDEsIG5hbWU6ICdBJyB9LFxuICogICB7IGlkOiAyLCBuYW1lOiAnQicgfSxcbiAqICAgeyBpZDogMSwgbmFtZTogJ0MnIH1cbiAqIF07XG4gKiB1bmlxQnkoYXJyLCAnaWQnKTsgLy8gW3sgaWQ6IDEsIG5hbWU6ICdBJyB9LCB7IGlkOiAyLCBuYW1lOiAnQicgfV1cbiAqIFxuICogY29uc3QgbnVtYmVycyA9IFsxLCAyLCAyLCAzLCAzXTtcbiAqIHVuaXFCeShudW1iZXJzKTsgLy8gWzEsIDIsIDNdXG4gKi9cbmV4cG9ydCBjb25zdCB1bmlxQnkgPSA8VD4oZGF0YTogQXJyYXk8VD4sIGtleT86IHN0cmluZyk6IEFycmF5PFQ+ID0+IHtcbiAgaWYgKCFrZXkgfHwgIWRhdGEgfHwgIWRhdGEubGVuZ3RoIHx8IHR5cGVvZiBkYXRhWzBdICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoZGF0YSkpO1xuICB9XG5cbiAgY29uc3QgZGF0YVVuaXF1ZSA9IGtleUJ5KGRhdGEgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4sIGtleSk7XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGRhdGFVbmlxdWUpLm1hcChrZXkgPT4gZGF0YVVuaXF1ZVtrZXldKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlSW50ZXJmYWNlID0gKG9iajogYW55LCBpbnRlcmZhY2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBnZW5lcmF0ZVR5cGUgPSAodmFsdWU6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiAnYW55JztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gJ0RhdGUnO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuICdSZWdFeHAnO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJ0FycmF5PGFueT4nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBBcnJheTwke2dlbmVyYXRlVHlwZSh2YWx1ZVswXSl9PmA7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBsZXQgaW50ZXJmYWNlU3RyID0gJ3tcXG4nO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGdlbmVyYXRlVHlwZSh2YWx1ZVtrZXldKTtcbiAgICAgICAgICBpbnRlcmZhY2VTdHIgKz0gYCAgJHtrZXl9OiAke3ZhbHVlVHlwZX07XFxuYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW50ZXJmYWNlU3RyICs9ICd9JztcbiAgICAgIHJldHVybiBpbnRlcmZhY2VTdHI7XG4gICAgfVxuXG4gICAgcmV0dXJuICdhbnknO1xuICB9O1xuXG4gIGNvbnN0IGludGVyZmFjZVN0ciA9IGBpbnRlcmZhY2UgJHtpbnRlcmZhY2VOYW1lfSAke2dlbmVyYXRlVHlwZShvYmopfWA7XG4gIHJldHVybiBpbnRlcmZhY2VTdHI7XG59OyJdfQ==
|