@plait/core 0.77.3 → 0.78.0
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/fesm2022/plait-core.mjs.map +1 -1
- package/package.json +1 -3
- package/esm2022/constants/cursor.mjs +0 -13
- package/esm2022/constants/index.mjs +0 -20
- package/esm2022/constants/keycodes.mjs +0 -127
- package/esm2022/constants/selection.mjs +0 -6
- package/esm2022/constants/zoom.mjs +0 -4
- package/esm2022/context.mjs +0 -23
- package/esm2022/core/element/context-change.mjs +0 -13
- package/esm2022/core/element/context.mjs +0 -2
- package/esm2022/core/element/element-flavour.mjs +0 -140
- package/esm2022/core/element/element-ref.mjs +0 -2
- package/esm2022/core/list-render.mjs +0 -217
- package/esm2022/differs/default_iterable_differ.mjs +0 -614
- package/esm2022/differs/iterable_differs.mjs +0 -9
- package/esm2022/interfaces/board.mjs +0 -108
- package/esm2022/interfaces/custom-types.mjs +0 -5
- package/esm2022/interfaces/direction.mjs +0 -8
- package/esm2022/interfaces/element.mjs +0 -43
- package/esm2022/interfaces/group.mjs +0 -6
- package/esm2022/interfaces/history.mjs +0 -5
- package/esm2022/interfaces/index.mjs +0 -19
- package/esm2022/interfaces/node.mjs +0 -57
- package/esm2022/interfaces/operation.mjs +0 -96
- package/esm2022/interfaces/path-ref.mjs +0 -15
- package/esm2022/interfaces/path.mjs +0 -183
- package/esm2022/interfaces/plugin.mjs +0 -6
- package/esm2022/interfaces/point.mjs +0 -27
- package/esm2022/interfaces/pointer.mjs +0 -6
- package/esm2022/interfaces/rectangle-client.mjs +0 -171
- package/esm2022/interfaces/selection.mjs +0 -13
- package/esm2022/interfaces/svg-arc-command.mjs +0 -2
- package/esm2022/interfaces/theme.mjs +0 -49
- package/esm2022/interfaces/viewport.mjs +0 -7
- package/esm2022/plait-core.mjs +0 -5
- package/esm2022/plugins/create-board.mjs +0 -122
- package/esm2022/plugins/index.mjs +0 -11
- package/esm2022/plugins/with-board.mjs +0 -20
- package/esm2022/plugins/with-hand.mjs +0 -113
- package/esm2022/plugins/with-history.mjs +0 -91
- package/esm2022/plugins/with-hotkey.mjs +0 -96
- package/esm2022/plugins/with-i18n.mjs +0 -13
- package/esm2022/plugins/with-moving.mjs +0 -282
- package/esm2022/plugins/with-options.mjs +0 -13
- package/esm2022/plugins/with-related-fragment.mjs +0 -23
- package/esm2022/plugins/with-selection.mjs +0 -230
- package/esm2022/public-api.mjs +0 -16
- package/esm2022/testing/core/create-board.mjs +0 -15
- package/esm2022/testing/core/fake-weak-map.mjs +0 -18
- package/esm2022/testing/core/index.mjs +0 -3
- package/esm2022/testing/fake-events/event-objects.mjs +0 -131
- package/esm2022/testing/fake-events/index.mjs +0 -2
- package/esm2022/testing/index.mjs +0 -3
- package/esm2022/testing/test-element.mjs +0 -9
- package/esm2022/transforms/board.mjs +0 -137
- package/esm2022/transforms/element.mjs +0 -22
- package/esm2022/transforms/general.mjs +0 -146
- package/esm2022/transforms/group.mjs +0 -64
- package/esm2022/transforms/index.mjs +0 -17
- package/esm2022/transforms/node.mjs +0 -37
- package/esm2022/transforms/selection.mjs +0 -26
- package/esm2022/transforms/theme.mjs +0 -8
- package/esm2022/transforms/viewport.mjs +0 -8
- package/esm2022/transforms/z-index.mjs +0 -20
- package/esm2022/utils/angle.mjs +0 -164
- package/esm2022/utils/board.mjs +0 -18
- package/esm2022/utils/clipboard/clipboard.mjs +0 -40
- package/esm2022/utils/clipboard/common.mjs +0 -82
- package/esm2022/utils/clipboard/data-transfer.mjs +0 -33
- package/esm2022/utils/clipboard/index.mjs +0 -3
- package/esm2022/utils/clipboard/navigator-clipboard.mjs +0 -71
- package/esm2022/utils/clipboard/types.mjs +0 -13
- package/esm2022/utils/common.mjs +0 -79
- package/esm2022/utils/debug.mjs +0 -91
- package/esm2022/utils/dnd.mjs +0 -8
- package/esm2022/utils/dom/common.mjs +0 -75
- package/esm2022/utils/dom/environment.mjs +0 -2
- package/esm2022/utils/dom/foreign.mjs +0 -26
- package/esm2022/utils/dom/index.mjs +0 -4
- package/esm2022/utils/drawing/arrow.mjs +0 -23
- package/esm2022/utils/drawing/circle.mjs +0 -4
- package/esm2022/utils/drawing/line.mjs +0 -47
- package/esm2022/utils/drawing/rectangle.mjs +0 -36
- package/esm2022/utils/element.mjs +0 -90
- package/esm2022/utils/environment.mjs +0 -14
- package/esm2022/utils/fragment.mjs +0 -27
- package/esm2022/utils/group.mjs +0 -239
- package/esm2022/utils/helper.mjs +0 -68
- package/esm2022/utils/history.mjs +0 -96
- package/esm2022/utils/hotkeys.mjs +0 -109
- package/esm2022/utils/id-creator.mjs +0 -11
- package/esm2022/utils/index.mjs +0 -35
- package/esm2022/utils/iterable.mjs +0 -32
- package/esm2022/utils/math.mjs +0 -480
- package/esm2022/utils/mobile.mjs +0 -6
- package/esm2022/utils/moving-element.mjs +0 -17
- package/esm2022/utils/pointer.mjs +0 -13
- package/esm2022/utils/position.mjs +0 -9
- package/esm2022/utils/selected-element.mjs +0 -145
- package/esm2022/utils/selection.mjs +0 -151
- package/esm2022/utils/snap/snap-moving.mjs +0 -199
- package/esm2022/utils/snap/snap.mjs +0 -211
- package/esm2022/utils/to-image.mjs +0 -204
- package/esm2022/utils/to-point.mjs +0 -74
- package/esm2022/utils/tree.mjs +0 -22
- package/esm2022/utils/viewport.mjs +0 -227
- package/esm2022/utils/weak-maps.mjs +0 -27
- package/esm2022/utils/z-index.mjs +0 -166
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, PlaitElement, PlaitNode } from '../interfaces';
|
|
2
|
-
import { NODE_TO_INDEX, NODE_TO_PARENT } from '../utils/weak-maps';
|
|
3
|
-
import { isSelectedElement, replaceSelectedElement } from '../utils/selected-element';
|
|
4
|
-
import { DefaultIterableDiffer } from '../differs/default_iterable_differ';
|
|
5
|
-
import { isDebug } from '../utils/debug';
|
|
6
|
-
export class ListRender {
|
|
7
|
-
constructor(board) {
|
|
8
|
-
this.board = board;
|
|
9
|
-
this.children = [];
|
|
10
|
-
this.instances = [];
|
|
11
|
-
this.contexts = [];
|
|
12
|
-
this.differ = null;
|
|
13
|
-
this.initialized = false;
|
|
14
|
-
}
|
|
15
|
-
initialize(children, childrenContext) {
|
|
16
|
-
this.initialized = true;
|
|
17
|
-
this.children = children;
|
|
18
|
-
children.forEach((descendant, index) => {
|
|
19
|
-
NODE_TO_INDEX.set(descendant, index);
|
|
20
|
-
NODE_TO_PARENT.set(descendant, childrenContext.parent);
|
|
21
|
-
const context = getContext(this.board, descendant, index, childrenContext.parent);
|
|
22
|
-
const componentType = getComponentType(this.board, context);
|
|
23
|
-
const instance = createPluginComponent(this.board, componentType, context, childrenContext);
|
|
24
|
-
this.instances.push(instance);
|
|
25
|
-
this.contexts.push(context);
|
|
26
|
-
});
|
|
27
|
-
this.differ = new DefaultIterableDiffer(trackBy);
|
|
28
|
-
this.differ.diff(children);
|
|
29
|
-
}
|
|
30
|
-
update(children, childrenContext) {
|
|
31
|
-
if (!this.initialized) {
|
|
32
|
-
this.initialize(children, childrenContext);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (!this.differ) {
|
|
36
|
-
throw new Error('Exception: Can not find differ ');
|
|
37
|
-
}
|
|
38
|
-
const { board, parent } = childrenContext;
|
|
39
|
-
const diffResult = this.differ.diff(children);
|
|
40
|
-
if (diffResult) {
|
|
41
|
-
const newContexts = [];
|
|
42
|
-
const newInstances = [];
|
|
43
|
-
// for moving scene: the current index for first element before moving
|
|
44
|
-
let currentIndexForFirstElement = null;
|
|
45
|
-
diffResult.forEachItem((record) => {
|
|
46
|
-
NODE_TO_INDEX.set(record.item, record.currentIndex);
|
|
47
|
-
NODE_TO_PARENT.set(record.item, childrenContext.parent);
|
|
48
|
-
const previousContext = record.previousIndex === null ? undefined : this.contexts[record.previousIndex];
|
|
49
|
-
const context = getContext(board, record.item, record.currentIndex, parent, previousContext);
|
|
50
|
-
if (record.previousIndex === null) {
|
|
51
|
-
const componentType = getComponentType(board, context);
|
|
52
|
-
const componentRef = createPluginComponent(board, componentType, context, childrenContext);
|
|
53
|
-
newContexts.push(context);
|
|
54
|
-
newInstances.push(componentRef);
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
const instance = this.instances[record.previousIndex];
|
|
58
|
-
instance.context = context;
|
|
59
|
-
newInstances.push(instance);
|
|
60
|
-
newContexts.push(context);
|
|
61
|
-
}
|
|
62
|
-
// item might has been changed, so need to compare the id
|
|
63
|
-
if (record.item === this.children[0] || record.item.id === this.children[0]?.id) {
|
|
64
|
-
currentIndexForFirstElement = record.currentIndex;
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
diffResult.forEachOperation(record => {
|
|
68
|
-
// removed
|
|
69
|
-
if (record.currentIndex === null) {
|
|
70
|
-
const componentRef = this.instances[record.previousIndex];
|
|
71
|
-
componentRef?.destroy();
|
|
72
|
-
}
|
|
73
|
-
// moved
|
|
74
|
-
if (record.previousIndex !== null && record.currentIndex !== null) {
|
|
75
|
-
mountOnItemMove(record.item, record.currentIndex, childrenContext, currentIndexForFirstElement);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
this.instances = newInstances;
|
|
79
|
-
this.contexts = newContexts;
|
|
80
|
-
this.children = children;
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
const newContexts = [];
|
|
84
|
-
this.children.forEach((element, index) => {
|
|
85
|
-
NODE_TO_INDEX.set(element, index);
|
|
86
|
-
NODE_TO_PARENT.set(element, childrenContext.parent);
|
|
87
|
-
const previousContext = this.contexts[index];
|
|
88
|
-
const previousInstance = this.instances[index];
|
|
89
|
-
const context = getContext(board, element, index, parent, previousContext);
|
|
90
|
-
previousInstance.context = context;
|
|
91
|
-
newContexts.push(context);
|
|
92
|
-
});
|
|
93
|
-
this.contexts = newContexts;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
destroy() {
|
|
97
|
-
this.children.forEach((element, index) => {
|
|
98
|
-
if (this.instances[index]) {
|
|
99
|
-
this.instances[index].destroy();
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
this.instances = [];
|
|
103
|
-
this.children = [];
|
|
104
|
-
this.contexts = [];
|
|
105
|
-
this.initialized = false;
|
|
106
|
-
this.differ = null;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
const trackBy = (index, element) => {
|
|
110
|
-
return element.id;
|
|
111
|
-
};
|
|
112
|
-
const createPluginComponent = (board, componentType, context, childrenContext) => {
|
|
113
|
-
const instance = new componentType();
|
|
114
|
-
instance.context = context;
|
|
115
|
-
board.normalizeElement(context);
|
|
116
|
-
try {
|
|
117
|
-
instance.initialize();
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
if (isDebug()) {
|
|
121
|
-
console.error('list-render-initialize', error, 'context', context);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
const g = instance.getContainerG();
|
|
125
|
-
mountElementG(context.index, g, childrenContext);
|
|
126
|
-
instance.initializeListRender();
|
|
127
|
-
return instance;
|
|
128
|
-
};
|
|
129
|
-
const getComponentType = (board, context) => {
|
|
130
|
-
const result = board.drawElement(context);
|
|
131
|
-
return result;
|
|
132
|
-
};
|
|
133
|
-
const getContext = (board, element, index, parent, previousContext) => {
|
|
134
|
-
let isSelected = isSelectedElement(board, element);
|
|
135
|
-
const previousElement = previousContext && previousContext.element;
|
|
136
|
-
if (previousElement && previousElement !== element && isSelectedElement(board, previousElement)) {
|
|
137
|
-
isSelected = true;
|
|
138
|
-
replaceSelectedElement(board, previousElement, element);
|
|
139
|
-
}
|
|
140
|
-
const context = {
|
|
141
|
-
element: element,
|
|
142
|
-
parent: parent,
|
|
143
|
-
board: board,
|
|
144
|
-
selected: isSelected,
|
|
145
|
-
index,
|
|
146
|
-
hasThemeChanged: !!board.operations?.find(op => op.type === 'set_theme')
|
|
147
|
-
};
|
|
148
|
-
return context;
|
|
149
|
-
};
|
|
150
|
-
// the g depth of root element:[1]-[2]-[3]-[4]
|
|
151
|
-
// the g depth of root element and children element(the [2] element has children):
|
|
152
|
-
// [1]-
|
|
153
|
-
// [2]([2-1-1][2-1-2][2-1][2-2][2-3-1][2-3-2][2-3][2])-
|
|
154
|
-
// [3]-
|
|
155
|
-
// [4]
|
|
156
|
-
export const mountElementG = (index, g, childrenContext,
|
|
157
|
-
// for moving scene: the current index for first element before moving
|
|
158
|
-
currentIndexForFirstElement = null) => {
|
|
159
|
-
const { parent, parentG } = childrenContext;
|
|
160
|
-
if (PlaitBoard.isBoard(parent)) {
|
|
161
|
-
if (index > 0) {
|
|
162
|
-
const previousElement = parent.children[index - 1];
|
|
163
|
-
const previousContainerG = PlaitElement.getContainerG(previousElement, { suppressThrow: false });
|
|
164
|
-
previousContainerG.insertAdjacentElement('afterend', g);
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
if (currentIndexForFirstElement !== null) {
|
|
168
|
-
const firstElement = parent.children[currentIndexForFirstElement];
|
|
169
|
-
const firstContainerG = firstElement && PlaitElement.getContainerG(firstElement, { suppressThrow: true });
|
|
170
|
-
if (firstElement && firstContainerG) {
|
|
171
|
-
parentG.insertBefore(g, firstContainerG);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
throw new Error('fail to mount container on moving');
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
parentG.append(g);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
if (index > 0) {
|
|
184
|
-
const previousElement = parent.children[index - 1];
|
|
185
|
-
const previousElementG = PlaitElement.getElementG(previousElement);
|
|
186
|
-
previousElementG.insertAdjacentElement('afterend', g);
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
if (currentIndexForFirstElement) {
|
|
190
|
-
const nextElement = parent.children[currentIndexForFirstElement];
|
|
191
|
-
const nextPath = nextElement && PlaitBoard.findPath(childrenContext.board, nextElement);
|
|
192
|
-
const first = nextPath && PlaitNode.first(childrenContext.board, nextPath);
|
|
193
|
-
const firstContainerG = first && PlaitElement.getContainerG(first, { suppressThrow: false });
|
|
194
|
-
if (firstContainerG) {
|
|
195
|
-
parentG.insertBefore(g, firstContainerG);
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
throw new Error('fail to mount container on moving');
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
let parentElementG = PlaitElement.getElementG(parent);
|
|
203
|
-
parentG.insertBefore(g, parentElementG);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
};
|
|
208
|
-
const mountOnItemMove = (element, index, childrenContext, currentIndexForFirstElement) => {
|
|
209
|
-
const containerG = PlaitElement.getContainerG(element, { suppressThrow: false });
|
|
210
|
-
mountElementG(index, containerG, childrenContext, currentIndexForFirstElement);
|
|
211
|
-
if (element.children && !PlaitElement.isRootElement(element) && childrenContext.board.isExpanded(element)) {
|
|
212
|
-
element.children.forEach((child, index) => {
|
|
213
|
-
mountOnItemMove(child, index, { ...childrenContext, parent: element }, null);
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9jb3JlL2xpc3QtcmVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxVQUFVLEVBRVYsWUFBWSxFQUNaLFNBQVMsRUFFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLE9BQU8sVUFBVTtJQU9uQixZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBTjdCLGFBQVEsR0FBbUIsRUFBRSxDQUFDO1FBQzlCLGNBQVMsR0FBcUIsRUFBRSxDQUFDO1FBQ2pDLGFBQVEsR0FBZ0MsRUFBRSxDQUFDO1FBQzNDLFdBQU0sR0FBd0MsSUFBSSxDQUFDO1FBQ3BELGdCQUFXLEdBQUcsS0FBSyxDQUFDO0lBRWEsQ0FBQztJQUVsQyxVQUFVLENBQUMsUUFBd0IsRUFBRSxlQUFxQztRQUM3RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ25DLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RCxNQUFNLE9BQU8sR0FB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YSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDL0UsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3hHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3RDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxlQUFlLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQW5jZXN0b3IsXG4gICAgQ29tcG9uZW50VHlwZSxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0Q2hpbGRyZW5Db250ZXh0LFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQbGFpdE5vZGUsXG4gICAgUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE5PREVfVE9fSU5ERVgsIE5PREVfVE9fUEFSRU5UIH0gZnJvbSAnLi4vdXRpbHMvd2Vhay1tYXBzJztcbmltcG9ydCB7IGlzU2VsZWN0ZWRFbGVtZW50LCByZXBsYWNlU2VsZWN0ZWRFbGVtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0ZWQtZWxlbWVudCc7XG5pbXBvcnQgeyBFbGVtZW50Rmxhdm91ciB9IGZyb20gJy4vZWxlbWVudC9lbGVtZW50LWZsYXZvdXInO1xuaW1wb3J0IHsgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIH0gZnJvbSAnLi4vZGlmZmVycy9kZWZhdWx0X2l0ZXJhYmxlX2RpZmZlcic7XG5pbXBvcnQgeyBJdGVyYWJsZUNoYW5nZVJlY29yZCwgSXRlcmFibGVEaWZmZXIgfSBmcm9tICcuLi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMnO1xuaW1wb3J0IHsgaXNEZWJ1ZyB9IGZyb20gJy4uL3V0aWxzL2RlYnVnJztcblxuZXhwb3J0IGNsYXNzIExpc3RSZW5kZXIge1xuICAgIHByaXZhdGUgY2hpbGRyZW46IFBsYWl0RWxlbWVudFtdID0gW107XG4gICAgcHJpdmF0ZSBpbnN0YW5jZXM6IEVsZW1lbnRGbGF2b3VyW10gPSBbXTtcbiAgICBwcml2YXRlIGNvbnRleHRzOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0W10gPSBbXTtcbiAgICBwcml2YXRlIGRpZmZlcjogSXRlcmFibGVEaWZmZXI8UGxhaXRFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRCb2FyZCkge31cblxuICAgIHB1YmxpYyBpbml0aWFsaXplKGNoaWxkcmVuOiBQbGFpdEVsZW1lbnRbXSwgY2hpbGRyZW5Db250ZXh0OiBQbGFpdENoaWxkcmVuQ29udGV4dCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChkZXNjZW5kYW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgTk9ERV9UT19JTkRFWC5zZXQoZGVzY2VuZGFudCwgaW5kZXgpO1xuICAgICAgICAgICAgTk9ERV9UT19QQVJFTlQuc2V0KGRlc2NlbmRhbnQsIGNoaWxkcmVuQ29udGV4dC5wYXJlbnQpO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQodGhpcy5ib2FyZCwgZGVzY2VuZGFudCwgaW5kZXgsIGNoaWxkcmVuQ29udGV4dC5wYXJlbnQpO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IGdldENvbXBvbmVudFR5cGUodGhpcy5ib2FyZCwgY29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGNyZWF0ZVBsdWdpbkNvbXBvbmVudCh0aGlzLmJvYXJkLCBjb21wb25lbnRUeXBlLCBjb250ZXh0LCBjaGlsZHJlbkNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpZmZlciA9IG5ldyBEZWZhdWx0SXRlcmFibGVEaWZmZXI8UGxhaXRFbGVtZW50Pih0cmFja0J5KTtcbiAgICAgICAgdGhpcy5kaWZmZXIuZGlmZihjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShjaGlsZHJlbjogUGxhaXRFbGVtZW50W10sIGNoaWxkcmVuQ29udGV4dDogUGxhaXRDaGlsZHJlbkNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemUoY2hpbGRyZW4sIGNoaWxkcmVuQ29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRpZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb246IENhbiBub3QgZmluZCBkaWZmZXIgJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBib2FyZCwgcGFyZW50IH0gPSBjaGlsZHJlbkNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGRpZmZSZXN1bHQgPSB0aGlzLmRpZmZlci5kaWZmKGNoaWxkcmVuKTtcbiAgICAgICAgaWYgKGRpZmZSZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRleHRzOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0W10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0luc3RhbmNlczogRWxlbWVudEZsYXZvdXJbXSA9IFtdO1xuICAgICAgICAgICAgLy8gZm9yIG1vdmluZyBzY2VuZTogdGhlIGN1cnJlbnQgaW5kZXggZm9yIGZpcnN0IGVsZW1lbnQgYmVmb3JlIG1vdmluZ1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBkaWZmUmVzdWx0LmZvckVhY2hJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPFBsYWl0RWxlbWVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBOT0RFX1RPX0lOREVYLnNldChyZWNvcmQuaXRlbSwgcmVjb3JkLmN1cnJlbnRJbmRleCBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgIE5PREVfVE9fUEFSRU5ULnNldChyZWNvcmQuaXRlbSwgY2hpbGRyZW5Db250ZXh0LnBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDb250ZXh0ID0gcmVjb3JkLnByZXZpb3VzSW5kZXggPT09IG51bGwgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRleHRzW3JlY29yZC5wcmV2aW91c0luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dChib2FyZCwgcmVjb3JkLml0ZW0sIHJlY29yZC5jdXJyZW50SW5kZXggYXMgbnVtYmVyLCBwYXJlbnQsIHByZXZpb3VzQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSBnZXRDb21wb25lbnRUeXBlKGJvYXJkLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gY3JlYXRlUGx1Z2luQ29tcG9uZW50KGJvYXJkLCBjb21wb25lbnRUeXBlLCBjb250ZXh0LCBjaGlsZHJlbkNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdJbnN0YW5jZXMucHVzaChjb21wb25lbnRSZWYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXNbcmVjb3JkLnByZXZpb3VzSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgbmV3SW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpdGVtIG1pZ2h0IGhhcyBiZWVuIGNoYW5nZWQsIHNvIG5lZWQgdG8gY29tcGFyZSB0aGUgaWRcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLml0ZW0gPT09IHRoaXMuY2hpbGRyZW5bMF0gfHwgcmVjb3JkLml0ZW0uaWQgPT09IHRoaXMuY2hpbGRyZW5bMF0/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudCA9IHJlY29yZC5jdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaWZmUmVzdWx0LmZvckVhY2hPcGVyYXRpb24ocmVjb3JkID0+IHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmVkXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5jdXJyZW50SW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5pbnN0YW5jZXNbcmVjb3JkLnByZXZpb3VzSW5kZXggYXMgbnVtYmVyXTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG1vdmVkXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ICE9PSBudWxsICYmIHJlY29yZC5jdXJyZW50SW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbW91bnRPbkl0ZW1Nb3ZlKHJlY29yZC5pdGVtLCByZWNvcmQuY3VycmVudEluZGV4LCBjaGlsZHJlbkNvbnRleHQsIGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlcyA9IG5ld0luc3RhbmNlcztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXdDb250ZXh0cztcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRleHRzOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0W10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBOT0RFX1RPX0lOREVYLnNldChlbGVtZW50LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgTk9ERV9UT19QQVJFTlQuc2V0KGVsZW1lbnQsIGNoaWxkcmVuQ29udGV4dC5wYXJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ29udGV4dCA9IHRoaXMuY29udGV4dHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlc1tpbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQoYm9hcmQsIGVsZW1lbnQsIGluZGV4LCBwYXJlbnQsIHByZXZpb3VzQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNJbnN0YW5jZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICBuZXdDb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRzID0gbmV3Q29udGV4dHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChlbGVtZW50OiBQbGFpdEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlc1tpbmRleF0uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRleHRzID0gW107XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWZmZXIgPSBudWxsO1xuICAgIH1cbn1cblxuY29uc3QgdHJhY2tCeSA9IChpbmRleDogbnVtYmVyLCBlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gZWxlbWVudC5pZDtcbn07XG5cbmNvbnN0IGNyZWF0ZVBsdWdpbkNvbXBvbmVudCA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlPEVsZW1lbnRGbGF2b3VyPixcbiAgICBjb250ZXh0OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0LFxuICAgIGNoaWxkcmVuQ29udGV4dDogUGxhaXRDaGlsZHJlbkNvbnRleHRcbikgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbXBvbmVudFR5cGUoKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICBib2FyZC5ub3JtYWxpemVFbGVtZW50KGNvbnRleHQpO1xuICAgIHRyeSB7XG4gICAgICAgIGluc3RhbmNlLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNEZWJ1ZygpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdsaXN0LXJlbmRlci1pbml0aWFsaXplJywgZXJyb3IsICdjb250ZXh0JywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZyA9IGluc3RhbmNlLmdldENvbnRhaW5lckcoKTtcbiAgICBtb3VudEVsZW1lbnRHKGNvbnRleHQuaW5kZXgsIGcsIGNoaWxkcmVuQ29udGV4dCk7XG4gICAgaW5zdGFuY2UuaW5pdGlhbGl6ZUxpc3RSZW5kZXIoKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG59O1xuXG5jb25zdCBnZXRDb21wb25lbnRUeXBlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBjb250ZXh0OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYm9hcmQuZHJhd0VsZW1lbnQoY29udGV4dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IGdldENvbnRleHQgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRFbGVtZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFyZW50OiBBbmNlc3RvcixcbiAgICBwcmV2aW91c0NvbnRleHQ/OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0XG4pOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0ID0+IHtcbiAgICBsZXQgaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWRFbGVtZW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBwcmV2aW91c0NvbnRleHQgJiYgcHJldmlvdXNDb250ZXh0LmVsZW1lbnQ7XG4gICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQgIT09IGVsZW1lbnQgJiYgaXNTZWxlY3RlZEVsZW1lbnQoYm9hcmQsIHByZXZpb3VzRWxlbWVudCkpIHtcbiAgICAgICAgaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHJlcGxhY2VTZWxlY3RlZEVsZW1lbnQoYm9hcmQsIHByZXZpb3VzRWxlbWVudCwgZWxlbWVudCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQ6IFBsYWl0UGx1Z2luRWxlbWVudENvbnRleHQgPSB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBib2FyZDogYm9hcmQsXG4gICAgICAgIHNlbGVjdGVkOiBpc1NlbGVjdGVkLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgaGFzVGhlbWVDaGFuZ2VkOiAhIWJvYXJkLm9wZXJhdGlvbnM/LmZpbmQob3AgPT4gb3AudHlwZSA9PT0gJ3NldF90aGVtZScpXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbn07XG5cbi8vIHRoZSBnIGRlcHRoIG9mIHJvb3QgZWxlbWVudO+8mlsxXS1bMl0tWzNdLVs0XVxuLy8gdGhlIGcgZGVwdGggb2Ygcm9vdCBlbGVtZW50IGFuZCBjaGlsZHJlbiBlbGVtZW5077yIdGhlIFsyXSBlbGVtZW50IGhhcyBjaGlsZHJlbu+8ie+8mlxuLy8gWzFdLVxuLy8gWzJdKFsyLTEtMV1bMi0xLTJdWzItMV1bMi0yXVsyLTMtMV1bMi0zLTJdWzItM11bMl0pLVxuLy8gWzNdLVxuLy8gWzRdXG5leHBvcnQgY29uc3QgbW91bnRFbGVtZW50RyA9IChcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGc6IFNWR0dFbGVtZW50LFxuICAgIGNoaWxkcmVuQ29udGV4dDogUGxhaXRDaGlsZHJlbkNvbnRleHQsXG4gICAgLy8gZm9yIG1vdmluZyBzY2VuZTogdGhlIGN1cnJlbnQgaW5kZXggZm9yIGZpcnN0IGVsZW1lbnQgYmVmb3JlIG1vdmluZ1xuICAgIGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudDogbnVtYmVyIHwgbnVsbCA9IG51bGxcbikgPT4ge1xuICAgIGNvbnN0IHsgcGFyZW50LCBwYXJlbnRHIH0gPSBjaGlsZHJlbkNvbnRleHQ7XG4gICAgaWYgKFBsYWl0Qm9hcmQuaXNCb2FyZChwYXJlbnQpKSB7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IHBhcmVudC5jaGlsZHJlbltpbmRleCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDb250YWluZXJHID0gUGxhaXRFbGVtZW50LmdldENvbnRhaW5lckcocHJldmlvdXNFbGVtZW50LCB7IHN1cHByZXNzVGhyb3c6IGZhbHNlIH0pO1xuICAgICAgICAgICAgcHJldmlvdXNDb250YWluZXJHLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhGb3JGaXJzdEVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSBwYXJlbnQuY2hpbGRyZW5bY3VycmVudEluZGV4Rm9yRmlyc3RFbGVtZW50XTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENvbnRhaW5lckcgPSBmaXJzdEVsZW1lbnQgJiYgUGxhaXRFbGVtZW50LmdldENvbnRhaW5lckcoZmlyc3RFbGVtZW50LCB7IHN1cHByZXNzVGhyb3c6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0RWxlbWVudCAmJiBmaXJzdENvbnRhaW5lckcpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Ry5pbnNlcnRCZWZvcmUoZywgZmlyc3RDb250YWluZXJHKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWwgdG8gbW91bnQgY29udGFpbmVyIG9uIG1vdmluZycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Ry5hcHBlbmQoZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSAocGFyZW50LmNoaWxkcmVuIGFzIFBsYWl0RWxlbWVudFtdKVtpbmRleCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50RyA9IFBsYWl0RWxlbWVudC5nZXRFbGVtZW50RyhwcmV2aW91c0VsZW1lbnQpO1xuICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50Ry5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4Rm9yRmlyc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSAocGFyZW50LmNoaWxkcmVuIGFzIFBsYWl0RWxlbWVudFtdKVtjdXJyZW50SW5kZXhGb3JGaXJzdEVsZW1lbnRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQYXRoID0gbmV4dEVsZW1lbnQgJiYgUGxhaXRCb2FyZC5maW5kUGF0aChjaGlsZHJlbkNvbnRleHQuYm9hcmQsIG5leHRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdCA9IG5leHRQYXRoICYmIFBsYWl0Tm9kZS5maXJzdChjaGlsZHJlbkNvbnRleHQuYm9hcmQsIG5leHRQYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENvbnRhaW5lckcgPSBmaXJzdCAmJiBQbGFpdEVsZW1lbnQuZ2V0Q29udGFpbmVyRyhmaXJzdCwgeyBzdXBwcmVzc1Rocm93OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250YWluZXJHKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEcuaW5zZXJ0QmVmb3JlKGcsIGZpcnN0Q29udGFpbmVyRyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsIHRvIG1vdW50IGNvbnRhaW5lciBvbiBtb3ZpbmcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRFbGVtZW50RyA9IFBsYWl0RWxlbWVudC5nZXRFbGVtZW50RyhwYXJlbnQpO1xuICAgICAgICAgICAgICAgIHBhcmVudEcuaW5zZXJ0QmVmb3JlKGcsIHBhcmVudEVsZW1lbnRHKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmNvbnN0IG1vdW50T25JdGVtTW92ZSA9IChcbiAgICBlbGVtZW50OiBQbGFpdEVsZW1lbnQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBjaGlsZHJlbkNvbnRleHQ6IFBsYWl0Q2hpbGRyZW5Db250ZXh0LFxuICAgIGN1cnJlbnRJbmRleEZvckZpcnN0RWxlbWVudDogbnVtYmVyIHwgbnVsbFxuKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyRyA9IFBsYWl0RWxlbWVudC5nZXRDb250YWluZXJHKGVsZW1lbnQsIHsgc3VwcHJlc3NUaHJvdzogZmFsc2UgfSk7XG4gICAgbW91bnRFbGVtZW50RyhpbmRleCwgY29udGFpbmVyRywgY2hpbGRyZW5Db250ZXh0LCBjdXJyZW50SW5kZXhGb3JGaXJzdEVsZW1lbnQpO1xuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICYmICFQbGFpdEVsZW1lbnQuaXNSb290RWxlbWVudChlbGVtZW50KSAmJiBjaGlsZHJlbkNvbnRleHQuYm9hcmQuaXNFeHBhbmRlZChlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbW91bnRPbkl0ZW1Nb3ZlKGNoaWxkLCBpbmRleCwgeyAuLi5jaGlsZHJlbkNvbnRleHQsIHBhcmVudDogZWxlbWVudCB9LCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiJdfQ==
|