@plait/mind 0.2.0-next.1 → 0.2.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drawer/base/base.d.ts +14 -0
- package/drawer/quick-insert.drawer.d.ts +7 -0
- package/esm2020/drawer/base/base.mjs +17 -0
- package/esm2020/drawer/quick-insert.drawer.mjs +208 -0
- package/esm2020/node.component.mjs +28 -198
- package/esm2020/plugins/with-dnd.mjs +7 -3
- package/esm2020/plugins/with-mind.mjs +2 -2
- package/esm2020/utils/abstract/common.mjs +56 -2
- package/esm2020/utils/abstract/resize.mjs +3 -3
- package/esm2020/utils/mindmap.mjs +20 -2
- package/fesm2015/plait-mind.mjs +507 -395
- package/fesm2015/plait-mind.mjs.map +1 -1
- package/fesm2020/plait-mind.mjs +506 -394
- package/fesm2020/plait-mind.mjs.map +1 -1
- package/node.component.d.ts +5 -3
- package/package.json +1 -1
- package/utils/abstract/common.d.ts +6 -0
- package/utils/mindmap.d.ts +4 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PlaitBoard } from '@plait/core';
|
|
2
|
+
import { MindElement } from '../../interfaces';
|
|
3
|
+
export declare abstract class BaseDrawer {
|
|
4
|
+
protected board: PlaitBoard;
|
|
5
|
+
g?: SVGGElement;
|
|
6
|
+
constructor(board: PlaitBoard);
|
|
7
|
+
abstract canDraw(element: MindElement): boolean;
|
|
8
|
+
abstract draw(element: MindElement): SVGGElement | undefined;
|
|
9
|
+
destroy(): void;
|
|
10
|
+
}
|
|
11
|
+
export interface AfterDraw {
|
|
12
|
+
afterDraw(element: MindElement): void;
|
|
13
|
+
}
|
|
14
|
+
export declare function hasAfterDraw(value: any): value is AfterDraw;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MindElement, BaseData } from '../interfaces';
|
|
2
|
+
import { AfterDraw, BaseDrawer } from './base/base';
|
|
3
|
+
export declare class QuickInsertDrawer extends BaseDrawer implements AfterDraw {
|
|
4
|
+
canDraw(element: MindElement<BaseData>): boolean;
|
|
5
|
+
draw(element: MindElement<BaseData>): SVGGElement;
|
|
6
|
+
afterDraw(element: MindElement): void;
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class BaseDrawer {
|
|
2
|
+
constructor(board) {
|
|
3
|
+
this.board = board;
|
|
4
|
+
}
|
|
5
|
+
destroy() {
|
|
6
|
+
if (this.g) {
|
|
7
|
+
this.g.remove();
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function hasAfterDraw(value) {
|
|
12
|
+
if (value.afterDraw) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXdlci9iYXNlL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFnQixVQUFVO0lBRzVCLFlBQXNCLEtBQWlCO1FBQWpCLFVBQUssR0FBTCxLQUFLLENBQVk7SUFBRyxDQUFDO0lBTTNDLE9BQU87UUFDSCxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztDQUNKO0FBTUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFVO0lBQ25DLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtRQUNqQixPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZURyYXdlciB7XG4gICAgZz86IFNWR0dFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJvYXJkOiBQbGFpdEJvYXJkKSB7fVxuXG4gICAgYWJzdHJhY3QgY2FuRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudCk6IGJvb2xlYW47XG5cbiAgICBhYnN0cmFjdCBkcmF3KGVsZW1lbnQ6IE1pbmRFbGVtZW50KTogU1ZHR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5nKSB7XG4gICAgICAgICAgICB0aGlzLmcucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWZ0ZXJEcmF3IHtcbiAgICBhZnRlckRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQWZ0ZXJEcmF3KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBZnRlckRyYXcge1xuICAgIGlmICh2YWx1ZS5hZnRlckRyYXcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { PlaitBoard, createG } from '@plait/core';
|
|
2
|
+
import { MindElement } from '../interfaces';
|
|
3
|
+
import { BaseDrawer } from './base/base';
|
|
4
|
+
import { getRectangleByNode } from '../utils/graph';
|
|
5
|
+
import { getNodeShapeByElement } from '../utils/shape';
|
|
6
|
+
import { EXTEND_RADIUS, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_CIRCLE_OFFSET, QUICK_INSERT_INNER_CROSS_COLOR, STROKE_WIDTH } from '../constants/default';
|
|
7
|
+
import { MindmapNodeShape } from '../constants/node';
|
|
8
|
+
import { AbstractNode, MindmapLayoutType, isStandardLayout } from '@plait/layouts';
|
|
9
|
+
import { getLinkLineColorByMindmapElement, getRootLinkLineColorByMindmapElement } from '../utils/colors';
|
|
10
|
+
import { MindmapQueries } from '../queries';
|
|
11
|
+
import { fromEvent, take } from 'rxjs';
|
|
12
|
+
import { insertMindElement } from '../utils/mindmap';
|
|
13
|
+
export class QuickInsertDrawer extends BaseDrawer {
|
|
14
|
+
canDraw(element) {
|
|
15
|
+
if (PlaitBoard.isReadonly(this.board)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
draw(element) {
|
|
21
|
+
let offset = element.children.length > 0 && !element.isRoot ? EXTEND_RADIUS : 0;
|
|
22
|
+
const quickInsertG = createG();
|
|
23
|
+
this.g = quickInsertG;
|
|
24
|
+
quickInsertG.classList.add('quick-insert');
|
|
25
|
+
const node = MindElement.getNode(element);
|
|
26
|
+
const { x, y, width, height } = getRectangleByNode(node);
|
|
27
|
+
/**
|
|
28
|
+
* 方位:
|
|
29
|
+
* 1. 左、左上、左下
|
|
30
|
+
* 2. 右、右上、右下
|
|
31
|
+
* 3. 上、上左、上右
|
|
32
|
+
* 4. 下、下左、下右
|
|
33
|
+
*/
|
|
34
|
+
const shape = getNodeShapeByElement(element);
|
|
35
|
+
// 形状是矩形要偏移边框的线宽
|
|
36
|
+
const strokeWidth = element.linkLineWidth ? element.linkLineWidth : STROKE_WIDTH;
|
|
37
|
+
let offsetBorderLineWidth = 0;
|
|
38
|
+
if (shape === MindmapNodeShape.roundRectangle && offset === 0) {
|
|
39
|
+
offsetBorderLineWidth = strokeWidth;
|
|
40
|
+
}
|
|
41
|
+
let offsetRootBorderLineWidth = 0;
|
|
42
|
+
if (element.isRoot) {
|
|
43
|
+
offsetRootBorderLineWidth = strokeWidth;
|
|
44
|
+
}
|
|
45
|
+
// 当没有子节点时,需要缩小的偏移量
|
|
46
|
+
const extraOffset = 3;
|
|
47
|
+
const underlineCoordinates = {
|
|
48
|
+
// 画线方向:右向左 <--
|
|
49
|
+
[MindmapLayoutType.left]: {
|
|
50
|
+
// EXTEND_RADIUS * 0.5 是 左方向,折叠/收起的偏移量
|
|
51
|
+
startX: x - (offset > 0 ? offset + EXTEND_RADIUS * 0.5 : 0) - offsetRootBorderLineWidth,
|
|
52
|
+
startY: y + height,
|
|
53
|
+
endX: x -
|
|
54
|
+
offsetBorderLineWidth -
|
|
55
|
+
offsetRootBorderLineWidth -
|
|
56
|
+
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) -
|
|
57
|
+
EXTEND_RADIUS,
|
|
58
|
+
endY: y + height
|
|
59
|
+
},
|
|
60
|
+
// 画线方向:左向右 -->
|
|
61
|
+
[MindmapLayoutType.right]: {
|
|
62
|
+
startX: x + width + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
|
|
63
|
+
startY: y + height,
|
|
64
|
+
endX: x +
|
|
65
|
+
width +
|
|
66
|
+
offsetBorderLineWidth +
|
|
67
|
+
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
|
|
68
|
+
EXTEND_RADIUS +
|
|
69
|
+
offsetRootBorderLineWidth,
|
|
70
|
+
endY: y + height
|
|
71
|
+
},
|
|
72
|
+
// 画线方向:下向上 -->
|
|
73
|
+
[MindmapLayoutType.upward]: {
|
|
74
|
+
startX: x + width * 0.5,
|
|
75
|
+
startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
|
|
76
|
+
endX: x + width * 0.5,
|
|
77
|
+
endY: y -
|
|
78
|
+
offsetBorderLineWidth -
|
|
79
|
+
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) -
|
|
80
|
+
EXTEND_RADIUS -
|
|
81
|
+
offsetRootBorderLineWidth
|
|
82
|
+
},
|
|
83
|
+
// 画线方向:上向下 -->
|
|
84
|
+
[MindmapLayoutType.downward]: {
|
|
85
|
+
startX: x + width * 0.5,
|
|
86
|
+
startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
|
|
87
|
+
endX: x + width * 0.5,
|
|
88
|
+
endY: y +
|
|
89
|
+
height +
|
|
90
|
+
offsetBorderLineWidth +
|
|
91
|
+
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
|
|
92
|
+
EXTEND_RADIUS +
|
|
93
|
+
offsetRootBorderLineWidth
|
|
94
|
+
},
|
|
95
|
+
[MindmapLayoutType.leftBottomIndented]: {
|
|
96
|
+
startX: x + width * 0.5,
|
|
97
|
+
startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
|
|
98
|
+
endX: x + width * 0.5,
|
|
99
|
+
endY: y +
|
|
100
|
+
height +
|
|
101
|
+
offsetBorderLineWidth +
|
|
102
|
+
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
|
|
103
|
+
EXTEND_RADIUS +
|
|
104
|
+
offsetRootBorderLineWidth
|
|
105
|
+
},
|
|
106
|
+
[MindmapLayoutType.leftTopIndented]: {
|
|
107
|
+
startX: x + width * 0.5,
|
|
108
|
+
startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
|
|
109
|
+
endX: x + width * 0.5,
|
|
110
|
+
endY: y -
|
|
111
|
+
offsetBorderLineWidth -
|
|
112
|
+
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) -
|
|
113
|
+
EXTEND_RADIUS -
|
|
114
|
+
offsetRootBorderLineWidth
|
|
115
|
+
},
|
|
116
|
+
[MindmapLayoutType.rightBottomIndented]: {
|
|
117
|
+
startX: x + width * 0.5,
|
|
118
|
+
startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
|
|
119
|
+
endX: x + width * 0.5,
|
|
120
|
+
endY: y +
|
|
121
|
+
height +
|
|
122
|
+
offsetBorderLineWidth +
|
|
123
|
+
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
|
|
124
|
+
EXTEND_RADIUS +
|
|
125
|
+
offsetRootBorderLineWidth
|
|
126
|
+
},
|
|
127
|
+
[MindmapLayoutType.rightTopIndented]: {
|
|
128
|
+
startX: x + width * 0.5,
|
|
129
|
+
startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
|
|
130
|
+
endX: x + width * 0.5,
|
|
131
|
+
endY: y -
|
|
132
|
+
offsetBorderLineWidth -
|
|
133
|
+
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) -
|
|
134
|
+
EXTEND_RADIUS -
|
|
135
|
+
offsetRootBorderLineWidth
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
if (shape === MindmapNodeShape.roundRectangle || element.isRoot) {
|
|
139
|
+
underlineCoordinates[MindmapLayoutType.left].startY -= height * 0.5;
|
|
140
|
+
underlineCoordinates[MindmapLayoutType.left].endY -= height * 0.5;
|
|
141
|
+
underlineCoordinates[MindmapLayoutType.right].startY -= height * 0.5;
|
|
142
|
+
underlineCoordinates[MindmapLayoutType.right].endY -= height * 0.5;
|
|
143
|
+
}
|
|
144
|
+
const stroke = element.isRoot ? getRootLinkLineColorByMindmapElement(element) : getLinkLineColorByMindmapElement(element);
|
|
145
|
+
let nodeLayout = MindmapQueries.getCorrectLayoutByElement(element);
|
|
146
|
+
if (element.isRoot && isStandardLayout(nodeLayout)) {
|
|
147
|
+
const root = element;
|
|
148
|
+
nodeLayout = root.children.length >= root.rightNodeCount ? MindmapLayoutType.left : MindmapLayoutType.right;
|
|
149
|
+
}
|
|
150
|
+
const underlineCoordinate = underlineCoordinates[nodeLayout];
|
|
151
|
+
if (underlineCoordinate) {
|
|
152
|
+
const underline = PlaitBoard.getRoughSVG(this.board).line(underlineCoordinate.startX, underlineCoordinate.startY, underlineCoordinate.endX, underlineCoordinate.endY, { stroke, strokeWidth });
|
|
153
|
+
const circleCoordinates = {
|
|
154
|
+
startX: underlineCoordinate.endX,
|
|
155
|
+
startY: underlineCoordinate.endY
|
|
156
|
+
};
|
|
157
|
+
const circle = PlaitBoard.getRoughSVG(this.board).circle(circleCoordinates.startX, circleCoordinates.startY, EXTEND_RADIUS, {
|
|
158
|
+
fill: QUICK_INSERT_CIRCLE_COLOR,
|
|
159
|
+
stroke: QUICK_INSERT_CIRCLE_COLOR,
|
|
160
|
+
fillStyle: 'solid'
|
|
161
|
+
});
|
|
162
|
+
const innerCrossCoordinates = {
|
|
163
|
+
horizontal: {
|
|
164
|
+
startX: circleCoordinates.startX - EXTEND_RADIUS * 0.5 + 3,
|
|
165
|
+
startY: circleCoordinates.startY,
|
|
166
|
+
endX: circleCoordinates.startX + EXTEND_RADIUS * 0.5 - 3,
|
|
167
|
+
endY: circleCoordinates.startY
|
|
168
|
+
},
|
|
169
|
+
vertical: {
|
|
170
|
+
startX: circleCoordinates.startX,
|
|
171
|
+
startY: circleCoordinates.startY - EXTEND_RADIUS * 0.5 + 3,
|
|
172
|
+
endX: circleCoordinates.startX,
|
|
173
|
+
endY: circleCoordinates.startY + EXTEND_RADIUS * 0.5 - 3
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
const innerCrossHLine = PlaitBoard.getRoughSVG(this.board).line(innerCrossCoordinates.horizontal.startX, innerCrossCoordinates.horizontal.startY, innerCrossCoordinates.horizontal.endX, innerCrossCoordinates.horizontal.endY, {
|
|
177
|
+
stroke: QUICK_INSERT_INNER_CROSS_COLOR,
|
|
178
|
+
strokeWidth: 2
|
|
179
|
+
});
|
|
180
|
+
const innerRingVLine = PlaitBoard.getRoughSVG(this.board).line(innerCrossCoordinates.vertical.startX, innerCrossCoordinates.vertical.startY, innerCrossCoordinates.vertical.endX, innerCrossCoordinates.vertical.endY, {
|
|
181
|
+
stroke: QUICK_INSERT_INNER_CROSS_COLOR,
|
|
182
|
+
strokeWidth: 2
|
|
183
|
+
});
|
|
184
|
+
quickInsertG.appendChild(underline);
|
|
185
|
+
quickInsertG.appendChild(circle);
|
|
186
|
+
quickInsertG.appendChild(innerCrossHLine);
|
|
187
|
+
quickInsertG.appendChild(innerRingVLine);
|
|
188
|
+
}
|
|
189
|
+
return quickInsertG;
|
|
190
|
+
}
|
|
191
|
+
afterDraw(element) {
|
|
192
|
+
if (!this.g) {
|
|
193
|
+
throw new Error(`can not find quick insert g`);
|
|
194
|
+
}
|
|
195
|
+
fromEvent(this.g, 'mousedown')
|
|
196
|
+
.pipe(take(1))
|
|
197
|
+
.subscribe(e => {
|
|
198
|
+
e.stopPropagation();
|
|
199
|
+
});
|
|
200
|
+
fromEvent(this.g, 'mouseup')
|
|
201
|
+
.pipe(take(1))
|
|
202
|
+
.subscribe(() => {
|
|
203
|
+
const path = PlaitBoard.findPath(this.board, element).concat(element.children.filter(child => !AbstractNode.isAbstract(child)).length);
|
|
204
|
+
insertMindElement(this.board, element, path);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2staW5zZXJ0LmRyYXdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXdlci9xdWljay1pbnNlcnQuZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQTZELE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUNILGFBQWEsRUFDYix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLDhCQUE4QixFQUM5QixZQUFZLEVBQ2YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFjLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0YsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsVUFBVTtJQUM3QyxPQUFPLENBQUMsT0FBOEI7UUFDbEMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQyxPQUFP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YUFDYixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDeEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQzNFLENBQUM7WUFDRixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIGNyZWF0ZUcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCwgQmFzZURhdGEsIEV4dGVuZFVuZGVybGluZUNvb3JkaW5hdGVUeXBlLCBFeHRlbmRMYXlvdXRUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBZnRlckRyYXcsIEJhc2VEcmF3ZXIgfSBmcm9tICcuL2Jhc2UvYmFzZSc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi91dGlscy9ncmFwaCc7XG5pbXBvcnQgeyBnZXROb2RlU2hhcGVCeUVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGFwZSc7XG5pbXBvcnQge1xuICAgIEVYVEVORF9SQURJVVMsXG4gICAgUVVJQ0tfSU5TRVJUX0NJUkNMRV9DT0xPUixcbiAgICBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCxcbiAgICBRVUlDS19JTlNFUlRfSU5ORVJfQ1JPU1NfQ09MT1IsXG4gICAgU1RST0tFX1dJRFRIXG59IGZyb20gJy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IE1pbmRtYXBOb2RlU2hhcGUgfSBmcm9tICcuLi9jb25zdGFudHMvbm9kZSc7XG5pbXBvcnQgeyBBYnN0cmFjdE5vZGUsIE1pbmRtYXBMYXlvdXRUeXBlLCBPcmlnaW5Ob2RlLCBpc1N0YW5kYXJkTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgZ2V0TGlua0xpbmVDb2xvckJ5TWluZG1hcEVsZW1lbnQsIGdldFJvb3RMaW5rTGluZUNvbG9yQnlNaW5kbWFwRWxlbWVudCB9IGZyb20gJy4uL3V0aWxzL2NvbG9ycyc7XG5pbXBvcnQgeyBNaW5kbWFwUXVlcmllcyB9IGZyb20gJy4uL3F1ZXJpZXMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbnNlcnRNaW5kRWxlbWVudCB9IGZyb20gJy4uL3V0aWxzL21pbmRtYXAnO1xuXG5leHBvcnQgY2xhc3MgUXVpY2tJbnNlcnREcmF3ZXIgZXh0ZW5kcyBCYXNlRHJhd2VyIGltcGxlbWVudHMgQWZ0ZXJEcmF3IHtcbiAgICBjYW5EcmF3KGVsZW1lbnQ6IE1pbmRFbGVtZW50PEJhc2VEYXRhPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoUGxhaXRCb2FyZC5pc1JlYWRvbmx5KHRoaXMuYm9hcmQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQ8QmFzZURhdGE+KTogU1ZHR0VsZW1lbnQge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwICYmICFlbGVtZW50LmlzUm9vdCA/IEVYVEVORF9SQURJVVMgOiAwO1xuICAgICAgICBjb25zdCBxdWlja0luc2VydEcgPSBjcmVhdGVHKCk7XG4gICAgICAgIHRoaXMuZyA9IHF1aWNrSW5zZXJ0RztcbiAgICAgICAgcXVpY2tJbnNlcnRHLmNsYXNzTGlzdC5hZGQoJ3F1aWNrLWluc2VydCcpO1xuICAgICAgICBjb25zdCBub2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRSZWN0YW5nbGVCeU5vZGUobm9kZSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaWueS9je+8mlxuICAgICAgICAgKiAgICAxLiDlt6bjgIHlt6bkuIrjgIHlt6bkuItcbiAgICAgICAgICogICAgMi4g5Y+z44CB5Y+z5LiK44CB5Y+z5LiLXG4gICAgICAgICAqICAgIDMuIOS4iuOAgeS4iuW3puOAgeS4iuWPs1xuICAgICAgICAgKiAgICA0LiDkuIvjgIHkuIvlt6bjgIHkuIvlj7NcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHNoYXBlID0gZ2V0Tm9kZVNoYXBlQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAvLyDlvaLnirbmmK/nn6nlvaLopoHlgY/np7vovrnmoYbnmoTnur/lrr1cbiAgICAgICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBlbGVtZW50LmxpbmtMaW5lV2lkdGggPyBlbGVtZW50LmxpbmtMaW5lV2lkdGggOiBTVFJPS0VfV0lEVEg7XG4gICAgICAgIGxldCBvZmZzZXRCb3JkZXJMaW5lV2lkdGggPSAwO1xuICAgICAgICBpZiAoc2hhcGUgPT09IE1pbmRtYXBOb2RlU2hhcGUucm91bmRSZWN0YW5nbGUgJiYgb2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggPSBzdHJva2VXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCA9IDA7XG4gICAgICAgIGlmIChlbGVtZW50LmlzUm9vdCkge1xuICAgICAgICAgICAgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCA9IHN0cm9rZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIC8vIOW9k+ayoeacieWtkOiKgueCueaXtu+8jOmcgOimgee8qeWwj+eahOWBj+enu+mHj1xuICAgICAgICBjb25zdCBleHRyYU9mZnNldCA9IDM7XG4gICAgICAgIGNvbnN0IHVuZGVybGluZUNvb3JkaW5hdGVzOiBFeHRlbmRVbmRlcmxpbmVDb29yZGluYXRlVHlwZSA9IHtcbiAgICAgICAgICAgIC8vIOeUu+e6v+aWueWQke+8muWPs+WQkeW3piA8LS1cbiAgICAgICAgICAgIFtNaW5kbWFwTGF5b3V0VHlwZS5sZWZ0XToge1xuICAgICAgICAgICAgICAgIC8vIEVYVEVORF9SQURJVVMgKiAwLjUg5pivIOW3puaWueWQke+8jOaKmOWPoC/mlLbotbfnmoTlgY/np7vph49cbiAgICAgICAgICAgICAgICBzdGFydFg6IHggLSAob2Zmc2V0ID4gMCA/IG9mZnNldCArIEVYVEVORF9SQURJVVMgKiAwLjUgOiAwKSAtIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgc3RhcnRZOiB5ICsgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGVuZFg6XG4gICAgICAgICAgICAgICAgICAgIHggLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCAtIGV4dHJhT2Zmc2V0IDogMCkgLVxuICAgICAgICAgICAgICAgICAgICBFWFRFTkRfUkFESVVTLFxuICAgICAgICAgICAgICAgIGVuZFk6IHkgKyBoZWlnaHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDnlLvnur/mlrnlkJHvvJrlt6blkJHlj7MgLS0+XG4gICAgICAgICAgICBbTWluZG1hcExheW91dFR5cGUucmlnaHRdOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4ICsgd2lkdGggKyAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgKyBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIHN0YXJ0WTogeSArIGhlaWdodCxcbiAgICAgICAgICAgICAgICBlbmRYOlxuICAgICAgICAgICAgICAgICAgICB4ICtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIC0gZXh0cmFPZmZzZXQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGVuZFk6IHkgKyBoZWlnaHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDnlLvnur/mlrnlkJHvvJrkuIvlkJHkuIogLS0+XG4gICAgICAgICAgICBbTWluZG1hcExheW91dFR5cGUudXB3YXJkXToge1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIHN0YXJ0WTogeSAtIG9mZnNldEJvcmRlckxpbmVXaWR0aCAtIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSAtIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgZW5kWDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIGVuZFk6XG4gICAgICAgICAgICAgICAgICAgIHkgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIC0gZXh0cmFPZmZzZXQgOiAwKSAtXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g55S757q/5pa55ZCR77ya5LiK5ZCR5LiLIC0tPlxuICAgICAgICAgICAgW01pbmRtYXBMYXlvdXRUeXBlLmRvd253YXJkXToge1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIHN0YXJ0WTpcbiAgICAgICAgICAgICAgICAgICAgeSArIGhlaWdodCArIG9mZnNldEJvcmRlckxpbmVXaWR0aCArIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSArIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgZW5kWDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIGVuZFk6XG4gICAgICAgICAgICAgICAgICAgIHkgK1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIC0gZXh0cmFPZmZzZXQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW01pbmRtYXBMYXlvdXRUeXBlLmxlZnRCb3R0b21JbmRlbnRlZF06IHtcbiAgICAgICAgICAgICAgICBzdGFydFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBzdGFydFk6XG4gICAgICAgICAgICAgICAgICAgIHkgKyBoZWlnaHQgKyBvZmZzZXRCb3JkZXJMaW5lV2lkdGggKyAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgKyBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGVuZFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBlbmRZOlxuICAgICAgICAgICAgICAgICAgICB5ICtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoICtcbiAgICAgICAgICAgICAgICAgICAgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCAtIGV4dHJhT2Zmc2V0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICBFWFRFTkRfUkFESVVTICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtNaW5kbWFwTGF5b3V0VHlwZS5sZWZ0VG9wSW5kZW50ZWRdOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgc3RhcnRZOiB5IC0gb2Zmc2V0Qm9yZGVyTGluZVdpZHRoIC0gKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApIC0gb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICBlbmRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgZW5kWTpcbiAgICAgICAgICAgICAgICAgICAgeSAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSAtXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW01pbmRtYXBMYXlvdXRUeXBlLnJpZ2h0Qm90dG9tSW5kZW50ZWRdOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgc3RhcnRZOlxuICAgICAgICAgICAgICAgICAgICB5ICsgaGVpZ2h0ICsgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoICsgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApICsgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICBlbmRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgZW5kWTpcbiAgICAgICAgICAgICAgICAgICAgeSArXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgLSBleHRyYU9mZnNldCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgRVhURU5EX1JBRElVUyArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTWluZG1hcExheW91dFR5cGUucmlnaHRUb3BJbmRlbnRlZF06IHtcbiAgICAgICAgICAgICAgICBzdGFydFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBzdGFydFk6IHkgLSBvZmZzZXRCb3JkZXJMaW5lV2lkdGggLSAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgLSBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGVuZFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBlbmRZOlxuICAgICAgICAgICAgICAgICAgICB5IC1cbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApIC1cbiAgICAgICAgICAgICAgICAgICAgRVhURU5EX1JBRElVUyAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNoYXBlID09PSBNaW5kbWFwTm9kZVNoYXBlLnJvdW5kUmVjdGFuZ2xlIHx8IGVsZW1lbnQuaXNSb290KSB7XG4gICAgICAgICAgICB1bmRlcmxpbmVDb29yZGluYXRlc1tNaW5kbWFwTGF5b3V0VHlwZS5sZWZ0XS5zdGFydFkgLT0gaGVpZ2h0ICogMC41O1xuICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZXNbTWluZG1hcExheW91dFR5cGUubGVmdF0uZW5kWSAtPSBoZWlnaHQgKiAwLjU7XG4gICAgICAgICAgICB1bmRlcmxpbmVDb29yZGluYXRlc1tNaW5kbWFwTGF5b3V0VHlwZS5yaWdodF0uc3RhcnRZIC09IGhlaWdodCAqIDAuNTtcbiAgICAgICAgICAgIHVuZGVybGluZUNvb3JkaW5hdGVzW01pbmRtYXBMYXlvdXRUeXBlLnJpZ2h0XS5lbmRZIC09IGhlaWdodCAqIDAuNTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJva2UgPSBlbGVtZW50LmlzUm9vdCA/IGdldFJvb3RMaW5rTGluZUNvbG9yQnlNaW5kbWFwRWxlbWVudChlbGVtZW50KSA6IGdldExpbmtMaW5lQ29sb3JCeU1pbmRtYXBFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBsZXQgbm9kZUxheW91dCA9IE1pbmRtYXBRdWVyaWVzLmdldENvcnJlY3RMYXlvdXRCeUVsZW1lbnQoZWxlbWVudCkgYXMgRXh0ZW5kTGF5b3V0VHlwZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNSb290ICYmIGlzU3RhbmRhcmRMYXlvdXQobm9kZUxheW91dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50IGFzIE9yaWdpbk5vZGU7XG4gICAgICAgICAgICBub2RlTGF5b3V0ID0gcm9vdC5jaGlsZHJlbi5sZW5ndGggPj0gcm9vdC5yaWdodE5vZGVDb3VudCA/IE1pbmRtYXBMYXlvdXRUeXBlLmxlZnQgOiBNaW5kbWFwTGF5b3V0VHlwZS5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmRlcmxpbmVDb29yZGluYXRlID0gdW5kZXJsaW5lQ29vcmRpbmF0ZXNbbm9kZUxheW91dF07XG4gICAgICAgIGlmICh1bmRlcmxpbmVDb29yZGluYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB1bmRlcmxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKHRoaXMuYm9hcmQpLmxpbmUoXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5zdGFydFgsXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5zdGFydFksXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5lbmRYLFxuICAgICAgICAgICAgICAgIHVuZGVybGluZUNvb3JkaW5hdGUuZW5kWSxcbiAgICAgICAgICAgICAgICB7IHN0cm9rZSwgc3Ryb2tlV2lkdGggfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZUNvb3JkaW5hdGVzID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogdW5kZXJsaW5lQ29vcmRpbmF0ZS5lbmRYLFxuICAgICAgICAgICAgICAgIHN0YXJ0WTogdW5kZXJsaW5lQ29vcmRpbmF0ZS5lbmRZXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5jaXJjbGUoY2lyY2xlQ29vcmRpbmF0ZXMuc3RhcnRYLCBjaXJjbGVDb29yZGluYXRlcy5zdGFydFksIEVYVEVORF9SQURJVVMsIHtcbiAgICAgICAgICAgICAgICBmaWxsOiBRVUlDS19JTlNFUlRfQ0lSQ0xFX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogUVVJQ0tfSU5TRVJUX0NJUkNMRV9DT0xPUixcbiAgICAgICAgICAgICAgICBmaWxsU3R5bGU6ICdzb2xpZCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzID0ge1xuICAgICAgICAgICAgICAgIGhvcml6b250YWw6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFggLSBFWFRFTkRfUkFESVVTICogMC41ICsgMyxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRZOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFksXG4gICAgICAgICAgICAgICAgICAgIGVuZFg6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WCArIEVYVEVORF9SQURJVVMgKiAwLjUgLSAzLFxuICAgICAgICAgICAgICAgICAgICBlbmRZOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsOiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WDogY2lyY2xlQ29vcmRpbmF0ZXMuc3RhcnRYLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFk6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WSAtIEVYVEVORF9SQURJVVMgKiAwLjUgKyAzLFxuICAgICAgICAgICAgICAgICAgICBlbmRYOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFgsXG4gICAgICAgICAgICAgICAgICAgIGVuZFk6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WSArIEVYVEVORF9SQURJVVMgKiAwLjUgLSAzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyQ3Jvc3NITGluZSA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShcbiAgICAgICAgICAgICAgICBpbm5lckNyb3NzQ29vcmRpbmF0ZXMuaG9yaXpvbnRhbC5zdGFydFgsXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLmhvcml6b250YWwuc3RhcnRZLFxuICAgICAgICAgICAgICAgIGlubmVyQ3Jvc3NDb29yZGluYXRlcy5ob3Jpem9udGFsLmVuZFgsXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLmhvcml6b250YWwuZW5kWSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogUVVJQ0tfSU5TRVJUX0lOTkVSX0NST1NTX0NPTE9SLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbm5lclJpbmdWTGluZSA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShcbiAgICAgICAgICAgICAgICBpbm5lckNyb3NzQ29vcmRpbmF0ZXMudmVydGljYWwuc3RhcnRYLFxuICAgICAgICAgICAgICAgIGlubmVyQ3Jvc3NDb29yZGluYXRlcy52ZXJ0aWNhbC5zdGFydFksXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLnZlcnRpY2FsLmVuZFgsXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLnZlcnRpY2FsLmVuZFksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IFFVSUNLX0lOU0VSVF9JTk5FUl9DUk9TU19DT0xPUixcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcXVpY2tJbnNlcnRHLmFwcGVuZENoaWxkKHVuZGVybGluZSk7XG4gICAgICAgICAgICBxdWlja0luc2VydEcuYXBwZW5kQ2hpbGQoY2lyY2xlKTtcbiAgICAgICAgICAgIHF1aWNrSW5zZXJ0Ry5hcHBlbmRDaGlsZChpbm5lckNyb3NzSExpbmUpO1xuICAgICAgICAgICAgcXVpY2tJbnNlcnRHLmFwcGVuZENoaWxkKGlubmVyUmluZ1ZMaW5lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVpY2tJbnNlcnRHO1xuICAgIH1cbiAgICBhZnRlckRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuIG5vdCBmaW5kIHF1aWNrIGluc2VydCBnYCk7XG4gICAgICAgIH1cbiAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuZywgJ21vdXNlZG93bicpXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLmcsICdtb3VzZXVwJylcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aCh0aGlzLmJvYXJkLCBlbGVtZW50KS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4uZmlsdGVyKGNoaWxkID0+ICFBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdChjaGlsZCkpLmxlbmd0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0TWluZEVsZW1lbnQodGhpcy5ib2FyZCwgZWxlbWVudCwgcGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|