@plait/core 0.52.0 → 0.54.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.
Files changed (56) hide show
  1. package/constants/cursor.d.ts +1 -0
  2. package/constants/selection.d.ts +1 -0
  3. package/esm2022/board/board.component.mjs +8 -6
  4. package/esm2022/constants/cursor.mjs +2 -1
  5. package/esm2022/constants/selection.mjs +2 -1
  6. package/esm2022/interfaces/board.mjs +5 -1
  7. package/esm2022/interfaces/path.mjs +2 -2
  8. package/esm2022/interfaces/rectangle-client.mjs +4 -1
  9. package/esm2022/interfaces/selection.mjs +2 -2
  10. package/esm2022/plugins/create-board.mjs +9 -6
  11. package/esm2022/plugins/with-hotkey.mjs +3 -3
  12. package/esm2022/plugins/with-moving.mjs +41 -21
  13. package/esm2022/plugins/with-related-fragment.mjs +20 -0
  14. package/esm2022/plugins/with-selection.mjs +37 -101
  15. package/esm2022/public-api.mjs +2 -1
  16. package/esm2022/transforms/element.mjs +2 -2
  17. package/esm2022/transforms/group.mjs +47 -0
  18. package/esm2022/transforms/index.mjs +2 -1
  19. package/esm2022/utils/angle.mjs +114 -0
  20. package/esm2022/utils/common.mjs +3 -2
  21. package/esm2022/utils/debug.mjs +91 -0
  22. package/esm2022/utils/element.mjs +17 -5
  23. package/esm2022/utils/fragment.mjs +5 -0
  24. package/esm2022/utils/group.mjs +88 -87
  25. package/esm2022/utils/helper.mjs +10 -1
  26. package/esm2022/utils/index.mjs +3 -1
  27. package/esm2022/utils/math.mjs +11 -1
  28. package/esm2022/utils/moving-snap.mjs +372 -0
  29. package/esm2022/utils/selection.mjs +90 -5
  30. package/esm2022/utils/touch.mjs +15 -4
  31. package/esm2022/utils/weak-maps.mjs +2 -1
  32. package/fesm2022/plait-core.mjs +587 -251
  33. package/fesm2022/plait-core.mjs.map +1 -1
  34. package/interfaces/board.d.ts +5 -2
  35. package/interfaces/rectangle-client.d.ts +1 -0
  36. package/interfaces/selection.d.ts +1 -1
  37. package/package.json +1 -1
  38. package/plugins/with-moving.d.ts +1 -1
  39. package/plugins/with-related-fragment.d.ts +2 -0
  40. package/public-api.d.ts +1 -0
  41. package/transforms/group.d.ts +7 -0
  42. package/transforms/index.d.ts +1 -0
  43. package/utils/angle.d.ts +18 -0
  44. package/utils/debug.d.ts +14 -0
  45. package/utils/fragment.d.ts +2 -0
  46. package/utils/group.d.ts +16 -16
  47. package/utils/helper.d.ts +2 -0
  48. package/utils/index.d.ts +2 -0
  49. package/utils/math.d.ts +8 -0
  50. package/utils/{reaction-manager.d.ts → moving-snap.d.ts} +3 -3
  51. package/utils/selection.d.ts +7 -4
  52. package/utils/touch.d.ts +1 -1
  53. package/utils/weak-maps.d.ts +1 -0
  54. package/esm2022/plugins/with-group.mjs +0 -27
  55. package/esm2022/utils/reaction-manager.mjs +0 -371
  56. package/plugins/with-group.d.ts +0 -2
