@libs-ui/services-diagram-draw 0.2.356-37

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.
Files changed (33) hide show
  1. package/README.md +279 -0
  2. package/canvas.service.d.ts +42 -0
  3. package/diagram-draw.service.d.ts +91 -0
  4. package/direction.service.d.ts +43 -0
  5. package/esm2022/canvas.service.mjs +628 -0
  6. package/esm2022/diagram-draw.service.mjs +711 -0
  7. package/esm2022/direction.service.mjs +255 -0
  8. package/esm2022/index.mjs +6 -0
  9. package/esm2022/interfaces/canvas.interface.mjs +2 -0
  10. package/esm2022/interfaces/coordinates.interface.mjs +2 -0
  11. package/esm2022/interfaces/diagram.interface.mjs +2 -0
  12. package/esm2022/libs-ui-services-diagram-draw.mjs +5 -0
  13. package/esm2022/utils/calculator-branch.util.mjs +187 -0
  14. package/esm2022/utils/calculator-element.util.mjs +335 -0
  15. package/esm2022/utils/canvas.util.mjs +176 -0
  16. package/esm2022/utils/diagram.util.mjs +54 -0
  17. package/esm2022/utils/direction.util.mjs +103 -0
  18. package/esm2022/utils/horizontal/calculator-branch.util.mjs +243 -0
  19. package/esm2022/utils/horizontal/calculator-coordinates.util.mjs +315 -0
  20. package/fesm2022/libs-ui-services-diagram-draw.mjs +2982 -0
  21. package/fesm2022/libs-ui-services-diagram-draw.mjs.map +1 -0
  22. package/index.d.ts +5 -0
  23. package/interfaces/canvas.interface.d.ts +21 -0
  24. package/interfaces/coordinates.interface.d.ts +40 -0
  25. package/interfaces/diagram.interface.d.ts +109 -0
  26. package/package.json +27 -0
  27. package/utils/calculator-branch.util.d.ts +16 -0
  28. package/utils/calculator-element.util.d.ts +24 -0
  29. package/utils/canvas.util.d.ts +21 -0
  30. package/utils/diagram.util.d.ts +6 -0
  31. package/utils/direction.util.d.ts +6 -0
  32. package/utils/horizontal/calculator-branch.util.d.ts +67 -0
  33. package/utils/horizontal/calculator-coordinates.util.d.ts +42 -0
