@libs-ui/components-draw-line 0.2.61

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy1saW5lLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmF3LWxpbmUvc3JjL2RyYXctbGluZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuZXhwb3J0IGludGVyZmFjZSBJUmVhY2hhYmxlUG9pbnRSYW5nZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBzdHlsZTogSUNpcmNsZVN0eWxlO1xuICBpZENvbm5lY3RlZD86IHN0cmluZztcbiAgcmVmPzogSVJlYWNoYWJsZVBvaW50UmFuZ2U7XG4gIGVsZW1lbnQ/OiBTVkdDaXJjbGVFbGVtZW50O1xuICBvbkRlc3Ryb3lFdmVudD86IFN1YmplY3Q8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZXdCb3hDb25maWcge1xuICBtaW5YPzogbnVtYmVyO1xuICBtaW5ZPzogbnVtYmVyO1xuICB3aWR0aD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICBpZ25vcmVWaWV3Qm94PzogYm9vbGVhbjtcbiAgbWFyZ2luQmV0d2VlbkVsZW1lbnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdMaW5lRGF0YUlucHV0IHtcbiAgaWQ6IHN0cmluZztcbiAgcG9pbnRzOiBJUG9pbnRzO1xuICBpZENvbm5lY3RlZD86IHN0cmluZztcbiAgbW9kZTogVFlQRV9NT0RFO1xuICBsaW5lU3R5bGU/OiBJTGluZVN0eWxlLFxuICBhcnJvd1N0eWxlPzogSUFycm93U3R5bGU7XG4gIGlnbm9yZURyYXdBcnJvdz86IGJvb2xlYW47IC8vIHRyxrDhu51uZyBo4bujcCB24bq9IHNlcGFyYXRlZFBvaW50IHPhur0gY+G6p24gYuG7jyBxdWEgYXJyb3dcbiAgc3RhcnRDaXJjbGU/OiBib29sZWFuO1xuICBzdGFydENpcmNsZVN0eWxlPzogSUNpcmNsZVN0eWxlO1xuICBlbmRDaXJjbGU/OiBib29sZWFuO1xuICBlbmRDaXJjbGVTdHlsZT86IElDaXJjbGVTdHlsZTtcbiAgaXNSZW1vdmU/OiBib29sZWFuO1xuICBhcnJvd0RpcmVjdGlvbj86IFRZUEVfRElSRUNUSU9OO1xuICByZWY/OiBJRHJhd0xpbmVEYXRhSW5wdXQ7XG4gIHN0YXJ0RW5kTW9kZT86ICdyaWdodC1sZWZ0JyB8ICdib3R0b20tdG9wJyB8ICdib3R0b20tbGVmdCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmVTdHlsZSB7XG4gIHN0cm9rZT86IHN0cmluZztcbiAgc3Ryb2tlRGFzaGFycmF5Pzogc3RyaW5nO1xuICBzdHJva2VXaWR0aD86IHN0cmluZztcbiAgZmlsbD86IHN0cmluZztcbiAgY3VydmU/OiBudW1iZXI7IC8vIGFwcGx5IG1vZGUgJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJ1xuICBkaXN0YW5jZVBvaW50PzogbnVtYmVyOyAvLyBraG/huqNuZyBjw6FjaCB04burIMSRaeG7g20gbcO6dCBjdeG7kWkgxJHhur9uIHbhu4sgdHLDrSBjb25nIGfhuqduIG5o4bqldCDEkeG7kWkgduG7m2kgbW9kZSBob3Jpem9udGFsIHbDoCDEkWnhu4NtIG3DunQgxJHhuqd1IMSR4bq/biDEkcaw4budbmcgxJHhur9uIMSRxrDhu51uZyBjb25nIGfhuqduIG5o4bqldCB24bubaSBtb2RlIHZlcnRpY2FsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBcnJvd1N0eWxlIHtcbiAgc3Ryb2tlPzogc3RyaW5nO1xuICBzdHJva2VXaWR0aD86IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgZmlsbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2lyY2xlU3R5bGUge1xuICBzdHJva2U/OiBzdHJpbmc7XG4gIHN0cm9rZVdpZHRoPzogc3RyaW5nO1xuICBmaWxsPzogc3RyaW5nO1xuICByPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQXR0cmlidXRlRE9uUGF0aCB7XG4gIE06IElQb2ludDtcbiAgQzogQXJyYXk8SVBvaW50PlxuICBMOiBJUG9pbnQ7XG4gIFE6IEFycmF5PElQb2ludD47XG4gIEwyOiBJUG9pbnQ7XG4gIFEyOiBBcnJheTxJUG9pbnQ+O1xuICBMMzogSVBvaW50O1xuICBRMz86IEFycmF5PElQb2ludD47XG4gIEw0PzogSVBvaW50O1xuICBRND86IEFycmF5PElQb2ludD47XG4gIEw1PzogSVBvaW50O1xuICBUPzogSVBvaW50O1xuICBBPzogSVBvaW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQb2ludHMge1xuICBpbml0aWFsaXplZD86IGJvb2xlYW47XG4gIG9ic3RhY2xlUmVjdD86IEFycmF5PElSZWN0PjtcbiAgc2VwYXJhdGVkUG9pbnRzPzogQXJyYXk8SVBvaW50cz47XG4gIHBhdGhFbGVtZW50PzogU1ZHUGF0aEVsZW1lbnQ7XG4gIGFycm93RWxlbWVudD86IFNWR1BvbHlsaW5lRWxlbWVudDtcbiAgY2lyY2xlU3RhcnRFbGVtZW50PzogU1ZHQ2lyY2xlRWxlbWVudDtcbiAgY2lyY2xlRW5kRWxlbWVudD86IFNWR0NpcmNsZUVsZW1lbnQ7XG4gIG9uRGVzdHJveUV2ZW50PzogU3ViamVjdDx2b2lkPjtcbiAgc3RhcnQ6IElQb2ludDtcbiAgZW5kOiBJUG9pbnQ7XG4gIG1vZGU/OiBUWVBFX01PREU7XG4gIGlkPzogc3RyaW5nLFxuICBuYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlY3Qge1xuICBpZD86IHN0cmluZ1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGdhcFhPYnN0YWNsZVJlY3Q/OiBudW1iZXI7XG4gIGdhcFlPYnN0YWNsZVJlY3Q/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFRZUEVfRElSRUNUSU9OID0gJ3JpZ2h0JyB8ICdsZWZ0JyB8ICd0b3AnIHwgJ2JvdHRvbSc7XG5leHBvcnQgdHlwZSBUWVBFX01PREUgPSAncXVhcnQtaW4nIHwgJ3ZlcnRpY2FsJyB8ICd2ZXJ0aWNhbC1zaW5nbGUtY3VydmUnIHwgJ2hvcml6b250YWwnIHwgJ2hvcml6b250YWwtc2luZ2xlLWN1cnZlJztcblxuZXhwb3J0IGludGVyZmFjZSBJTW9EcmF3TGluZUZ1bmN0aW9uQ29udHJvbCB7XG4gIHNldERhdGE6IChkYXRhOiBBcnJheTxJRHJhd0xpbmVEYXRhSW5wdXQ+KSA9PiB2b2lkO1xuICByZW1vdmVMaW5lOiAoaWQ6IHN0cmluZywgcG9pbnRzPzogQXJyYXk8SVBvaW50cz4pID0+IHZvaWQ7XG4gIHNldFJlYWNoYWJsZVBvaW50UmFuZ2U6IChkYXRhOiBBcnJheTxJUmVhY2hhYmxlUG9pbnRSYW5nZT4pID0+IHZvaWQ7XG4gIHJlbW92ZVJlYWNoYWJsZVBvaW50UmFuZ2U6IChpZHM6IEFycmF5PHN0cmluZz4pID0+IHZvaWQ7XG4gIHVwZGF0ZVZpZXdCb3g6ICh2aWV3Qm94Q29uZmlnPzogSVZpZXdCb3hDb25maWcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvb3JkaW5hdGVzU3ZnIHtcbiAgbXg/OiBudW1iZXI7XG4gIG15PzogbnVtYmVyO1xuICB4MT86IG51bWJlcjtcbiAgeTE/OiBudW1iZXI7XG4gIHg/OiBudW1iZXI7XG4gIHk/OiBudW1iZXI7XG4gIGx4PzogbnVtYmVyO1xuICBseT86IG51bWJlcjtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './draw-line.directive';
2
+ export * from './draw-line.interface';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJhdy1saW5lL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RyYXctbGluZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9kcmF3LWxpbmUuaW50ZXJmYWNlJztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicy11aS1jb21wb25lbnRzLWRyYXctbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmF3LWxpbmUvc3JjL2xpYnMtdWktY29tcG9uZW50cy1kcmF3LWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,27 @@
1
+ export class MoCanvasCalculatorBranchUtil {
2
+ /**
3
+ *
4
+ * above, left a + b; opposite = true a - b;
5
+ *
6
+ * under, right a - b; opposite = true a + b
7
+ */
8
+ static mathOperatorsCalculation(direction, a, b, opposite) {
9
+ switch (direction) {
10
+ case 'left':
11
+ case 'above':
12
+ if (opposite) {
13
+ return (a ?? 0) - (b ?? 0);
14
+ }
15
+ return (a ?? 0) + (b ?? 0);
16
+ case 'right':
17
+ case 'under':
18
+ if (opposite) {
19
+ return (a ?? 0) + (b ?? 0);
20
+ }
21
+ return (a ?? 0) - (b ?? 0);
22
+ default:
23
+ return (a ?? 0) - (b ?? 0);
24
+ }
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1icmFuY2gudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmF3LWxpbmUvc3JjL3V0aWwvY2FsY3VsYXRvci1icmFuY2gudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDOzs7OztLQUtDO0lBQ0QsTUFBTSxDQUFDLHdCQUF3QixDQUFDLFNBQXdELEVBQUUsQ0FBcUIsRUFBRSxDQUFxQixFQUFFLFFBQWtCO1FBQ3hKLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUVELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFN0IsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUVELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0I7Z0JBQ0UsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwge1xuICAvKipcbiAqIFxuICogYWJvdmUsIGxlZnQgYSArIGI7IG9wcG9zaXRlID0gdHJ1ZSBhIC0gYjtcbiAqIFxuICogdW5kZXIsIHJpZ2h0IGEgLSBiOyBvcHBvc2l0ZSA9IHRydWUgYSArIGJcbiAqL1xuICBzdGF0aWMgbWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdhYm92ZScgfCAndW5kZXInIHwgc3RyaW5nLCBhOiBudW1iZXIgfCB1bmRlZmluZWQsIGI6IG51bWJlciB8IHVuZGVmaW5lZCwgb3Bwb3NpdGU/OiBib29sZWFuKSB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgY2FzZSAnYWJvdmUnOlxuICAgICAgICBpZiAob3Bwb3NpdGUpIHtcbiAgICAgICAgICByZXR1cm4gKGEgPz8gMCkgLSAoYiA/PyAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoYSA/PyAwKSArIChiID8/IDApO1xuXG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICBjYXNlICd1bmRlcic6XG4gICAgICAgIGlmIChvcHBvc2l0ZSkge1xuICAgICAgICAgIHJldHVybiAoYSA/PyAwKSArIChiID8/IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChhID8/IDApIC0gKGIgPz8gMCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKGEgPz8gMCkgLSAoYiA/PyAwKTtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -0,0 +1,339 @@
1
+ import { range } from "@libs-ui/utils";
2
+ import { MoCanvasCalculatorBranchUtil } from "./calculator-branch.util";
3
+ import { MoCanvasConnectNavigationNewElementUtil } from "./connect-navigation-new-element.util";
4
+ export class MoCanvasCalculatorDirectionElementUtil {
5
+ static checkUpDownLeftRight(firstPoint, endPoint, direction) {
6
+ const distance = ((firstPoint ?? 0) - (endPoint ?? 0));
7
+ if (distance === 0) {
8
+ return 'center';
9
+ }
10
+ if (distance > 0) {
11
+ return direction === 'x' ? 'left' : 'above';
12
+ }
13
+ return direction === 'x' ? 'right' : 'under';
14
+ }
15
+ static drawLineQ(start, corner, lineCurveX, lineCurveY) {
16
+ const coordQ = {};
17
+ switch (corner) {
18
+ case 'right-under':
19
+ coordQ.x1 = start.x + lineCurveX;
20
+ coordQ.y1 = start.y;
21
+ coordQ.x = coordQ.x1;
22
+ coordQ.y = coordQ.y1 + lineCurveY;
23
+ break;
24
+ case 'under-left':
25
+ coordQ.x1 = start.x;
26
+ coordQ.y1 = start.y + lineCurveY;
27
+ coordQ.x = coordQ.x1 - lineCurveX;
28
+ coordQ.y = coordQ.y1;
29
+ break;
30
+ case 'left-above':
31
+ coordQ.x1 = start.x - lineCurveX;
32
+ coordQ.y1 = start.y;
33
+ coordQ.x = coordQ.x1;
34
+ coordQ.y = coordQ.y1 - lineCurveY;
35
+ break;
36
+ case 'above-right':
37
+ coordQ.x1 = start.x;
38
+ coordQ.y1 = start.y - lineCurveY;
39
+ coordQ.x = coordQ.x1 + lineCurveX;
40
+ coordQ.y = coordQ.y1;
41
+ break;
42
+ case 'under-right':
43
+ coordQ.x1 = start.x;
44
+ coordQ.y1 = start.y + lineCurveY;
45
+ coordQ.x = coordQ.x1 + lineCurveX;
46
+ coordQ.y = coordQ.y1;
47
+ break;
48
+ case 'right-above':
49
+ coordQ.x1 = start.x + lineCurveX;
50
+ coordQ.y1 = start.y;
51
+ coordQ.x = coordQ.x1;
52
+ coordQ.y = coordQ.y1 - lineCurveY;
53
+ break;
54
+ case 'above-left':
55
+ coordQ.x1 = start.x;
56
+ coordQ.y1 = start.y - lineCurveY;
57
+ coordQ.x = coordQ.x1 - lineCurveX;
58
+ coordQ.y = coordQ.y1;
59
+ break;
60
+ case 'left-under':
61
+ coordQ.x1 = start.x - lineCurveX;
62
+ coordQ.y1 = start.y;
63
+ coordQ.x = coordQ.x1;
64
+ coordQ.y = coordQ.y1 + lineCurveY;
65
+ break;
66
+ default:
67
+ break;
68
+ }
69
+ return coordQ;
70
+ }
71
+ /**Tránh khối phía bên phải */
72
+ static byPassElementOnRightSide(startX, startY, endY, lineCurve, elementBlockRoad, directionX, separatedPoints, key, coordLX) {
73
+ const topElementBlockRoad = (elementBlockRoad.y ?? 0);
74
+ const bottomElementBlockRoad = (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0);
75
+ const directionY = this.checkUpDownLeftRight(startY, endY, 'y');
76
+ const Q1 = this.drawLineQ({ x: startX, y: startY ?? 0 }, `${directionX}-${directionY === 'under' ? 'under' : 'above'}`, lineCurve, lineCurve);
77
+ const L1 = {
78
+ x: Q1.x ?? 0,
79
+ y: (directionY === 'under' ? bottomElementBlockRoad : topElementBlockRoad)
80
+ };
81
+ if ((directionY === 'under' && bottomElementBlockRoad - (Q1.y ?? 0) <= 0)
82
+ || (directionY === 'above' && topElementBlockRoad - (Q1.y ?? 0) >= 0)) {
83
+ L1.y = Q1.y ?? 0;
84
+ }
85
+ if (Math.abs((L1.y ?? 0) - endY) <= 10) {
86
+ L1.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, L1.y, lineCurve);
87
+ }
88
+ const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionY === 'under' ? 'under' : 'above'}-${directionX}`, lineCurve, lineCurve);
89
+ const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;
90
+ const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;
91
+ separatedPoints.push({ start: { x: coordLX ?? startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'horizontal-single-curve', id: key, name: 'qr' });
92
+ separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y ?? 0 }, mode: 'horizontal', id: key, name: 'lr' });
93
+ separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y ?? 0 }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'vertical-single-curve', id: key, name: 'q2r' });
94
+ return {
95
+ pathByPassQ: `${pathQ1} ${pathQ2}`,
96
+ endPath: {
97
+ x: Q2.x ?? 0,
98
+ y: Q2.y ?? 0
99
+ }
100
+ };
101
+ }
102
+ /**Tránh khối phía bên trên */
103
+ static byPassElementOnTopBottomSide(startX, startY, endX, lineCurve, elementBlockRoad, directionY, separatedPoints, key) {
104
+ const leftElementBlockRoad = (elementBlockRoad.x ?? 0);
105
+ const rightElementBlockRoad = (elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0);
106
+ const directionX = this.checkUpDownLeftRight(startX, endX, 'x') === 'left' ? 'left' : 'right'; // xem nên tránh sang trái hay phải
107
+ const Q1 = this.drawLineQ({ x: startX, y: startY ?? 0 }, `${directionY}-${directionX}`, lineCurve, lineCurve);
108
+ const L1 = {
109
+ x: (directionX === 'left' ? leftElementBlockRoad : rightElementBlockRoad),
110
+ y: Q1.y ?? 0
111
+ };
112
+ if ((directionX === 'right' && rightElementBlockRoad - (Q1.x ?? 0) <= 0) || (directionX === 'left' && leftElementBlockRoad - (Q1.x ?? 0) >= 0)) {
113
+ L1.x = Q1.x ?? 0;
114
+ }
115
+ const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionX}-${directionY}`, lineCurve, lineCurve);
116
+ if (Math.abs((Q2.x ?? 0) - leftElementBlockRoad) <= 10) {
117
+ Q2.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, Q2.x, lineCurve, true);
118
+ }
119
+ const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;
120
+ const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;
121
+ separatedPoints.push({ start: { x: startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'vertical-single-curve', id: key ?? 'qb' });
122
+ separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y ?? 0 }, mode: 'horizontal-single-curve', id: key ?? 'lb' });
123
+ separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y ?? 0 }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'horizontal-single-curve', id: key ?? 'q2b' });
124
+ return {
125
+ pathByPassQ: `${pathQ1} ${pathQ2}`,
126
+ endPath: {
127
+ x: Q2.x ?? 0,
128
+ y: Q2.y ?? 0
129
+ }
130
+ };
131
+ }
132
+ // kiểm tra đường thẳng và khối có cắt nhau không
133
+ static checkLinePassBlockHorizontal(start, end, xOrYOfLine, direction, obstacleRect, returnAllElementBlockRoad) {
134
+ const minimumDistanceFromBlock = 8;
135
+ start += minimumDistanceFromBlock + 1; // tránh khối xuất phát vào list
136
+ const listPointsOfLine = range(start, end + 1);
137
+ const elementBlockRoad = obstacleRect.filter(item => {
138
+ const left = (item.x ?? 0) - minimumDistanceFromBlock;
139
+ const right = (item.x ?? 0) + (item.width ?? 0) + minimumDistanceFromBlock;
140
+ const top = (item.y ?? 0) - minimumDistanceFromBlock;
141
+ const bottom = (item.y ?? 0) + (item.height ?? 0) + minimumDistanceFromBlock;
142
+ if (direction === 'x' && listPointsOfLine.find(el => (left <= el && el <= right)) && (top <= xOrYOfLine && xOrYOfLine <= bottom)) {
143
+ return true;
144
+ }
145
+ if (direction === 'y' && listPointsOfLine.find(el => (top <= el && el <= bottom)) && (left <= xOrYOfLine && xOrYOfLine <= right)) {
146
+ return true;
147
+ }
148
+ return false;
149
+ });
150
+ if (!elementBlockRoad || !elementBlockRoad.length) {
151
+ return undefined;
152
+ }
153
+ if (returnAllElementBlockRoad) {
154
+ return elementBlockRoad;
155
+ }
156
+ if (direction === 'y') {
157
+ return elementBlockRoad.reduce((a, b) => (Math.abs(((a.y ?? 0) - start))) < (Math.abs(((b.y ?? 0) - start))) ? a : b);
158
+ }
159
+ return elementBlockRoad.reduce((a, b) => (Math.abs(((a.x ?? 0) - start))) < (Math.abs(((b.x ?? 0) - start))) ? a : b);
160
+ }
161
+ // kiểm tra hướng thẳng vẽ về điểm end xem có bị chắn bởi khối nào không, nếu có thì phải lùi lại điểm end nhé.
162
+ static checkBlocksElementStraightY(startX, startY, endPosition, obstacleRect) {
163
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect, true);
164
+ if (!elementBlockRoad || !elementBlockRoad.length) {
165
+ return;
166
+ }
167
+ return elementBlockRoad.reduce((a, b) => (Math.abs((a.x ?? 0 - startX))) < (Math.abs((b.x ?? 0 - startX))) ? a : b);
168
+ }
169
+ // kiểm tra hướng ngang vẽ về điểm end xem có bị chắn bởi khối nào không, nếu có thì phải lùi lại điểm end nhé.
170
+ static checkBlocksElementX(startX, startY, endPosition, obstacleRect) {
171
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect, true);
172
+ if (!elementBlockRoad || !elementBlockRoad.length) {
173
+ return;
174
+ }
175
+ return elementBlockRoad.reduce((a, b) => (Math.abs(((a.y ?? 0) - startY))) < (Math.abs(((b.y ?? 0) - startY))) ? a : b);
176
+ }
177
+ // kiểm tra hướng sang phải là tránh khối
178
+ static checkAndAvoidBlocksLeft(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints, pathPre) {
179
+ const coordLX = { x: endPosition.x, y: startY };
180
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect);
181
+ if (!elementBlockRoad) {
182
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '14' });
183
+ return {
184
+ path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
185
+ endPath: coordLX
186
+ };
187
+ }
188
+ const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');
189
+ const specificXElement = directionX === 'right' ? (elementBlockRoad.x ?? 0) : ((elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0));
190
+ coordLX.x = specificXElement + (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) + (lineCurve / 2);
191
+ if (directionX === 'right') {
192
+ coordLX.x = specificXElement - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);
193
+ }
194
+ let startXBypassElement = coordLX.x;
195
+ if ((directionX === 'left' && startX - (coordLX.x ?? 0) <= 0) || (directionX === 'right' && startX - (coordLX.x ?? 0) >= 0)) {
196
+ coordLX.x = startX;
197
+ startXBypassElement = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, coordLX.x, lineCurve);
198
+ }
199
+ const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, separatedPoints, undefined, coordLX.x);
200
+ const line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;
201
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '15' });
202
+ const data = this.checkAndAvoidBlocksLeft(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints, `${line}`);
203
+ return {
204
+ path: data.path,
205
+ endPath: data.endPath
206
+ };
207
+ }
208
+ // kiểm tra hướng sang phải là tránh khối
209
+ static checkAndAvoidBlocks(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints, pathPre) {
210
+ const coordLX = { x: endPosition.x - 30, y: startY };
211
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect);
212
+ if (!elementBlockRoad) {
213
+ const elementBlockRoadStraightLineY = this.checkBlocksElementStraightY((coordLX.x ?? 0) + 10, coordLX.y ?? 0, endPosition, obstacleRect); // tính điểm end_x dự kiến theo trường hợp đẹp nhất xem nó có chắn bởi khối nào khi kéo xuống không
214
+ if (elementBlockRoadStraightLineY && (elementBlockRoadStraightLineY.x ?? 0) > startX) {
215
+ let toX = (elementBlockRoadStraightLineY.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);
216
+ if (((elementBlockRoadStraightLineY?.x ?? 0) - startX) < MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT) {
217
+ toX = (elementBlockRoadStraightLineY.x ?? 0) - (((elementBlockRoadStraightLineY?.x ?? 0) - startX) / 2);
218
+ }
219
+ coordLX.x = toX;
220
+ }
221
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'w' });
222
+ return {
223
+ path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
224
+ endPath: coordLX
225
+ };
226
+ }
227
+ const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');
228
+ coordLX.x = (elementBlockRoad.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);
229
+ let separatedPointsByPassElementOnRightSide = [];
230
+ const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(coordLX.x, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, separatedPointsByPassElementOnRightSide, 'checkAndAvoidBlocks', coordLX.x);
231
+ let line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;
232
+ // tính trước trường hợp sau để lùi line
233
+ const elementBlockRoadPre = this.checkLinePassBlockHorizontal(endPath.x ?? 0, endPosition.x, endPath.y ?? 0, 'x', obstacleRect);
234
+ if (!elementBlockRoadPre) {
235
+ const elementBlockRoadStraightLineY = this.checkBlocksElementStraightY((endPosition.x ?? 0) + 10, endPath.y ?? 0, endPosition, obstacleRect);
236
+ if (elementBlockRoadStraightLineY) {
237
+ const XNew = (elementBlockRoadStraightLineY.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);
238
+ if (XNew < (endPath.x ?? 0)) {
239
+ separatedPointsByPassElementOnRightSide = [];
240
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'u' });
241
+ line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`;
242
+ return {
243
+ path: line,
244
+ endPath: coordLX
245
+ };
246
+ }
247
+ }
248
+ }
249
+ separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsByPassElementOnRightSide);
250
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'p' });
251
+ const data = this.checkAndAvoidBlocks(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints, `${line}`);
252
+ return {
253
+ path: data.path,
254
+ endPath: data.endPath
255
+ };
256
+ }
257
+ // kiểm tra hướng thẳng và tránh khối
258
+ static checkAndAvoidBlocksY(startX, startY, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, pathPre) {
259
+ const coordLX = { x: startX, y: endPosition.y };
260
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect);
261
+ if ((directionY === 'under' && startY > endPosition.y) || (directionY === 'above' && startY < endPosition.y)) {
262
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'k' });
263
+ return {
264
+ path: pathPre ?? '',
265
+ endPath: { x: startX, y: startY }
266
+ };
267
+ }
268
+ if (!elementBlockRoad) {
269
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'r' });
270
+ return {
271
+ path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
272
+ endPath: coordLX
273
+ };
274
+ }
275
+ const y = directionY === 'above' ? (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0) : (elementBlockRoad.y ?? 0);
276
+ coordLX.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, y, lineCurve * 2);
277
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'ra' });
278
+ const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnTopBottomSide(coordLX.x ?? 0, coordLX.y ?? 0, endPosition.x, lineCurve, elementBlockRoad, directionY, separatedPoints);
279
+ // sau khi đã tránh thì tiếp tục kéo dài cho tời điểm end x, lại kiểm tra xem có khối nào chắn không?
280
+ const line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;
281
+ const data = this.checkAndAvoidBlocksY(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, `${line}`);
282
+ return {
283
+ path: data.path,
284
+ endPath: data.endPath
285
+ };
286
+ }
287
+ // kiểm tra hướng thẳng và tránh khối
288
+ static checkAndAvoidBlocksYLeft(startX, startY, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, pathPre) {
289
+ const key = 'checkAndAvoidBlocksYLeft';
290
+ const coordLX = { x: startX, y: endPosition.y };
291
+ const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect);
292
+ if (!elementBlockRoad) {
293
+ const elementBlockRoadStraightLineX = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementX(coordLX.x ?? 0, (coordLX.y ?? 0), endPosition, obstacleRect);
294
+ if (elementBlockRoadStraightLineX) {
295
+ const topElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0);
296
+ const bottomElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0) + (elementBlockRoadStraightLineX.height ?? 0);
297
+ let toY = (directionY === 'under' ? topElementBlockRoad : bottomElementBlockRoad);
298
+ toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, toY, lineCurve * 2);
299
+ if (toY > startY) {
300
+ coordLX.y = toY;
301
+ }
302
+ }
303
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: key, name: 'a' });
304
+ return {
305
+ path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
306
+ endPath: coordLX
307
+ };
308
+ }
309
+ const y = directionY === 'above' ? (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0) : (elementBlockRoad.y ?? 0);
310
+ const elementBlockRoadStraightLineX = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementX(coordLX.x ?? 0, (coordLX.y ?? 0), endPosition, obstacleRect);
311
+ let ignoreBypassElement = false;
312
+ if (elementBlockRoadStraightLineX && elementBlockRoadStraightLineX.id === elementBlockRoad.id) {
313
+ ignoreBypassElement = true;
314
+ }
315
+ coordLX.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, y, lineCurve * 2);
316
+ let separatedPointsByPassElementOnRightSide = [];
317
+ const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnTopBottomSide(coordLX.x ?? 0, coordLX.y ?? 0, endPosition.x, lineCurve, elementBlockRoad, directionY, separatedPointsByPassElementOnRightSide, key);
318
+ let end = coordLX;
319
+ let line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`;
320
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: key, name: 'b' });
321
+ if (ignoreBypassElement) {
322
+ separatedPointsByPassElementOnRightSide = [];
323
+ separatedPoints.push({ start: coordLX, end, mode: 'horizontal', id: key, name: 'c' });
324
+ return {
325
+ path: line,
326
+ endPath: end
327
+ };
328
+ }
329
+ end = endPath;
330
+ line += ` ${pathByPassQ}`;
331
+ separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsByPassElementOnRightSide);
332
+ const data = this.checkAndAvoidBlocksYLeft(end.x ?? 0, end.y ?? 0, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, `${line}`);
333
+ return {
334
+ path: data.path,
335
+ endPath: data.endPath
336
+ };
337
+ }
338
+ }
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1kaXJldGlvbi1lbGVtZW50LnVudGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RyYXctbGluZS9zcmMvdXRpbC9jYWxjdWxhdG9yLWRpcmV0aW9uLWVsZW1lbnQudW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBSWhHLE1BQU0sT0FBTyxzQ0FBc0M7SUFDakQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFVBQThCLEVBQUUsUUFBNEIsRUFBRSxTQUFvQjtRQUM1RyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkQsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkIsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDL0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBK0IsRUFBRSxNQUFnQyxFQUFFLFVBQWtCLEVBQUUsVUFBa0I7UUFFeEgsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUVuQyxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2Ys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LElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXJELGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hLLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5SSxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENB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QUFFLEdBQUc7YUFDYixDQUFDO1FBQ0osQ0FBQztRQUVELEdBQUcsR0FBRyxPQUFPLENBQUM7UUFDZCxJQUFJLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMxQixlQUFlLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsdUNBQXVDLENBQUMsQ0FBQztRQUM5RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFFakosT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZ2UgfSBmcm9tIFwiQGxpYnMtdWkvdXRpbHNcIjtcbmltcG9ydCB7IElDb29yZGluYXRlc1N2ZywgSVBvaW50LCBJUG9pbnRzLCBJUmVjdCB9IGZyb20gXCIuLi9kcmF3LWxpbmUuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsIH0gZnJvbSBcIi4vY2FsY3VsYXRvci1icmFuY2gudXRpbFwiO1xuaW1wb3J0IHsgTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsIH0gZnJvbSBcIi4vY29ubmVjdC1uYXZpZ2F0aW9uLW5ldy1lbGVtZW50LnV0aWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJUG9zaXRpb25YWSB7IHg6IG51bWJlciwgeTogbnVtYmVyIH1cbmV4cG9ydCB0eXBlIENvcm5lckRpcmVjdGlvbiA9ICdyaWdodC11bmRlcicgfCAndW5kZXItbGVmdCcgfCAnbGVmdC1hYm92ZScgfCAnYWJvdmUtcmlnaHQnIHwgJ3VuZGVyLXJpZ2h0JyB8ICdyaWdodC1hYm92ZScgfCAnYWJvdmUtbGVmdCcgfCAnbGVmdC11bmRlcic7IC8vIHRoZW8gY2hp4buBdVxuZXhwb3J0IGNsYXNzIE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsIHtcbiAgc3RhdGljIGNoZWNrVXBEb3duTGVmdFJpZ2h0KGZpcnN0UG9pbnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgZW5kUG9pbnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgZGlyZWN0aW9uOiAneCcgfCAneScpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gKChmaXJzdFBvaW50ID8/IDApIC0gKGVuZFBvaW50ID8/IDApKTtcblxuICAgIGlmIChkaXN0YW5jZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgIH1cbiAgICBpZiAoZGlzdGFuY2UgPiAwKSB7XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAneCcgPyAnbGVmdCcgOiAnYWJvdmUnO1xuICAgIH1cblxuICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICd4JyA/ICdyaWdodCcgOiAndW5kZXInO1xuICB9XG5cbiAgc3RhdGljIGRyYXdMaW5lUShzdGFydDogeyB4OiBudW1iZXIsIHk6IG51bWJlciB9LCBjb3JuZXI6IENvcm5lckRpcmVjdGlvbiB8IHN0cmluZywgbGluZUN1cnZlWDogbnVtYmVyLCBsaW5lQ3VydmVZOiBudW1iZXIpIHtcblxuICAgIGNvbnN0IGNvb3JkUTogSUNvb3JkaW5hdGVzU3ZnID0ge307XG5cbiAgICBzd2l0Y2ggKGNvcm5lcikge1xuICAgICAgY2FzZSAncmlnaHQtdW5kZXInOlxuICAgICAgICBjb29yZFEueDEgPSBzdGFydC54ICsgbGluZUN1cnZlWDtcbiAgICAgICAgY29vcmRRLnkxID0gc3RhcnQueTtcbiAgICAgICAgY29vcmRRLnggPSBjb29yZFEueDE7XG4gICAgICAgIGNvb3JkUS55ID0gY29vcmRRLnkxICsgbGluZUN1cnZlWTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3VuZGVyLWxlZnQnOlxuICAgICAgICBjb29yZFEueDEgPSBzdGFydC54O1xuICAgICAgICBjb29yZFEueTEgPSBzdGFydC55ICsgbGluZUN1cnZlWTtcbiAgICAgICAgY29vcmRRLnggPSBjb29yZFEueDEgLSBsaW5lQ3VydmVYO1xuICAgICAgICBjb29yZFEueSA9IGNvb3JkUS55MTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnQtYWJvdmUnOlxuICAgICAgICBjb29yZFEueDEgPSBzdGFydC54IC0gbGluZUN1cnZlWDtcbiAgICAgICAgY29vcmRRLnkxID0gc3RhcnQueTtcbiAgICAgICAgY29vcmRRLnggPSBjb29yZFEueDE7XG4gICAgICAgIGNvb3JkUS55ID0gY29vcmRRLnkxIC0gbGluZUN1cnZlWTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2Fib3ZlLXJpZ2h0JzpcbiAgICAgICAgY29vcmRRLngxID0gc3RhcnQueDtcbiAgICAgICAgY29vcmRRLnkxID0gc3RhcnQueSAtIGxpbmVDdXJ2ZVk7XG4gICAgICAgIGNvb3JkUS54ID0gY29vcmRRLngxICsgbGluZUN1cnZlWDtcbiAgICAgICAgY29vcmRRLnkgPSBjb29yZFEueTE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd1bmRlci1yaWdodCc6XG4gICAgICAgIGNvb3JkUS54MSA9IHN0YXJ0Lng7XG4gICAgICAgIGNvb3JkUS55MSA9IHN0YXJ0LnkgKyBsaW5lQ3VydmVZO1xuICAgICAgICBjb29yZFEueCA9IGNvb3JkUS54MSArIGxpbmVDdXJ2ZVg7XG4gICAgICAgIGNvb3JkUS55ID0gY29vcmRRLnkxO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlnaHQtYWJvdmUnOlxuICAgICAgICBjb29yZFEueDEgPSBzdGFydC54ICsgbGluZUN1cnZlWDtcbiAgICAgICAgY29vcmRRLnkxID0gc3RhcnQueTtcbiAgICAgICAgY29vcmRRLnggPSBjb29yZFEueDE7XG4gICAgICAgIGNvb3JkUS55ID0gY29vcmRRLnkxIC0gbGluZUN1cnZlWTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2Fib3ZlLWxlZnQnOlxuICAgICAgICBjb29yZFEueDEgPSBzdGFydC54O1xuICAgICAgICBjb29yZFEueTEgPSBzdGFydC55IC0gbGluZUN1cnZlWTtcbiAgICAgICAgY29vcmRRLnggPSBjb29yZFEueDEgLSBsaW5lQ3VydmVYO1xuICAgICAgICBjb29yZFEueSA9IGNvb3JkUS55MTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnQtdW5kZXInOlxuICAgICAgICBjb29yZFEueDEgPSBzdGFydC54IC0gbGluZUN1cnZlWDtcbiAgICAgICAgY29vcmRRLnkxID0gc3RhcnQueTtcbiAgICAgICAgY29vcmRRLnggPSBjb29yZFEueDE7XG4gICAgICAgIGNvb3JkUS55ID0gY29vcmRRLnkxICsgbGluZUN1cnZlWTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjb29yZFE7XG4gIH1cblxuICAvKipUcsOhbmgga2jhu5FpIHBow61hIGLDqm4gcGjhuqNpICovXG4gIHN0YXRpYyBieVBhc3NFbGVtZW50T25SaWdodFNpZGUoc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRZOiBudW1iZXIsIGxpbmVDdXJ2ZTogbnVtYmVyLCBlbGVtZW50QmxvY2tSb2FkOiBJUmVjdCwgZGlyZWN0aW9uWDogc3RyaW5nLCBzZXBhcmF0ZWRQb2ludHM6IEFycmF5PElQb2ludHM+LCBrZXk/OiBzdHJpbmcsIGNvb3JkTFg/OiBudW1iZXIpIHtcbiAgICBjb25zdCB0b3BFbGVtZW50QmxvY2tSb2FkID0gKGVsZW1lbnRCbG9ja1JvYWQueSA/PyAwKTtcbiAgICBjb25zdCBib3R0b21FbGVtZW50QmxvY2tSb2FkID0gKGVsZW1lbnRCbG9ja1JvYWQueSA/PyAwKSArIChlbGVtZW50QmxvY2tSb2FkLmhlaWdodCA/PyAwKTtcbiAgICBjb25zdCBkaXJlY3Rpb25ZID0gdGhpcy5jaGVja1VwRG93bkxlZnRSaWdodChzdGFydFksIGVuZFksICd5Jyk7XG4gICAgY29uc3QgUTEgPSB0aGlzLmRyYXdMaW5lUSh7IHg6IHN0YXJ0WCwgeTogc3RhcnRZID8/IDAgfSwgYCR7ZGlyZWN0aW9uWH0tJHtkaXJlY3Rpb25ZID09PSAndW5kZXInID8gJ3VuZGVyJyA6ICdhYm92ZSd9YCwgbGluZUN1cnZlLCBsaW5lQ3VydmUpO1xuICAgIGNvbnN0IEwxID0ge1xuICAgICAgeDogUTEueCA/PyAwLFxuICAgICAgeTogKGRpcmVjdGlvblkgPT09ICd1bmRlcicgPyBib3R0b21FbGVtZW50QmxvY2tSb2FkIDogdG9wRWxlbWVudEJsb2NrUm9hZClcbiAgICB9O1xuICAgIGlmICgoZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJyAmJiBib3R0b21FbGVtZW50QmxvY2tSb2FkIC0gKFExLnkgPz8gMCkgPD0gMClcbiAgICAgIHx8IChkaXJlY3Rpb25ZID09PSAnYWJvdmUnICYmIHRvcEVsZW1lbnRCbG9ja1JvYWQgLSAoUTEueSA/PyAwKSA+PSAwKSkge1xuICAgICAgTDEueSA9IFExLnkgPz8gMDtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnMoKEwxLnkgPz8gMCkgLSBlbmRZKSA8PSAxMCkge1xuICAgICAgTDEueSA9IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblgsIEwxLnksIGxpbmVDdXJ2ZSk7XG4gICAgfVxuICAgIGNvbnN0IFEyID0gdGhpcy5kcmF3TGluZVEoeyB4OiBMMS54LCB5OiBMMS55ID8/IDAgfSwgYCR7ZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJyA/ICd1bmRlcicgOiAnYWJvdmUnfS0ke2RpcmVjdGlvblh9YCwgbGluZUN1cnZlLCBsaW5lQ3VydmUpO1xuXG4gICAgY29uc3QgcGF0aFExID0gYFEgJHtRMS54MX0sJHtRMS55MX0gJHtRMS54fSwke1ExLnl9IEwgJHtMMS54fSAke0wxLnl9YDtcbiAgICBjb25zdCBwYXRoUTIgPSBgUSAke1EyLngxfSwke1EyLnkxfSAke1EyLnh9LCR7UTIueX1gO1xuXG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBjb29yZExYID8/IHN0YXJ0WCwgeTogc3RhcnRZIH0sIGVuZDogeyB4OiBRMS54ID8/IDAsIHk6IFExLnkgPz8gMCB9LCBtb2RlOiAnaG9yaXpvbnRhbC1zaW5nbGUtY3VydmUnLCBpZDoga2V5LCBuYW1lOiAncXInIH0pO1xuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogUTEueCA/PyAwLCB5OiBRMS55ID8/IDAgfSwgZW5kOiB7IHg6IEwxLnggPz8gMCwgeTogTDEueSA/PyAwIH0sIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6IGtleSwgbmFtZTogJ2xyJyB9KTtcbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IEwxLnggPz8gMCwgeTogTDEueSA/PyAwIH0sIGVuZDogeyB4OiBRMi54ID8/IDAsIHk6IFEyLnkgPz8gMCB9LCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6IGtleSwgbmFtZTogJ3EycicgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aEJ5UGFzc1E6IGAke3BhdGhRMX0gJHtwYXRoUTJ9YCxcbiAgICAgIGVuZFBhdGg6IHtcbiAgICAgICAgeDogUTIueCA/PyAwLFxuICAgICAgICB5OiBRMi55ID8/IDBcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqVHLDoW5oIGto4buRaSBwaMOtYSBiw6puIHRyw6puICovXG4gIHN0YXRpYyBieVBhc3NFbGVtZW50T25Ub3BCb3R0b21TaWRlKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBsaW5lQ3VydmU6IG51bWJlciwgZWxlbWVudEJsb2NrUm9hZDogSVJlY3QsIGRpcmVjdGlvblk6IHN0cmluZywgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPiwga2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgbGVmdEVsZW1lbnRCbG9ja1JvYWQgPSAoZWxlbWVudEJsb2NrUm9hZC54ID8/IDApO1xuICAgIGNvbnN0IHJpZ2h0RWxlbWVudEJsb2NrUm9hZCA9IChlbGVtZW50QmxvY2tSb2FkLnggPz8gMCkgKyAoZWxlbWVudEJsb2NrUm9hZC53aWR0aCA/PyAwKTtcbiAgICBjb25zdCBkaXJlY3Rpb25YID0gdGhpcy5jaGVja1VwRG93bkxlZnRSaWdodChzdGFydFgsIGVuZFgsICd4JykgPT09ICdsZWZ0JyA/ICdsZWZ0JyA6ICdyaWdodCc7IC8vIHhlbSBuw6puIHRyw6FuaCBzYW5nIHRyw6FpIGhheSBwaOG6o2lcblxuICAgIGNvbnN0IFExID0gdGhpcy5kcmF3TGluZVEoeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSA/PyAwIH0sIGAke2RpcmVjdGlvbll9LSR7ZGlyZWN0aW9uWH1gLCBsaW5lQ3VydmUsIGxpbmVDdXJ2ZSk7XG4gICAgY29uc3QgTDEgPSB7XG4gICAgICB4OiAoZGlyZWN0aW9uWCA9PT0gJ2xlZnQnID8gbGVmdEVsZW1lbnRCbG9ja1JvYWQgOiByaWdodEVsZW1lbnRCbG9ja1JvYWQpLFxuICAgICAgeTogUTEueSA/PyAwXG4gICAgfTtcbiAgICBpZiAoKGRpcmVjdGlvblggPT09ICdyaWdodCcgJiYgcmlnaHRFbGVtZW50QmxvY2tSb2FkIC0gKFExLnggPz8gMCkgPD0gMCkgfHwgKGRpcmVjdGlvblggPT09ICdsZWZ0JyAmJiBsZWZ0RWxlbWVudEJsb2NrUm9hZCAtIChRMS54ID8/IDApID49IDApKSB7XG4gICAgICBMMS54ID0gUTEueCA/PyAwO1xuICAgIH1cbiAgICBjb25zdCBRMiA9IHRoaXMuZHJhd0xpbmVRKHsgeDogTDEueCwgeTogTDEueSA/PyAwIH0sIGAke2RpcmVjdGlvblh9LSR7ZGlyZWN0aW9uWX1gLCBsaW5lQ3VydmUsIGxpbmVDdXJ2ZSk7XG5cbiAgICBpZiAoTWF0aC5hYnMoKFEyLnggPz8gMCkgLSBsZWZ0RWxlbWVudEJsb2NrUm9hZCkgPD0gMTApIHtcbiAgICAgIFEyLnggPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25YLCBRMi54LCBsaW5lQ3VydmUsIHRydWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhRMSA9IGBRICR7UTEueDF9LCR7UTEueTF9ICR7UTEueH0sJHtRMS55fSBMICR7TDEueH0gJHtMMS55fWA7XG4gICAgY29uc3QgcGF0aFEyID0gYFEgJHtRMi54MX0sJHtRMi55MX0gJHtRMi54fSwke1EyLnl9YDtcblxuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogc3RhcnRYLCB5OiBzdGFydFkgfSwgZW5kOiB7IHg6IFExLnggPz8gMCwgeTogUTEueSA/PyAwIH0sIG1vZGU6ICd2ZXJ0aWNhbC1zaW5nbGUtY3VydmUnLCBpZDoga2V5ID8/ICdxYicgfSk7XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBRMS54ID8/IDAsIHk6IFExLnkgPz8gMCB9LCBlbmQ6IHsgeDogTDEueCA/PyAwLCB5OiBMMS55ID8/IDAgfSwgbW9kZTogJ2hvcml6b250YWwtc2luZ2xlLWN1cnZlJywgaWQ6IGtleSA/PyAnbGInIH0pO1xuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogTDEueCA/PyAwLCB5OiBMMS55ID8/IDAgfSwgZW5kOiB7IHg6IFEyLnggPz8gMCwgeTogUTIueSA/PyAwIH0sIG1vZGU6ICdob3Jpem9udGFsLXNpbmdsZS1jdXJ2ZScsIGlkOiBrZXkgPz8gJ3EyYicgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aEJ5UGFzc1E6IGAke3BhdGhRMX0gJHtwYXRoUTJ9YCxcbiAgICAgIGVuZFBhdGg6IHtcbiAgICAgICAgeDogUTIueCA/PyAwLFxuICAgICAgICB5OiBRMi55ID8/IDBcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8ga2nhu4NtIHRyYSDEkcaw4budbmcgdGjhurNuZyB2w6Aga2jhu5FpIGPDsyBj4bqvdCBuaGF1IGtow7RuZ1xuICBzdGF0aWMgY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgeE9yWU9mTGluZTogbnVtYmVyLCBkaXJlY3Rpb246ICd4JyB8ICd5Jywgb2JzdGFjbGVSZWN0OiBJUmVjdFtdLCByZXR1cm5BbGxFbGVtZW50QmxvY2tSb2FkPzogYm9vbGVhbikge1xuICAgIGNvbnN0IG1pbmltdW1EaXN0YW5jZUZyb21CbG9jayA9IDg7XG5cbiAgICBzdGFydCArPSBtaW5pbXVtRGlzdGFuY2VGcm9tQmxvY2sgKyAxOyAvLyB0csOhbmgga2jhu5FpIHh14bqldCBwaMOhdCB2w6BvIGxpc3RcbiAgICBjb25zdCBsaXN0UG9pbnRzT2ZMaW5lID0gcmFuZ2Uoc3RhcnQsIGVuZCArIDEpO1xuXG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZCA9IG9ic3RhY2xlUmVjdC5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBsZWZ0ID0gKGl0ZW0ueCA/PyAwKSAtIG1pbmltdW1EaXN0YW5jZUZyb21CbG9jaztcbiAgICAgIGNvbnN0IHJpZ2h0ID0gKGl0ZW0ueCA/PyAwKSArIChpdGVtLndpZHRoID8/IDApICsgbWluaW11bURpc3RhbmNlRnJvbUJsb2NrO1xuICAgICAgY29uc3QgdG9wID0gKGl0ZW0ueSA/PyAwKSAtIG1pbmltdW1EaXN0YW5jZUZyb21CbG9jaztcbiAgICAgIGNvbnN0IGJvdHRvbSA9IChpdGVtLnkgPz8gMCkgKyAoaXRlbS5oZWlnaHQgPz8gMCkgKyBtaW5pbXVtRGlzdGFuY2VGcm9tQmxvY2s7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICd4JyAmJiBsaXN0UG9pbnRzT2ZMaW5lLmZpbmQoZWwgPT4gKGxlZnQgPD0gZWwgJiYgZWwgPD0gcmlnaHQpKSAmJiAodG9wIDw9IHhPcllPZkxpbmUgJiYgeE9yWU9mTGluZSA8PSBib3R0b20pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3knICYmIGxpc3RQb2ludHNPZkxpbmUuZmluZChlbCA9PiAodG9wIDw9IGVsICYmIGVsIDw9IGJvdHRvbSkpICYmIChsZWZ0IDw9IHhPcllPZkxpbmUgJiYgeE9yWU9mTGluZSA8PSByaWdodCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZCB8fCAhZWxlbWVudEJsb2NrUm9hZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHJldHVybkFsbEVsZW1lbnRCbG9ja1JvYWQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50QmxvY2tSb2FkO1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gPT09ICd5Jykge1xuICAgICAgcmV0dXJuIGVsZW1lbnRCbG9ja1JvYWQucmVkdWNlKChhOiBJUmVjdCwgYjogSVJlY3QpID0+IChNYXRoLmFicygoKGEueSA/PyAwKSAtIHN0YXJ0KSkpIDwgKE1hdGguYWJzKCgoYi55ID8/IDApIC0gc3RhcnQpKSkgPyBhIDogYik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRCbG9ja1JvYWQucmVkdWNlKChhOiBJUmVjdCwgYjogSVJlY3QpID0+IChNYXRoLmFicygoKGEueCA/PyAwKSAtIHN0YXJ0KSkpIDwgKE1hdGguYWJzKCgoYi54ID8/IDApIC0gc3RhcnQpKSkgPyBhIDogYik7XG4gIH1cblxuICAvLyBraeG7g20gdHJhIGjGsOG7m25nIHRo4bqzbmcgduG6vSB24buBIMSRaeG7g20gZW5kIHhlbSBjw7MgYuG7iyBjaOG6r24gYuG7n2kga2jhu5FpIG7DoG8ga2jDtG5nLCBu4bq/dSBjw7MgdGjDrCBwaOG6o2kgbMO5aSBs4bqhaSDEkWnhu4NtIGVuZCBuaMOpLlxuICBzdGF0aWMgY2hlY2tCbG9ja3NFbGVtZW50U3RyYWlnaHRZKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kUG9zaXRpb246IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSwgb2JzdGFjbGVSZWN0OiBJUmVjdFtdKSB7XG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZCA9IHRoaXMuY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChzdGFydFksIGVuZFBvc2l0aW9uLnksIHN0YXJ0WCwgJ3knLCBvYnN0YWNsZVJlY3QsIHRydWUpIGFzIElSZWN0W107XG5cbiAgICBpZiAoIWVsZW1lbnRCbG9ja1JvYWQgfHwgIWVsZW1lbnRCbG9ja1JvYWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRCbG9ja1JvYWQucmVkdWNlKChhOiBJUmVjdCwgYjogSVJlY3QpID0+IChNYXRoLmFicygoYS54ID8/IDAgLSBzdGFydFgpKSkgPCAoTWF0aC5hYnMoKGIueCA/PyAwIC0gc3RhcnRYKSkpID8gYSA6IGIpO1xuICB9XG5cbiAgLy8ga2nhu4NtIHRyYSBoxrDhu5tuZyBuZ2FuZyB24bq9IHbhu4EgxJFp4buDbSBlbmQgeGVtIGPDsyBi4buLIGNo4bqvbiBi4bufaSBraOG7kWkgbsOgbyBraMO0bmcsIG7hur91IGPDsyB0aMOsIHBo4bqjaSBsw7lpIGzhuqFpIMSRaeG7g20gZW5kIG5ow6kuXG4gIHN0YXRpYyBjaGVja0Jsb2Nrc0VsZW1lbnRYKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kUG9zaXRpb246IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSwgb2JzdGFjbGVSZWN0OiBJUmVjdFtdKSB7XG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZCA9IHRoaXMuY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChzdGFydFgsIGVuZFBvc2l0aW9uLngsIHN0YXJ0WSwgJ3gnLCBvYnN0YWNsZVJlY3QsIHRydWUpIGFzIElSZWN0W107XG5cbiAgICBpZiAoIWVsZW1lbnRCbG9ja1JvYWQgfHwgIWVsZW1lbnRCbG9ja1JvYWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRCbG9ja1JvYWQucmVkdWNlKChhOiBJUmVjdCwgYjogSVJlY3QpID0+IChNYXRoLmFicygoKGEueSA/PyAwKSAtIHN0YXJ0WSkpKSA8IChNYXRoLmFicygoKGIueSA/PyAwKSAtIHN0YXJ0WSkpKSA/IGEgOiBiKTtcbiAgfVxuXG4gIC8vIGtp4buDbSB0cmEgaMaw4bubbmcgc2FuZyBwaOG6o2kgbMOgIHRyw6FuaCBraOG7kWlcbiAgc3RhdGljIGNoZWNrQW5kQXZvaWRCbG9ja3NMZWZ0KHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgbGluZUN1cnZlOiBudW1iZXIsIGVuZFBvc2l0aW9uOiBJUG9zaXRpb25YWSwgb2JzdGFjbGVSZWN0OiBJUmVjdFtdLCBzZXBhcmF0ZWRQb2ludHM6IEFycmF5PElQb2ludHM+LCBwYXRoUHJlPzogc3RyaW5nKTogeyBwYXRoOiBzdHJpbmcsIGVuZFBhdGg6IElQb2ludCB9IHtcbiAgICBjb25zdCBjb29yZExYOiBJUG9pbnQgPSB7IHg6IGVuZFBvc2l0aW9uLngsIHk6IHN0YXJ0WSB9O1xuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWQgPSB0aGlzLmNoZWNrTGluZVBhc3NCbG9ja0hvcml6b250YWwoc3RhcnRYLCBlbmRQb3NpdGlvbi54LCBzdGFydFksICd4Jywgb2JzdGFjbGVSZWN0KSBhcyBJUmVjdDtcblxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZCkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IGNvb3JkTFgsIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6ICcxNCcgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHBhdGhQcmUgPyBgJHtwYXRoUHJlfSBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX1gIDogYEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fWAsXG4gICAgICAgIGVuZFBhdGg6IGNvb3JkTFhcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0aW9uWCA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KHN0YXJ0WCwgZW5kUG9zaXRpb24ueCwgJ3gnKTtcbiAgICBjb25zdCBzcGVjaWZpY1hFbGVtZW50ID0gZGlyZWN0aW9uWCA9PT0gJ3JpZ2h0JyA/IChlbGVtZW50QmxvY2tSb2FkLnggPz8gMCkgOiAoKGVsZW1lbnRCbG9ja1JvYWQueCA/PyAwKSArIChlbGVtZW50QmxvY2tSb2FkLndpZHRoID8/IDApKTtcblxuICAgIGNvb3JkTFgueCA9IHNwZWNpZmljWEVsZW1lbnQgKyAoTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyKSArIChsaW5lQ3VydmUgLyAyKTtcbiAgICBpZiAoZGlyZWN0aW9uWCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgY29vcmRMWC54ID0gc3BlY2lmaWNYRWxlbWVudCAtIChNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uTmV3RWxlbWVudFV0aWwuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDIpIC0gKGxpbmVDdXJ2ZSAvIDIpO1xuICAgIH1cblxuICAgIGxldCBzdGFydFhCeXBhc3NFbGVtZW50ID0gY29vcmRMWC54O1xuXG4gICAgaWYgKChkaXJlY3Rpb25YID09PSAnbGVmdCcgJiYgc3RhcnRYIC0gKGNvb3JkTFgueCA/PyAwKSA8PSAwKSB8fCAoZGlyZWN0aW9uWCA9PT0gJ3JpZ2h0JyAmJiBzdGFydFggLSAoY29vcmRMWC54ID8/IDApID49IDApKSB7XG4gICAgICBjb29yZExYLnggPSBzdGFydFg7XG4gICAgICBzdGFydFhCeXBhc3NFbGVtZW50ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWCwgY29vcmRMWC54LCBsaW5lQ3VydmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGF0aEJ5UGFzc1EsIGVuZFBhdGggfSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmJ5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZShzdGFydFhCeXBhc3NFbGVtZW50ID8/IDAsIGNvb3JkTFgueSA/PyAwLCBlbmRQb3NpdGlvbi55LCBsaW5lQ3VydmUsIGVsZW1lbnRCbG9ja1JvYWQsIGRpcmVjdGlvblgsIHNlcGFyYXRlZFBvaW50cywgdW5kZWZpbmVkLCBjb29yZExYLngpO1xuXG4gICAgY29uc3QgbGluZSA9IHBhdGhQcmUgPyBgJHtwYXRoUHJlfSBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX0gJHtwYXRoQnlQYXNzUX1gIDogYEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fSAke3BhdGhCeVBhc3NRfWA7XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0sIGVuZDogY29vcmRMWCwgbW9kZTogJ2hvcml6b250YWwnLCBpZDogJzE1JyB9KTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGVja0FuZEF2b2lkQmxvY2tzTGVmdChlbmRQYXRoLnggPz8gMCwgZW5kUGF0aC55ID8/IDAsIGxpbmVDdXJ2ZSwgZW5kUG9zaXRpb24sIG9ic3RhY2xlUmVjdCwgc2VwYXJhdGVkUG9pbnRzLCBgJHtsaW5lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGRhdGEucGF0aCxcbiAgICAgIGVuZFBhdGg6IGRhdGEuZW5kUGF0aFxuICAgIH07XG4gIH1cblxuICAvLyBraeG7g20gdHJhIGjGsOG7m25nIHNhbmcgcGjhuqNpIGzDoCB0csOhbmgga2jhu5FpXG4gIHN0YXRpYyBjaGVja0FuZEF2b2lkQmxvY2tzKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgbGluZUN1cnZlOiBudW1iZXIsIGVuZFBvc2l0aW9uOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0sIG9ic3RhY2xlUmVjdDogSVJlY3RbXSwgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPiwgcGF0aFByZT86IHN0cmluZyk6IHsgcGF0aDogc3RyaW5nLCBlbmRQYXRoOiBJUG9pbnQgfSB7XG4gICAgY29uc3QgY29vcmRMWDogSVBvaW50ID0geyB4OiBlbmRQb3NpdGlvbi54IC0gMzAsIHk6IHN0YXJ0WSB9O1xuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWQgPSB0aGlzLmNoZWNrTGluZVBhc3NCbG9ja0hvcml6b250YWwoc3RhcnRYLCBlbmRQb3NpdGlvbi54LCBzdGFydFksICd4Jywgb2JzdGFjbGVSZWN0KSBhcyBJUmVjdDtcblxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZCkge1xuICAgICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkgPSB0aGlzLmNoZWNrQmxvY2tzRWxlbWVudFN0cmFpZ2h0WSgoY29vcmRMWC54ID8/IDApICsgMTAsIGNvb3JkTFgueSA/PyAwLCBlbmRQb3NpdGlvbiwgb2JzdGFjbGVSZWN0KTsgLy8gdMOtbmggxJFp4buDbSBlbmRfeCBk4buxIGtp4bq/biB0aGVvIHRyxrDhu51uZyBo4bujcCDEkeG6uXAgbmjhuqV0IHhlbSBuw7MgY8OzIGNo4bqvbiBi4bufaSBraOG7kWkgbsOgbyBraGkga8OpbyB4deG7kW5nIGtow7RuZ1xuXG4gICAgICBpZiAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkgJiYgKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZLnggPz8gMCkgPiBzdGFydFgpIHtcbiAgICAgICAgbGV0IHRvWCA9IChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWS54ID8/IDApIC0gKE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUIC8gMikgLSAobGluZUN1cnZlIC8gMik7XG5cbiAgICAgICAgaWYgKCgoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVk/LnggPz8gMCkgLSBzdGFydFgpIDwgTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQpIHtcbiAgICAgICAgICB0b1ggPSAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkueCA/PyAwKSAtICgoKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZPy54ID8/IDApIC0gc3RhcnRYKSAvIDIpO1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkTFgueCA9IHRvWDtcbiAgICAgIH1cblxuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IGNvb3JkTFgsIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6ICdjaGVja0FuZEF2b2lkQmxvY2tzJywgbmFtZTogJ3cnIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBwYXRoUHJlID8gYCR7cGF0aFByZX0gTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9YCA6IGBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX1gLFxuICAgICAgICBlbmRQYXRoOiBjb29yZExYXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBkaXJlY3Rpb25YID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoc3RhcnRYLCBlbmRQb3NpdGlvbi54LCAneCcpO1xuXG4gICAgY29vcmRMWC54ID0gKGVsZW1lbnRCbG9ja1JvYWQueCA/PyAwKSAtIChNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uTmV3RWxlbWVudFV0aWwuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDIpIC0gKGxpbmVDdXJ2ZSAvIDIpO1xuXG4gICAgbGV0IHNlcGFyYXRlZFBvaW50c0J5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZTogQXJyYXk8SVBvaW50cz4gPSBbXTtcblxuICAgIGNvbnN0IHsgcGF0aEJ5UGFzc1EsIGVuZFBhdGggfSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmJ5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZShjb29yZExYLngsIGNvb3JkTFgueSA/PyAwLCBlbmRQb3NpdGlvbi55LCBsaW5lQ3VydmUsIGVsZW1lbnRCbG9ja1JvYWQsIGRpcmVjdGlvblgsIHNlcGFyYXRlZFBvaW50c0J5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZSwgJ2NoZWNrQW5kQXZvaWRCbG9ja3MnLCBjb29yZExYLngpO1xuICAgIGxldCBsaW5lID0gcGF0aFByZSA/IGAke3BhdGhQcmV9IEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fSAke3BhdGhCeVBhc3NRfWAgOiBgTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9ICR7cGF0aEJ5UGFzc1F9YDtcblxuICAgIC8vIHTDrW5oIHRyxrDhu5tjIHRyxrDhu51uZyBo4bujcCBzYXUgxJHhu4MgbMO5aSBsaW5lXG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZFByZSA9IHRoaXMuY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChlbmRQYXRoLnggPz8gMCwgZW5kUG9zaXRpb24ueCwgZW5kUGF0aC55ID8/IDAsICd4Jywgb2JzdGFjbGVSZWN0KSBhcyBJUmVjdDtcblxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZFByZSkge1xuICAgICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkgPSB0aGlzLmNoZWNrQmxvY2tzRWxlbWVudFN0cmFpZ2h0WSgoZW5kUG9zaXRpb24ueCA/PyAwKSArIDEwLCBlbmRQYXRoLnkgPz8gMCwgZW5kUG9zaXRpb24sIG9ic3RhY2xlUmVjdCk7XG5cbiAgICAgIGlmIChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWSkge1xuICAgICAgICBjb25zdCBYTmV3ID0gKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZLnggPz8gMCkgLSAoTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyKSAtIChsaW5lQ3VydmUgLyAyKTtcblxuICAgICAgICBpZiAoWE5ldyA8IChlbmRQYXRoLnggPz8gMCkpIHtcbiAgICAgICAgICBzZXBhcmF0ZWRQb2ludHNCeVBhc3NFbGVtZW50T25SaWdodFNpZGUgPSBbXTtcbiAgICAgICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0sIGVuZDogY29vcmRMWCwgbW9kZTogJ2hvcml6b250YWwnLCBpZDogJ2NoZWNrQW5kQXZvaWRCbG9ja3MnLCBuYW1lOiAndScgfSk7XG5cbiAgICAgICAgICBsaW5lID0gcGF0aFByZSA/IGAke3BhdGhQcmV9IEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fWAgOiBgTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9YDtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiBsaW5lLFxuICAgICAgICAgICAgZW5kUGF0aDogY29vcmRMWFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgc2VwYXJhdGVkUG9pbnRzLnNwbGljZShzZXBhcmF0ZWRQb2ludHMubGVuZ3RoLCAwLCAuLi5zZXBhcmF0ZWRQb2ludHNCeVBhc3NFbGVtZW50T25SaWdodFNpZGUpO1xuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogc3RhcnRYLCB5OiBzdGFydFkgfSwgZW5kOiBjb29yZExYLCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiAnY2hlY2tBbmRBdm9pZEJsb2NrcycsIG5hbWU6ICdwJyB9KTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGVja0FuZEF2b2lkQmxvY2tzKGVuZFBhdGgueCA/PyAwLCBlbmRQYXRoLnkgPz8gMCwgbGluZUN1cnZlLCBlbmRQb3NpdGlvbiwgb2JzdGFjbGVSZWN0LCBzZXBhcmF0ZWRQb2ludHMsIGAke2xpbmV9YCwpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGRhdGEucGF0aCxcbiAgICAgIGVuZFBhdGg6IGRhdGEuZW5kUGF0aFxuICAgIH07XG4gIH1cblxuICAvLyBraeG7g20gdHJhIGjGsOG7m25nIHRo4bqzbmcgdsOgIHRyw6FuaCBraOG7kWlcbiAgc3RhdGljIGNoZWNrQW5kQXZvaWRCbG9ja3NZKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgbGluZUN1cnZlOiBudW1iZXIsIGVuZFBvc2l0aW9uOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0sIGRpcmVjdGlvblk6IHN0cmluZywgb2JzdGFjbGVSZWN0OiBJUmVjdFtdLCBzZXBhcmF0ZWRQb2ludHM6IEFycmF5PElQb2ludHM+LCBwYXRoUHJlPzogc3RyaW5nKTogeyBwYXRoOiBzdHJpbmcsIGVuZFBhdGg6IElQb2ludCB9IHtcbiAgICBjb25zdCBjb29yZExYOiBJUG9pbnQgPSB7IHg6IHN0YXJ0WCwgeTogZW5kUG9zaXRpb24ueSB9O1xuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWQgPSB0aGlzLmNoZWNrTGluZVBhc3NCbG9ja0hvcml6b250YWwoc3RhcnRZLCBlbmRQb3NpdGlvbi55LCBzdGFydFgsICd5Jywgb2JzdGFjbGVSZWN0KSBhcyBJUmVjdDtcblxuICAgIGlmICgoZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJyAmJiBzdGFydFkgPiBlbmRQb3NpdGlvbi55KSB8fCAoZGlyZWN0aW9uWSA9PT0gJ2Fib3ZlJyAmJiBzdGFydFkgPCBlbmRQb3NpdGlvbi55KSkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IGNvb3JkTFgsIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6ICdrJyB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogcGF0aFByZSA/PyAnJyxcbiAgICAgICAgZW5kUGF0aDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIWVsZW1lbnRCbG9ja1JvYWQpIHtcbiAgICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogc3RhcnRYLCB5OiBzdGFydFkgfSwgZW5kOiBjb29yZExYLCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiAncicgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHBhdGhQcmUgPyBgJHtwYXRoUHJlfSBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX1gIDogYEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fWAsXG4gICAgICAgIGVuZFBhdGg6IGNvb3JkTFhcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgeSA9IGRpcmVjdGlvblkgPT09ICdhYm92ZScgPyAoZWxlbWVudEJsb2NrUm9hZC55ID8/IDApICsgKGVsZW1lbnRCbG9ja1JvYWQuaGVpZ2h0ID8/IDApIDogKGVsZW1lbnRCbG9ja1JvYWQueSA/PyAwKTtcbiAgICBjb29yZExYLnkgPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25ZLCB5LCBsaW5lQ3VydmUgKiAyKTtcblxuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogc3RhcnRYLCB5OiBzdGFydFkgfSwgZW5kOiBjb29yZExYLCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiAncmEnIH0pO1xuICAgIGNvbnN0IHsgcGF0aEJ5UGFzc1EsIGVuZFBhdGggfSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmJ5UGFzc0VsZW1lbnRPblRvcEJvdHRvbVNpZGUoY29vcmRMWC54ID8/IDAsIGNvb3JkTFgueSA/PyAwLCBlbmRQb3NpdGlvbi54LCBsaW5lQ3VydmUsIGVsZW1lbnRCbG9ja1JvYWQsIGRpcmVjdGlvblksIHNlcGFyYXRlZFBvaW50cyk7XG5cbiAgICAvLyBzYXUga2hpIMSRw6MgdHLDoW5oIHRow6wgdGnhur9wIHThu6VjIGvDqW8gZMOgaSBjaG8gdOG7nWkgxJFp4buDbSBlbmQgeCwgbOG6oWkga2nhu4NtIHRyYSB4ZW0gY8OzIGto4buRaSBuw6BvIGNo4bqvbiBraMO0bmc/XG4gICAgY29uc3QgbGluZSA9IHBhdGhQcmUgPyBgJHtwYXRoUHJlfSBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX0gJHtwYXRoQnlQYXNzUX1gIDogYEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fSAke3BhdGhCeVBhc3NRfWA7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2hlY2tBbmRBdm9pZEJsb2Nrc1koZW5kUGF0aC54ID8/IDAsIGVuZFBhdGgueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uLCBkaXJlY3Rpb25ZLCBvYnN0YWNsZVJlY3QsIHNlcGFyYXRlZFBvaW50cywgYCR7bGluZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBkYXRhLnBhdGgsXG4gICAgICBlbmRQYXRoOiBkYXRhLmVuZFBhdGhcbiAgICB9O1xuICB9XG5cbiAgLy8ga2nhu4NtIHRyYSBoxrDhu5tuZyB0aOG6s25nIHbDoCB0csOhbmgga2jhu5FpXG4gIHN0YXRpYyBjaGVja0FuZEF2b2lkQmxvY2tzWUxlZnQoc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBsaW5lQ3VydmU6IG51bWJlciwgZW5kUG9zaXRpb246IElQb3NpdGlvblhZLCBkaXJlY3Rpb25ZOiBzdHJpbmcsIG9ic3RhY2xlUmVjdDogSVJlY3RbXSwgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPiwgcGF0aFByZT86IHN0cmluZyk6IHsgcGF0aDogc3RyaW5nLCBlbmRQYXRoOiBJUG9zaXRpb25YWSB9IHtcbiAgICBjb25zdCBrZXkgPSAnY2hlY2tBbmRBdm9pZEJsb2Nrc1lMZWZ0JztcbiAgICBjb25zdCBjb29yZExYOiBJUG9zaXRpb25YWSA9IHsgeDogc3RhcnRYLCB5OiBlbmRQb3NpdGlvbi55IH07XG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZCA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrTGluZVBhc3NCbG9ja0hvcml6b250YWwoc3RhcnRZLCBlbmRQb3NpdGlvbi55LCBzdGFydFgsICd5Jywgb2JzdGFjbGVSZWN0KSBhcyBJUmVjdDtcbiAgICBpZiAoIWVsZW1lbnRCbG9ja1JvYWQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVYID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tCbG9ja3NFbGVtZW50WChjb29yZExYLnggPz8gMCwgKGNvb3JkTFgueSA/PyAwKSwgZW5kUG9zaXRpb24sIG9ic3RhY2xlUmVjdCk7XG5cbiAgICAgIGlmIChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWCkge1xuICAgICAgICBjb25zdCB0b3BFbGVtZW50QmxvY2tSb2FkID0gKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVYLnkgPz8gMCk7XG4gICAgICAgIGNvbnN0IGJvdHRvbUVsZW1lbnRCbG9ja1JvYWQgPSAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVgueSA/PyAwKSArIChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWC5oZWlnaHQgPz8gMCk7XG5cbiAgICAgICAgbGV0IHRvWSA9IChkaXJlY3Rpb25ZID09PSAndW5kZXInID8gdG9wRWxlbWVudEJsb2NrUm9hZCA6IGJvdHRvbUVsZW1lbnRCbG9ja1JvYWQpO1xuXG4gICAgICAgIHRvWSA9IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblksIHRvWSwgbGluZUN1cnZlICogMik7XG4gICAgICAgIGlmICh0b1kgPiBzdGFydFkpIHtcbiAgICAgICAgICBjb29yZExYLnkgPSB0b1k7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IGNvb3JkTFgsIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6IGtleSwgbmFtZTogJ2EnIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBwYXRoUHJlID8gYCR7cGF0aFByZX0gTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9YCA6IGBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX1gLFxuICAgICAgICBlbmRQYXRoOiBjb29yZExYXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHkgPSBkaXJlY3Rpb25ZID09PSAnYWJvdmUnID8gKGVsZW1lbnRCbG9ja1JvYWQueSA/PyAwKSArIChlbGVtZW50QmxvY2tSb2FkLmhlaWdodCA/PyAwKSA6IChlbGVtZW50QmxvY2tSb2FkLnkgPz8gMCk7XG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVggPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja0Jsb2Nrc0VsZW1lbnRYKGNvb3JkTFgueCA/PyAwLCAoY29vcmRMWC55ID8/IDApLCBlbmRQb3NpdGlvbiwgb2JzdGFjbGVSZWN0KTtcbiAgICBsZXQgaWdub3JlQnlwYXNzRWxlbWVudCA9IGZhbHNlO1xuXG4gICAgaWYgKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVYICYmIGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVYLmlkID09PSBlbGVtZW50QmxvY2tSb2FkLmlkKSB7XG4gICAgICBpZ25vcmVCeXBhc3NFbGVtZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29vcmRMWC55ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWSwgeSwgbGluZUN1cnZlICogMik7XG5cbiAgICBsZXQgc2VwYXJhdGVkUG9pbnRzQnlQYXNzRWxlbWVudE9uUmlnaHRTaWRlOiBBcnJheTxJUG9pbnRzPiA9IFtdO1xuXG4gICAgY29uc3QgeyBwYXRoQnlQYXNzUSwgZW5kUGF0aCB9ID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuYnlQYXNzRWxlbWVudE9uVG9wQm90dG9tU2lkZShjb29yZExYLnggPz8gMCwgY29vcmRMWC55ID8/IDAsIGVuZFBvc2l0aW9uLngsIGxpbmVDdXJ2ZSwgZWxlbWVudEJsb2NrUm9hZCwgZGlyZWN0aW9uWSwgc2VwYXJhdGVkUG9pbnRzQnlQYXNzRWxlbWVudE9uUmlnaHRTaWRlLCBrZXkpO1xuICAgIGxldCBlbmQgPSBjb29yZExYO1xuICAgIGxldCBsaW5lID0gcGF0aFByZSA/IGAke3BhdGhQcmV9IEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fWAgOiBgTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9YDtcblxuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogc3RhcnRYLCB5OiBzdGFydFkgfSwgZW5kOiBjb29yZExYLCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiBrZXksIG5hbWU6ICdiJyB9KTtcblxuICAgIGlmIChpZ25vcmVCeXBhc3NFbGVtZW50KSB7XG4gICAgICBzZXBhcmF0ZWRQb2ludHNCeVBhc3NFbGVtZW50T25SaWdodFNpZGUgPSBbXVxuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogY29vcmRMWCwgZW5kLCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiBrZXksIG5hbWU6ICdjJyB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogbGluZSxcbiAgICAgICAgZW5kUGF0aDogZW5kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGVuZCA9IGVuZFBhdGg7XG4gICAgbGluZSArPSBgICR7cGF0aEJ5UGFzc1F9YDtcbiAgICBzZXBhcmF0ZWRQb2ludHMuc3BsaWNlKHNlcGFyYXRlZFBvaW50cy5sZW5ndGgsIDAsIC4uLnNlcGFyYXRlZFBvaW50c0J5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZSk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2hlY2tBbmRBdm9pZEJsb2Nrc1lMZWZ0KGVuZC54ID8/IDAsIGVuZC55ID8/IDAsIGxpbmVDdXJ2ZSwgZW5kUG9zaXRpb24sIGRpcmVjdGlvblksIG9ic3RhY2xlUmVjdCwgc2VwYXJhdGVkUG9pbnRzLCBgJHtsaW5lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGRhdGEucGF0aCxcbiAgICAgIGVuZFBhdGg6IGRhdGEuZW5kUGF0aFxuICAgIH07XG4gIH1cbn0iXX0=