@@ -0,0 +1,372 @@
1
+ import { PlaitBoard } from '../interfaces/board';
2
+ import { createG } from './dom/common';
3
+ import { RectangleClient, SELECTION_BORDER_COLOR } from '../interfaces';
4
+ import { depthFirstRecursion } from './tree';
5
+ import { getRectangleByAngle } from './angle';
6
+ const SNAP_TOLERANCE = 2;
7
+ export class MovingSnapReaction {
8
+ constructor(board, activeElements, activeRectangle) {
9
+ this.board = board;
10
+ this.activeElements = activeElements;
11
+ this.activeRectangle = activeRectangle;
12
+ this.alignRectangles = this.getAlignRectangle();
13
+ }
14
+ getAlignRectangle() {
15
+ const result = [];
16
+ depthFirstRecursion(this.board, node => {
17
+ if (PlaitBoard.isBoard(node) || this.activeElements.some(element => node.id === element.id) || !this.board.isAlign(node)) {
18
+ return;
19
+ }
20
+ const rectangle = this.board.getRectangle(node);
21
+ rectangle && result.push(getRectangleByAngle(rectangle, node.angle) || rectangle);
22
+ }, node => {
23
+ if (node && (PlaitBoard.isBoard(node) || this.board.isRecursion(node))) {
24
+ return true;
25
+ }
26
+ else {
27
+ return false;
28
+ }
29
+ }, true);
30
+ return result;
31
+ }
32
+ handleSnapping() {
33
+ const alignRectangles = this.getAlignRectangle();
34
+ const g = createG();
35
+ let alignLines = [];
36
+ const offset = 12;
37
+ let deltaX = 0;
38
+ let deltaY = 0;
39
+ let isCorrectX = false;
40
+ let isCorrectY = false;
41
+ for (let alignRectangle of alignRectangles) {
42
+ const closestDistances = this.calculateClosestDistances(this.activeRectangle, alignRectangle);
43
+ let canDrawHorizontal = false;
44
+ if (!isCorrectX && closestDistances.absXDistance < SNAP_TOLERANCE) {
45
+ deltaX = closestDistances.xDistance;
46
+ this.activeRectangle.x -= deltaX;
47
+ isCorrectX = true;
48
+ canDrawHorizontal = true;
49
+ }
50
+ if (closestDistances.absXDistance === 0) {
51
+ canDrawHorizontal = true;
52
+ }
53
+ if (canDrawHorizontal) {
54
+ const verticalY = [
55
+ alignRectangle.y,
56
+ alignRectangle.y + alignRectangle.height,
57
+ this.activeRectangle.y,
58
+ this.activeRectangle.y + this.activeRectangle.height
59
+ ];
60
+ const lineTopY = Math.min(...verticalY) - offset;
61
+ const lineBottomY = Math.max(...verticalY) + offset;
62
+ const leftLine = [this.activeRectangle.x, lineTopY, this.activeRectangle.x, lineBottomY];
63
+ const middleLine = [
64
+ this.activeRectangle.x + this.activeRectangle.width / 2,
65
+ lineTopY,
66
+ this.activeRectangle.x + this.activeRectangle.width / 2,
67
+ lineBottomY
68
+ ];
69
+ const rightLine = [
70
+ this.activeRectangle.x + this.activeRectangle.width,
71
+ lineTopY,
72
+ this.activeRectangle.x + this.activeRectangle.width,
73
+ lineBottomY
74
+ ];
75
+ const shouldDrawLeftLine = closestDistances.indexX === 0 ||
76
+ closestDistances.indexX === 1 ||
77
+ (closestDistances.indexX === 2 && this.activeRectangle.width === alignRectangle.width);
78
+ if (shouldDrawLeftLine && !alignLines[0]) {
79
+ alignLines[0] = leftLine;
80
+ }
81
+ const shouldDrawRightLine = closestDistances.indexX === 2 ||
82
+ closestDistances.indexX === 3 ||
83
+ (closestDistances.indexX === 0 && this.activeRectangle.width === alignRectangle.width);
84
+ if (shouldDrawRightLine && !alignLines[2]) {
85
+ alignLines[2] = rightLine;
86
+ }
87
+ const shouldDrawMiddleLine = closestDistances.indexX === 4 || (!shouldDrawLeftLine && !shouldDrawRightLine);
88
+ if (shouldDrawMiddleLine && !alignLines[1]) {
89
+ alignLines[1] = middleLine;
90
+ }
91
+ isCorrectX = true;
92
+ }
93
+ let canDrawVertical = false;
94
+ if (!isCorrectY && closestDistances.absYDistance < SNAP_TOLERANCE) {
95
+ deltaY = closestDistances.yDistance;
96
+ this.activeRectangle.y -= deltaY;
97
+ isCorrectY = true;
98
+ canDrawVertical = true;
99
+ }
100
+ if (closestDistances.absYDistance === 0) {
101
+ canDrawVertical = true;
102
+ }
103
+ if (canDrawVertical) {
104
+ const horizontalX = [
105
+ alignRectangle.x,
106
+ alignRectangle.x + alignRectangle.width,
107
+ this.activeRectangle.x,
108
+ this.activeRectangle.x + this.activeRectangle.width
109
+ ];
110
+ const lineLeftX = Math.min(...horizontalX) - offset;
111
+ const lineRightX = Math.max(...horizontalX) + offset;
112
+ const topLine = [lineLeftX, this.activeRectangle.y, lineRightX, this.activeRectangle.y];
113
+ const horizontalMiddleLine = [
114
+ lineLeftX,
115
+ this.activeRectangle.y + this.activeRectangle.height / 2,
116
+ lineRightX,
117
+ this.activeRectangle.y + this.activeRectangle.height / 2
118
+ ];
119
+ const bottomLine = [
120
+ lineLeftX,
121
+ this.activeRectangle.y + this.activeRectangle.height,
122
+ lineRightX,
123
+ this.activeRectangle.y + this.activeRectangle.height
124
+ ];
125
+ const shouldDrawTopLine = closestDistances.indexY === 0 ||
126
+ closestDistances.indexY === 1 ||
127
+ (closestDistances.indexY === 2 && this.activeRectangle.height === alignRectangle.height);
128
+ if (shouldDrawTopLine && !alignLines[3]) {
129
+ alignLines[3] = topLine;
130
+ }
131
+ const shouldDrawBottomLine = closestDistances.indexY === 2 ||
132
+ closestDistances.indexY === 3 ||
133
+ (closestDistances.indexY === 0 && this.activeRectangle.width === alignRectangle.width);
134
+ if (shouldDrawBottomLine && !alignLines[5]) {
135
+ alignLines[5] = bottomLine;
136
+ }
137
+ const shouldDrawMiddleLine = closestDistances.indexY === 4 || (!shouldDrawTopLine && !shouldDrawBottomLine);
138
+ if (shouldDrawMiddleLine && !alignLines[4]) {
139
+ alignLines[4] = horizontalMiddleLine;
140
+ }
141
+ }
142
+ }
143
+ const alignDeltaX = deltaX;
144
+ const alignDeltaY = deltaY;
145
+ this.activeRectangle.x += deltaX;
146
+ this.activeRectangle.y += deltaY;
147
+ const distributeHorizontalResult = this.alignDistribute(alignRectangles, true);
148
+ const distributeVerticalResult = this.alignDistribute(alignRectangles, false);
149
+ const distributeLines = [...distributeHorizontalResult.distributeLines, ...distributeVerticalResult.distributeLines];
150
+ if (distributeHorizontalResult.delta) {
151
+ deltaX = distributeHorizontalResult.delta;
152
+ if (alignDeltaX !== deltaX) {
153
+ alignLines[0] = [];
154
+ alignLines[1] = [];
155
+ alignLines[2] = [];
156
+ }
157
+ }
158
+ if (distributeVerticalResult.delta) {
159
+ deltaY = distributeVerticalResult.delta;
160
+ if (alignDeltaY !== deltaY) {
161
+ alignLines[3] = [];
162
+ alignLines[4] = [];
163
+ alignLines[5] = [];
164
+ }
165
+ }
166
+ if (alignLines.length) {
167
+ this.drawAlignLines(alignLines, g);
168
+ }
169
+ if (distributeLines.length) {
170
+ this.drawDistributeLines(distributeLines, g);
171
+ }
172
+ return { deltaX, deltaY, g };
173
+ }
174
+ calculateClosestDistances(activeRectangle, alignRectangle) {
175
+ const activeRectangleCenter = [activeRectangle.x + activeRectangle.width / 2, activeRectangle.y + activeRectangle.height / 2];
176
+ const alignRectangleCenter = [alignRectangle.x + alignRectangle.width / 2, alignRectangle.y + alignRectangle.height / 2];
177
+ const centerXDistance = activeRectangleCenter[0] - alignRectangleCenter[0];
178
+ const centerYDistance = activeRectangleCenter[1] - alignRectangleCenter[1];
179
+ const leftToLeft = activeRectangle.x - alignRectangle.x;
180
+ const leftToRight = activeRectangle.x - (alignRectangle.x + alignRectangle.width);
181
+ const rightToRight = activeRectangle.x + activeRectangle.width - (alignRectangle.x + alignRectangle.width);
182
+ const rightToLeft = activeRectangle.x + activeRectangle.width - alignRectangle.x;
183
+ const topToTop = activeRectangle.y - alignRectangle.y;
184
+ const topToBottom = activeRectangle.y - (alignRectangle.y + alignRectangle.height);
185
+ const bottomToTop = activeRectangle.y + activeRectangle.height - alignRectangle.y;
186
+ const bottomToBottom = activeRectangle.y + activeRectangle.height - (alignRectangle.y + alignRectangle.height);
187
+ const xDistances = [leftToLeft, leftToRight, rightToRight, rightToLeft, centerXDistance];
188
+ const yDistances = [topToTop, topToBottom, bottomToBottom, bottomToTop, centerYDistance];
189
+ const xDistancesAbs = xDistances.map(distance => Math.abs(distance));
190
+ const yDistancesAbs = yDistances.map(distance => Math.abs(distance));
191
+ const indexX = xDistancesAbs.indexOf(Math.min(...xDistancesAbs));
192
+ const indexY = yDistancesAbs.indexOf(Math.min(...yDistancesAbs));
193
+ return {
194
+ absXDistance: xDistancesAbs[indexX],
195
+ xDistance: xDistances[indexX],
196
+ absYDistance: yDistancesAbs[indexY],
197
+ yDistance: yDistances[indexY],
198
+ indexX,
199
+ indexY
200
+ };
201
+ }
202
+ alignDistribute(alignRectangles, isHorizontal) {
203
+ let distributeLines = [];
204
+ let delta = 0;
205
+ let rectangles = [];
206
+ const axis = isHorizontal ? 'x' : 'y';
207
+ const side = isHorizontal ? 'width' : 'height';
208
+ const activeRectangleCenter = this.activeRectangle[axis] + this.activeRectangle[side] / 2;
209
+ alignRectangles.forEach(rec => {
210
+ const isCross = isHorizontal ? isHorizontalCross(rec, this.activeRectangle) : isVerticalCross(rec, this.activeRectangle);
211
+ if (isCross && !RectangleClient.isHit(rec, this.activeRectangle)) {
212
+ rectangles.push(rec);
213
+ }
214
+ });
215
+ rectangles = [...rectangles, this.activeRectangle].sort((a, b) => a[axis] - b[axis]);
216
+ const refArray = [];
217
+ let distributeDistance = 0;
218
+ let beforeIndex = undefined;
219
+ let afterIndex = undefined;
220
+ for (let i = 0; i < rectangles.length; i++) {
221
+ for (let j = i + 1; j < rectangles.length; j++) {
222
+ const before = rectangles[i];
223
+ const after = rectangles[j];
224
+ const distance = after[axis] - (before[axis] + before[side]);
225
+ let dif = Infinity;
226
+ if (refArray[i]?.after) {
227
+ refArray[i].after.push({ distance, index: j });
228
+ }
229
+ else {
230
+ refArray[i] = { ...refArray[i], after: [{ distance, index: j }] };
231
+ }
232
+ if (refArray[j]?.before) {
233
+ refArray[j].before.push({ distance, index: i });
234
+ }
235
+ else {
236
+ refArray[j] = { ...refArray[j], before: [{ distance, index: i }] };
237
+ }
238
+ //middle
239
+ let _center = (before[axis] + before[side] + after[axis]) / 2;
240
+ dif = Math.abs(activeRectangleCenter - _center);
241
+ if (dif < SNAP_TOLERANCE) {
242
+ distributeDistance = (after[axis] - (before[axis] + before[side]) - this.activeRectangle[side]) / 2;
243
+ delta = activeRectangleCenter - _center;
244
+ beforeIndex = i;
245
+ afterIndex = j;
246
+ }
247
+ //after
248
+ const distanceRight = after[axis] - (before[axis] + before[side]);
249
+ _center = after[axis] + after[side] + distanceRight + this.activeRectangle[side] / 2;
250
+ dif = Math.abs(activeRectangleCenter - _center);
251
+ if (!distributeDistance && dif < SNAP_TOLERANCE) {
252
+ distributeDistance = distanceRight;
253
+ beforeIndex = j;
254
+ delta = activeRectangleCenter - _center;
255
+ }
256
+ //before
257
+ const distanceBefore = after[axis] - (before[axis] + before[side]);
258
+ _center = before[axis] - distanceBefore - this.activeRectangle[side] / 2;
259
+ dif = Math.abs(activeRectangleCenter - _center);
260
+ if (!distributeDistance && dif < SNAP_TOLERANCE) {
261
+ distributeDistance = distanceBefore;
262
+ afterIndex = i;
263
+ delta = activeRectangleCenter - _center;
264
+ }
265
+ }
266
+ }
267
+ const activeIndex = rectangles.indexOf(this.activeRectangle);
268
+ let beforeIndexes = [];
269
+ let afterIndexes = [];
270
+ if (beforeIndex !== undefined) {
271
+ beforeIndexes.push(beforeIndex);
272
+ findRectangle(distributeDistance, refArray[beforeIndex], 'before', beforeIndexes);
273
+ }
274
+ if (afterIndex !== undefined) {
275
+ afterIndexes.push(afterIndex);
276
+ findRectangle(distributeDistance, refArray[afterIndex], 'after', afterIndexes);
277
+ }
278
+ if (beforeIndexes.length || afterIndexes.length) {
279
+ const indexArr = [...beforeIndexes.reverse(), activeIndex, ...afterIndexes];
280
+ this.activeRectangle[axis] -= delta;
281
+ for (let i = 1; i < indexArr.length; i++) {
282
+ distributeLines.push(getLinePoints(rectangles[indexArr[i - 1]], rectangles[indexArr[i]]));
283
+ }
284
+ }
285
+ function findRectangle(distance, ref, direction, rectangleIndexes) {
286
+ const arr = ref[direction];
287
+ const index = refArray.indexOf(ref);
288
+ if ((index === 0 && direction === 'before') || (index === refArray.length - 1 && direction === 'after'))
289
+ return;
290
+ for (let i = 0; i < arr.length; i++) {
291
+ if (Math.abs(arr[i].distance - distance) < 0.1) {
292
+ rectangleIndexes.push(arr[i].index);
293
+ findRectangle(distance, refArray[arr[i].index], direction, rectangleIndexes);
294
+ return;
295
+ }
296
+ }
297
+ }
298
+ function getLinePoints(beforeRectangle, afterRectangle) {
299
+ const oppositeAxis = axis === 'x' ? 'y' : 'x';
300
+ const oppositeSide = side === 'width' ? 'height' : 'width';
301
+ const align = [
302
+ beforeRectangle[oppositeAxis],
303
+ beforeRectangle[oppositeAxis] + beforeRectangle[oppositeSide],
304
+ afterRectangle[oppositeAxis],
305
+ afterRectangle[oppositeAxis] + afterRectangle[oppositeSide]
306
+ ];
307
+ const sortArr = align.sort((a, b) => a - b);
308
+ const average = (sortArr[1] + sortArr[2]) / 2;
309
+ const offset = 3;
310
+ return isHorizontal
311
+ ? [
312
+ [beforeRectangle.x + beforeRectangle.width + offset, average],
313
+ [afterRectangle.x - offset, average]
314
+ ]
315
+ : [
316
+ [average, beforeRectangle.y + beforeRectangle.height + offset],
317
+ [average, afterRectangle.y - offset]
318
+ ];
319
+ }
320
+ return { delta, distributeLines };
321
+ }
322
+ drawAlignLines(lines, g) {
323
+ lines.forEach(points => {
324
+ if (!points.length)
325
+ return;
326
+ const xAlign = PlaitBoard.getRoughSVG(this.board).line(points[0], points[1], points[2], points[3], {
327
+ stroke: SELECTION_BORDER_COLOR,
328
+ strokeWidth: 1,
329
+ strokeLineDash: [4, 4]
330
+ });
331
+ g.appendChild(xAlign);
332
+ });
333
+ }
334
+ drawDistributeLines(lines, g) {
335
+ lines.forEach(line => {
336
+ if (!line.length)
337
+ return;
338
+ let isHorizontal = line[0][1] === line[1][1];
339
+ const yAlign = PlaitBoard.getRoughSVG(this.board).line(line[0][0], line[0][1], line[1][0], line[1][1], {
340
+ stroke: SELECTION_BORDER_COLOR,
341
+ strokeWidth: 1
342
+ });
343
+ g.appendChild(yAlign);
344
+ line.forEach(point => {
345
+ const barPoint = getBarPoint(point, isHorizontal);
346
+ const bar = PlaitBoard.getRoughSVG(this.board).line(barPoint[0][0], barPoint[0][1], barPoint[1][0], barPoint[1][1], {
347
+ stroke: SELECTION_BORDER_COLOR,
348
+ strokeWidth: 1
349
+ });
350
+ g.appendChild(bar);
351
+ });
352
+ });
353
+ }
354
+ }
355
+ function isHorizontalCross(rectangle, other) {
356
+ return !(rectangle.y + rectangle.height < other.y || rectangle.y > other.y + other.height);
357
+ }
358
+ function isVerticalCross(rectangle, other) {
359
+ return !(rectangle.x + rectangle.width < other.x || rectangle.x > other.x + other.width);
360
+ }
361
+ function getBarPoint(point, isHorizontal) {
362
+ return isHorizontal
363
+ ? [
364
+ [point[0], point[1] - 4],
365
+ [point[0], point[1] + 4]
366
+ ]
367
+ : [
368
+ [point[0] - 4, point[1]],
369
+ [point[0] + 4, point[1]]
370
+ ];
371
+ }
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92aW5nLXNuYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy9tb3Zpbmctc25hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd2QyxPQUFPLEVBQVMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFhOUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCLE1BQU0sT0FBTyxrQkFBa0I7SUFHM0IsWUFBb0IsS0FBaUIsRUFBVSxjQUE4QixFQUFVLGVBQWdDO1FBQW5HLFVBQUssR0FBTCxLQUFLLENBQVk7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDbkgsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsTUFBTSxNQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUNyQyxtQkFBbUIsQ0FDZixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxFQUFFO1lBQ0gsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2SCxPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUM7UUFDdEYsQ0FBQyxFQUNELElBQUksQ0FBQyxFQUFFO1lBQ0gsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLENBQUM7UUFDTCxDQUFDLEVBQ0QsSUFBSSxDQUNQLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsY0FBYztRQUNWLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVwQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV2QixLQUFLLElBQUksY0FBYyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDOUYsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsY0FBYyxFQUFFLENBQUM7Z0JBQ2hFLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztnQkFDakMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDbEIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLENBQUM7WUFFRCxJQUFJLGdCQUFnQixDQUFDLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLENBQUM7WUFFRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sU0FBUyxHQUFHO29CQUNkLGNBQWMsQ0FBQyxDQUFDO29CQUNoQixjQUFjLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNO29CQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTtpQkFDdkQsQ0FBQztnQkFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUNwRCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDekYsTUFBTSxVQUFVLEdBQUc7b0JBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztvQkFDdkQsUUFBUTtvQkFDUixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDO29CQUN2RCxXQUFXO2lCQUNkLENBQUM7Z0JBQ0YsTUFBTSxTQUFTLEdBQUc7b0JBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO29CQUNuRCxRQUFRO29CQUNSLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztvQkFDbkQsV0FBVztpQkFDZCxDQUFDO2dCQUVGLE1BQU0sa0JBQWtCLEdBQ3BCLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUM3QixnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDN0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUFLLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0YsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2QyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO2dCQUM3QixDQUFDO2dCQUVELE1BQU0sbUJBQW1CLEdBQ3JCLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUM3QixnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDN0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUFLLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0YsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4QyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO2dCQUM5QixDQUFDO2dCQUVELE1BQU0sb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsa0JBQWtCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUM1RyxJQUFJLG9CQUFvQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQy9CLENBQUM7Z0JBRUQsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN0QixDQUFDO1lBRUQsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxVQUFVLElBQUksZ0JBQWdCLENBQUMsWUFBWSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUNoRSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7Z0JBQ2pDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ2xCLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDM0IsQ0FBQztZQUNELElBQUksZ0JBQWdCLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzNCLENBQUM7WUFDRCxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixNQUFNLFdBQVcsR0FBRztvQkFDaEIsY0FBYyxDQUFDLENBQUM7b0JBQ2hCLGNBQWMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUs7b0JBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO2lCQUN0RCxDQUFDO2dCQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3JELE1BQU0sT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RixNQUFNLG9CQUFvQixHQUFHO29CQUN6QixTQUFTO29CQUNULElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ3hELFVBQVU7b0JBQ1YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztpQkFDM0QsQ0FBQztnQkFDRixNQUFNLFVBQVUsR0FBRztvQkFDZixTQUFTO29CQUNULElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTtvQkFDcEQsVUFBVTtvQkFDVixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU07aUJBQ3ZELENBQUM7Z0JBRUYsTUFBTSxpQkFBaUIsR0FDbkIsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQzdCLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUM3QixDQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3RixJQUFJLGlCQUFpQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3RDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQzVCLENBQUM7Z0JBRUQsTUFBTSxvQkFBb0IsR0FDdEIsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQzdCLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUM3QixDQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzRixJQUFJLG9CQUFvQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQy9CLENBQUM7Z0JBRUQsTUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQzVHLElBQUksb0JBQW9CLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDekMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixDQUFDO2dCQUN6QyxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDM0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBRTNCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztRQUNqQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7UUFDakMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvRSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlFLE1BQU0sZUFBZSxHQUFjLENBQUMsR0FBRywwQkFBMEIsQ0FBQyxlQUFlLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoSSxJQUFJLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxLQUFLLENBQUM7WUFDMUMsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLHdCQUF3QixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7WUFDeEMsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELHlCQUF5QixDQUFDLGVBQWdDLEVBQUUsY0FBK0I7UUFDdkYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV6SCxNQUFNLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRSxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNHLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBRWpGLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkYsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDbEYsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0csTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDekYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFekYsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUVqRSxPQUFPO1lBQ0gsWUFBWSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDbkMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDN0IsWUFBWSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDbkMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDN0IsTUFBTTtZQUNOLE1BQU07U0FDVCxDQUFDO0lBQ04sQ0FBQztJQUVELGVBQWUsQ0FBQyxlQUFrQyxFQUFFLFlBQXFCO1FBQ3JFLElBQUksZUFBZSxHQUFVLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLFVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUUvQyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUYsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pILElBQUksT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9ELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVyRixNQUFNLFFBQVEsR0FBb0IsRUFBRSxDQUFDO1FBQ3JDLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFFM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDO2dCQUNuQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztvQkFDckIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25ELENBQUM7cUJBQU0sQ0FBQztvQkFDSixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxDQUFDO2dCQUVELElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUN0QixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztxQkFBTSxDQUFDO29CQUNKLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBRUQsUUFBUTtnQkFDUixJQUFJLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5RCxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxHQUFHLEdBQUcsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLGtCQUFrQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BHLEtBQUssR0FBRyxxQkFBcUIsR0FBRyxPQUFPLENBQUM7b0JBQ3hDLFdBQVcsR0FBRyxDQUFDLENBQUM7b0JBQ2hCLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLENBQUM7Z0JBRUQsT0FBTztnQkFDUCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckYsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxrQkFBa0IsSUFBSSxHQUFHLEdBQUcsY0FBYyxFQUFFLENBQUM7b0JBQzlDLGtCQUFrQixHQUFHLGFBQWEsQ0FBQztvQkFDbkMsV0FBVyxHQUFHLENBQUMsQ0FBQztvQkFDaEIsS0FBSyxHQUFHLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztnQkFDNUMsQ0FBQztnQkFFRCxRQUFRO2dCQUNSLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pFLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxDQUFDO2dCQUVoRCxJQUFJLENBQUMsa0JBQWtCLElBQUksR0FBRyxHQUFHLGNBQWMsRUFBRSxDQUFDO29CQUM5QyxrQkFBa0IsR0FBRyxjQUFjLENBQUM7b0JBQ3BDLFVBQVUsR0FBRyxDQUFDLENBQUM7b0JBQ2YsS0FBSyxHQUFHLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztnQkFDNUMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0QsSUFBSSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBQ2pDLElBQUksWUFBWSxHQUFhLEVBQUUsQ0FBQztRQUNoQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFFRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlCLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUM7WUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLENBQUM7UUFDTCxDQUFDO1FBRUQsU0FBUyxhQUFhLENBQUMsUUFBZ0IsRUFBRSxHQUFrQixFQUFFLFNBQWlCLEVBQUUsZ0JBQTBCO1lBQ3RHLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFnQyxDQUFDLENBQUM7WUFDbEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxTQUFTLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxLQUFLLE9BQU8sQ0FBQztnQkFBRSxPQUFPO1lBQ2hILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO29CQUM3QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzdFLE9BQU87Z0JBQ1gsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsU0FBUyxhQUFhLENBQUMsZUFBZ0MsRUFBRSxjQUErQjtZQUNwRixNQUFNLFlBQVksR0FBRyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM5QyxNQUFNLFlBQVksR0FBRyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUMzRCxNQUFNLEtBQUssR0FBRztnQkFDVixlQUFlLENBQUMsWUFBWSxDQUFDO2dCQUM3QixlQUFlLENBQUMsWUFBWSxDQUFDLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQztnQkFDN0QsY0FBYyxDQUFDLFlBQVksQ0FBQztnQkFDNUIsY0FBYyxDQUFDLFlBQVksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7YUFDOUQsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNqQixPQUFPLFlBQVk7Z0JBQ2YsQ0FBQyxDQUFDO29CQUNJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxHQUFHLE1BQU0sRUFBRSxPQUFPLENBQUM7b0JBQzdELENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsT0FBTyxDQUFDO2lCQUN2QztnQkFDSCxDQUFDLENBQUM7b0JBQ0ksQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDOUQsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7aUJBQ3ZDLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWlCLEVBQUUsQ0FBYztRQUM1QyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBQzNCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQy9GLE1BQU0sRUFBRSxzQkFBc0I7Z0JBQzlCLFdBQVcsRUFBRSxDQUFDO2dCQUNkLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDekIsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFnQixFQUFFLENBQWM7UUFDaEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUN6QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ25HLE1BQU0sRUFBRSxzQkFBc0I7Z0JBQzlCLFdBQVcsRUFBRSxDQUFDO2FBQ2pCLENBQUMsQ0FBQztZQUNILENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDakIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDaEgsTUFBTSxFQUFFLHNCQUFzQjtvQkFDOUIsV0FBVyxFQUFFLENBQUM7aUJBQ2pCLENBQUMsQ0FBQztnQkFDSCxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFNBQTBCLEVBQUUsS0FBc0I7SUFDekUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsU0FBMEIsRUFBRSxLQUFzQjtJQUN2RSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdGLENBQUM7QUFDRCxTQUFTLFdBQVcsQ0FBQyxLQUFZLEVBQUUsWUFBcUI7SUFDcEQsT0FBTyxZQUFZO1FBQ2YsQ0FBQyxDQUFDO1lBQ0ksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO1FBQ0gsQ0FBQyxDQUFDO1lBQ0ksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvYm9hcmQnO1xuaW1wb3J0IHsgY3JlYXRlRyB9IGZyb20gJy4vZG9tL2NvbW1vbic7XG5pbXBvcnQgeyBQbGFpdEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2VsZW1lbnQnO1xuaW1wb3J0IHsgQW5jZXN0b3IgfSBmcm9tICcuLi9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHsgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgU0VMRUNUSU9OX0JPUkRFUl9DT0xPUiB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZGVwdGhGaXJzdFJlY3Vyc2lvbiB9IGZyb20gJy4vdHJlZSc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeUFuZ2xlIH0gZnJvbSAnLi9hbmdsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25hcFJlZiB7XG4gICAgZGVsdGFYOiBudW1iZXI7XG4gICAgZGVsdGFZOiBudW1iZXI7XG4gICAgZzogU1ZHR0VsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzdHJpYnV0ZVJlZiB7XG4gICAgYmVmb3JlOiB7IGRpc3RhbmNlOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xuICAgIGFmdGVyOiB7IGRpc3RhbmNlOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xufVxuXG5jb25zdCBTTkFQX1RPTEVSQU5DRSA9IDI7XG5cbmV4cG9ydCBjbGFzcyBNb3ZpbmdTbmFwUmVhY3Rpb24ge1xuICAgIGFsaWduUmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJvYXJkOiBQbGFpdEJvYXJkLCBwcml2YXRlIGFjdGl2ZUVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSwgcHJpdmF0ZSBhY3RpdmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICB0aGlzLmFsaWduUmVjdGFuZ2xlcyA9IHRoaXMuZ2V0QWxpZ25SZWN0YW5nbGUoKTtcbiAgICB9XG5cbiAgICBnZXRBbGlnblJlY3RhbmdsZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWN0YW5nbGVDbGllbnRbXSA9IFtdO1xuICAgICAgICBkZXB0aEZpcnN0UmVjdXJzaW9uPEFuY2VzdG9yPihcbiAgICAgICAgICAgIHRoaXMuYm9hcmQsXG4gICAgICAgICAgICBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoUGxhaXRCb2FyZC5pc0JvYXJkKG5vZGUpIHx8IHRoaXMuYWN0aXZlRWxlbWVudHMuc29tZShlbGVtZW50ID0+IG5vZGUuaWQgPT09IGVsZW1lbnQuaWQpIHx8ICF0aGlzLmJvYXJkLmlzQWxpZ24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWN0YW5nbGUgPSB0aGlzLmJvYXJkLmdldFJlY3RhbmdsZShub2RlKTtcbiAgICAgICAgICAgICAgICByZWN0YW5nbGUgJiYgcmVzdWx0LnB1c2goZ2V0UmVjdGFuZ2xlQnlBbmdsZShyZWN0YW5nbGUsIG5vZGUuYW5nbGUpIHx8IHJlY3RhbmdsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgKFBsYWl0Qm9hcmQuaXNCb2FyZChub2RlKSB8fCB0aGlzLmJvYXJkLmlzUmVjdXJzaW9uKG5vZGUpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBoYW5kbGVTbmFwcGluZygpOiBTbmFwUmVmIHtcbiAgICAgICAgY29uc3QgYWxpZ25SZWN0YW5nbGVzID0gdGhpcy5nZXRBbGlnblJlY3RhbmdsZSgpO1xuICAgICAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgICAgICBsZXQgYWxpZ25MaW5lcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDEyO1xuICAgICAgICBsZXQgZGVsdGFYID0gMDtcbiAgICAgICAgbGV0IGRlbHRhWSA9IDA7XG4gICAgICAgIGxldCBpc0NvcnJlY3RYID0gZmFsc2U7XG4gICAgICAgIGxldCBpc0NvcnJlY3RZID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgYWxpZ25SZWN0YW5nbGUgb2YgYWxpZ25SZWN0YW5nbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjbG9zZXN0RGlzdGFuY2VzID0gdGhpcy5jYWxjdWxhdGVDbG9zZXN0RGlzdGFuY2VzKHRoaXMuYWN0aXZlUmVjdGFuZ2xlLCBhbGlnblJlY3RhbmdsZSk7XG4gICAgICAgICAgICBsZXQgY2FuRHJhd0hvcml6b250YWwgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghaXNDb3JyZWN0WCAmJiBjbG9zZXN0RGlzdGFuY2VzLmFic1hEaXN0YW5jZSA8IFNOQVBfVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gY2xvc2VzdERpc3RhbmNlcy54RGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueCAtPSBkZWx0YVg7XG4gICAgICAgICAgICAgICAgaXNDb3JyZWN0WCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FuRHJhd0hvcml6b250YWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2xvc2VzdERpc3RhbmNlcy5hYnNYRGlzdGFuY2UgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjYW5EcmF3SG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYW5EcmF3SG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsWSA9IFtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGUueSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGUueSArIGFsaWduUmVjdGFuZ2xlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLmhlaWdodFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZVRvcFkgPSBNYXRoLm1pbiguLi52ZXJ0aWNhbFkpIC0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVCb3R0b21ZID0gTWF0aC5tYXgoLi4udmVydGljYWxZKSArIG9mZnNldDtcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0TGluZSA9IFt0aGlzLmFjdGl2ZVJlY3RhbmdsZS54LCBsaW5lVG9wWSwgdGhpcy5hY3RpdmVSZWN0YW5nbGUueCwgbGluZUJvdHRvbVldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZGRsZUxpbmUgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLnggKyB0aGlzLmFjdGl2ZVJlY3RhbmdsZS53aWR0aCAvIDIsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVUb3BZLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGggLyAyLFxuICAgICAgICAgICAgICAgICAgICBsaW5lQm90dG9tWVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHRMaW5lID0gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVUb3BZLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVCb3R0b21ZXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdMZWZ0TGluZSA9XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhYID09PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhYID09PSAxIHx8XG4gICAgICAgICAgICAgICAgICAgIChjbG9zZXN0RGlzdGFuY2VzLmluZGV4WCA9PT0gMiAmJiB0aGlzLmFjdGl2ZVJlY3RhbmdsZS53aWR0aCA9PT0gYWxpZ25SZWN0YW5nbGUud2lkdGgpO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREcmF3TGVmdExpbmUgJiYgIWFsaWduTGluZXNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25MaW5lc1swXSA9IGxlZnRMaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdSaWdodExpbmUgPVxuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2VzLmluZGV4WCA9PT0gMiB8fFxuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2VzLmluZGV4WCA9PT0gMyB8fFxuICAgICAgICAgICAgICAgICAgICAoY2xvc2VzdERpc3RhbmNlcy5pbmRleFggPT09IDAgJiYgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGggPT09IGFsaWduUmVjdGFuZ2xlLndpZHRoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRHJhd1JpZ2h0TGluZSAmJiAhYWxpZ25MaW5lc1syXSkge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzJdID0gcmlnaHRMaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdNaWRkbGVMaW5lID0gY2xvc2VzdERpc3RhbmNlcy5pbmRleFggPT09IDQgfHwgKCFzaG91bGREcmF3TGVmdExpbmUgJiYgIXNob3VsZERyYXdSaWdodExpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREcmF3TWlkZGxlTGluZSAmJiAhYWxpZ25MaW5lc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzFdID0gbWlkZGxlTGluZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpc0NvcnJlY3RYID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNhbkRyYXdWZXJ0aWNhbCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFpc0NvcnJlY3RZICYmIGNsb3Nlc3REaXN0YW5jZXMuYWJzWURpc3RhbmNlIDwgU05BUF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICBkZWx0YVkgPSBjbG9zZXN0RGlzdGFuY2VzLnlEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55IC09IGRlbHRhWTtcbiAgICAgICAgICAgICAgICBpc0NvcnJlY3RZID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjYW5EcmF3VmVydGljYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3REaXN0YW5jZXMuYWJzWURpc3RhbmNlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2FuRHJhd1ZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYW5EcmF3VmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsWCA9IFtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGUueCxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGUueCArIGFsaWduUmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGhcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVMZWZ0WCA9IE1hdGgubWluKC4uLmhvcml6b250YWxYKSAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lUmlnaHRYID0gTWF0aC5tYXgoLi4uaG9yaXpvbnRhbFgpICsgb2Zmc2V0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcExpbmUgPSBbbGluZUxlZnRYLCB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55LCBsaW5lUmlnaHRYLCB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55XTtcbiAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsTWlkZGxlTGluZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgbGluZUxlZnRYLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUuaGVpZ2h0IC8gMixcbiAgICAgICAgICAgICAgICAgICAgbGluZVJpZ2h0WCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCAvIDJcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbUxpbmUgPSBbXG4gICAgICAgICAgICAgICAgICAgIGxpbmVMZWZ0WCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgbGluZVJpZ2h0WCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLmhlaWdodFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGREcmF3VG9wTGluZSA9XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhZID09PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhZID09PSAxIHx8XG4gICAgICAgICAgICAgICAgICAgIChjbG9zZXN0RGlzdGFuY2VzLmluZGV4WSA9PT0gMiAmJiB0aGlzLmFjdGl2ZVJlY3RhbmdsZS5oZWlnaHQgPT09IGFsaWduUmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZERyYXdUb3BMaW5lICYmICFhbGlnbkxpbmVzWzNdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWduTGluZXNbM10gPSB0b3BMaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdCb3R0b21MaW5lID1cbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlcy5pbmRleFkgPT09IDIgfHxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlcy5pbmRleFkgPT09IDMgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhZID09PSAwICYmIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLndpZHRoID09PSBhbGlnblJlY3RhbmdsZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZERyYXdCb3R0b21MaW5lICYmICFhbGlnbkxpbmVzWzVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWduTGluZXNbNV0gPSBib3R0b21MaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdNaWRkbGVMaW5lID0gY2xvc2VzdERpc3RhbmNlcy5pbmRleFkgPT09IDQgfHwgKCFzaG91bGREcmF3VG9wTGluZSAmJiAhc2hvdWxkRHJhd0JvdHRvbUxpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREcmF3TWlkZGxlTGluZSAmJiAhYWxpZ25MaW5lc1s0XSkge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzRdID0gaG9yaXpvbnRhbE1pZGRsZUxpbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxpZ25EZWx0YVggPSBkZWx0YVg7XG4gICAgICAgIGNvbnN0IGFsaWduRGVsdGFZID0gZGVsdGFZO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLnggKz0gZGVsdGFYO1xuICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55ICs9IGRlbHRhWTtcbiAgICAgICAgY29uc3QgZGlzdHJpYnV0ZUhvcml6b250YWxSZXN1bHQgPSB0aGlzLmFsaWduRGlzdHJpYnV0ZShhbGlnblJlY3RhbmdsZXMsIHRydWUpO1xuICAgICAgICBjb25zdCBkaXN0cmlidXRlVmVydGljYWxSZXN1bHQgPSB0aGlzLmFsaWduRGlzdHJpYnV0ZShhbGlnblJlY3RhbmdsZXMsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgZGlzdHJpYnV0ZUxpbmVzOiBQb2ludFtdW10gPSBbLi4uZGlzdHJpYnV0ZUhvcml6b250YWxSZXN1bHQuZGlzdHJpYnV0ZUxpbmVzLCAuLi5kaXN0cmlidXRlVmVydGljYWxSZXN1bHQuZGlzdHJpYnV0ZUxpbmVzXTtcbiAgICAgICAgaWYgKGRpc3RyaWJ1dGVIb3Jpem9udGFsUmVzdWx0LmRlbHRhKSB7XG4gICAgICAgICAgICBkZWx0YVggPSBkaXN0cmlidXRlSG9yaXpvbnRhbFJlc3VsdC5kZWx0YTtcbiAgICAgICAgICAgIGlmIChhbGlnbkRlbHRhWCAhPT0gZGVsdGFYKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lc1swXSA9IFtdO1xuICAgICAgICAgICAgICAgIGFsaWduTGluZXNbMV0gPSBbXTtcbiAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzJdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzdHJpYnV0ZVZlcnRpY2FsUmVzdWx0LmRlbHRhKSB7XG4gICAgICAgICAgICBkZWx0YVkgPSBkaXN0cmlidXRlVmVydGljYWxSZXN1bHQuZGVsdGE7XG4gICAgICAgICAgICBpZiAoYWxpZ25EZWx0YVkgIT09IGRlbHRhWSkge1xuICAgICAgICAgICAgICAgIGFsaWduTGluZXNbM10gPSBbXTtcbiAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzRdID0gW107XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lc1s1XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsaWduTGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRyYXdBbGlnbkxpbmVzKGFsaWduTGluZXMsIGcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc3RyaWJ1dGVMaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd0Rpc3RyaWJ1dGVMaW5lcyhkaXN0cmlidXRlTGluZXMsIGcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZGVsdGFYLCBkZWx0YVksIGcgfTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDbG9zZXN0RGlzdGFuY2VzKGFjdGl2ZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBhbGlnblJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZUNlbnRlciA9IFthY3RpdmVSZWN0YW5nbGUueCArIGFjdGl2ZVJlY3RhbmdsZS53aWR0aCAvIDIsIGFjdGl2ZVJlY3RhbmdsZS55ICsgYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCAvIDJdO1xuICAgICAgICBjb25zdCBhbGlnblJlY3RhbmdsZUNlbnRlciA9IFthbGlnblJlY3RhbmdsZS54ICsgYWxpZ25SZWN0YW5nbGUud2lkdGggLyAyLCBhbGlnblJlY3RhbmdsZS55ICsgYWxpZ25SZWN0YW5nbGUuaGVpZ2h0IC8gMl07XG5cbiAgICAgICAgY29uc3QgY2VudGVyWERpc3RhbmNlID0gYWN0aXZlUmVjdGFuZ2xlQ2VudGVyWzBdIC0gYWxpZ25SZWN0YW5nbGVDZW50ZXJbMF07XG4gICAgICAgIGNvbnN0IGNlbnRlcllEaXN0YW5jZSA9IGFjdGl2ZVJlY3RhbmdsZUNlbnRlclsxXSAtIGFsaWduUmVjdGFuZ2xlQ2VudGVyWzFdO1xuXG4gICAgICAgIGNvbnN0IGxlZnRUb0xlZnQgPSBhY3RpdmVSZWN0YW5nbGUueCAtIGFsaWduUmVjdGFuZ2xlLng7XG4gICAgICAgIGNvbnN0IGxlZnRUb1JpZ2h0ID0gYWN0aXZlUmVjdGFuZ2xlLnggLSAoYWxpZ25SZWN0YW5nbGUueCArIGFsaWduUmVjdGFuZ2xlLndpZHRoKTtcbiAgICAgICAgY29uc3QgcmlnaHRUb1JpZ2h0ID0gYWN0aXZlUmVjdGFuZ2xlLnggKyBhY3RpdmVSZWN0YW5nbGUud2lkdGggLSAoYWxpZ25SZWN0YW5nbGUueCArIGFsaWduUmVjdGFuZ2xlLndpZHRoKTtcbiAgICAgICAgY29uc3QgcmlnaHRUb0xlZnQgPSBhY3RpdmVSZWN0YW5nbGUueCArIGFjdGl2ZVJlY3RhbmdsZS53aWR0aCAtIGFsaWduUmVjdGFuZ2xlLng7XG5cbiAgICAgICAgY29uc3QgdG9wVG9Ub3AgPSBhY3RpdmVSZWN0YW5nbGUueSAtIGFsaWduUmVjdGFuZ2xlLnk7XG4gICAgICAgIGNvbnN0IHRvcFRvQm90dG9tID0gYWN0aXZlUmVjdGFuZ2xlLnkgLSAoYWxpZ25SZWN0YW5nbGUueSArIGFsaWduUmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IGJvdHRvbVRvVG9wID0gYWN0aXZlUmVjdGFuZ2xlLnkgKyBhY3RpdmVSZWN0YW5nbGUuaGVpZ2h0IC0gYWxpZ25SZWN0YW5nbGUueTtcbiAgICAgICAgY29uc3QgYm90dG9tVG9Cb3R0b20gPSBhY3RpdmVSZWN0YW5nbGUueSArIGFjdGl2ZVJlY3RhbmdsZS5oZWlnaHQgLSAoYWxpZ25SZWN0YW5nbGUueSArIGFsaWduUmVjdGFuZ2xlLmhlaWdodCk7XG5cbiAgICAgICAgY29uc3QgeERpc3RhbmNlcyA9IFtsZWZ0VG9MZWZ0LCBsZWZ0VG9SaWdodCwgcmlnaHRUb1JpZ2h0LCByaWdodFRvTGVmdCwgY2VudGVyWERpc3RhbmNlXTtcbiAgICAgICAgY29uc3QgeURpc3RhbmNlcyA9IFt0b3BUb1RvcCwgdG9wVG9Cb3R0b20sIGJvdHRvbVRvQm90dG9tLCBib3R0b21Ub1RvcCwgY2VudGVyWURpc3RhbmNlXTtcblxuICAgICAgICBjb25zdCB4RGlzdGFuY2VzQWJzID0geERpc3RhbmNlcy5tYXAoZGlzdGFuY2UgPT4gTWF0aC5hYnMoZGlzdGFuY2UpKTtcbiAgICAgICAgY29uc3QgeURpc3RhbmNlc0FicyA9IHlEaXN0YW5jZXMubWFwKGRpc3RhbmNlID0+IE1hdGguYWJzKGRpc3RhbmNlKSk7XG5cbiAgICAgICAgY29uc3QgaW5kZXhYID0geERpc3RhbmNlc0Ficy5pbmRleE9mKE1hdGgubWluKC4uLnhEaXN0YW5jZXNBYnMpKTtcbiAgICAgICAgY29uc3QgaW5kZXhZID0geURpc3RhbmNlc0Ficy5pbmRleE9mKE1hdGgubWluKC4uLnlEaXN0YW5jZXNBYnMpKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWJzWERpc3RhbmNlOiB4RGlzdGFuY2VzQWJzW2luZGV4WF0sXG4gICAgICAgICAgICB4RGlzdGFuY2U6IHhEaXN0YW5jZXNbaW5kZXhYXSxcbiAgICAgICAgICAgIGFic1lEaXN0YW5jZTogeURpc3RhbmNlc0Fic1tpbmRleFldLFxuICAgICAgICAgICAgeURpc3RhbmNlOiB5RGlzdGFuY2VzW2luZGV4WV0sXG4gICAgICAgICAgICBpbmRleFgsXG4gICAgICAgICAgICBpbmRleFlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhbGlnbkRpc3RyaWJ1dGUoYWxpZ25SZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSwgaXNIb3Jpem9udGFsOiBib29sZWFuKSB7XG4gICAgICAgIGxldCBkaXN0cmlidXRlTGluZXM6IGFueVtdID0gW107XG4gICAgICAgIGxldCBkZWx0YSA9IDA7XG4gICAgICAgIGxldCByZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSA9IFtdO1xuICAgICAgICBjb25zdCBheGlzID0gaXNIb3Jpem9udGFsID8gJ3gnIDogJ3knO1xuICAgICAgICBjb25zdCBzaWRlID0gaXNIb3Jpem9udGFsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZUNlbnRlciA9IHRoaXMuYWN0aXZlUmVjdGFuZ2xlW2F4aXNdICsgdGhpcy5hY3RpdmVSZWN0YW5nbGVbc2lkZV0gLyAyO1xuICAgICAgICBhbGlnblJlY3RhbmdsZXMuZm9yRWFjaChyZWMgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNDcm9zcyA9IGlzSG9yaXpvbnRhbCA/IGlzSG9yaXpvbnRhbENyb3NzKHJlYywgdGhpcy5hY3RpdmVSZWN0YW5nbGUpIDogaXNWZXJ0aWNhbENyb3NzKHJlYywgdGhpcy5hY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICAgICAgaWYgKGlzQ3Jvc3MgJiYgIVJlY3RhbmdsZUNsaWVudC5pc0hpdChyZWMsIHRoaXMuYWN0aXZlUmVjdGFuZ2xlKSkge1xuICAgICAgICAgICAgICAgIHJlY3RhbmdsZXMucHVzaChyZWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVjdGFuZ2xlcyA9IFsuLi5yZWN0YW5nbGVzLCB0aGlzLmFjdGl2ZVJlY3RhbmdsZV0uc29ydCgoYSwgYikgPT4gYVtheGlzXSAtIGJbYXhpc10pO1xuXG4gICAgICAgIGNvbnN0IHJlZkFycmF5OiBEaXN0cmlidXRlUmVmW10gPSBbXTtcbiAgICAgICAgbGV0IGRpc3RyaWJ1dGVEaXN0YW5jZSA9IDA7XG4gICAgICAgIGxldCBiZWZvcmVJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGFmdGVySW5kZXggPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0YW5nbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCByZWN0YW5nbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gcmVjdGFuZ2xlc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlciA9IHJlY3RhbmdsZXNbal07XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhZnRlcltheGlzXSAtIChiZWZvcmVbYXhpc10gKyBiZWZvcmVbc2lkZV0pO1xuICAgICAgICAgICAgICAgIGxldCBkaWYgPSBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICBpZiAocmVmQXJyYXlbaV0/LmFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZkFycmF5W2ldLmFmdGVyLnB1c2goeyBkaXN0YW5jZSwgaW5kZXg6IGogfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQXJyYXlbaV0gPSB7IC4uLnJlZkFycmF5W2ldLCBhZnRlcjogW3sgZGlzdGFuY2UsIGluZGV4OiBqIH1dIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkFycmF5W2pdPy5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQXJyYXlbal0uYmVmb3JlLnB1c2goeyBkaXN0YW5jZSwgaW5kZXg6IGkgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQXJyYXlbal0gPSB7IC4uLnJlZkFycmF5W2pdLCBiZWZvcmU6IFt7IGRpc3RhbmNlLCBpbmRleDogaSB9XSB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vbWlkZGxlXG4gICAgICAgICAgICAgICAgbGV0IF9jZW50ZXIgPSAoYmVmb3JlW2F4aXNdICsgYmVmb3JlW3NpZGVdICsgYWZ0ZXJbYXhpc10pIC8gMjtcbiAgICAgICAgICAgICAgICBkaWYgPSBNYXRoLmFicyhhY3RpdmVSZWN0YW5nbGVDZW50ZXIgLSBfY2VudGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlmIDwgU05BUF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZURpc3RhbmNlID0gKGFmdGVyW2F4aXNdIC0gKGJlZm9yZVtheGlzXSArIGJlZm9yZVtzaWRlXSkgLSB0aGlzLmFjdGl2ZVJlY3RhbmdsZVtzaWRlXSkgLyAyO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGFjdGl2ZVJlY3RhbmdsZUNlbnRlciAtIF9jZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCA9IGo7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9hZnRlclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlUmlnaHQgPSBhZnRlcltheGlzXSAtIChiZWZvcmVbYXhpc10gKyBiZWZvcmVbc2lkZV0pO1xuICAgICAgICAgICAgICAgIF9jZW50ZXIgPSBhZnRlcltheGlzXSArIGFmdGVyW3NpZGVdICsgZGlzdGFuY2VSaWdodCArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlW3NpZGVdIC8gMjtcbiAgICAgICAgICAgICAgICBkaWYgPSBNYXRoLmFicyhhY3RpdmVSZWN0YW5nbGVDZW50ZXIgLSBfY2VudGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRpc3RyaWJ1dGVEaXN0YW5jZSAmJiBkaWYgPCBTTkFQX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRlRGlzdGFuY2UgPSBkaXN0YW5jZVJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmVJbmRleCA9IGo7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gYWN0aXZlUmVjdGFuZ2xlQ2VudGVyIC0gX2NlbnRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2JlZm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlQmVmb3JlID0gYWZ0ZXJbYXhpc10gLSAoYmVmb3JlW2F4aXNdICsgYmVmb3JlW3NpZGVdKTtcbiAgICAgICAgICAgICAgICBfY2VudGVyID0gYmVmb3JlW2F4aXNdIC0gZGlzdGFuY2VCZWZvcmUgLSB0aGlzLmFjdGl2ZVJlY3RhbmdsZVtzaWRlXSAvIDI7XG4gICAgICAgICAgICAgICAgZGlmID0gTWF0aC5hYnMoYWN0aXZlUmVjdGFuZ2xlQ2VudGVyIC0gX2NlbnRlcik7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRpc3RyaWJ1dGVEaXN0YW5jZSAmJiBkaWYgPCBTTkFQX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRlRGlzdGFuY2UgPSBkaXN0YW5jZUJlZm9yZTtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gYWN0aXZlUmVjdGFuZ2xlQ2VudGVyIC0gX2NlbnRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVJbmRleCA9IHJlY3RhbmdsZXMuaW5kZXhPZih0aGlzLmFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgIGxldCBiZWZvcmVJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBsZXQgYWZ0ZXJJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBpZiAoYmVmb3JlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYmVmb3JlSW5kZXhlcy5wdXNoKGJlZm9yZUluZGV4KTtcbiAgICAgICAgICAgIGZpbmRSZWN0YW5nbGUoZGlzdHJpYnV0ZURpc3RhbmNlLCByZWZBcnJheVtiZWZvcmVJbmRleF0sICdiZWZvcmUnLCBiZWZvcmVJbmRleGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZnRlckluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFmdGVySW5kZXhlcy5wdXNoKGFmdGVySW5kZXgpO1xuICAgICAgICAgICAgZmluZFJlY3RhbmdsZShkaXN0cmlidXRlRGlzdGFuY2UsIHJlZkFycmF5W2FmdGVySW5kZXhdLCAnYWZ0ZXInLCBhZnRlckluZGV4ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlZm9yZUluZGV4ZXMubGVuZ3RoIHx8IGFmdGVySW5kZXhlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4QXJyID0gWy4uLmJlZm9yZUluZGV4ZXMucmV2ZXJzZSgpLCBhY3RpdmVJbmRleCwgLi4uYWZ0ZXJJbmRleGVzXTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlUmVjdGFuZ2xlW2F4aXNdIC09IGRlbHRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbmRleEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVMaW5lcy5wdXNoKGdldExpbmVQb2ludHMocmVjdGFuZ2xlc1tpbmRleEFycltpIC0gMV1dLCByZWN0YW5nbGVzW2luZGV4QXJyW2ldXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZmluZFJlY3RhbmdsZShkaXN0YW5jZTogbnVtYmVyLCByZWY6IERpc3RyaWJ1dGVSZWYsIGRpcmVjdGlvbjogc3RyaW5nLCByZWN0YW5nbGVJbmRleGVzOiBudW1iZXJbXSkge1xuICAgICAgICAgICAgY29uc3QgYXJyID0gcmVmW2RpcmVjdGlvbiBhcyBrZXlvZiBEaXN0cmlidXRlUmVmXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVmQXJyYXkuaW5kZXhPZihyZWYpO1xuICAgICAgICAgICAgaWYgKChpbmRleCA9PT0gMCAmJiBkaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB8fCAoaW5kZXggPT09IHJlZkFycmF5Lmxlbmd0aCAtIDEgJiYgZGlyZWN0aW9uID09PSAnYWZ0ZXInKSkgcmV0dXJuO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoYXJyW2ldLmRpc3RhbmNlIC0gZGlzdGFuY2UpIDwgMC4xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZUluZGV4ZXMucHVzaChhcnJbaV0uaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBmaW5kUmVjdGFuZ2xlKGRpc3RhbmNlLCByZWZBcnJheVthcnJbaV0uaW5kZXhdLCBkaXJlY3Rpb24sIHJlY3RhbmdsZUluZGV4ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZVBvaW50cyhiZWZvcmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgYWZ0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICAgICAgY29uc3Qgb3Bwb3NpdGVBeGlzID0gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuICAgICAgICAgICAgY29uc3Qgb3Bwb3NpdGVTaWRlID0gc2lkZSA9PT0gJ3dpZHRoJyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICAgICAgICAgIGNvbnN0IGFsaWduID0gW1xuICAgICAgICAgICAgICAgIGJlZm9yZVJlY3RhbmdsZVtvcHBvc2l0ZUF4aXNdLFxuICAgICAgICAgICAgICAgIGJlZm9yZVJlY3RhbmdsZVtvcHBvc2l0ZUF4aXNdICsgYmVmb3JlUmVjdGFuZ2xlW29wcG9zaXRlU2lkZV0sXG4gICAgICAgICAgICAgICAgYWZ0ZXJSZWN0YW5nbGVbb3Bwb3NpdGVBeGlzXSxcbiAgICAgICAgICAgICAgICBhZnRlclJlY3RhbmdsZVtvcHBvc2l0ZUF4aXNdICsgYWZ0ZXJSZWN0YW5nbGVbb3Bwb3NpdGVTaWRlXVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRBcnIgPSBhbGlnbi5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgICBjb25zdCBhdmVyYWdlID0gKHNvcnRBcnJbMV0gKyBzb3J0QXJyWzJdKSAvIDI7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIGlzSG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgIFtiZWZvcmVSZWN0YW5nbGUueCArIGJlZm9yZVJlY3RhbmdsZS53aWR0aCArIG9mZnNldCwgYXZlcmFnZV0sXG4gICAgICAgICAgICAgICAgICAgICAgW2FmdGVyUmVjdGFuZ2xlLnggLSBvZmZzZXQsIGF2ZXJhZ2VdXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICAgICAgW2F2ZXJhZ2UsIGJlZm9yZVJlY3RhbmdsZS55ICsgYmVmb3JlUmVjdGFuZ2xlLmhlaWdodCArIG9mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgW2F2ZXJhZ2UsIGFmdGVyUmVjdGFuZ2xlLnkgLSBvZmZzZXRdXG4gICAgICAgICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRlbHRhLCBkaXN0cmlidXRlTGluZXMgfTtcbiAgICB9XG5cbiAgICBkcmF3QWxpZ25MaW5lcyhsaW5lczogbnVtYmVyW11bXSwgZzogU1ZHR0VsZW1lbnQpIHtcbiAgICAgICAgbGluZXMuZm9yRWFjaChwb2ludHMgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB4QWxpZ24gPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKHRoaXMuYm9hcmQpLmxpbmUocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVEYXNoOiBbNCwgNF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZy5hcHBlbmRDaGlsZCh4QWxpZ24pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkcmF3RGlzdHJpYnV0ZUxpbmVzKGxpbmVzOiBQb2ludFtdW10sIGc6IFNWR0dFbGVtZW50KSB7XG4gICAgICAgIGxpbmVzLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWxpbmUubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICBsZXQgaXNIb3Jpem9udGFsID0gbGluZVswXVsxXSA9PT0gbGluZVsxXVsxXTtcbiAgICAgICAgICAgIGNvbnN0IHlBbGlnbiA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShsaW5lWzBdWzBdLCBsaW5lWzBdWzFdLCBsaW5lWzFdWzBdLCBsaW5lWzFdWzFdLCB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGcuYXBwZW5kQ2hpbGQoeUFsaWduKTtcblxuICAgICAgICAgICAgbGluZS5mb3JFYWNoKHBvaW50ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXJQb2ludCA9IGdldEJhclBvaW50KHBvaW50LCBpc0hvcml6b250YWwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhciA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShiYXJQb2ludFswXVswXSwgYmFyUG9pbnRbMF1bMV0sIGJhclBvaW50WzFdWzBdLCBiYXJQb2ludFsxXVsxXSwge1xuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZy5hcHBlbmRDaGlsZChiYXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNIb3Jpem9udGFsQ3Jvc3MocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG90aGVyOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICByZXR1cm4gIShyZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgPCBvdGhlci55IHx8IHJlY3RhbmdsZS55ID4gb3RoZXIueSArIG90aGVyLmhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIGlzVmVydGljYWxDcm9zcyhyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgb3RoZXI6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgIHJldHVybiAhKHJlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIDwgb3RoZXIueCB8fCByZWN0YW5nbGUueCA+IG90aGVyLnggKyBvdGhlci53aWR0aCk7XG59XG5mdW5jdGlvbiBnZXRCYXJQb2ludChwb2ludDogUG9pbnQsIGlzSG9yaXpvbnRhbDogYm9vbGVhbikge1xuICAgIHJldHVybiBpc0hvcml6b250YWxcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFtwb2ludFswXSwgcG9pbnRbMV0gLSA0XSxcbiAgICAgICAgICAgICAgW3BvaW50WzBdLCBwb2ludFsxXSArIDRdXG4gICAgICAgICAgXVxuICAgICAgICA6IFtcbiAgICAgICAgICAgICAgW3BvaW50WzBdIC0gNCwgcG9pbnRbMV1dLFxuICAgICAgICAgICAgICBbcG9pbnRbMF0gKyA0LCBwb2ludFsxXV1cbiAgICAgICAgICBdO1xufVxuIl19
@@ -1,10 +1,15 @@
1
- import { getSelectedElements } from '.';
2
1
  import { ACTIVE_STROKE_WIDTH, SELECTION_RECTANGLE_CLASS_NAME } from '../constants';