@@ -0,0 +1,335 @@
1
+ import { canvasConfigReadonly } from '../diagram-draw.service';
2
+ import { MoLibDiagramCalculatorBranchUtil } from './calculator-branch.util';
3
+ import { buildFlatElement } from './diagram.util';
4
+ export class MoLibDiagramCalculatorCoordinatesUtil {
5
+ static setXYElements(elements, config, positionX) {
6
+ if (!elements || !elements.length) {
7
+ return;
8
+ }
9
+ elements.forEach((currentElement, index) => {
10
+ currentElement.specific_x = (currentElement.specific_x ?? 0) + (positionX ?? 0);
11
+ const preElement = elements[index - 1];
12
+ if (preElement) {
13
+ currentElement.specific_x = (preElement.specific_x ?? 0) + (preElement.specific_width ?? 0) / 2 - (currentElement.specific_width ?? 0) / 2;
14
+ currentElement.specific_y = (preElement.specific_y ?? 0) + (preElement.specific_height ?? 0) + checkElementGetHeight(preElement.nodeOtherConfig);
15
+ if (preElement.position_end_branch) {
16
+ currentElement.specific_y = preElement.position_end_branch;
17
+ }
18
+ }
19
+ const top = currentElement.specific_y ?? 0;
20
+ const left = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) / 2;
21
+ let lineBetweenElements = (currentElement.specific_height ?? 0) + checkElementGetHeight(currentElement.nodeOtherConfig);
22
+ if (currentElement.branches && currentElement.branches.length) {
23
+ lineBetweenElements = (currentElement.specific_height ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;
24
+ }
25
+ const maxY = (currentElement.specific_y ?? 0) + (currentElement.specific_height ?? 0) + 200;
26
+ const maxXLeft = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) + 100;
27
+ const configSvg = config.widthHeightSvgCanvas;
28
+ configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;
29
+ configSvg.widthSvg = maxXLeft > configSvg.widthSvg ? maxXLeft : configSvg.widthSvg;
30
+ checkMaxLeft(config, currentElement.specific_x, currentElement.branches?.[0].positionMaxLeft);
31
+ if (!currentElement.branches || !currentElement.branches.length) {
32
+ // các element không có nhánh mới vẽ đường thẳng
33
+ const drawFormToHeightExit = (currentElement.subCodeOfElement || currentElement.code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT ? (currentElement.specific_height ?? 0) / 2 : lineBetweenElements;
34
+ currentElement.attributeSvgD = `M ${left} ${top} l 0 ${drawFormToHeightExit}`;
35
+ currentElement.position_end = top + lineBetweenElements;
36
+ if (currentElement.nodeOtherConfig) {
37
+ const waitHeight = getHeightWaitConfig(currentElement.nodeOtherConfig);
38
+ const distanceElementToWait = (currentElement.specific_height ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT;
39
+ const topStartLine2 = top + distanceElementToWait + waitHeight;
40
+ currentElement.attributeSvgD = `M ${left} ${top} l 0 ${distanceElementToWait}`;
41
+ currentElement.position_end = topStartLine2 + lineBetweenElements;
42
+ currentElement.nodeOtherConfig.specific_y = top + distanceElementToWait;
43
+ currentElement.nodeOtherConfig.specific_x = left;
44
+ delete currentElement.nodeOtherConfig.attributeSvgD;
45
+ if (currentElement.subCodeOfElement !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
46
+ currentElement.nodeOtherConfig.attributeSvgD = `M ${left} ${topStartLine2} l 0 ${canvasConfigReadonly().WAIT_TO_ELEMENT}`;
47
+ }
48
+ }
49
+ return;
50
+ }
51
+ // start các element có nhánh
52
+ const half = Math.ceil(currentElement.branches.length / 2);
53
+ const aboveHalf = currentElement.branches.slice(0, half);
54
+ const underHalf = currentElement.branches.slice(half);
55
+ let brachMiddle;
56
+ if (aboveHalf.length !== underHalf.length) {
57
+ brachMiddle = aboveHalf.pop();
58
+ }
59
+ // TÍNH CHIỀU Cao TỐI ĐA CỦA NHÁNH
60
+ const maxHeightBranch = {
61
+ height: 0,
62
+ };
63
+ MoLibDiagramCalculatorCoordinatesUtil.calculatorMaxBranchHeight(currentElement, maxHeightBranch);
64
+ currentElement.maxHeightBranch = maxHeightBranch.height;
65
+ const maxWidthBrachMiddle = { width: 0, aboveWidth: 0, underWidth: 0 };
66
+ const lineFormElementToBranching = (currentElement.specific_height ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;
67
+ if (brachMiddle) {
68
+ this.calculatorWidthBranch(brachMiddle.elements, maxWidthBrachMiddle);
69
+ brachMiddle.widthBranch = {
70
+ width: maxWidthBrachMiddle.width,
71
+ above: maxWidthBrachMiddle.aboveWidth,
72
+ under: maxWidthBrachMiddle.underWidth,
73
+ };
74
+ MoLibDiagramCalculatorBranchUtil.drawStraightLine(left, lineFormElementToBranching, top, brachMiddle, maxHeightBranch.height, config);
75
+ }
76
+ let hasNextSameParentElementNext = false;
77
+ const aboveHalfReverse = aboveHalf.reverse();
78
+ aboveHalfReverse.forEach((branch, indexBranch) => {
79
+ if (!hasNextSameParentElementNext) {
80
+ const flatElementOnBranch = [];
81
+ buildFlatElement(branch.elements, flatElementOnBranch);
82
+ hasNextSameParentElementNext = !flatElementOnBranch || !flatElementOnBranch.length ? true : flatElementOnBranch.find((item) => item.next_id === currentElement.next_id) ? true : false;
83
+ }
84
+ branch.onTheSide = 'above';
85
+ const maxWidthBranch = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều ngang để cách nhánh trên or dưới
86
+ this.calculatorWidthBranch(branch.elements, maxWidthBranch);
87
+ branch.widthBranch = {
88
+ width: maxWidthBranch.width,
89
+ above: maxWidthBranch.aboveWidth,
90
+ under: maxWidthBranch.underWidth,
91
+ };
92
+ const branchPre = aboveHalfReverse[indexBranch - 1];
93
+ let lineBetweenBranch = maxWidthBranch.underWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
94
+ if (branchPre) {
95
+ lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;
96
+ }
97
+ if (brachMiddle) {
98
+ lineBetweenBranch += (brachMiddle.widthBranch?.above ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
99
+ }
100
+ // nhánh trái
101
+ MoLibDiagramCalculatorBranchUtil.leftLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch.height, currentElement, config);
102
+ });
103
+ underHalf.forEach((branch, indexBranch) => {
104
+ if (!hasNextSameParentElementNext) {
105
+ const flatElementOnBranch = [];
106
+ buildFlatElement(branch.elements, flatElementOnBranch);
107
+ hasNextSameParentElementNext = !flatElementOnBranch || !flatElementOnBranch.length ? true : flatElementOnBranch.find((item) => item.next_id === currentElement.next_id) ? true : false;
108
+ }
109
+ branch.onTheSide = 'under';
110
+ const maxWidthBranch = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều cao để cách nhánh trên or dưới
111
+ this.calculatorWidthBranch(branch.elements, maxWidthBranch);
112
+ branch.widthBranch = {
113
+ width: maxWidthBranch.width,
114
+ above: maxWidthBranch.aboveWidth,
115
+ under: maxWidthBranch.underWidth,
116
+ };
117
+ const branchPre = underHalf[indexBranch - 1];
118
+ let lineBetweenBranch = maxWidthBranch.aboveWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
119
+ if (branchPre) {
120
+ lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;
121
+ }
122
+ if (brachMiddle) {
123
+ lineBetweenBranch += (brachMiddle.widthBranch?.under ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
124
+ }
125
+ // nhánh phải
126
+ MoLibDiagramCalculatorBranchUtil.rightLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch.height, currentElement, config);
127
+ });
128
+ });
129
+ // Set translateX và translateY để có thể render nodes
130
+ this.setTranslatePositions(elements);
131
+ }
132
+ /**
133
+ * Set translateX và translateY từ specific_x và specific_y cho tất cả elements (bao gồm branches)
134
+ */
135
+ static setTranslatePositions(elements) {
136
+ elements.forEach((element) => {
137
+ // Set position cho element chính
138
+ element.translateX = element.specific_x;
139
+ element.translateY = element.specific_y;
140
+ // Set position cho nodeOtherConfig nếu có
141
+ if (element.nodeOtherConfig) {
142
+ const offsetX = (element.nodeOtherConfig.specific_width ?? 0) / 2;
143
+ element.nodeOtherConfig.translateX = (element.nodeOtherConfig.specific_x ?? 0) - offsetX;
144
+ element.nodeOtherConfig.translateY = element.nodeOtherConfig.specific_y;
145
+ }
146
+ // Recursively set positions cho elements trong branches
147
+ if (element.branches && element.branches.length > 0) {
148
+ element.branches.forEach((branch) => {
149
+ // Set position cho branch nodeOtherConfig nếu có
150
+ if (branch.nodeOtherConfig) {
151
+ const offsetX = (branch.nodeOtherConfig.specific_width ?? 0) / 2;
152
+ branch.nodeOtherConfig.translateX = (branch.nodeOtherConfig.specific_x ?? 0) - offsetX;
153
+ branch.nodeOtherConfig.translateY = branch.nodeOtherConfig.specific_y;
154
+ }
155
+ // Recursively set positions cho elements trong branch
156
+ if (branch.elements && branch.elements.length > 0) {
157
+ this.setTranslatePositions(branch.elements);
158
+ }
159
+ });
160
+ }
161
+ });
162
+ }
163
+ static calculatorMaxBranchHeight(element, maxHeightBranch) {
164
+ if (!element.branches || !element.branches.length) {
165
+ return;
166
+ }
167
+ element.branches.forEach((branch) => {
168
+ if (!branch.elements || !branch.elements.length) {
169
+ const lineBranchNoHasElement = canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;
170
+ maxHeightBranch.height = lineBranchNoHasElement > maxHeightBranch.height ? lineBranchNoHasElement : maxHeightBranch.height;
171
+ return;
172
+ }
173
+ const total = {
174
+ height: 0,
175
+ };
176
+ this.plusHeightElementInBranch(branch.elements, total);
177
+ maxHeightBranch.height = total.height > maxHeightBranch.height ? total.height : maxHeightBranch.height;
178
+ });
179
+ }
180
+ static plusHeightElementInBranch(elements, total) {
181
+ elements.forEach((element) => {
182
+ const margin = !element.branches || !element.branches.length ? checkElementGetHeight(element.nodeOtherConfig) : canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;
183
+ total.height += (element.specific_height ?? 0) + margin;
184
+ if (!element.branches || !element.branches.length) {
185
+ return;
186
+ }
187
+ total.height += 64; // từ chiều đường thẳng ngang xuống đến nhánh đầu tiên
188
+ const theMostElementsInBranch = {
189
+ height: 0,
190
+ };
191
+ element.branches.forEach((branch) => {
192
+ const heightInBranch = { height: 0 };
193
+ heightInBranch.height += canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST + 20; // đường cong kết thúc nhánh + 10px đường cong
194
+ if (!branch.elements || !branch.elements.length) {
195
+ heightInBranch.height += canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;
196
+ if (theMostElementsInBranch.height < heightInBranch.height) {
197
+ theMostElementsInBranch.height = heightInBranch.height;
198
+ }
199
+ return;
200
+ }
201
+ this.plusHeightElementInBranch(branch.elements, heightInBranch);
202
+ if (theMostElementsInBranch.height < heightInBranch.height) {
203
+ theMostElementsInBranch.height = heightInBranch.height;
204
+ }
205
+ });
206
+ total.height += theMostElementsInBranch.height;
207
+ });
208
+ }
209
+ static calculatorWidthBranch(elements, maxWidth, log) {
210
+ if (!elements || !elements.length) {
211
+ const width = canvasConfigReadonly().DEFAULT_BRANCH_WHEN_NO_ELEMENT;
212
+ maxWidth.width = width;
213
+ maxWidth.aboveWidth = width / 2;
214
+ maxWidth.underWidth = width / 2;
215
+ return;
216
+ }
217
+ const maxWidthInElements = { width: 0, aboveWidth: 0, underWidth: 0 };
218
+ elements.forEach((element) => {
219
+ if (!element.branches || !element.branches.length) {
220
+ // tính chiều cao của từng element 1, vì chiều cao của từng thằng có thể khác nhau
221
+ if ((element.specific_width ?? 0) < maxWidthInElements.width) {
222
+ return;
223
+ }
224
+ const width = element.specific_width ?? 0;
225
+ maxWidthInElements.width = width;
226
+ maxWidthInElements.aboveWidth = width / 2;
227
+ maxWidthInElements.underWidth = width / 2;
228
+ return;
229
+ }
230
+ const widthElementIncludeBranch = { width: 0, aboveWidth: 0, underWidth: 0 };
231
+ const width = element.specific_width ?? 0;
232
+ if (width > widthElementIncludeBranch.width) {
233
+ widthElementIncludeBranch.width = width;
234
+ widthElementIncludeBranch.aboveWidth = width / 2;
235
+ widthElementIncludeBranch.underWidth = width / 2;
236
+ }
237
+ const half = Math.ceil(element.branches.length / 2);
238
+ const aboveHalf = element.branches.slice(0, half);
239
+ const underHalf = element.branches.slice(half);
240
+ let brachMiddle;
241
+ if (aboveHalf.length !== underHalf.length) {
242
+ brachMiddle = aboveHalf.pop();
243
+ }
244
+ if (brachMiddle) {
245
+ brachMiddle.onTheSide = 'center';
246
+ }
247
+ aboveHalf.forEach((branch) => (branch.onTheSide = 'above'));
248
+ underHalf.forEach((branch) => (branch.onTheSide = 'under'));
249
+ // tính chiều cao của từng nhánh 1, rồi tính tổng => so sánh với chiều cao xem element có nhánh nào cao nhất thì lấy
250
+ const widthBranch = { width: 0, aboveWidth: 0, underWidth: 0 };
251
+ element.branches.forEach((branch) => {
252
+ const width = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều cao của từng nhánh 1
253
+ this.calculatorWidthBranch(branch.elements, width, log);
254
+ switch (branch.onTheSide) {
255
+ case 'above':
256
+ widthBranch.aboveWidth += width.width;
257
+ break;
258
+ case 'under':
259
+ widthBranch.underWidth += width.width;
260
+ break;
261
+ case 'center':
262
+ widthBranch.aboveWidth += width.aboveWidth;
263
+ widthBranch.underWidth += width.underWidth;
264
+ break;
265
+ }
266
+ });
267
+ const marginBetweenBranch = (element.branches.length - 1) * canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;
268
+ widthBranch.aboveWidth += marginBetweenBranch / 2;
269
+ widthBranch.underWidth += marginBetweenBranch / 2;
270
+ const maxAboveWidth = Math.max(widthElementIncludeBranch.aboveWidth, widthBranch.aboveWidth);
271
+ const maxUnderWidth = Math.max(widthElementIncludeBranch.underWidth, widthBranch.underWidth);
272
+ if (maxWidthInElements.aboveWidth < maxAboveWidth) {
273
+ maxWidthInElements.aboveWidth = maxAboveWidth;
274
+ }
275
+ if (maxWidthInElements.underWidth < maxUnderWidth) {
276
+ maxWidthInElements.underWidth = maxUnderWidth;
277
+ }
278
+ maxWidthInElements.width = maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;
279
+ });
280
+ maxWidth.width += maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;
281
+ maxWidth.aboveWidth += maxWidthInElements.aboveWidth;
282
+ maxWidth.underWidth += maxWidthInElements.underWidth;
283
+ }
284
+ }
285
+ const checkElementGetHeight = (hasWaitConfig) => {
286
+ if (hasWaitConfig) {
287
+ return canvasConfigReadonly().DISTANCE_TO_WAIT + getHeightWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;
288
+ }
289
+ return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;
290
+ };
291
+ export const getDistanceFromBranchToFirstBlock = (hasWaitConfig) => {
292
+ if (hasWaitConfig) {
293
+ return canvasConfigReadonly().DISTANCE_TO_WAIT + getHeightWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;
294
+ }
295
+ return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST;
296
+ };
297
+ export const getHeightWaitConfig = (hasWaitConfig) => {
298
+ if (hasWaitConfig) {
299
+ return (hasWaitConfig.specific_height ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;
300
+ }
301
+ return canvasConfigReadonly().ELEMENT_WAIT_DEFAULT + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;
302
+ };
303
+ export const checkMaxLeft = (config, specific_x, positionMaxLeft) => {
304
+ let numberTranslatePosition = config.positionMaxLeft;
305
+ if (numberTranslatePosition === 0 && specific_x && specific_x > 0 && specific_x < 50) {
306
+ numberTranslatePosition = -50;
307
+ }
308
+ if (specific_x && specific_x < numberTranslatePosition) {
309
+ numberTranslatePosition = specific_x;
310
+ }
311
+ if (positionMaxLeft && positionMaxLeft < numberTranslatePosition) {
312
+ numberTranslatePosition = positionMaxLeft;
313
+ }
314
+ if (numberTranslatePosition === config.positionMaxLeft) {
315
+ return;
316
+ }
317
+ config.positionMaxLeft = numberTranslatePosition;
318
+ };
319
+ export const checkMaxTop = (config, specific_y, positionMaxTop) => {
320
+ let numberTranslatePosition = config.positionMaxTop;
321
+ if (numberTranslatePosition === 0 && specific_y && specific_y > 0 && specific_y < 100) {
322
+ numberTranslatePosition = specific_y - 120;
323
+ }
324
+ if (specific_y && specific_y < numberTranslatePosition) {
325
+ numberTranslatePosition = specific_y;
326
+ }
327
+ if (positionMaxTop && positionMaxTop < numberTranslatePosition) {
328
+ numberTranslatePosition = positionMaxTop;
329
+ }
330
+ if (numberTranslatePosition === config.positionMaxTop) {
331
+ return;
332
+ }
333
+ config.positionMaxTop = numberTranslatePosition;
334
+ };
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1lbGVtZW50LnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvdXRpbHMvY2FsY3VsYXRvci1lbGVtZW50LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHL0QsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsTUFBTSxPQUFPLHFDQUFxQztJQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQWdDLEVBQUUsTUFBNkIsRUFBRSxTQUFrQjtRQUN0RyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLE9BQU87UUFDVCxDQUFDO1FBQ0QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN6QyxjQUFjLENBQUMsVUFBVSxHQUFHLENBQUMsY0FBYyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXZDLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsY0FBYyxDQUFDLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzSSxjQUFjLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNqSixJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUNuQyxjQUFjLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDN0QsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RixJQUFJLG1CQUFtQixHQUFHLENBQUMsY0FBYyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFeEgsSUFBSSxjQUFjLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzlELG1CQUFtQixHQUFHLENBQUMsY0FBYyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDLDZCQUE2QixDQUFDO1lBQ3JILENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUM1RixNQUFNLFFBQVEsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUUvRixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUM7WUFFOUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQzlFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUVuRixZQUFZLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzlGLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEUsZ0RBQWdEO2dCQUNoRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsY0FBYyxDQUFDLGdCQUFnQixJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxvQkFBb0IsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQztnQkFFck0sY0FBYyxDQUFDLGFBQWEsR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLFFBQVEsb0JBQW9CLEVBQUUsQ0FBQztnQkFDOUUsY0FBYyxDQUFDLFlBQVksR0FBRyxHQUFHLEdBQUcsbUJBQW1CLENBQUM7Z0JBRXhELElBQUksY0FBYyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUNuQyxNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3ZFLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxjQUFjLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzlHLE1BQU0sYUFBYSxHQUFHLEdBQUcsR0FBRyxxQkFBcUIsR0FBRyxVQUFVLENBQUM7b0JBRS9ELGNBQWMsQ0FBQyxhQUFhLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxRQUFRLHFCQUFxQixFQUFFLENBQUM7b0JBQy9FLGNBQWMsQ0FBQyxZQUFZLEdBQUcsYUFBYSxHQUFHLG1CQUFtQixDQUFDO29CQUVsRSxjQUFjLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcscUJBQXFCLENBQUM7b0JBQ3hFLGNBQWMsQ0FBQyxlQUFlLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztvQkFDakQsT0FBTyxjQUFjLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztvQkFDcEQsSUFBSSxjQUFjLENBQUMsZ0JBQWdCLEtBQUssb0JBQW9CLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUNqRixjQUFjLENBQUMsZUFBZSxDQUFDLGFBQWEsR0FBRyxLQUFLLElBQUksSUFBSSxhQUFhLFFBQVEsb0JBQW9CLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDNUgsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE9BQU87WUFDVCxDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pELE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELElBQUksV0FBOEMsQ0FBQztZQUVuRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxQyxXQUFXLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLENBQUM7WUFFRCxrQ0FBa0M7WUFDbEMsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLE1BQU0sRUFBRSxDQUFDO2FBQ1YsQ0FBQztZQUVGLHFDQUFxQyxDQUFDLHlCQUF5QixDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNqRyxjQUFjLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDeEQsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkUsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQztZQUVoSSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN0RSxXQUFXLENBQUMsV0FBVyxHQUFHO29CQUN4QixLQUFLLEVBQUUsbUJBQW1CLENBQUMsS0FBSztvQkFDaEMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLFVBQVU7b0JBQ3JDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxVQUFVO2lCQUN0QyxDQUFDO2dCQUNGLGdDQUFnQyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSwwQkFBMEIsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDeEksQ0FBQztZQUVELElBQUksNEJBQTRCLEdBQUcsS0FBSyxDQUFDO1lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTdDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRTtnQkFDL0MsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7b0JBQ2xDLE1BQU0sbUJBQW1CLEdBQXNCLEVBQUUsQ0FBQztvQkFFbEQsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO29CQUV2RCw0QkFBNEIsR0FBRyxDQUFDLG1CQUFtQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUN6TCxDQUFDO2dCQUVELE1BQU0sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO2dCQUMzQixNQUFNLGNBQWMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyw4Q0FBOEM7Z0JBRWpILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLENBQUMsV0FBVyxHQUFHO29CQUNuQixLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUs7b0JBQzNCLEtBQUssRUFBRSxjQUFjLENBQUMsVUFBVTtvQkFDaEMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxVQUFVO2lCQUNqQyxDQUFDO2dCQUNGLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFcEQsSUFBSSxpQkFBaUIsR0FBRyxjQUFjLENBQUMsVUFBVSxHQUFHLG9CQUFvQixFQUFFLENBQUMscUNBQXFDLEdBQUcsQ0FBQyxDQUFDO2dCQUVySCxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLGlCQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQztnQkFDMUgsQ0FBQztnQkFDRCxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixpQkFBaUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUMscUNBQXFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoSSxDQUFDO2dCQUNELGFBQWE7Z0JBRWIsZ0NBQWdDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSwwQkFBMEIsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzlKLENBQUMsQ0FBQyxDQUFDO1lBRUgsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7b0JBQ2xDLE1BQU0sbUJBQW1CLEdBQXNCLEVBQUUsQ0FBQztvQkFFbEQsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO29CQUV2RCw0QkFBNEIsR0FBRyxDQUFDLG1CQUFtQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUN6TCxDQUFDO2dCQUNELE1BQU0sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO2dCQUMzQixNQUFNLGNBQWMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyw0Q0FBNEM7Z0JBRS9HLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLENBQUMsV0FBVyxHQUFHO29CQUNuQixLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUs7b0JBQzNCLEtBQUssRUFBRSxjQUFjLENBQUMsVUFBVTtvQkFDaEMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxVQUFVO2lCQUNqQyxDQUFDO2dCQUNGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksaUJBQWlCLEdBQUcsY0FBYyxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsRUFBRSxDQUFDLHFDQUFxQyxHQUFHLENBQUMsQ0FBQztnQkFFckgsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDZCxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUMscUNBQXFDLENBQUM7Z0JBQzFILENBQUM7Z0JBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsaUJBQWlCLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDLHFDQUFxQyxHQUFHLENBQUMsQ0FBQztnQkFDaEksQ0FBQztnQkFFRCxhQUFhO2dCQUNiLGdDQUFnQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMscUJBQXFCLENBQUMsUUFBZ0M7UUFDbkUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLGlDQUFpQztZQUNqQyxPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDeEMsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBRXhDLDBDQUEwQztZQUMxQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRWxFLE9BQU8sQ0FBQyxlQUFlLENBQUMsVUFBVSxHQUFHLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dCQUN6RixPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztZQUMxRSxDQUFDO1lBRUQsd0RBQXdEO1lBQ3hELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDbEMsaURBQWlEO29CQUNqRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDM0IsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2pFLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO3dCQUN2RixNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztvQkFDeEUsQ0FBQztvQkFFRCxzREFBc0Q7b0JBQ3RELElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDbEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDOUMsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMseUJBQXlCLENBQUMsT0FBd0IsRUFBRSxlQUFtQztRQUM1RixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxzQkFBc0IsR0FBRyxvQkFBb0IsRUFBRSxDQUFDLDZDQUE2QyxDQUFDO2dCQUVwRyxlQUFlLENBQUMsTUFBTSxHQUFHLHNCQUFzQixHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO2dCQUUzSCxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHO2dCQUNaLE1BQU0sRUFBRSxDQUFDO2FBQ1YsQ0FBQztZQUVGLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELGVBQWUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxRQUEyQixFQUFFLEtBQXlCO1FBQ3JGLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixNQUFNLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLDZCQUE2QixDQUFDO1lBRXJLLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xELE9BQU87WUFDVCxDQUFDO1lBQ0QsS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxzREFBc0Q7WUFDMUUsTUFBTSx1QkFBdUIsR0FBRztnQkFDOUIsTUFBTSxFQUFFLENBQUM7YUFDVixDQUFDO1lBRUYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDbEMsTUFBTSxjQUFjLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBRXJDLGNBQWMsQ0FBQyxNQUFNLElBQUksb0JBQW9CLEVBQUUsQ0FBQyw4Q0FBOEMsR0FBRyxFQUFFLENBQUMsQ0FBQyw4Q0FBOEM7Z0JBQ25KLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEQsY0FBYyxDQUFDLE1BQU0sSUFBSSxvQkFBb0IsRUFBRSxDQUFDLDZDQUE2QyxDQUFDO29CQUU5RixJQUFJLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQzNELHVCQUF1QixDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO29CQUN6RCxDQUFDO29CQUVELE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDaEUsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUMzRCx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztnQkFDekQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsS0FBSyxDQUFDLE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQXVDLEVBQUUsUUFBbUUsRUFBRSxHQUFhO1FBQ3RKLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztZQUVwRSxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUN2QixRQUFRLENBQUMsVUFBVSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDaEMsUUFBUSxDQUFDLFVBQVUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBRWhDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFdEUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEQsa0ZBQWtGO2dCQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDN0QsT0FBTztnQkFDVCxDQUFDO2dCQUNELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDO2dCQUUxQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNqQyxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDMUMsa0JBQWtCLENBQUMsVUFBVSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBRTFDLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDN0UsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUM7WUFFMUMsSUFBSSxLQUFLLEdBQUcseUJBQXlCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLHlCQUF5QixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ3hDLHlCQUF5QixDQUFDLFVBQVUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCx5QkFBeUIsQ0FBQyxVQUFVLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsSUFBSSxXQUFXLENBQUM7WUFFaEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDMUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsV0FBVyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDbkMsQ0FBQztZQUNELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBRTVELG9IQUFvSDtZQUNwSCxNQUFNLFdBQVcsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFL0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDbEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsa0NBQWtDO2dCQUU1RixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3hELFFBQVEsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN6QixLQUFLLE9BQU87d0JBQ1YsV0FBVyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO3dCQUN0QyxNQUFNO29CQUVSLEtBQUssT0FBTzt3QkFDVixXQUFXLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7d0JBQ3RDLE1BQU07b0JBRVIsS0FBSyxRQUFRO3dCQUNYLFdBQVcsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQzt3QkFDM0MsV0FBVyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO3dCQUMzQyxNQUFNO2dCQUNWLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDLHFDQUFxQyxDQUFDO1lBRXpILFdBQVcsQ0FBQyxVQUFVLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELFdBQVcsQ0FBQyxVQUFVLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFN0YsSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxFQUFFLENBQUM7Z0JBQ2xELGtCQUFrQixDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7WUFDaEQsQ0FBQztZQUNELElBQUksa0JBQWtCLENBQUMsVUFBVSxHQUFHLGFBQWEsRUFBRSxDQUFDO2dCQUNsRCxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO1lBQ2hELENBQUM7WUFFRCxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztRQUMzRixDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxLQUFLLElBQUksa0JBQWtCLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztRQUNoRixRQUFRLENBQUMsVUFBVSxJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztRQUNyRCxRQUFRLENBQUMsVUFBVSxJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztJQUN2RCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsYUFBK0IsRUFBRSxFQUFFO0lBQ2hFLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsT0FBTyxvQkFBb0IsRUFBRSxDQUFDLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUMsZUFBZSxDQUFDO0lBQy9ILENBQUM7SUFFRCxPQUFPLG9CQUFvQixFQUFFLENBQUMsc0JBQXNCLENBQUM7QUFDdkQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcsQ0FBQyxhQUErQixFQUFFLEVBQUU7SUFDbkYsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixPQUFPLG9CQUFvQixFQUFFLENBQUMsZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDL0gsQ0FBQztJQUVELE9BQU8sb0JBQW9CLEVBQUUsQ0FBQyw4Q0FBOEMsQ0FBQztBQUMvRSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLGFBQStCLEVBQUUsRUFBRTtJQUNyRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxhQUFhLENBQUMsZUFBZSxJQUFJLG9CQUFvQixFQUFFLENBQUMsb0JBQW9CLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDLDBCQUEwQixDQUFDO0lBQzVJLENBQUM7SUFFRCxPQUFPLG9CQUFvQixFQUFFLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztBQUN6RyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUE2QixFQUFFLFVBQThCLEVBQUUsZUFBbUMsRUFBRSxFQUFFO0lBQ2pJLElBQUksdUJBQXVCLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztJQUVyRCxJQUFJLHVCQUF1QixLQUFLLENBQUMsSUFBSSxVQUFVLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDckYsdUJBQXVCLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksVUFBVSxJQUFJLFVBQVUsR0FBRyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3ZELHVCQUF1QixHQUFHLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxlQUFlLElBQUksZUFBZSxHQUFHLHVCQUF1QixFQUFFLENBQUM7UUFDakUsdUJBQXVCLEdBQUcsZUFBZSxDQUFDO0lBQzVDLENBQUM7SUFDRCxJQUFJLHVCQUF1QixLQUFLLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2RCxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sQ0FBQyxlQUFlLEdBQUcsdUJBQXVCLENBQUM7QUFDbkQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBNkIsRUFBRSxVQUE4QixFQUFFLGNBQWtDLEVBQUUsRUFBRTtJQUMvSCxJQUFJLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFFcEQsSUFBSSx1QkFBdUIsS0FBSyxDQUFDLElBQUksVUFBVSxJQUFJLFVBQVUsR0FBRyxDQUFDLElBQUksVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3RGLHVCQUF1QixHQUFHLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksVUFBVSxJQUFJLFVBQVUsR0FBRyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3ZELHVCQUF1QixHQUFHLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxjQUFjLElBQUksY0FBYyxHQUFHLHVCQUF1QixFQUFFLENBQUM7UUFDL0QsdUJBQXVCLEdBQUcsY0FBYyxDQUFDO0lBQzNDLENBQUM7SUFDRCxJQUFJLHVCQUF1QixLQUFLLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0RCxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sQ0FBQyxjQUFjLEdBQUcsdUJBQXVCLENBQUM7QUFDbEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FudmFzQ29uZmlnUmVhZG9ubHkgfSBmcm9tICcuLi9kaWFncmFtLWRyYXcuc2VydmljZSc7XG5pbXBvcnQgeyBJRGF0YURpYWdyYW1Db25maWdTdmcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nvb3JkaW5hdGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRGlhZ3JhbUVsZW1lbnQsIElEaWFncmFtRWxlbWVudEJyYW5jaCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGlhZ3JhbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTW9MaWJEaWFncmFtQ2FsY3VsYXRvckJyYW5jaFV0aWwgfSBmcm9tICcuL2NhbGN1bGF0b3ItYnJhbmNoLnV0aWwnO1xuaW1wb3J0IHsgYnVpbGRGbGF0RWxlbWVudCB9IGZyb20gJy4vZGlhZ3JhbS51dGlsJztcblxuZXhwb3J0IGNsYXNzIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JDb29yZGluYXRlc1V0aWwge1xuICBzdGF0aWMgc2V0WFlFbGVtZW50cyhlbGVtZW50czogQXJyYXk8SURpYWdyYW1FbGVtZW50PiwgY29uZmlnOiBJRGF0YURpYWdyYW1Db25maWdTdmcsIHBvc2l0aW9uWD86IG51bWJlcikge1xuICAgIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVtZW50cy5mb3JFYWNoKChjdXJyZW50RWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIChwb3NpdGlvblggPz8gMCk7XG4gICAgICBjb25zdCBwcmVFbGVtZW50ID0gZWxlbWVudHNbaW5kZXggLSAxXTtcblxuICAgICAgaWYgKHByZUVsZW1lbnQpIHtcbiAgICAgICAgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA9IChwcmVFbGVtZW50LnNwZWNpZmljX3ggPz8gMCkgKyAocHJlRWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDIgLSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMCkgLyAyO1xuICAgICAgICBjdXJyZW50RWxlbWVudC5zcGVjaWZpY195ID0gKHByZUVsZW1lbnQuc3BlY2lmaWNfeSA/PyAwKSArIChwcmVFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSArIGNoZWNrRWxlbWVudEdldEhlaWdodChwcmVFbGVtZW50Lm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICAgIGlmIChwcmVFbGVtZW50LnBvc2l0aW9uX2VuZF9icmFuY2gpIHtcbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5zcGVjaWZpY195ID0gcHJlRWxlbWVudC5wb3NpdGlvbl9lbmRfYnJhbmNoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvcCA9IGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3kgPz8gMDtcbiAgICAgIGNvbnN0IGxlZnQgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDI7XG4gICAgICBsZXQgbGluZUJldHdlZW5FbGVtZW50cyA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyBjaGVja0VsZW1lbnRHZXRIZWlnaHQoY3VycmVudEVsZW1lbnQubm9kZU90aGVyQ29uZmlnKTtcblxuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzICYmIGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICBsaW5lQmV0d2VlbkVsZW1lbnRzID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0g7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1heFkgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeSA/PyAwKSArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyAyMDA7XG4gICAgICBjb25zdCBtYXhYTGVmdCA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY194ID8/IDApICsgKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgMTAwO1xuXG4gICAgICBjb25zdCBjb25maWdTdmcgPSBjb25maWcud2lkdGhIZWlnaHRTdmdDYW52YXM7XG5cbiAgICAgIGNvbmZpZ1N2Zy5oZWlnaHRTdmcgPSBtYXhZID4gY29uZmlnU3ZnLmhlaWdodFN2ZyA/IG1heFkgOiBjb25maWdTdmcuaGVpZ2h0U3ZnO1xuICAgICAgY29uZmlnU3ZnLndpZHRoU3ZnID0gbWF4WExlZnQgPiBjb25maWdTdmcud2lkdGhTdmcgPyBtYXhYTGVmdCA6IGNvbmZpZ1N2Zy53aWR0aFN2ZztcblxuICAgICAgY2hlY2tNYXhMZWZ0KGNvbmZpZywgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCwgY3VycmVudEVsZW1lbnQuYnJhbmNoZXM/LlswXS5wb3NpdGlvbk1heExlZnQpO1xuICAgICAgaWYgKCFjdXJyZW50RWxlbWVudC5icmFuY2hlcyB8fCAhY3VycmVudEVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGPDoWMgZWxlbWVudCBraMO0bmcgY8OzIG5ow6FuaCBt4bubaSB24bq9IMSRxrDhu51uZyB0aOG6s25nXG4gICAgICAgIGNvbnN0IGRyYXdGb3JtVG9IZWlnaHRFeGl0ID0gKGN1cnJlbnRFbGVtZW50LnN1YkNvZGVPZkVsZW1lbnQgfHwgY3VycmVudEVsZW1lbnQuY29kZSkgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQgPyAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMiA6IGxpbmVCZXR3ZWVuRWxlbWVudHM7XG5cbiAgICAgICAgY3VycmVudEVsZW1lbnQuYXR0cmlidXRlU3ZnRCA9IGBNICR7bGVmdH0gJHt0b3B9IGwgMCAke2RyYXdGb3JtVG9IZWlnaHRFeGl0fWA7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50LnBvc2l0aW9uX2VuZCA9IHRvcCArIGxpbmVCZXR3ZWVuRWxlbWVudHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHdhaXRIZWlnaHQgPSBnZXRIZWlnaHRXYWl0Q29uZmlnKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VFbGVtZW50VG9XYWl0ID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRElTVEFOQ0VfVE9fV0FJVDtcbiAgICAgICAgICBjb25zdCB0b3BTdGFydExpbmUyID0gdG9wICsgZGlzdGFuY2VFbGVtZW50VG9XYWl0ICsgd2FpdEhlaWdodDtcblxuICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmF0dHJpYnV0ZVN2Z0QgPSBgTSAke2xlZnR9ICR7dG9wfSBsIDAgJHtkaXN0YW5jZUVsZW1lbnRUb1dhaXR9YDtcbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5wb3NpdGlvbl9lbmQgPSB0b3BTdGFydExpbmUyICsgbGluZUJldHdlZW5FbGVtZW50cztcblxuICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY195ID0gdG9wICsgZGlzdGFuY2VFbGVtZW50VG9XYWl0O1xuICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY194ID0gbGVmdDtcbiAgICAgICAgICBkZWxldGUgY3VycmVudEVsZW1lbnQubm9kZU90aGVyQ29uZmlnLmF0dHJpYnV0ZVN2Z0Q7XG4gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnN1YkNvZGVPZkVsZW1lbnQgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEID0gYE0gJHtsZWZ0fSAke3RvcFN0YXJ0TGluZTJ9IGwgMCAke2NhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0FJVF9UT19FTEVNRU5UfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGFydCBjw6FjIGVsZW1lbnQgY8OzIG5ow6FuaFxuICAgICAgY29uc3QgaGFsZiA9IE1hdGguY2VpbChjdXJyZW50RWxlbWVudC5icmFuY2hlcy5sZW5ndGggLyAyKTtcbiAgICAgIGNvbnN0IGFib3ZlSGFsZiA9IGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzLnNsaWNlKDAsIGhhbGYpO1xuICAgICAgY29uc3QgdW5kZXJIYWxmID0gY3VycmVudEVsZW1lbnQuYnJhbmNoZXMuc2xpY2UoaGFsZik7XG4gICAgICBsZXQgYnJhY2hNaWRkbGU6IElEaWFncmFtRWxlbWVudEJyYW5jaCB8IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGFib3ZlSGFsZi5sZW5ndGggIT09IHVuZGVySGFsZi5sZW5ndGgpIHtcbiAgICAgICAgYnJhY2hNaWRkbGUgPSBhYm92ZUhhbGYucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFTDjU5IIENISeG7gFUgQ2FvIFThu5BJIMSQQSBD4bumQSBOSMOBTkhcbiAgICAgIGNvbnN0IG1heEhlaWdodEJyYW5jaCA9IHtcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgfTtcblxuICAgICAgTW9MaWJEaWFncmFtQ2FsY3VsYXRvckNvb3JkaW5hdGVzVXRpbC5jYWxjdWxhdG9yTWF4QnJhbmNoSGVpZ2h0KGN1cnJlbnRFbGVtZW50LCBtYXhIZWlnaHRCcmFuY2gpO1xuICAgICAgY3VycmVudEVsZW1lbnQubWF4SGVpZ2h0QnJhbmNoID0gbWF4SGVpZ2h0QnJhbmNoLmhlaWdodDtcbiAgICAgIGNvbnN0IG1heFdpZHRoQnJhY2hNaWRkbGUgPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07XG4gICAgICBjb25zdCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZyA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0RFRkFVTFRfQlJBTkNIO1xuXG4gICAgICBpZiAoYnJhY2hNaWRkbGUpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdG9yV2lkdGhCcmFuY2goYnJhY2hNaWRkbGUuZWxlbWVudHMsIG1heFdpZHRoQnJhY2hNaWRkbGUpO1xuICAgICAgICBicmFjaE1pZGRsZS53aWR0aEJyYW5jaCA9IHtcbiAgICAgICAgICB3aWR0aDogbWF4V2lkdGhCcmFjaE1pZGRsZS53aWR0aCxcbiAgICAgICAgICBhYm92ZTogbWF4V2lkdGhCcmFjaE1pZGRsZS5hYm92ZVdpZHRoLFxuICAgICAgICAgIHVuZGVyOiBtYXhXaWR0aEJyYWNoTWlkZGxlLnVuZGVyV2lkdGgsXG4gICAgICAgIH07XG4gICAgICAgIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JCcmFuY2hVdGlsLmRyYXdTdHJhaWdodExpbmUobGVmdCwgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcsIHRvcCwgYnJhY2hNaWRkbGUsIG1heEhlaWdodEJyYW5jaC5oZWlnaHQsIGNvbmZpZyk7XG4gICAgICB9XG5cbiAgICAgIGxldCBoYXNOZXh0U2FtZVBhcmVudEVsZW1lbnROZXh0ID0gZmFsc2U7XG4gICAgICBjb25zdCBhYm92ZUhhbGZSZXZlcnNlID0gYWJvdmVIYWxmLnJldmVyc2UoKTtcblxuICAgICAgYWJvdmVIYWxmUmV2ZXJzZS5mb3JFYWNoKChicmFuY2gsIGluZGV4QnJhbmNoKSA9PiB7XG4gICAgICAgIGlmICghaGFzTmV4dFNhbWVQYXJlbnRFbGVtZW50TmV4dCkge1xuICAgICAgICAgIGNvbnN0IGZsYXRFbGVtZW50T25CcmFuY2g6IElEaWFncmFtRWxlbWVudFtdID0gW107XG5cbiAgICAgICAgICBidWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cywgZmxhdEVsZW1lbnRPbkJyYW5jaCk7XG5cbiAgICAgICAgICBoYXNOZXh0U2FtZVBhcmVudEVsZW1lbnROZXh0ID0gIWZsYXRFbGVtZW50T25CcmFuY2ggfHwgIWZsYXRFbGVtZW50T25CcmFuY2gubGVuZ3RoID8gdHJ1ZSA6IGZsYXRFbGVtZW50T25CcmFuY2guZmluZCgoaXRlbSkgPT4gaXRlbS5uZXh0X2lkID09PSBjdXJyZW50RWxlbWVudC5uZXh0X2lkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyYW5jaC5vblRoZVNpZGUgPSAnYWJvdmUnO1xuICAgICAgICBjb25zdCBtYXhXaWR0aEJyYW5jaCA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTsgLy8gdMOtbmggY2hp4buBdSBuZ2FuZyDEkeG7gyBjw6FjaCBuaMOhbmggdHLDqm4gb3IgZMaw4bubaVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRvcldpZHRoQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgbWF4V2lkdGhCcmFuY2gpO1xuICAgICAgICBicmFuY2gud2lkdGhCcmFuY2ggPSB7XG4gICAgICAgICAgd2lkdGg6IG1heFdpZHRoQnJhbmNoLndpZHRoLFxuICAgICAgICAgIGFib3ZlOiBtYXhXaWR0aEJyYW5jaC5hYm92ZVdpZHRoLFxuICAgICAgICAgIHVuZGVyOiBtYXhXaWR0aEJyYW5jaC51bmRlcldpZHRoLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBicmFuY2hQcmUgPSBhYm92ZUhhbGZSZXZlcnNlW2luZGV4QnJhbmNoIC0gMV07XG5cbiAgICAgICAgbGV0IGxpbmVCZXR3ZWVuQnJhbmNoID0gbWF4V2lkdGhCcmFuY2gudW5kZXJXaWR0aCArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDI7XG5cbiAgICAgICAgaWYgKGJyYW5jaFByZSkge1xuICAgICAgICAgIGxpbmVCZXR3ZWVuQnJhbmNoICs9IChicmFuY2hQcmUud2lkdGhCcmFuY2g/LndpZHRoID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFjaE1pZGRsZSkge1xuICAgICAgICAgIGxpbmVCZXR3ZWVuQnJhbmNoICs9IChicmFjaE1pZGRsZS53aWR0aEJyYW5jaD8uYWJvdmUgPz8gMCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5ow6FuaCB0csOhaVxuXG4gICAgICAgIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JCcmFuY2hVdGlsLmxlZnRMaW5lKGxlZnQsIGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nLCB0b3AsIGxpbmVCZXR3ZWVuQnJhbmNoLCBicmFuY2gsIG1heEhlaWdodEJyYW5jaC5oZWlnaHQsIGN1cnJlbnRFbGVtZW50LCBjb25maWcpO1xuICAgICAgfSk7XG5cbiAgICAgIHVuZGVySGFsZi5mb3JFYWNoKChicmFuY2gsIGluZGV4QnJhbmNoKSA9PiB7XG4gICAgICAgIGlmICghaGFzTmV4dFNhbWVQYXJlbnRFbGVtZW50TmV4dCkge1xuICAgICAgICAgIGNvbnN0IGZsYXRFbGVtZW50T25CcmFuY2g6IElEaWFncmFtRWxlbWVudFtdID0gW107XG5cbiAgICAgICAgICBidWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cywgZmxhdEVsZW1lbnRPbkJyYW5jaCk7XG5cbiAgICAgICAgICBoYXNOZXh0U2FtZVBhcmVudEVsZW1lbnROZXh0ID0gIWZsYXRFbGVtZW50T25CcmFuY2ggfHwgIWZsYXRFbGVtZW50T25CcmFuY2gubGVuZ3RoID8gdHJ1ZSA6IGZsYXRFbGVtZW50T25CcmFuY2guZmluZCgoaXRlbSkgPT4gaXRlbS5uZXh0X2lkID09PSBjdXJyZW50RWxlbWVudC5uZXh0X2lkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmFuY2gub25UaGVTaWRlID0gJ3VuZGVyJztcbiAgICAgICAgY29uc3QgbWF4V2lkdGhCcmFuY2ggPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07IC8vIHTDrW5oIGNoaeG7gXUgY2FvIMSR4buDIGPDoWNoIG5ow6FuaCB0csOqbiBvciBkxrDhu5tpXG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdG9yV2lkdGhCcmFuY2goYnJhbmNoLmVsZW1lbnRzLCBtYXhXaWR0aEJyYW5jaCk7XG4gICAgICAgIGJyYW5jaC53aWR0aEJyYW5jaCA9IHtcbiAgICAgICAgICB3aWR0aDogbWF4V2lkdGhCcmFuY2gud2lkdGgsXG4gICAgICAgICAgYWJvdmU6IG1heFdpZHRoQnJhbmNoLmFib3ZlV2lkdGgsXG4gICAgICAgICAgdW5kZXI6IG1heFdpZHRoQnJhbmNoLnVuZGVyV2lkdGgsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJyYW5jaFByZSA9IHVuZGVySGFsZltpbmRleEJyYW5jaCAtIDFdO1xuICAgICAgICBsZXQgbGluZUJldHdlZW5CcmFuY2ggPSBtYXhXaWR0aEJyYW5jaC5hYm92ZVdpZHRoICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUIC8gMjtcblxuICAgICAgICBpZiAoYnJhbmNoUHJlKSB7XG4gICAgICAgICAgbGluZUJldHdlZW5CcmFuY2ggKz0gKGJyYW5jaFByZS53aWR0aEJyYW5jaD8ud2lkdGggPz8gMCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyYWNoTWlkZGxlKSB7XG4gICAgICAgICAgbGluZUJldHdlZW5CcmFuY2ggKz0gKGJyYWNoTWlkZGxlLndpZHRoQnJhbmNoPy51bmRlciA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBuaMOhbmggcGjhuqNpXG4gICAgICAgIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JCcmFuY2hVdGlsLnJpZ2h0TGluZShsZWZ0LCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZywgdG9wLCBsaW5lQmV0d2VlbkJyYW5jaCwgYnJhbmNoLCBtYXhIZWlnaHRCcmFuY2guaGVpZ2h0LCBjdXJyZW50RWxlbWVudCwgY29uZmlnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0IHRyYW5zbGF0ZVggdsOgIHRyYW5zbGF0ZVkgxJHhu4MgY8OzIHRo4buDIHJlbmRlciBub2Rlc1xuICAgIHRoaXMuc2V0VHJhbnNsYXRlUG9zaXRpb25zKGVsZW1lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNsYXRlWCB2w6AgdHJhbnNsYXRlWSB04burIHNwZWNpZmljX3ggdsOgIHNwZWNpZmljX3kgY2hvIHThuqV0IGPhuqMgZWxlbWVudHMgKGJhbyBn4buTbSBicmFuY2hlcylcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNldFRyYW5zbGF0ZVBvc2l0aW9ucyhlbGVtZW50czogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIC8vIFNldCBwb3NpdGlvbiBjaG8gZWxlbWVudCBjaMOtbmhcbiAgICAgIGVsZW1lbnQudHJhbnNsYXRlWCA9IGVsZW1lbnQuc3BlY2lmaWNfeDtcbiAgICAgIGVsZW1lbnQudHJhbnNsYXRlWSA9IGVsZW1lbnQuc3BlY2lmaWNfeTtcblxuICAgICAgLy8gU2V0IHBvc2l0aW9uIGNobyBub2RlT3RoZXJDb25maWcgbuG6v3UgY8OzXG4gICAgICBpZiAoZWxlbWVudC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IChlbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDI7XG5cbiAgICAgICAgZWxlbWVudC5ub2RlT3RoZXJDb25maWcudHJhbnNsYXRlWCA9IChlbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY194ID8/IDApIC0gb2Zmc2V0WDtcbiAgICAgICAgZWxlbWVudC5ub2RlT3RoZXJDb25maWcudHJhbnNsYXRlWSA9IGVsZW1lbnQubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3k7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNldCBwb3NpdGlvbnMgY2hvIGVsZW1lbnRzIHRyb25nIGJyYW5jaGVzXG4gICAgICBpZiAoZWxlbWVudC5icmFuY2hlcyAmJiBlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgICAvLyBTZXQgcG9zaXRpb24gY2hvIGJyYW5jaCBub2RlT3RoZXJDb25maWcgbuG6v3UgY8OzXG4gICAgICAgICAgaWYgKGJyYW5jaC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFggPSAoYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDI7XG4gICAgICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnRyYW5zbGF0ZVggPSAoYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY194ID8/IDApIC0gb2Zmc2V0WDtcbiAgICAgICAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcudHJhbnNsYXRlWSA9IGJyYW5jaC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBzZXQgcG9zaXRpb25zIGNobyBlbGVtZW50cyB0cm9uZyBicmFuY2hcbiAgICAgICAgICBpZiAoYnJhbmNoLmVsZW1lbnRzICYmIGJyYW5jaC5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRyYW5zbGF0ZVBvc2l0aW9ucyhicmFuY2guZWxlbWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgY2FsY3VsYXRvck1heEJyYW5jaEhlaWdodChlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIG1heEhlaWdodEJyYW5jaDogeyBoZWlnaHQ6IG51bWJlciB9KSB7XG4gICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzIHx8ICFlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuYnJhbmNoZXMuZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBsaW5lQnJhbmNoTm9IYXNFbGVtZW50ID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dJRFRIX0RFRkFVTFRfQlJBTkNIX1dIRU5fTk9UX0VMRU1FTlQ7XG5cbiAgICAgICAgbWF4SGVpZ2h0QnJhbmNoLmhlaWdodCA9IGxpbmVCcmFuY2hOb0hhc0VsZW1lbnQgPiBtYXhIZWlnaHRCcmFuY2guaGVpZ2h0ID8gbGluZUJyYW5jaE5vSGFzRWxlbWVudCA6IG1heEhlaWdodEJyYW5jaC5oZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3RhbCA9IHtcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5wbHVzSGVpZ2h0RWxlbWVudEluQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgdG90YWwpO1xuICAgICAgbWF4SGVpZ2h0QnJhbmNoLmhlaWdodCA9IHRvdGFsLmhlaWdodCA+IG1heEhlaWdodEJyYW5jaC5oZWlnaHQgPyB0b3RhbC5oZWlnaHQgOiBtYXhIZWlnaHRCcmFuY2guaGVpZ2h0O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHBsdXNIZWlnaHRFbGVtZW50SW5CcmFuY2goZWxlbWVudHM6IElEaWFncmFtRWxlbWVudFtdLCB0b3RhbDogeyBoZWlnaHQ6IG51bWJlciB9KSB7XG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgbWFyZ2luID0gIWVsZW1lbnQuYnJhbmNoZXMgfHwgIWVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoID8gY2hlY2tFbGVtZW50R2V0SGVpZ2h0KGVsZW1lbnQubm9kZU90aGVyQ29uZmlnKSA6IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0g7XG5cbiAgICAgIHRvdGFsLmhlaWdodCArPSAoZWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyBtYXJnaW47XG4gICAgICBpZiAoIWVsZW1lbnQuYnJhbmNoZXMgfHwgIWVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRvdGFsLmhlaWdodCArPSA2NDsgLy8gdOG7qyBjaGnhu4F1IMSRxrDhu51uZyB0aOG6s25nIG5nYW5nIHh14buRbmcgxJHhur9uIG5ow6FuaCDEkeG6p3UgdGnDqm5cbiAgICAgIGNvbnN0IHRoZU1vc3RFbGVtZW50c0luQnJhbmNoID0ge1xuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICB9O1xuXG4gICAgICBlbGVtZW50LmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgICBjb25zdCBoZWlnaHRJbkJyYW5jaCA9IHsgaGVpZ2h0OiAwIH07XG5cbiAgICAgICAgaGVpZ2h0SW5CcmFuY2guaGVpZ2h0ICs9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0hfVE9fRUxFTUVOVF9GSVJTVCArIDIwOyAvLyDEkcaw4budbmcgY29uZyBr4bq/dCB0aMO6YyBuaMOhbmggKyAxMHB4IMSRxrDhu51uZyBjb25nXG4gICAgICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgaGVpZ2h0SW5CcmFuY2guaGVpZ2h0ICs9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XSURUSF9ERUZBVUxUX0JSQU5DSF9XSEVOX05PVF9FTEVNRU5UO1xuXG4gICAgICAgICAgaWYgKHRoZU1vc3RFbGVtZW50c0luQnJhbmNoLmhlaWdodCA8IGhlaWdodEluQnJhbmNoLmhlaWdodCkge1xuICAgICAgICAgICAgdGhlTW9zdEVsZW1lbnRzSW5CcmFuY2guaGVpZ2h0ID0gaGVpZ2h0SW5CcmFuY2guaGVpZ2h0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBsdXNIZWlnaHRFbGVtZW50SW5CcmFuY2goYnJhbmNoLmVsZW1lbnRzLCBoZWlnaHRJbkJyYW5jaCk7XG4gICAgICAgIGlmICh0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQgPCBoZWlnaHRJbkJyYW5jaC5oZWlnaHQpIHtcbiAgICAgICAgICB0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQgPSBoZWlnaHRJbkJyYW5jaC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0b3RhbC5oZWlnaHQgKz0gdGhlTW9zdEVsZW1lbnRzSW5CcmFuY2guaGVpZ2h0O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGNhbGN1bGF0b3JXaWR0aEJyYW5jaChlbGVtZW50czogSURpYWdyYW1FbGVtZW50W10gfCB1bmRlZmluZWQsIG1heFdpZHRoOiB7IHdpZHRoOiBudW1iZXI7IGFib3ZlV2lkdGg6IG51bWJlcjsgdW5kZXJXaWR0aDogbnVtYmVyIH0sIGxvZz86IGJvb2xlYW4pIHtcbiAgICBpZiAoIWVsZW1lbnRzIHx8ICFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ERUZBVUxUX0JSQU5DSF9XSEVOX05PX0VMRU1FTlQ7XG5cbiAgICAgIG1heFdpZHRoLndpZHRoID0gd2lkdGg7XG4gICAgICBtYXhXaWR0aC5hYm92ZVdpZHRoID0gd2lkdGggLyAyO1xuICAgICAgbWF4V2lkdGgudW5kZXJXaWR0aCA9IHdpZHRoIC8gMjtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heFdpZHRoSW5FbGVtZW50cyA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcblxuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICghZWxlbWVudC5icmFuY2hlcyB8fCAhZWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gdMOtbmggY2hp4buBdSBjYW8gY+G7p2EgdOG7q25nIGVsZW1lbnQgMSwgdsOsIGNoaeG7gXUgY2FvIGPhu6dhIHThu6tuZyB0aOG6sW5nIGPDsyB0aOG7gyBraMOhYyBuaGF1XG4gICAgICAgIGlmICgoZWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSA8IG1heFdpZHRoSW5FbGVtZW50cy53aWR0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3aWR0aCA9IGVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMDtcblxuICAgICAgICBtYXhXaWR0aEluRWxlbWVudHMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgICAgIG1heFdpZHRoSW5FbGVtZW50cy51bmRlcldpZHRoID0gd2lkdGggLyAyO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdpZHRoRWxlbWVudEluY2x1ZGVCcmFuY2ggPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07XG4gICAgICBjb25zdCB3aWR0aCA9IGVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMDtcblxuICAgICAgaWYgKHdpZHRoID4gd2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC53aWR0aCkge1xuICAgICAgICB3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHdpZHRoRWxlbWVudEluY2x1ZGVCcmFuY2guYWJvdmVXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgICAgd2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC51bmRlcldpZHRoID0gd2lkdGggLyAyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYWxmID0gTWF0aC5jZWlsKGVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoIC8gMik7XG4gICAgICBjb25zdCBhYm92ZUhhbGYgPSBlbGVtZW50LmJyYW5jaGVzLnNsaWNlKDAsIGhhbGYpO1xuICAgICAgY29uc3QgdW5kZXJIYWxmID0gZWxlbWVudC5icmFuY2hlcy5zbGljZShoYWxmKTtcbiAgICAgIGxldCBicmFjaE1pZGRsZTtcblxuICAgICAgaWYgKGFib3ZlSGFsZi5sZW5ndGggIT09IHVuZGVySGFsZi5sZW5ndGgpIHtcbiAgICAgICAgYnJhY2hNaWRkbGUgPSBhYm92ZUhhbGYucG9wKCk7XG4gICAgICB9XG4gICAgICBpZiAoYnJhY2hNaWRkbGUpIHtcbiAgICAgICAgYnJhY2hNaWRkbGUub25UaGVTaWRlID0gJ2NlbnRlcic7XG4gICAgICB9XG4gICAgICBhYm92ZUhhbGYuZm9yRWFjaCgoYnJhbmNoKSA9PiAoYnJhbmNoLm9uVGhlU2lkZSA9ICdhYm92ZScpKTtcbiAgICAgIHVuZGVySGFsZi5mb3JFYWNoKChicmFuY2gpID0+IChicmFuY2gub25UaGVTaWRlID0gJ3VuZGVyJykpO1xuXG4gICAgICAvLyB0w61uaCBjaGnhu4F1IGNhbyBj4bunYSB04burbmcgbmjDoW5oIDEsIHLhu5NpIHTDrW5oIHThu5VuZyA9PiBzbyBzw6FuaCB24bubaSBjaGnhu4F1IGNhbyB4ZW0gZWxlbWVudCBjw7MgbmjDoW5oIG7DoG8gY2FvIG5o4bqldCB0aMOsIGzhuqV5XG4gICAgICBjb25zdCB3aWR0aEJyYW5jaCA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcblxuICAgICAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07IC8vIHTDrW5oIGNoaeG7gXUgY2FvIGPhu6dhIHThu6tuZyBuaMOhbmggMVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRvcldpZHRoQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgd2lkdGgsIGxvZyk7XG4gICAgICAgIHN3aXRjaCAoYnJhbmNoLm9uVGhlU2lkZSkge1xuICAgICAgICAgIGNhc2UgJ2Fib3ZlJzpcbiAgICAgICAgICAgIHdpZHRoQnJhbmNoLmFib3ZlV2lkdGggKz0gd2lkdGgud2lkdGg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3VuZGVyJzpcbiAgICAgICAgICAgIHdpZHRoQnJhbmNoLnVuZGVyV2lkdGggKz0gd2lkdGgud2lkdGg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICB3aWR0aEJyYW5jaC5hYm92ZVdpZHRoICs9IHdpZHRoLmFib3ZlV2lkdGg7XG4gICAgICAgICAgICB3aWR0aEJyYW5jaC51bmRlcldpZHRoICs9IHdpZHRoLnVuZGVyV2lkdGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1hcmdpbkJldHdlZW5CcmFuY2ggPSAoZWxlbWVudC5icmFuY2hlcy5sZW5ndGggLSAxKSAqIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVDtcblxuICAgICAgd2lkdGhCcmFuY2guYWJvdmVXaWR0aCArPSBtYXJnaW5CZXR3ZWVuQnJhbmNoIC8gMjtcbiAgICAgIHdpZHRoQnJhbmNoLnVuZGVyV2lkdGggKz0gbWFyZ2luQmV0d2VlbkJyYW5jaCAvIDI7XG4gICAgICBjb25zdCBtYXhBYm92ZVdpZHRoID0gTWF0aC5tYXgod2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC5hYm92ZVdpZHRoLCB3aWR0aEJyYW5jaC5hYm92ZVdpZHRoKTtcbiAgICAgIGNvbnN0IG1heFVuZGVyV2lkdGggPSBNYXRoLm1heCh3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLnVuZGVyV2lkdGgsIHdpZHRoQnJhbmNoLnVuZGVyV2lkdGgpO1xuXG4gICAgICBpZiAobWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggPCBtYXhBYm92ZVdpZHRoKSB7XG4gICAgICAgIG1heFdpZHRoSW5FbGVtZW50cy5hYm92ZVdpZHRoID0gbWF4QWJvdmVXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aEluRWxlbWVudHMudW5kZXJXaWR0aCA8IG1heFVuZGVyV2lkdGgpIHtcbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLnVuZGVyV2lkdGggPSBtYXhVbmRlcldpZHRoO1xuICAgICAgfVxuXG4gICAgICBtYXhXaWR0aEluRWxlbWVudHMud2lkdGggPSBtYXhXaWR0aEluRWxlbWVudHMuYWJvdmVXaWR0aCArIG1heFdpZHRoSW5FbGVtZW50cy51bmRlcldpZHRoO1xuICAgIH0pO1xuXG4gICAgbWF4V2lkdGgud2lkdGggKz0gbWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggKyBtYXhXaWR0aEluRWxlbWVudHMudW5kZXJXaWR0aDtcbiAgICBtYXhXaWR0aC5hYm92ZVdpZHRoICs9IG1heFdpZHRoSW5FbGVtZW50cy5hYm92ZVdpZHRoO1xuICAgIG1heFdpZHRoLnVuZGVyV2lkdGggKz0gbWF4V2lkdGhJbkVsZW1lbnRzLnVuZGVyV2lkdGg7XG4gIH1cbn1cblxuY29uc3QgY2hlY2tFbGVtZW50R2V0SGVpZ2h0ID0gKGhhc1dhaXRDb25maWc/OiBJRGlhZ3JhbUVsZW1lbnQpID0+IHtcbiAgaWYgKGhhc1dhaXRDb25maWcpIHtcbiAgICByZXR1cm4gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ESVNUQU5DRV9UT19XQUlUICsgZ2V0SGVpZ2h0V2FpdENvbmZpZyhoYXNXYWl0Q29uZmlnKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0FJVF9UT19FTEVNRU5UO1xuICB9XG5cbiAgcmV0dXJuIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXN0YW5jZUZyb21CcmFuY2hUb0ZpcnN0QmxvY2sgPSAoaGFzV2FpdENvbmZpZz86IElEaWFncmFtRWxlbWVudCkgPT4ge1xuICBpZiAoaGFzV2FpdENvbmZpZykge1xuICAgIHJldHVybiBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1RPX1dBSVQgKyBnZXRIZWlnaHRXYWl0Q29uZmlnKGhhc1dhaXRDb25maWcpICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5XQUlUX1RPX0VMRU1FTlQ7XG4gIH1cblxuICByZXR1cm4gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9ERUZBVUxUX0JSQU5DSF9UT19FTEVNRU5UX0ZJUlNUO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhlaWdodFdhaXRDb25maWcgPSAoaGFzV2FpdENvbmZpZz86IElEaWFncmFtRWxlbWVudCkgPT4ge1xuICBpZiAoaGFzV2FpdENvbmZpZykge1xuICAgIHJldHVybiAoaGFzV2FpdENvbmZpZy5zcGVjaWZpY19oZWlnaHQgPz8gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dBSVRfREVGQVVMVCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1dBSVRfVE9fTkVYVF9MSU5FO1xuICB9XG5cbiAgcmV0dXJuIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XQUlUX0RFRkFVTFQgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1dBSVRfVE9fTkVYVF9MSU5FO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTWF4TGVmdCA9IChjb25maWc6IElEYXRhRGlhZ3JhbUNvbmZpZ1N2Zywgc3BlY2lmaWNfeDogbnVtYmVyIHwgdW5kZWZpbmVkLCBwb3NpdGlvbk1heExlZnQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4ge1xuICBsZXQgbnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPSBjb25maWcucG9zaXRpb25NYXhMZWZ0O1xuXG4gIGlmIChudW1iZXJUcmFuc2xhdGVQb3NpdGlvbiA9PT0gMCAmJiBzcGVjaWZpY194ICYmIHNwZWNpZmljX3ggPiAwICYmIHNwZWNpZmljX3ggPCA1MCkge1xuICAgIG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID0gLTUwO1xuICB9XG5cbiAgaWYgKHNwZWNpZmljX3ggJiYgc3BlY2lmaWNfeCA8IG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uKSB7XG4gICAgbnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPSBzcGVjaWZpY194O1xuICB9XG5cbiAgaWYgKHBvc2l0aW9uTWF4TGVmdCAmJiBwb3NpdGlvbk1heExlZnQgPCBudW1iZXJUcmFuc2xhdGVQb3NpdGlvbikge1xuICAgIG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID0gcG9zaXRpb25NYXhMZWZ0O1xuICB9XG4gIGlmIChudW1iZXJUcmFuc2xhdGVQb3NpdGlvbiA9PT0gY29uZmlnLnBvc2l0aW9uTWF4TGVmdCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25maWcucG9zaXRpb25NYXhMZWZ0ID0gbnVtYmVyVHJhbnNsYXRlUG9zaXRpb247XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tNYXhUb3AgPSAoY29uZmlnOiBJRGF0YURpYWdyYW1Db25maWdTdmcsIHNwZWNpZmljX3k6IG51bWJlciB8IHVuZGVmaW5lZCwgcG9zaXRpb25NYXhUb3A6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4ge1xuICBsZXQgbnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPSBjb25maWcucG9zaXRpb25NYXhUb3A7XG5cbiAgaWYgKG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID09PSAwICYmIHNwZWNpZmljX3kgJiYgc3BlY2lmaWNfeSA+IDAgJiYgc3BlY2lmaWNfeSA8IDEwMCkge1xuICAgIG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID0gc3BlY2lmaWNfeSAtIDEyMDtcbiAgfVxuXG4gIGlmIChzcGVjaWZpY195ICYmIHNwZWNpZmljX3kgPCBudW1iZXJUcmFuc2xhdGVQb3NpdGlvbikge1xuICAgIG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID0gc3BlY2lmaWNfeTtcbiAgfVxuXG4gIGlmIChwb3NpdGlvbk1heFRvcCAmJiBwb3NpdGlvbk1heFRvcCA8IG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uKSB7XG4gICAgbnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPSBwb3NpdGlvbk1heFRvcDtcbiAgfVxuICBpZiAobnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPT09IGNvbmZpZy5wb3NpdGlvbk1heFRvcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25maWcucG9zaXRpb25NYXhUb3AgPSBudW1iZXJUcmFuc2xhdGVQb3NpdGlvbjtcbn07XG4iXX0=
@@ -0,0 +1,176 @@
1
+ export class LibsUiDiagramDrawCanvasUtil {
2
+ static buildFlatElement(elements, flatElementsContainer) {
3
+ elements.forEach((element) => {
4
+ flatElementsContainer.push(element);
5
+ if (!element.branches || !element.branches.length) {
6
+ return;
7
+ }
8
+ LibsUiDiagramDrawCanvasUtil.flatElementHasBranch(element, flatElementsContainer);
9
+ });
10
+ }
11
+ static flatElementHasBranch(element, flatElementsContainer) {
12
+ if (!element.branches || !element.branches.length) {
13
+ return;
14
+ }
15
+ element.branches.forEach((branch) => {
16
+ if (!branch.elements || !branch.elements.length) {
17
+ return;
18
+ }
19
+ LibsUiDiagramDrawCanvasUtil.buildFlatElement(branch.elements, flatElementsContainer);
20
+ });
21
+ }
22
+ static getDefaultStorageBranchEndCount() {
23
+ return { branchContainer: undefined, count: 0, branchEmpty: 0 };
24
+ }
25
+ /**
26
+ * data: sử dụng reference Object type nên count sẽ đệ quy cho đến node cuối cùng
27
+ * data.branchContainer: branch cuối cùng của element không next đến idElement
28
+ * data.count: số lượng branch có next_id đến idElement
29
+ */
30
+ static getBranchContainerAndCountElementHasNextIdToElement(element, idElement, data, flowFlatElements) {
31
+ if (!element || !element.branches) {
32
+ return;
33
+ }
34
+ element.branches.forEach((branch) => {
35
+ if (!branch.elements || !branch.elements.length) {
36
+ data.count++;
37
+ data.branchContainer = branch;
38
+ data.branchEmpty++;
39
+ return;
40
+ }
41
+ const lastElement = branch.elements[branch.elements.length - 1];
42
+ if (!lastElement.next_id) {
43
+ return;
44
+ }
45
+ if (lastElement.branches && lastElement.branches.length) {
46
+ const dataOfLastElement = this.getDefaultStorageBranchEndCount();
47
+ LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(lastElement, idElement, dataOfLastElement, flowFlatElements);
48
+ if (!dataOfLastElement.count) {
49
+ lastElement.next_id = '';
50
+ return;
51
+ }
52
+ data.count++;
53
+ data.branchContainer = branch;
54
+ if (dataOfLastElement.count === 1) {
55
+ return (data.branchContainer = dataOfLastElement.branchContainer);
56
+ }
57
+ return;
58
+ }
59
+ const nextOfLastElement = flowFlatElements.find((el) => el.id === lastElement.next_id);
60
+ if (nextOfLastElement && nextOfLastElement.id !== idElement) {
61
+ return;
62
+ }
63
+ data.count++;
64
+ data.branchContainer = branch;
65
+ return;
66
+ });
67
+ }
68
+ static getElementHasCurrentBranchOrCurrentElement(currentBranch, currentElement, flatElements) {
69
+ const data = {
70
+ currentBranch: undefined,
71
+ element: undefined,
72
+ };
73
+ if (!flatElements || !flatElements.length || (!currentBranch && !currentElement)) {
74
+ return data;
75
+ }
76
+ if (!currentElement) {
77
+ data.currentBranch = currentBranch;
78
+ data.element = flatElements.find((el) => el.branches && !!el.branches.find((branch) => branch === currentBranch));
79
+ return data;
80
+ }
81
+ const elementsHasBranches = flatElements.filter((item) => item.branches && item.branches.length);
82
+ if (!elementsHasBranches) {
83
+ return data;
84
+ }
85
+ for (const element of elementsHasBranches) {
86
+ const branches = element.branches;
87
+ if (!branches) {
88
+ return data;
89
+ }
90
+ for (const branch of branches) {
91
+ if (!branch.elements || !branch.elements.length) {
92
+ continue;
93
+ }
94
+ if (branch.elements.find((item) => item.id === currentElement.id)) {
95
+ data.currentBranch = branch;
96
+ data.element = element;
97
+ return data;
98
+ }
99
+ }
100
+ }
101
+ return data;
102
+ }
103
+ static findAndDeleteElementFromContainer(containerElement, elementDelete) {
104
+ for (const index in containerElement) {
105
+ const elementOfIndex = containerElement[index];
106
+ if (elementOfIndex.id === elementDelete.id) {
107
+ containerElement.splice(+index, 1);
108
+ return true;
109
+ }
110
+ if (!elementOfIndex.branches || !elementOfIndex.branches.length) {
111
+ continue;
112
+ }
113
+ for (const branch of elementOfIndex.branches) {
114
+ if (!branch.elements || !branch.elements.length) {
115
+ continue;
116
+ }
117
+ if (this.findAndDeleteElementFromContainer(branch.elements, elementDelete)) {
118
+ return true;
119
+ }
120
+ }
121
+ }
122
+ return false;
123
+ }
124
+ static getBranchOfElement(elementId, flatElements, elementTypeWorkflow) {
125
+ const flatElementHasBranch = flatElements.filter((item) => item.element_type === elementTypeWorkflow);
126
+ if (!flatElementHasBranch) {
127
+ return;
128
+ }
129
+ for (const item of flatElementHasBranch) {
130
+ if (!item.branches || !item.branches.length) {
131
+ continue;
132
+ }
133
+ for (const branch of item.branches) {
134
+ const index = branch.elements.findIndex((el) => el.id === elementId);
135
+ if (index === -1) {
136
+ continue;
137
+ }
138
+ return branch;
139
+ }
140
+ }
141
+ return;
142
+ }
143
+ }
144
+ export const getDefaultConfigConstituentBranches = (code, dataDefault) => {
145
+ dataDefault.branches = [
146
+ {
147
+ elements: [],
148
+ },
149
+ {
150
+ elements: [],
151
+ },
152
+ ];
153
+ return dataDefault;
154
+ };
155
+ export const findAndDeleteElementFromContainer = (containerElement, elementDelete) => {
156
+ for (const index in containerElement) {
157
+ const elementOfIndex = containerElement[index];
158
+ if (elementOfIndex.id === elementDelete.id) {
159
+ containerElement.splice(+index, 1);
160
+ return true;
161
+ }
162
+ if (!elementOfIndex.branches || !elementOfIndex.branches.length) {
163
+ continue;
164
+ }
165
+ for (const branch of elementOfIndex.branches) {
166
+ if (!branch.elements || !branch.elements.length) {
167
+ continue;
168
+ }
169
+ if (findAndDeleteElementFromContainer(branch.elements, elementDelete)) {
170
+ return true;
171
+ }
172
+ }
173
+ }
174
+ return false;
175
+ };
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvdXRpbHMvY2FudmFzLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBZ0MsRUFBRSxxQkFBNkM7UUFDckcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xELE9BQU87WUFDVCxDQUFDO1lBQ0QsMkJBQTJCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQXdCLEVBQUUscUJBQTZDO1FBQ2pHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoRCxPQUFPO1lBQ1QsQ0FBQztZQUNELDJCQUEyQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUE2QixFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDNUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lB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RSxFQUFFLENBQUM7WUFDM0MsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRW5DLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRSxTQUFTO1FBQ1gsQ0FBQztRQUVELEtBQUssTUFBTSxNQUFNLElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEQsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElCcmFuY2hFbmRDb3VudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FudmFzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRGlhZ3JhbUVsZW1lbnQsIElEaWFncmFtRWxlbWVudEJyYW5jaCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGlhZ3JhbS5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsIHtcbiAgc3RhdGljIGJ1aWxkRmxhdEVsZW1lbnQoZWxlbWVudHM6IEFycmF5PElEaWFncmFtRWxlbWVudD4sIGZsYXRFbGVtZW50c0NvbnRhaW5lcjogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGZsYXRFbGVtZW50c0NvbnRhaW5lci5wdXNoKGVsZW1lbnQpO1xuICAgICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzIHx8ICFlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZmxhdEVsZW1lbnRIYXNCcmFuY2goZWxlbWVudCwgZmxhdEVsZW1lbnRzQ29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmbGF0RWxlbWVudEhhc0JyYW5jaChlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIGZsYXRFbGVtZW50c0NvbnRhaW5lcjogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGlmICghZWxlbWVudC5icmFuY2hlcyB8fCAhZWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5idWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cyBhcyBJRGlhZ3JhbUVsZW1lbnRbXSwgZmxhdEVsZW1lbnRzQ29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXREZWZhdWx0U3RvcmFnZUJyYW5jaEVuZENvdW50KCk6IElCcmFuY2hFbmRDb3VudCB7XG4gICAgcmV0dXJuIHsgYnJhbmNoQ29udGFpbmVyOiB1bmRlZmluZWQsIGNvdW50OiAwLCBicmFuY2hFbXB0eTogMCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGRhdGE6IHPhu60gZOG7pW5nIHJlZmVyZW5jZSBPYmplY3QgdHlwZSBuw6puIGNvdW50IHPhur0gxJHhu4cgcXV5IGNobyDEkeG6v24gbm9kZSBjdeG7kWkgY8O5bmdcbiAgICogZGF0YS5icmFuY2hDb250YWluZXI6IGJyYW5jaCBjdeG7kWkgY8O5bmcgY+G7p2EgZWxlbWVudCBraMO0bmcgbmV4dCDEkeG6v24gaWRFbGVtZW50XG4gICAqIGRhdGEuY291bnQ6IHPhu5EgbMaw4bujbmcgYnJhbmNoIGPDsyBuZXh0X2lkIMSR4bq/biBpZEVsZW1lbnRcbiAgICovXG4gIHN0YXRpYyBnZXRCcmFuY2hDb250YWluZXJBbmRDb3VudEVsZW1lbnRIYXNOZXh0SWRUb0VsZW1lbnQoZWxlbWVudDogSURpYWdyYW1FbGVtZW50LCBpZEVsZW1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGF0YTogSUJyYW5jaEVuZENvdW50LCBmbG93RmxhdEVsZW1lbnRzOiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+KSB7XG4gICAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmJyYW5jaGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuYnJhbmNoZXMuZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBkYXRhLmNvdW50Kys7XG4gICAgICAgIGRhdGEuYnJhbmNoQ29udGFpbmVyID0gYnJhbmNoO1xuICAgICAgICBkYXRhLmJyYW5jaEVtcHR5Kys7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBicmFuY2guZWxlbWVudHNbYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoIWxhc3RFbGVtZW50Lm5leHRfaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RFbGVtZW50LmJyYW5jaGVzICYmIGxhc3RFbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkYXRhT2ZMYXN0RWxlbWVudCA9IHRoaXMuZ2V0RGVmYXVsdFN0b3JhZ2VCcmFuY2hFbmRDb3VudCgpO1xuXG4gICAgICAgIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5nZXRCcmFuY2hDb250YWluZXJBbmRDb3VudEVsZW1lbnRIYXNOZXh0SWRUb0VsZW1lbnQobGFzdEVsZW1lbnQgYXMgSURpYWdyYW1FbGVtZW50LCBpZEVsZW1lbnQsIGRhdGFPZkxhc3RFbGVtZW50LCBmbG93RmxhdEVsZW1lbnRzKTtcbiAgICAgICAgaWYgKCFkYXRhT2ZMYXN0RWxlbWVudC5jb3VudCkge1xuICAgICAgICAgIGxhc3RFbGVtZW50Lm5leHRfaWQgPSAnJztcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmNvdW50Kys7XG4gICAgICAgIGRhdGEuYnJhbmNoQ29udGFpbmVyID0gYnJhbmNoO1xuICAgICAgICBpZiAoZGF0YU9mTGFzdEVsZW1lbnQuY291bnQgPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gKGRhdGEuYnJhbmNoQ29udGFpbmVyID0gZGF0YU9mTGFzdEVsZW1lbnQuYnJhbmNoQ29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5leHRPZkxhc3RFbGVtZW50ID0gZmxvd0ZsYXRFbGVtZW50cy5maW5kKChlbCkgPT4gZWwuaWQgPT09IGxhc3RFbGVtZW50Lm5leHRfaWQpO1xuXG4gICAgICBpZiAobmV4dE9mTGFzdEVsZW1lbnQgJiYgbmV4dE9mTGFzdEVsZW1lbnQuaWQgIT09IGlkRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkYXRhLmNvdW50Kys7XG4gICAgICBkYXRhLmJyYW5jaENvbnRhaW5lciA9IGJyYW5jaDtcblxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldEVsZW1lbnRIYXNDdXJyZW50QnJhbmNoT3JDdXJyZW50RWxlbWVudChjdXJyZW50QnJhbmNoPzogSURpYWdyYW1FbGVtZW50QnJhbmNoLCBjdXJyZW50RWxlbWVudD86IElEaWFncmFtRWxlbWVudCwgZmxhdEVsZW1lbnRzPzogQXJyYXk8SURpYWdyYW1FbGVtZW50Pik6IHsgY3VycmVudEJyYW5jaD86IElEaWFncmFtRWxlbWVudEJyYW5jaDsgZWxlbWVudD86IElEaWFncmFtRWxlbWVudCB9IHtcbiAgICBjb25zdCBkYXRhOiB7IGN1cnJlbnRCcmFuY2g/OiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2g7IGVsZW1lbnQ/OiBJRGlhZ3JhbUVsZW1lbnQgfSA9IHtcbiAgICAgIGN1cnJlbnRCcmFuY2g6IHVuZGVmaW5lZCxcbiAgICAgIGVsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgaWYgKCFmbGF0RWxlbWVudHMgfHwgIWZsYXRFbGVtZW50cy5sZW5ndGggfHwgKCFjdXJyZW50QnJhbmNoICYmICFjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmICghY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIGRhdGEuY3VycmVudEJyYW5jaCA9IGN1cnJlbnRCcmFuY2g7XG4gICAgICBkYXRhLmVsZW1lbnQgPSBmbGF0RWxlbWVudHMuZmluZCgoZWwpID0+IGVsLmJyYW5jaGVzICYmICEhZWwuYnJhbmNoZXMuZmluZCgoYnJhbmNoKSA9PiBicmFuY2ggPT09IGN1cnJlbnRCcmFuY2gpKTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRzSGFzQnJhbmNoZXMgPSBmbGF0RWxlbWVudHMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmJyYW5jaGVzICYmIGl0ZW0uYnJhbmNoZXMubGVuZ3RoKTtcblxuICAgIGlmICghZWxlbWVudHNIYXNCcmFuY2hlcykge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c0hhc0JyYW5jaGVzKSB7XG4gICAgICBjb25zdCBicmFuY2hlcyA9IGVsZW1lbnQuYnJhbmNoZXM7XG5cbiAgICAgIGlmICghYnJhbmNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBicmFuY2hlcykge1xuICAgICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFuY2guZWxlbWVudHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gY3VycmVudEVsZW1lbnQuaWQpKSB7XG4gICAgICAgICAgZGF0YS5jdXJyZW50QnJhbmNoID0gYnJhbmNoO1xuICAgICAgICAgIGRhdGEuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc3RhdGljIGZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lcihjb250YWluZXJFbGVtZW50OiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBlbGVtZW50RGVsZXRlOiBJRGlhZ3JhbUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGluZGV4IGluIGNvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRPZkluZGV4ID0gY29udGFpbmVyRWxlbWVudFtpbmRleF07XG5cbiAgICAgIGlmIChlbGVtZW50T2ZJbmRleC5pZCA9PT0gZWxlbWVudERlbGV0ZS5pZCkge1xuICAgICAgICBjb250YWluZXJFbGVtZW50LnNwbGljZSgraW5kZXgsIDEpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFlbGVtZW50T2ZJbmRleC5icmFuY2hlcyB8fCAhZWxlbWVudE9mSW5kZXguYnJhbmNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBlbGVtZW50T2ZJbmRleC5icmFuY2hlcykge1xuICAgICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lcihicmFuY2guZWxlbWVudHMsIGVsZW1lbnREZWxldGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEJyYW5jaE9mRWxlbWVudChlbGVtZW50SWQ6IHN0cmluZywgZmxhdEVsZW1lbnRzOiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBlbGVtZW50VHlwZVdvcmtmbG93OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmbGF0RWxlbWVudEhhc0JyYW5jaCA9IGZsYXRFbGVtZW50cy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZWxlbWVudF90eXBlID09PSBlbGVtZW50VHlwZVdvcmtmbG93KTtcblxuICAgIGlmICghZmxhdEVsZW1lbnRIYXNCcmFuY2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmxhdEVsZW1lbnRIYXNCcmFuY2gpIHtcbiAgICAgIGlmICghaXRlbS5icmFuY2hlcyB8fCAhaXRlbS5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBpdGVtLmJyYW5jaGVzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYnJhbmNoLmVsZW1lbnRzLmZpbmRJbmRleCgoZWwpID0+IGVsLmlkID09PSBlbGVtZW50SWQpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBicmFuY2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0Q29uZmlnQ29uc3RpdHVlbnRCcmFuY2hlcyA9IChjb2RlOiBzdHJpbmcsIGRhdGFEZWZhdWx0OiBJRGlhZ3JhbUVsZW1lbnQpID0+IHtcbiAgZGF0YURlZmF1bHQuYnJhbmNoZXMgPSBbXG4gICAge1xuICAgICAgZWxlbWVudHM6IFtdLFxuICAgIH0sXG4gICAge1xuICAgICAgZWxlbWVudHM6IFtdLFxuICAgIH0sXG4gIF07XG5cbiAgcmV0dXJuIGRhdGFEZWZhdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lciA9IChjb250YWluZXJFbGVtZW50OiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBlbGVtZW50RGVsZXRlOiBJRGlhZ3JhbUVsZW1lbnQpOiBib29sZWFuID0+IHtcbiAgZm9yIChjb25zdCBpbmRleCBpbiBjb250YWluZXJFbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudE9mSW5kZXggPSBjb250YWluZXJFbGVtZW50W2luZGV4XTtcblxuICAgIGlmIChlbGVtZW50T2ZJbmRleC5pZCA9PT0gZWxlbWVudERlbGV0ZS5pZCkge1xuICAgICAgY29udGFpbmVyRWxlbWVudC5zcGxpY2UoK2luZGV4LCAxKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghZWxlbWVudE9mSW5kZXguYnJhbmNoZXMgfHwgIWVsZW1lbnRPZkluZGV4LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBicmFuY2ggb2YgZWxlbWVudE9mSW5kZXguYnJhbmNoZXMpIHtcbiAgICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lcihicmFuY2guZWxlbWVudHMsIGVsZW1lbnREZWxldGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4iXX0=