3
2
  import { PlaitBoard, PlaitPluginKey, PlaitPointerType, RectangleClient, SELECTION_BORDER_COLOR } from '../interfaces';
4
- import { drawRectangle } from '../public-api';
5
3
  import { setDragging } from './dnd';
6
4
  import { getRectangleByElements } from './element';
7
5
  import { BOARD_TO_IS_SELECTION_MOVING, BOARD_TO_TEMPORARY_ELEMENTS } from './weak-maps';
6
+ import { drawRectangle } from './drawing/rectangle';
7
+ import { cacheSelectedElements, getSelectedElements } from './selected-element';
8
+ import { getSelectionAngle } from './angle';
9
+ import { setAngleForG } from './dom';
10
+ import { filterSelectedGroups, getAllElementsInGroup, getElementsInGroup, getElementsInGroupByElement, getGroupByElement } from './group';
11
+ import { uniqueById } from './helper';
12
+ import { Selection } from '../interfaces/selection';
8
13
  export function isSelectionMoving(board) {
9
14
  return !!BOARD_TO_IS_SELECTION_MOVING.get(board);
10
15
  }
@@ -40,7 +45,7 @@ export function getTemporaryRef(board) {
40
45
  export function deleteTemporaryElements(board) {
41
46
  BOARD_TO_TEMPORARY_ELEMENTS.delete(board);
42
47
  }
43
- export function createSelectionRectangleG(board) {
48
+ export function drawEntireActiveRectangleG(board) {
44
49
  const elements = getSelectedElements(board);
45
50
  const rectangle = getRectangleByElements(board, elements, false);
46
51
  if (rectangle.width > 0 && rectangle.height > 0 && elements.length > 1) {
@@ -50,9 +55,89 @@ export function createSelectionRectangleG(board) {
50
55
  fillStyle: 'solid'
51
56
  });
52
57
  selectionRectangleG.classList.add(SELECTION_RECTANGLE_CLASS_NAME);
53
- PlaitBoard.getElementActiveHost(board).append(selectionRectangleG);
58
+ const angle = getSelectionAngle(elements);
59
+ if (angle) {
60
+ setAngleForG(selectionRectangleG, RectangleClient.getCenterPoint(rectangle), angle);
61
+ }
54
62
  return selectionRectangleG;
55
63
  }
56
64
  return null;
57
65
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvc2VsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBd0MsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDcEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4RixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBaUI7SUFDL0MsT0FBTyxDQUFDLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBaUI7SUFDaEQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0RSw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUFpQjtJQUNsRCxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pFLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBaUI7SUFDL0MsTUFBTSxPQUFPLEdBQUksS0FBMkIsQ0FBQyxnQkFBZ0IsQ0FBb0IsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9HLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pILENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsS0FBaUI7SUFDckQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBaUI7SUFDbEQsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25ELElBQUksR0FBRyxFQUFFLENBQUM7UUFDTixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDeEIsQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBaUI7SUFDN0MsT0FBTywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFpQjtJQUNyRCwyQkFBMkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxLQUFpQjtJQUN2RCxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLElBQUksU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsRUFBRTtZQUN0RyxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFdBQVcsRUFBRSxtQkFBbUI7WUFDaEMsU0FBUyxFQUFFLE9BQU87U0FDckIsQ0FBQyxDQUFDO1FBQ0gsbUJBQW1CLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xFLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxPQUFPLG1CQUFtQixDQUFDO0lBQy9CLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gJy4nO1xuaW1wb3J0IHsgQUNUSVZFX1NUUk9LRV9XSURUSCwgU0VMRUNUSU9OX1JFQ1RBTkdMRV9DTEFTU19OQU1FIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBsYWl0UGx1Z2luS2V5LCBQbGFpdFBvaW50ZXJUeXBlLCBSZWN0YW5nbGVDbGllbnQsIFNFTEVDVElPTl9CT1JERVJfQ09MT1IgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBsYWl0T3B0aW9uc0JvYXJkLCBXaXRoUGx1Z2luT3B0aW9ucywgZHJhd1JlY3RhbmdsZSB9IGZyb20gJy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgc2V0RHJhZ2dpbmcgfSBmcm9tICcuL2RuZCc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzIH0gZnJvbSAnLi9lbGVtZW50JztcbmltcG9ydCB7IEJPQVJEX1RPX0lTX1NFTEVDVElPTl9NT1ZJTkcsIEJPQVJEX1RPX1RFTVBPUkFSWV9FTEVNRU5UUyB9IGZyb20gJy4vd2Vhay1tYXBzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2VsZWN0aW9uTW92aW5nKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgcmV0dXJuICEhQk9BUkRfVE9fSVNfU0VMRUNUSU9OX01PVklORy5nZXQoYm9hcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uTW92aW5nKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LmFkZCgnc2VsZWN0aW9uLW1vdmluZycpO1xuICAgIEJPQVJEX1RPX0lTX1NFTEVDVElPTl9NT1ZJTkcuc2V0KGJvYXJkLCB0cnVlKTtcbiAgICBzZXREcmFnZ2luZyhib2FyZCwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbk1vdmluZyhib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGlvbi1tb3ZpbmcnKTtcbiAgICBCT0FSRF9UT19JU19TRUxFQ1RJT05fTU9WSU5HLmRlbGV0ZShib2FyZCk7XG4gICAgc2V0RHJhZ2dpbmcoYm9hcmQsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFuZGxlU2VsZWN0aW9uKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IChib2FyZCBhcyBQbGFpdE9wdGlvbnNCb2FyZCkuZ2V0UGx1Z2luT3B0aW9uczxXaXRoUGx1Z2luT3B0aW9ucz4oUGxhaXRQbHVnaW5LZXkud2l0aFNlbGVjdGlvbik7XG4gICAgcmV0dXJuIGJvYXJkLnBvaW50ZXIgIT09IFBsYWl0UG9pbnRlclR5cGUuaGFuZCAmJiAhb3B0aW9ucy5pc0Rpc2FibGVkU2VsZWN0ICYmICFQbGFpdEJvYXJkLmlzUmVhZG9ubHkoYm9hcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTZXRTZWxlY3Rpb25PcGVyYXRpb24oYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICByZXR1cm4gISFib2FyZC5vcGVyYXRpb25zLmZpbmQodmFsdWUgPT4gdmFsdWUudHlwZSA9PT0gJ3NldF9zZWxlY3Rpb24nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBvcmFyeUVsZW1lbnRzKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3QgcmVmID0gQk9BUkRfVE9fVEVNUE9SQVJZX0VMRU1FTlRTLmdldChib2FyZCk7XG4gICAgaWYgKHJlZikge1xuICAgICAgICByZXR1cm4gcmVmLmVsZW1lbnRzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcG9yYXJ5UmVmKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgcmV0dXJuIEJPQVJEX1RPX1RFTVBPUkFSWV9FTEVNRU5UUy5nZXQoYm9hcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlVGVtcG9yYXJ5RWxlbWVudHMoYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBCT0FSRF9UT19URU1QT1JBUllfRUxFTUVOVFMuZGVsZXRlKGJvYXJkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdGlvblJlY3RhbmdsZUcoYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMoYm9hcmQsIGVsZW1lbnRzLCBmYWxzZSk7XG4gICAgaWYgKHJlY3RhbmdsZS53aWR0aCA+IDAgJiYgcmVjdGFuZ2xlLmhlaWdodCA+IDAgJiYgZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25SZWN0YW5nbGVHID0gZHJhd1JlY3RhbmdsZShib2FyZCwgUmVjdGFuZ2xlQ2xpZW50LmluZmxhdGUocmVjdGFuZ2xlLCBBQ1RJVkVfU1RST0tFX1dJRFRIKSwge1xuICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IEFDVElWRV9TVFJPS0VfV0lEVEgsXG4gICAgICAgICAgICBmaWxsU3R5bGU6ICdzb2xpZCdcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGVjdGlvblJlY3RhbmdsZUcuY2xhc3NMaXN0LmFkZChTRUxFQ1RJT05fUkVDVEFOR0xFX0NMQVNTX05BTUUpO1xuICAgICAgICBQbGFpdEJvYXJkLmdldEVsZW1lbnRBY3RpdmVIb3N0KGJvYXJkKS5hcHBlbmQoc2VsZWN0aW9uUmVjdGFuZ2xlRyk7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb25SZWN0YW5nbGVHO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbiJdfQ==
66
+ export function setSelectedElementsWithGroup(board, elements, isShift) {
67
+ if (!board.selection) {
68
+ return;
69
+ }
70
+ const selectedElements = getSelectedElements(board);
71
+ if (!Selection.isCollapsed(board.selection)) {
72
+ let newElements = [...selectedElements];
73
+ elements.forEach(item => {
74
+ if (!item.groupId) {
75
+ newElements.push(item);
76
+ }
77
+ else {
78
+ newElements.push(...getElementsInGroupByElement(board, item));
79
+ }
80
+ });
81
+ cacheSelectedElements(board, uniqueById(newElements));
82
+ return;
83
+ }
84
+ if (Selection.isCollapsed(board.selection)) {
85
+ const hitElement = elements[0];
86
+ const hitElementGroups = getGroupByElement(board, hitElement, true);
87
+ if (hitElementGroups.length) {
88
+ const elementsInHighestGroup = getElementsInGroup(board, hitElementGroups[hitElementGroups.length - 1], true) || [];
89
+ const isSelectGroupElement = selectedElements.some(element => elementsInHighestGroup.map(item => item.id).includes(element.id));
90
+ if (isShift) {
91
+ cacheSelectedElementsWithGroupOnShift(board, elements, isSelectGroupElement, elementsInHighestGroup);
92
+ }
93
+ else {
94
+ cacheSelectedElementsWithGroup(board, elements, isSelectGroupElement, hitElementGroups);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ export function cacheSelectedElementsWithGroupOnShift(board, elements, isSelectGroupElement, elementsInHighestGroup) {
100
+ const selectedElements = getSelectedElements(board);
101
+ let newElements = [...selectedElements];
102
+ const hitElement = elements[0];
103
+ let pendingElements = [];
104
+ if (!isSelectGroupElement) {
105
+ pendingElements = elementsInHighestGroup;
106
+ }
107
+ else {
108
+ const isHitSelectedElement = selectedElements.some(item => item.id === hitElement.id);
109
+ const selectedElementsInGroup = elementsInHighestGroup.filter(item => selectedElements.includes(item));
110
+ if (isHitSelectedElement) {
111
+ pendingElements = selectedElementsInGroup.filter(item => item.id !== hitElement.id);
112
+ }
113
+ else {
114
+ pendingElements.push(...selectedElementsInGroup, ...elements);
115
+ }
116
+ }
117
+ elementsInHighestGroup.forEach(element => {
118
+ if (newElements.includes(element)) {
119
+ newElements.splice(newElements.indexOf(element), 1);
120
+ }
121
+ });
122
+ if (pendingElements.length) {
123
+ newElements.push(...pendingElements);
124
+ }
125
+ cacheSelectedElements(board, uniqueById(newElements));
126
+ }
127
+ export function cacheSelectedElementsWithGroup(board, elements, isSelectGroupElement, hitElementGroups) {
128
+ let newElements = [...elements];
129
+ const selectedGroups = filterSelectedGroups(board, hitElementGroups);
130
+ if (selectedGroups.length > 0) {
131
+ if (selectedGroups.length > 1) {
132
+ newElements = getAllElementsInGroup(board, selectedGroups[selectedGroups.length - 2], true);
133
+ }
134
+ }
135
+ else {
136
+ const elementsInGroup = getAllElementsInGroup(board, hitElementGroups[hitElementGroups.length - 1], true);
137
+ if (!isSelectGroupElement) {
138
+ newElements = elementsInGroup;
139
+ }
140
+ }
141
+ cacheSelectedElements(board, uniqueById(newElements));
142
+ }
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvc2VsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuRixPQUFPLEVBQUUsVUFBVSxFQUE0QixjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hKLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDcEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDckMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFJLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXBELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFpQjtJQUMvQyxPQUFPLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0Is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QkFBb0IsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEcsQ0FBQztJQUNMLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUN4QixXQUFXLEdBQUcsZUFBZSxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0lBQ0QscUJBQXFCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBQ1RJVkVfU1RST0tFX1dJRFRILCBTRUxFQ1RJT05fUkVDVEFOR0xFX0NMQVNTX05BTUUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50LCBQbGFpdEdyb3VwLCBQbGFpdFBsdWdpbktleSwgUGxhaXRQb2ludGVyVHlwZSwgUmVjdGFuZ2xlQ2xpZW50LCBTRUxFQ1RJT05fQk9SREVSX0NPTE9SIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBzZXREcmFnZ2luZyB9IGZyb20gJy4vZG5kJztcbmltcG9ydCB7IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMgfSBmcm9tICcuL2VsZW1lbnQnO1xuaW1wb3J0IHsgQk9BUkRfVE9fSVNfU0VMRUNUSU9OX01PVklORywgQk9BUkRfVE9fVEVNUE9SQVJZX0VMRU1FTlRTIH0gZnJvbSAnLi93ZWFrLW1hcHMnO1xuaW1wb3J0IHsgZHJhd1JlY3RhbmdsZSB9IGZyb20gJy4vZHJhd2luZy9yZWN0YW5nbGUnO1xuaW1wb3J0IHsgY2FjaGVTZWxlY3RlZEVsZW1lbnRzLCBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSAnLi9zZWxlY3RlZC1lbGVtZW50JztcbmltcG9ydCB7IGdldFNlbGVjdGlvbkFuZ2xlIH0gZnJvbSAnLi9hbmdsZSc7XG5pbXBvcnQgeyBzZXRBbmdsZUZvckcgfSBmcm9tICcuL2RvbSc7XG5pbXBvcnQgeyBmaWx0ZXJTZWxlY3RlZEdyb3VwcywgZ2V0QWxsRWxlbWVudHNJbkdyb3VwLCBnZXRFbGVtZW50c0luR3JvdXAsIGdldEVsZW1lbnRzSW5Hcm91cEJ5RWxlbWVudCwgZ2V0R3JvdXBCeUVsZW1lbnQgfSBmcm9tICcuL2dyb3VwJztcbmltcG9ydCB7IHVuaXF1ZUJ5SWQgfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBTZWxlY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NlbGVjdGlvbic7XG5pbXBvcnQgeyBQbGFpdE9wdGlvbnNCb2FyZCB9IGZyb20gJy4uL3BsdWdpbnMvd2l0aC1vcHRpb25zJztcbmltcG9ydCB7IFdpdGhQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi4vcGx1Z2lucy93aXRoLXNlbGVjdGlvbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbGVjdGlvbk1vdmluZyhib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIHJldHVybiAhIUJPQVJEX1RPX0lTX1NFTEVDVElPTl9NT1ZJTkcuZ2V0KGJvYXJkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFNlbGVjdGlvbk1vdmluZyhib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGlvbi1tb3ZpbmcnKTtcbiAgICBCT0FSRF9UT19JU19TRUxFQ1RJT05fTU9WSU5HLnNldChib2FyZCwgdHJ1ZSk7XG4gICAgc2V0RHJhZ2dpbmcoYm9hcmQsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb25Nb3ZpbmcoYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3Rpb24tbW92aW5nJyk7XG4gICAgQk9BUkRfVE9fSVNfU0VMRUNUSU9OX01PVklORy5kZWxldGUoYm9hcmQpO1xuICAgIHNldERyYWdnaW5nKGJvYXJkLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhbmRsZVNlbGVjdGlvbihib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoYm9hcmQgYXMgUGxhaXRPcHRpb25zQm9hcmQpLmdldFBsdWdpbk9wdGlvbnM8V2l0aFBsdWdpbk9wdGlvbnM+KFBsYWl0UGx1Z2luS2V5LndpdGhTZWxlY3Rpb24pO1xuICAgIHJldHVybiBib2FyZC5wb2ludGVyICE9PSBQbGFpdFBvaW50ZXJUeXBlLmhhbmQgJiYgIW9wdGlvbnMuaXNEaXNhYmxlZFNlbGVjdCAmJiAhUGxhaXRCb2FyZC5pc1JlYWRvbmx5KGJvYXJkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2V0U2VsZWN0aW9uT3BlcmF0aW9uKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgcmV0dXJuICEhYm9hcmQub3BlcmF0aW9ucy5maW5kKHZhbHVlID0+IHZhbHVlLnR5cGUgPT09ICdzZXRfc2VsZWN0aW9uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wb3JhcnlFbGVtZW50cyhib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IHJlZiA9IEJPQVJEX1RPX1RFTVBPUkFSWV9FTEVNRU5UUy5nZXQoYm9hcmQpO1xuICAgIGlmIChyZWYpIHtcbiAgICAgICAgcmV0dXJuIHJlZi5lbGVtZW50cztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBvcmFyeVJlZihib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIHJldHVybiBCT0FSRF9UT19URU1QT1JBUllfRUxFTUVOVFMuZ2V0KGJvYXJkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVRlbXBvcmFyeUVsZW1lbnRzKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgQk9BUkRfVE9fVEVNUE9SQVJZX0VMRU1FTlRTLmRlbGV0ZShib2FyZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3RW50aXJlQWN0aXZlUmVjdGFuZ2xlRyhib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCk7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyhib2FyZCwgZWxlbWVudHMsIGZhbHNlKTtcbiAgICBpZiAocmVjdGFuZ2xlLndpZHRoID4gMCAmJiByZWN0YW5nbGUuaGVpZ2h0ID4gMCAmJiBlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblJlY3RhbmdsZUcgPSBkcmF3UmVjdGFuZ2xlKGJvYXJkLCBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZShyZWN0YW5nbGUsIEFDVElWRV9TVFJPS0VfV0lEVEgpLCB7XG4gICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogQUNUSVZFX1NUUk9LRV9XSURUSCxcbiAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZWN0aW9uUmVjdGFuZ2xlRy5jbGFzc0xpc3QuYWRkKFNFTEVDVElPTl9SRUNUQU5HTEVfQ0xBU1NfTkFNRSk7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gZ2V0U2VsZWN0aW9uQW5nbGUoZWxlbWVudHMpO1xuICAgICAgICBpZiAoYW5nbGUpIHtcbiAgICAgICAgICAgIHNldEFuZ2xlRm9yRyhzZWxlY3Rpb25SZWN0YW5nbGVHLCBSZWN0YW5nbGVDbGllbnQuZ2V0Q2VudGVyUG9pbnQocmVjdGFuZ2xlKSwgYW5nbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb25SZWN0YW5nbGVHO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFNlbGVjdGVkRWxlbWVudHNXaXRoR3JvdXAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSwgaXNTaGlmdDogYm9vbGVhbikge1xuICAgIGlmICghYm9hcmQuc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpO1xuICAgIGlmICghU2VsZWN0aW9uLmlzQ29sbGFwc2VkKGJvYXJkLnNlbGVjdGlvbikpIHtcbiAgICAgICAgbGV0IG5ld0VsZW1lbnRzID0gWy4uLnNlbGVjdGVkRWxlbWVudHNdO1xuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKC4uLmdldEVsZW1lbnRzSW5Hcm91cEJ5RWxlbWVudChib2FyZCwgaXRlbSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY2FjaGVTZWxlY3RlZEVsZW1lbnRzKGJvYXJkLCB1bmlxdWVCeUlkKG5ld0VsZW1lbnRzKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNlbGVjdGlvbi5pc0NvbGxhcHNlZChib2FyZC5zZWxlY3Rpb24pKSB7XG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBlbGVtZW50c1swXTtcbiAgICAgICAgY29uc3QgaGl0RWxlbWVudEdyb3VwcyA9IGdldEdyb3VwQnlFbGVtZW50KGJvYXJkLCBoaXRFbGVtZW50LCB0cnVlKSBhcyBQbGFpdEdyb3VwW107XG4gICAgICAgIGlmIChoaXRFbGVtZW50R3JvdXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNJbkhpZ2hlc3RHcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cChib2FyZCwgaGl0RWxlbWVudEdyb3Vwc1toaXRFbGVtZW50R3JvdXBzLmxlbmd0aCAtIDFdLCB0cnVlKSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0R3JvdXBFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5zb21lKGVsZW1lbnQgPT4gZWxlbWVudHNJbkhpZ2hlc3RHcm91cC5tYXAoaXRlbSA9PiBpdGVtLmlkKS5pbmNsdWRlcyhlbGVtZW50LmlkKSk7XG4gICAgICAgICAgICBpZiAoaXNTaGlmdCkge1xuICAgICAgICAgICAgICAgIGNhY2hlU2VsZWN0ZWRFbGVtZW50c1dpdGhHcm91cE9uU2hpZnQoYm9hcmQsIGVsZW1lbnRzLCBpc1NlbGVjdEdyb3VwRWxlbWVudCwgZWxlbWVudHNJbkhpZ2hlc3RHcm91cCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhY2hlU2VsZWN0ZWRFbGVtZW50c1dpdGhHcm91cChib2FyZCwgZWxlbWVudHMsIGlzU2VsZWN0R3JvdXBFbGVtZW50LCBoaXRFbGVtZW50R3JvdXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlU2VsZWN0ZWRFbGVtZW50c1dpdGhHcm91cE9uU2hpZnQoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudHM6IFBsYWl0RWxlbWVudFtdLFxuICAgIGlzU2VsZWN0R3JvdXBFbGVtZW50OiBib29sZWFuLFxuICAgIGVsZW1lbnRzSW5IaWdoZXN0R3JvdXA6IFBsYWl0RWxlbWVudFtdXG4pIHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCk7XG4gICAgbGV0IG5ld0VsZW1lbnRzID0gWy4uLnNlbGVjdGVkRWxlbWVudHNdO1xuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBlbGVtZW50c1swXTtcbiAgICBsZXQgcGVuZGluZ0VsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSA9IFtdO1xuICAgIGlmICghaXNTZWxlY3RHcm91cEVsZW1lbnQpIHtcbiAgICAgICAgcGVuZGluZ0VsZW1lbnRzID0gZWxlbWVudHNJbkhpZ2hlc3RHcm91cDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpc0hpdFNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMuc29tZShpdGVtID0+IGl0ZW0uaWQgPT09IGhpdEVsZW1lbnQuaWQpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzSW5Hcm91cCA9IGVsZW1lbnRzSW5IaWdoZXN0R3JvdXAuZmlsdGVyKGl0ZW0gPT4gc2VsZWN0ZWRFbGVtZW50cy5pbmNsdWRlcyhpdGVtKSk7XG4gICAgICAgIGlmIChpc0hpdFNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgICAgICAgcGVuZGluZ0VsZW1lbnRzID0gc2VsZWN0ZWRFbGVtZW50c0luR3JvdXAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gaGl0RWxlbWVudC5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZW5kaW5nRWxlbWVudHMucHVzaCguLi5zZWxlY3RlZEVsZW1lbnRzSW5Hcm91cCwgLi4uZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsZW1lbnRzSW5IaWdoZXN0R3JvdXAuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKG5ld0VsZW1lbnRzLmluY2x1ZGVzKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBuZXdFbGVtZW50cy5zcGxpY2UobmV3RWxlbWVudHMuaW5kZXhPZihlbGVtZW50KSwgMSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocGVuZGluZ0VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBuZXdFbGVtZW50cy5wdXNoKC4uLnBlbmRpbmdFbGVtZW50cyk7XG4gICAgfVxuICAgIGNhY2hlU2VsZWN0ZWRFbGVtZW50cyhib2FyZCwgdW5pcXVlQnlJZChuZXdFbGVtZW50cykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVTZWxlY3RlZEVsZW1lbnRzV2l0aEdyb3VwKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSxcbiAgICBpc1NlbGVjdEdyb3VwRWxlbWVudDogYm9vbGVhbixcbiAgICBoaXRFbGVtZW50R3JvdXBzOiBQbGFpdEdyb3VwW11cbikge1xuICAgIGxldCBuZXdFbGVtZW50cyA9IFsuLi5lbGVtZW50c107XG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cHMgPSBmaWx0ZXJTZWxlY3RlZEdyb3Vwcyhib2FyZCwgaGl0RWxlbWVudEdyb3Vwcyk7XG4gICAgaWYgKHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnRzID0gZ2V0QWxsRWxlbWVudHNJbkdyb3VwKGJvYXJkLCBzZWxlY3RlZEdyb3Vwc1tzZWxlY3RlZEdyb3Vwcy5sZW5ndGggLSAyXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbGVtZW50c0luR3JvdXAgPSBnZXRBbGxFbGVtZW50c0luR3JvdXAoYm9hcmQsIGhpdEVsZW1lbnRHcm91cHNbaGl0RWxlbWVudEdyb3Vwcy5sZW5ndGggLSAxXSwgdHJ1ZSk7XG4gICAgICAgIGlmICghaXNTZWxlY3RHcm91cEVsZW1lbnQpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnRzID0gZWxlbWVudHNJbkdyb3VwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhY2hlU2VsZWN0ZWRFbGVtZW50cyhib2FyZCwgdW5pcXVlQnlJZChuZXdFbGVtZW50cykpO1xufVxuIl19