@schneideress/dashboardframework 17.0.47 → 20.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/schneideress-dashboardframework.mjs +47 -47
- package/fesm2022/schneideress-dashboardframework.mjs.map +1 -1
- package/index.d.ts +1255 -5
- package/package.json +11 -7
- package/esm2022/gridster/index.mjs +0 -12
- package/esm2022/gridster/lib/gridster.component.mjs +0 -627
- package/esm2022/gridster/lib/gridster.interface.mjs +0 -3
- package/esm2022/gridster/lib/gridster.module.mjs +0 -17
- package/esm2022/gridster/lib/gridsterCompact.service.mjs +0 -126
- package/esm2022/gridster/lib/gridsterConfig.constant.mjs +0 -118
- package/esm2022/gridster/lib/gridsterConfig.interface.mjs +0 -37
- package/esm2022/gridster/lib/gridsterConfigS.interface.mjs +0 -2
- package/esm2022/gridster/lib/gridsterDraggable.service.mjs +0 -405
- package/esm2022/gridster/lib/gridsterEmptyCell.service.mjs +0 -255
- package/esm2022/gridster/lib/gridsterItem.component.mjs +0 -231
- package/esm2022/gridster/lib/gridsterItem.interface.mjs +0 -3
- package/esm2022/gridster/lib/gridsterPreview.component.mjs +0 -36
- package/esm2022/gridster/lib/gridsterPush.service.mjs +0 -316
- package/esm2022/gridster/lib/gridsterPushResize.service.mjs +0 -225
- package/esm2022/gridster/lib/gridsterRenderer.interface.mjs +0 -2
- package/esm2022/gridster/lib/gridsterRenderer.service.mjs +0 -274
- package/esm2022/gridster/lib/gridsterResizable.service.mjs +0 -470
- package/esm2022/gridster/lib/gridsterResizeEventType.interface.mjs +0 -2
- package/esm2022/gridster/lib/gridsterScroll.service.mjs +0 -134
- package/esm2022/gridster/lib/gridsterSwap.service.mjs +0 -87
- package/esm2022/gridster/lib/gridsterUtils.service.mjs +0 -92
- package/esm2022/lib/custom.notifier.options.mjs +0 -41
- package/esm2022/lib/ra-dashboard-area/ra.dashboard.area.mjs +0 -639
- package/esm2022/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +0 -43
- package/esm2022/lib/ra-widget-container/ra.widget.container.component.mjs +0 -964
- package/esm2022/lib/ra.base.dashboard.filter.mjs +0 -46
- package/esm2022/lib/ra.base.dashboard.template.mjs +0 -45
- package/esm2022/lib/ra.dashbard.event.bus.mjs +0 -46
- package/esm2022/lib/ra.dashboard.module.mjs +0 -55
- package/esm2022/lib/ra.dashboard.responsive.service.mjs +0 -149
- package/esm2022/lib/ra.dashboard.service.mjs +0 -84
- package/esm2022/lib/ra.event.enum.mjs +0 -75
- package/esm2022/lib/ra.gridster.config.mjs +0 -56
- package/esm2022/public-api.mjs +0 -13
- package/esm2022/schneideress-dashboardframework.mjs +0 -5
- package/gridster/index.d.ts +0 -9
- package/gridster/lib/gridster.component.d.ts +0 -79
- package/gridster/lib/gridster.interface.d.ts +0 -49
- package/gridster/lib/gridster.module.d.ts +0 -8
- package/gridster/lib/gridsterCompact.service.d.ts +0 -11
- package/gridster/lib/gridsterConfig.constant.d.ts +0 -2
- package/gridster/lib/gridsterConfig.interface.d.ts +0 -155
- package/gridster/lib/gridsterConfigS.interface.d.ts +0 -107
- package/gridster/lib/gridsterDraggable.service.d.ts +0 -68
- package/gridster/lib/gridsterEmptyCell.service.d.ts +0 -31
- package/gridster/lib/gridsterItem.component.d.ts +0 -61
- package/gridster/lib/gridsterItem.interface.d.ts +0 -67
- package/gridster/lib/gridsterPreview.component.d.ts +0 -17
- package/gridster/lib/gridsterPush.service.d.ts +0 -34
- package/gridster/lib/gridsterPushResize.service.d.ts +0 -26
- package/gridster/lib/gridsterRenderer.interface.d.ts +0 -14
- package/gridster/lib/gridsterRenderer.service.d.ts +0 -37
- package/gridster/lib/gridsterResizable.service.d.ts +0 -86
- package/gridster/lib/gridsterResizeEventType.interface.d.ts +0 -6
- package/gridster/lib/gridsterScroll.service.d.ts +0 -7
- package/gridster/lib/gridsterSwap.service.d.ts +0 -13
- package/gridster/lib/gridsterUtils.service.d.ts +0 -16
- package/lib/custom.notifier.options.d.ts +0 -2
- package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +0 -132
- package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +0 -20
- package/lib/ra-widget-container/ra.widget.container.component.d.ts +0 -154
- package/lib/ra.base.dashboard.filter.d.ts +0 -19
- package/lib/ra.base.dashboard.template.d.ts +0 -24
- package/lib/ra.dashbard.event.bus.d.ts +0 -23
- package/lib/ra.dashboard.module.d.ts +0 -16
- package/lib/ra.dashboard.responsive.service.d.ts +0 -24
- package/lib/ra.dashboard.service.d.ts +0 -26
- package/lib/ra.event.enum.d.ts +0 -72
- package/lib/ra.gridster.config.d.ts +0 -2
- package/public-api.d.ts +0 -9
|
@@ -1,627 +0,0 @@
|
|
|
1
|
-
import { NgForOf, NgStyle } from '@angular/common';
|
|
2
|
-
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, Renderer2, ViewEncapsulation } from '@angular/core';
|
|
3
|
-
import { debounceTime, Subject, switchMap, takeUntil, timer } from 'rxjs';
|
|
4
|
-
import { GridsterCompact } from './gridsterCompact.service';
|
|
5
|
-
import { GridsterConfigService } from './gridsterConfig.constant';
|
|
6
|
-
import { GridType } from './gridsterConfig.interface';
|
|
7
|
-
import { GridsterEmptyCell } from './gridsterEmptyCell.service';
|
|
8
|
-
import { GridsterPreviewComponent } from './gridsterPreview.component';
|
|
9
|
-
import { GridsterRenderer } from './gridsterRenderer.service';
|
|
10
|
-
import { GridsterUtils } from './gridsterUtils.service';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
export class GridsterComponent {
|
|
13
|
-
constructor(el, renderer, cdRef, zone) {
|
|
14
|
-
this.renderer = renderer;
|
|
15
|
-
this.cdRef = cdRef;
|
|
16
|
-
this.zone = zone;
|
|
17
|
-
this.columns = 0;
|
|
18
|
-
this.rows = 0;
|
|
19
|
-
this.gridColumns = [];
|
|
20
|
-
this.gridRows = [];
|
|
21
|
-
this.previewStyle$ = new EventEmitter();
|
|
22
|
-
this.calculateLayout$ = new Subject();
|
|
23
|
-
this.resize$ = new Subject();
|
|
24
|
-
this.destroy$ = new Subject();
|
|
25
|
-
this.optionsChanged = () => {
|
|
26
|
-
this.setOptions();
|
|
27
|
-
let widgetsIndex = this.grid.length - 1;
|
|
28
|
-
let widget;
|
|
29
|
-
for (; widgetsIndex >= 0; widgetsIndex--) {
|
|
30
|
-
widget = this.grid[widgetsIndex];
|
|
31
|
-
widget.updateOptions();
|
|
32
|
-
}
|
|
33
|
-
this.calculateLayout();
|
|
34
|
-
};
|
|
35
|
-
this.onResize = () => {
|
|
36
|
-
if (this.el.clientWidth) {
|
|
37
|
-
if (this.options.setGridSize) {
|
|
38
|
-
// reset width/height so the size is recalculated afterwards
|
|
39
|
-
this.renderer.setStyle(this.el, 'width', '');
|
|
40
|
-
this.renderer.setStyle(this.el, 'height', '');
|
|
41
|
-
}
|
|
42
|
-
this.setGridSize();
|
|
43
|
-
this.calculateLayout();
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
this.getNextPossiblePosition = (newItem, startingFrom = {}) => {
|
|
47
|
-
if (newItem.cols === -1) {
|
|
48
|
-
newItem.cols = this.$options.defaultItemCols;
|
|
49
|
-
}
|
|
50
|
-
if (newItem.rows === -1) {
|
|
51
|
-
newItem.rows = this.$options.defaultItemRows;
|
|
52
|
-
}
|
|
53
|
-
this.setGridDimensions();
|
|
54
|
-
let rowsIndex = startingFrom.y || 0;
|
|
55
|
-
let colsIndex;
|
|
56
|
-
for (; rowsIndex < this.rows; rowsIndex++) {
|
|
57
|
-
newItem.y = rowsIndex;
|
|
58
|
-
colsIndex = startingFrom.x || 0;
|
|
59
|
-
for (; colsIndex < this.columns; colsIndex++) {
|
|
60
|
-
newItem.x = colsIndex;
|
|
61
|
-
if (!this.checkCollision(newItem)) {
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
const canAddToRows = this.$options.maxRows >= this.rows + newItem.rows;
|
|
67
|
-
const canAddToColumns = this.$options.maxCols >= this.columns + newItem.cols;
|
|
68
|
-
const addToRows = this.rows <= this.columns && canAddToRows;
|
|
69
|
-
if (!addToRows && canAddToColumns) {
|
|
70
|
-
newItem.x = this.columns;
|
|
71
|
-
newItem.y = 0;
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
else if (canAddToRows) {
|
|
75
|
-
newItem.y = this.rows;
|
|
76
|
-
newItem.x = 0;
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
return false;
|
|
80
|
-
};
|
|
81
|
-
this.getFirstPossiblePosition = (item) => {
|
|
82
|
-
const tmpItem = Object.assign({}, item);
|
|
83
|
-
this.getNextPossiblePosition(tmpItem);
|
|
84
|
-
return tmpItem;
|
|
85
|
-
};
|
|
86
|
-
this.getLastPossiblePosition = (item) => {
|
|
87
|
-
let farthestItem = { y: 0, x: 0 };
|
|
88
|
-
farthestItem = this.grid.reduce((prev, curr) => {
|
|
89
|
-
const currCoords = {
|
|
90
|
-
y: curr.$item.y + curr.$item.rows - 1,
|
|
91
|
-
x: curr.$item.x + curr.$item.cols - 1
|
|
92
|
-
};
|
|
93
|
-
if (GridsterUtils.compareItems(prev, currCoords) === 1) {
|
|
94
|
-
return currCoords;
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
return prev;
|
|
98
|
-
}
|
|
99
|
-
}, farthestItem);
|
|
100
|
-
const tmpItem = Object.assign({}, item);
|
|
101
|
-
this.getNextPossiblePosition(tmpItem, farthestItem);
|
|
102
|
-
return tmpItem;
|
|
103
|
-
};
|
|
104
|
-
this.el = el.nativeElement;
|
|
105
|
-
this.$options = JSON.parse(JSON.stringify(GridsterConfigService));
|
|
106
|
-
this.mobile = false;
|
|
107
|
-
this.curWidth = 0;
|
|
108
|
-
this.curHeight = 0;
|
|
109
|
-
this.grid = [];
|
|
110
|
-
this.curColWidth = 0;
|
|
111
|
-
this.curRowHeight = 0;
|
|
112
|
-
this.dragInProgress = false;
|
|
113
|
-
this.emptyCell = new GridsterEmptyCell(this);
|
|
114
|
-
this.compact = new GridsterCompact(this);
|
|
115
|
-
this.gridRenderer = new GridsterRenderer(this);
|
|
116
|
-
}
|
|
117
|
-
// ------ Function for swapWhileDragging option
|
|
118
|
-
// identical to checkCollision() except that here we add boundaries.
|
|
119
|
-
static checkCollisionTwoItemsForSwaping(item, item2) {
|
|
120
|
-
// if the cols or rows of the items are 1 , doesnt make any sense to set a boundary. Only if the item is bigger we set a boundary
|
|
121
|
-
const horizontalBoundaryItem1 = item.cols === 1 ? 0 : 1;
|
|
122
|
-
const horizontalBoundaryItem2 = item2.cols === 1 ? 0 : 1;
|
|
123
|
-
const verticalBoundaryItem1 = item.rows === 1 ? 0 : 1;
|
|
124
|
-
const verticalBoundaryItem2 = item2.rows === 1 ? 0 : 1;
|
|
125
|
-
return (item.x + horizontalBoundaryItem1 < item2.x + item2.cols &&
|
|
126
|
-
item.x + item.cols > item2.x + horizontalBoundaryItem2 &&
|
|
127
|
-
item.y + verticalBoundaryItem1 < item2.y + item2.rows &&
|
|
128
|
-
item.y + item.rows > item2.y + verticalBoundaryItem2);
|
|
129
|
-
}
|
|
130
|
-
checkCollisionTwoItems(item, item2) {
|
|
131
|
-
const collision = item.x < item2.x + item2.cols &&
|
|
132
|
-
item.x + item.cols > item2.x &&
|
|
133
|
-
item.y < item2.y + item2.rows &&
|
|
134
|
-
item.y + item.rows > item2.y;
|
|
135
|
-
if (!collision) {
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
if (!this.$options.allowMultiLayer) {
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
const defaultLayerIndex = this.$options.defaultLayerIndex;
|
|
142
|
-
const layerIndex = item.layerIndex === undefined ? defaultLayerIndex : item.layerIndex;
|
|
143
|
-
const layerIndex2 = item2.layerIndex === undefined ? defaultLayerIndex : item2.layerIndex;
|
|
144
|
-
return layerIndex === layerIndex2;
|
|
145
|
-
}
|
|
146
|
-
ngOnInit() {
|
|
147
|
-
if (this.options.initCallback) {
|
|
148
|
-
this.options.initCallback(this);
|
|
149
|
-
}
|
|
150
|
-
this.calculateLayout$
|
|
151
|
-
.pipe(debounceTime(0), takeUntil(this.destroy$))
|
|
152
|
-
.subscribe(() => this.calculateLayout());
|
|
153
|
-
this.resize$
|
|
154
|
-
.pipe(
|
|
155
|
-
// Cancel previously scheduled DOM timer if `calculateLayout()` has been called
|
|
156
|
-
// within this time range.
|
|
157
|
-
switchMap(() => timer(100)), takeUntil(this.destroy$))
|
|
158
|
-
.subscribe(() => this.resize());
|
|
159
|
-
}
|
|
160
|
-
ngOnChanges(changes) {
|
|
161
|
-
if (changes['options']) {
|
|
162
|
-
this.setOptions();
|
|
163
|
-
this.options.api = {
|
|
164
|
-
optionsChanged: this.optionsChanged.bind(this),
|
|
165
|
-
resize: this.onResize.bind(this),
|
|
166
|
-
getNextPossiblePosition: this.getNextPossiblePosition.bind(this),
|
|
167
|
-
getFirstPossiblePosition: this.getFirstPossiblePosition.bind(this),
|
|
168
|
-
getLastPossiblePosition: this.getLastPossiblePosition.bind(this),
|
|
169
|
-
getItemComponent: (item) => this.getItemComponent(item),
|
|
170
|
-
getCurrentRowHeight: this.getCurrentRowHeight.bind(this)
|
|
171
|
-
};
|
|
172
|
-
this.columns = this.$options.minCols;
|
|
173
|
-
this.rows = this.$options.minRows + this.$options.addEmptyRowsCount;
|
|
174
|
-
this.setGridSize();
|
|
175
|
-
this.calculateLayout();
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
getCurrentRowHeight() {
|
|
179
|
-
return this.curRowHeight;
|
|
180
|
-
}
|
|
181
|
-
resize() {
|
|
182
|
-
let height;
|
|
183
|
-
let width;
|
|
184
|
-
if (this.$options.gridType === 'fit' && !this.mobile) {
|
|
185
|
-
width = this.el.offsetWidth;
|
|
186
|
-
height = this.el.offsetHeight;
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
width = this.el.clientWidth;
|
|
190
|
-
height = this.el.clientHeight;
|
|
191
|
-
}
|
|
192
|
-
if ((width !== this.curWidth || height !== this.curHeight) &&
|
|
193
|
-
this.checkIfToResize()) {
|
|
194
|
-
this.onResize();
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
setOptions() {
|
|
198
|
-
this.$options = GridsterUtils.merge(this.$options, this.options, this.$options);
|
|
199
|
-
if (!this.$options.disableWindowResize && !this.windowResize) {
|
|
200
|
-
this.windowResize = this.renderer.listen('window', 'resize', this.onResize);
|
|
201
|
-
}
|
|
202
|
-
else if (this.$options.disableWindowResize && this.windowResize) {
|
|
203
|
-
this.windowResize();
|
|
204
|
-
this.windowResize = null;
|
|
205
|
-
}
|
|
206
|
-
this.emptyCell.updateOptions();
|
|
207
|
-
}
|
|
208
|
-
ngOnDestroy() {
|
|
209
|
-
this.destroy$.next();
|
|
210
|
-
this.previewStyle$.complete();
|
|
211
|
-
if (this.windowResize) {
|
|
212
|
-
this.windowResize();
|
|
213
|
-
}
|
|
214
|
-
if (this.options && this.options.destroyCallback) {
|
|
215
|
-
this.options.destroyCallback(this);
|
|
216
|
-
}
|
|
217
|
-
if (this.options && this.options.api) {
|
|
218
|
-
this.options.api.resize = undefined;
|
|
219
|
-
this.options.api.optionsChanged = undefined;
|
|
220
|
-
this.options.api.getNextPossiblePosition = undefined;
|
|
221
|
-
this.options.api = undefined;
|
|
222
|
-
}
|
|
223
|
-
this.emptyCell.destroy();
|
|
224
|
-
this.emptyCell = null;
|
|
225
|
-
this.compact.destroy();
|
|
226
|
-
this.compact = null;
|
|
227
|
-
}
|
|
228
|
-
checkIfToResize() {
|
|
229
|
-
const clientWidth = this.el.clientWidth;
|
|
230
|
-
const offsetWidth = this.el.offsetWidth;
|
|
231
|
-
const scrollWidth = this.el.scrollWidth;
|
|
232
|
-
const clientHeight = this.el.clientHeight;
|
|
233
|
-
const offsetHeight = this.el.offsetHeight;
|
|
234
|
-
const scrollHeight = this.el.scrollHeight;
|
|
235
|
-
const verticalScrollPresent = clientWidth < offsetWidth &&
|
|
236
|
-
scrollHeight > offsetHeight &&
|
|
237
|
-
scrollHeight - offsetHeight < offsetWidth - clientWidth;
|
|
238
|
-
const horizontalScrollPresent = clientHeight < offsetHeight &&
|
|
239
|
-
scrollWidth > offsetWidth &&
|
|
240
|
-
scrollWidth - offsetWidth < offsetHeight - clientHeight;
|
|
241
|
-
if (verticalScrollPresent) {
|
|
242
|
-
return false;
|
|
243
|
-
}
|
|
244
|
-
return !horizontalScrollPresent;
|
|
245
|
-
}
|
|
246
|
-
checkIfMobile() {
|
|
247
|
-
if (this.$options.useBodyForBreakpoint) {
|
|
248
|
-
return this.$options.mobileBreakpoint > document.body.clientWidth;
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
return this.$options.mobileBreakpoint > this.curWidth;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
setGridSize() {
|
|
255
|
-
const el = this.el;
|
|
256
|
-
let width;
|
|
257
|
-
let height;
|
|
258
|
-
if (this.$options.setGridSize ||
|
|
259
|
-
(this.$options.gridType === GridType.Fit && !this.mobile)) {
|
|
260
|
-
width = el.offsetWidth;
|
|
261
|
-
height = el.offsetHeight;
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
264
|
-
width = el.clientWidth;
|
|
265
|
-
height = el.clientHeight;
|
|
266
|
-
}
|
|
267
|
-
this.curWidth = width;
|
|
268
|
-
this.curHeight = height;
|
|
269
|
-
}
|
|
270
|
-
setGridDimensions() {
|
|
271
|
-
this.setGridSize();
|
|
272
|
-
if (!this.mobile && this.checkIfMobile()) {
|
|
273
|
-
this.mobile = !this.mobile;
|
|
274
|
-
this.renderer.addClass(this.el, 'mobile');
|
|
275
|
-
}
|
|
276
|
-
else if (this.mobile && !this.checkIfMobile()) {
|
|
277
|
-
this.mobile = !this.mobile;
|
|
278
|
-
this.renderer.removeClass(this.el, 'mobile');
|
|
279
|
-
}
|
|
280
|
-
let rows = this.$options.minRows;
|
|
281
|
-
let columns = this.$options.minCols;
|
|
282
|
-
let widgetsIndex = this.grid.length - 1;
|
|
283
|
-
let widget;
|
|
284
|
-
for (; widgetsIndex >= 0; widgetsIndex--) {
|
|
285
|
-
widget = this.grid[widgetsIndex];
|
|
286
|
-
if (!widget.notPlaced) {
|
|
287
|
-
rows = Math.max(rows, widget.$item.y + widget.$item.rows);
|
|
288
|
-
columns = Math.max(columns, widget.$item.x + widget.$item.cols);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
rows += this.$options.addEmptyRowsCount;
|
|
292
|
-
if (this.columns !== columns || this.rows !== rows) {
|
|
293
|
-
this.columns = columns;
|
|
294
|
-
this.rows = rows;
|
|
295
|
-
if (this.options.gridSizeChangedCallback) {
|
|
296
|
-
this.options.gridSizeChangedCallback(this);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
calculateLayout() {
|
|
301
|
-
if (this.compact) {
|
|
302
|
-
this.compact.checkCompact();
|
|
303
|
-
}
|
|
304
|
-
this.setGridDimensions();
|
|
305
|
-
if (this.$options.outerMargin) {
|
|
306
|
-
let marginWidth = -this.$options.margin;
|
|
307
|
-
if (this.$options.outerMarginLeft !== null) {
|
|
308
|
-
marginWidth += this.$options.outerMarginLeft;
|
|
309
|
-
this.renderer.setStyle(this.el, 'padding-left', this.$options.outerMarginLeft + 'px');
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
marginWidth += this.$options.margin;
|
|
313
|
-
this.renderer.setStyle(this.el, 'padding-left', this.$options.margin + 'px');
|
|
314
|
-
}
|
|
315
|
-
if (this.$options.outerMarginRight !== null) {
|
|
316
|
-
marginWidth += this.$options.outerMarginRight;
|
|
317
|
-
this.renderer.setStyle(this.el, 'padding-right', this.$options.outerMarginRight + 'px');
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
marginWidth += this.$options.margin;
|
|
321
|
-
this.renderer.setStyle(this.el, 'padding-right', this.$options.margin + 'px');
|
|
322
|
-
}
|
|
323
|
-
this.curColWidth = (this.curWidth - marginWidth) / this.columns;
|
|
324
|
-
let marginHeight = -this.$options.margin;
|
|
325
|
-
if (this.$options.outerMarginTop !== null) {
|
|
326
|
-
marginHeight += this.$options.outerMarginTop;
|
|
327
|
-
this.renderer.setStyle(this.el, 'padding-top', this.$options.outerMarginTop + 'px');
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
marginHeight += this.$options.margin;
|
|
331
|
-
this.renderer.setStyle(this.el, 'padding-top', this.$options.margin + 'px');
|
|
332
|
-
}
|
|
333
|
-
if (this.$options.outerMarginBottom !== null) {
|
|
334
|
-
marginHeight += this.$options.outerMarginBottom;
|
|
335
|
-
this.renderer.setStyle(this.el, 'padding-bottom', this.$options.outerMarginBottom + 'px');
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
marginHeight += this.$options.margin;
|
|
339
|
-
this.renderer.setStyle(this.el, 'padding-bottom', this.$options.margin + 'px');
|
|
340
|
-
}
|
|
341
|
-
this.curRowHeight =
|
|
342
|
-
((this.curHeight - marginHeight) / this.rows) *
|
|
343
|
-
this.$options.rowHeightRatio;
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
this.curColWidth = (this.curWidth + this.$options.margin) / this.columns;
|
|
347
|
-
this.curRowHeight =
|
|
348
|
-
((this.curHeight + this.$options.margin) / this.rows) *
|
|
349
|
-
this.$options.rowHeightRatio;
|
|
350
|
-
this.renderer.setStyle(this.el, 'padding-left', 0 + 'px');
|
|
351
|
-
this.renderer.setStyle(this.el, 'padding-right', 0 + 'px');
|
|
352
|
-
this.renderer.setStyle(this.el, 'padding-top', 0 + 'px');
|
|
353
|
-
this.renderer.setStyle(this.el, 'padding-bottom', 0 + 'px');
|
|
354
|
-
}
|
|
355
|
-
this.gridRenderer.updateGridster();
|
|
356
|
-
if (this.$options.setGridSize) {
|
|
357
|
-
this.renderer.addClass(this.el, 'gridSize');
|
|
358
|
-
if (!this.mobile) {
|
|
359
|
-
this.renderer.setStyle(this.el, 'width', this.columns * this.curColWidth + this.$options.margin + 'px');
|
|
360
|
-
this.renderer.setStyle(this.el, 'height', this.rows * this.curRowHeight + this.$options.margin + 'px');
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
else {
|
|
364
|
-
this.renderer.removeClass(this.el, 'gridSize');
|
|
365
|
-
this.renderer.setStyle(this.el, 'width', '');
|
|
366
|
-
this.renderer.setStyle(this.el, 'height', '');
|
|
367
|
-
}
|
|
368
|
-
this.updateGrid();
|
|
369
|
-
let widgetsIndex = this.grid.length - 1;
|
|
370
|
-
let widget;
|
|
371
|
-
for (; widgetsIndex >= 0; widgetsIndex--) {
|
|
372
|
-
widget = this.grid[widgetsIndex];
|
|
373
|
-
widget.setSize();
|
|
374
|
-
widget.drag.toggle();
|
|
375
|
-
widget.resize.toggle();
|
|
376
|
-
}
|
|
377
|
-
this.resize$.next();
|
|
378
|
-
}
|
|
379
|
-
updateGrid() {
|
|
380
|
-
if (this.$options.displayGrid === 'always' && !this.mobile) {
|
|
381
|
-
this.renderer.addClass(this.el, 'display-grid');
|
|
382
|
-
}
|
|
383
|
-
else if (this.$options.displayGrid === 'onDrag&Resize' &&
|
|
384
|
-
this.dragInProgress) {
|
|
385
|
-
this.renderer.addClass(this.el, 'display-grid');
|
|
386
|
-
}
|
|
387
|
-
else if (this.$options.displayGrid === 'none' ||
|
|
388
|
-
!this.dragInProgress ||
|
|
389
|
-
this.mobile) {
|
|
390
|
-
this.renderer.removeClass(this.el, 'display-grid');
|
|
391
|
-
}
|
|
392
|
-
this.setGridDimensions();
|
|
393
|
-
this.gridColumns.length = GridsterComponent.getNewArrayLength(this.columns, this.curWidth, this.curColWidth);
|
|
394
|
-
this.gridRows.length = GridsterComponent.getNewArrayLength(this.rows, this.curHeight, this.curRowHeight);
|
|
395
|
-
this.cdRef.markForCheck();
|
|
396
|
-
}
|
|
397
|
-
addItem(itemComponent) {
|
|
398
|
-
if (itemComponent.$item.cols === undefined) {
|
|
399
|
-
itemComponent.$item.cols = this.$options.defaultItemCols;
|
|
400
|
-
itemComponent.item.cols = itemComponent.$item.cols;
|
|
401
|
-
itemComponent.itemChanged();
|
|
402
|
-
}
|
|
403
|
-
if (itemComponent.$item.rows === undefined) {
|
|
404
|
-
itemComponent.$item.rows = this.$options.defaultItemRows;
|
|
405
|
-
itemComponent.item.rows = itemComponent.$item.rows;
|
|
406
|
-
itemComponent.itemChanged();
|
|
407
|
-
}
|
|
408
|
-
if (itemComponent.$item.x === -1 || itemComponent.$item.y === -1) {
|
|
409
|
-
this.autoPositionItem(itemComponent);
|
|
410
|
-
}
|
|
411
|
-
else if (this.checkCollision(itemComponent.$item)) {
|
|
412
|
-
if (!this.$options.disableWarnings) {
|
|
413
|
-
itemComponent.notPlaced = true;
|
|
414
|
-
console.warn("Can't be placed in the bounds of the dashboard, trying to auto position!/n" +
|
|
415
|
-
JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
|
|
416
|
-
}
|
|
417
|
-
if (!this.$options.disableAutoPositionOnConflict) {
|
|
418
|
-
this.autoPositionItem(itemComponent);
|
|
419
|
-
}
|
|
420
|
-
else {
|
|
421
|
-
itemComponent.notPlaced = true;
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
this.grid.push(itemComponent);
|
|
425
|
-
this.calculateLayout$.next();
|
|
426
|
-
}
|
|
427
|
-
removeItem(itemComponent) {
|
|
428
|
-
this.grid.splice(this.grid.indexOf(itemComponent), 1);
|
|
429
|
-
this.calculateLayout$.next();
|
|
430
|
-
if (this.options.itemRemovedCallback) {
|
|
431
|
-
this.options.itemRemovedCallback(itemComponent.item, itemComponent);
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
checkCollision(item) {
|
|
435
|
-
let collision = false;
|
|
436
|
-
if (this.options.itemValidateCallback) {
|
|
437
|
-
collision = !this.options.itemValidateCallback(item);
|
|
438
|
-
}
|
|
439
|
-
if (!collision && this.checkGridCollision(item)) {
|
|
440
|
-
collision = true;
|
|
441
|
-
}
|
|
442
|
-
if (!collision) {
|
|
443
|
-
const c = this.findItemWithItem(item);
|
|
444
|
-
if (c) {
|
|
445
|
-
collision = c;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
return collision;
|
|
449
|
-
}
|
|
450
|
-
checkGridCollision(item) {
|
|
451
|
-
const noNegativePosition = item.y > -1 && item.x > -1;
|
|
452
|
-
const maxGridCols = item.cols + item.x <= this.$options.maxCols;
|
|
453
|
-
const maxGridRows = item.rows + item.y <= this.$options.maxRows;
|
|
454
|
-
const maxItemCols = item.maxItemCols === undefined
|
|
455
|
-
? this.$options.maxItemCols
|
|
456
|
-
: item.maxItemCols;
|
|
457
|
-
const minItemCols = item.minItemCols === undefined
|
|
458
|
-
? this.$options.minItemCols
|
|
459
|
-
: item.minItemCols;
|
|
460
|
-
const maxItemRows = item.maxItemRows === undefined
|
|
461
|
-
? this.$options.maxItemRows
|
|
462
|
-
: item.maxItemRows;
|
|
463
|
-
const minItemRows = item.minItemRows === undefined
|
|
464
|
-
? this.$options.minItemRows
|
|
465
|
-
: item.minItemRows;
|
|
466
|
-
const inColsLimits = item.cols <= maxItemCols && item.cols >= minItemCols;
|
|
467
|
-
const inRowsLimits = item.rows <= maxItemRows && item.rows >= minItemRows;
|
|
468
|
-
const minAreaLimit = item.minItemArea === undefined
|
|
469
|
-
? this.$options.minItemArea
|
|
470
|
-
: item.minItemArea;
|
|
471
|
-
const maxAreaLimit = item.maxItemArea === undefined
|
|
472
|
-
? this.$options.maxItemArea
|
|
473
|
-
: item.maxItemArea;
|
|
474
|
-
const area = item.cols * item.rows;
|
|
475
|
-
const inMinArea = minAreaLimit <= area;
|
|
476
|
-
const inMaxArea = maxAreaLimit >= area;
|
|
477
|
-
return !(noNegativePosition &&
|
|
478
|
-
maxGridCols &&
|
|
479
|
-
maxGridRows &&
|
|
480
|
-
inColsLimits &&
|
|
481
|
-
inRowsLimits &&
|
|
482
|
-
inMinArea &&
|
|
483
|
-
inMaxArea);
|
|
484
|
-
}
|
|
485
|
-
findItemWithItem(item) {
|
|
486
|
-
let widgetsIndex = 0;
|
|
487
|
-
let widget;
|
|
488
|
-
for (; widgetsIndex < this.grid.length; widgetsIndex++) {
|
|
489
|
-
widget = this.grid[widgetsIndex];
|
|
490
|
-
if (widget.$item !== item &&
|
|
491
|
-
this.checkCollisionTwoItems(widget.$item, item)) {
|
|
492
|
-
return widget;
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
return false;
|
|
496
|
-
}
|
|
497
|
-
findItemsWithItem(item) {
|
|
498
|
-
const a = [];
|
|
499
|
-
let widgetsIndex = 0;
|
|
500
|
-
let widget;
|
|
501
|
-
for (; widgetsIndex < this.grid.length; widgetsIndex++) {
|
|
502
|
-
widget = this.grid[widgetsIndex];
|
|
503
|
-
if (widget.$item !== item &&
|
|
504
|
-
this.checkCollisionTwoItems(widget.$item, item)) {
|
|
505
|
-
a.push(widget);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
return a;
|
|
509
|
-
}
|
|
510
|
-
autoPositionItem(itemComponent) {
|
|
511
|
-
if (this.getNextPossiblePosition(itemComponent.$item)) {
|
|
512
|
-
itemComponent.notPlaced = false;
|
|
513
|
-
itemComponent.item.x = itemComponent.$item.x;
|
|
514
|
-
itemComponent.item.y = itemComponent.$item.y;
|
|
515
|
-
itemComponent.itemChanged();
|
|
516
|
-
}
|
|
517
|
-
else {
|
|
518
|
-
itemComponent.notPlaced = true;
|
|
519
|
-
if (!this.$options.disableWarnings) {
|
|
520
|
-
console.warn("Can't be placed in the bounds of the dashboard!/n" +
|
|
521
|
-
JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
pixelsToPositionX(x, roundingMethod, noLimit) {
|
|
526
|
-
const position = roundingMethod(x / this.curColWidth);
|
|
527
|
-
if (noLimit) {
|
|
528
|
-
return position;
|
|
529
|
-
}
|
|
530
|
-
else {
|
|
531
|
-
return Math.max(position, 0);
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
pixelsToPositionY(y, roundingMethod, noLimit) {
|
|
535
|
-
const position = roundingMethod(y / this.curRowHeight);
|
|
536
|
-
if (noLimit) {
|
|
537
|
-
return position;
|
|
538
|
-
}
|
|
539
|
-
else {
|
|
540
|
-
return Math.max(position, 0);
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
positionXToPixels(x) {
|
|
544
|
-
return x * this.curColWidth;
|
|
545
|
-
}
|
|
546
|
-
positionYToPixels(y) {
|
|
547
|
-
return y * this.curRowHeight;
|
|
548
|
-
}
|
|
549
|
-
getItemComponent(item) {
|
|
550
|
-
return this.grid.find(c => c.item === item);
|
|
551
|
-
}
|
|
552
|
-
// ------ Functions for swapWhileDragging option
|
|
553
|
-
// identical to checkCollision() except that this function calls findItemWithItemForSwaping() instead of findItemWithItem()
|
|
554
|
-
checkCollisionForSwaping(item) {
|
|
555
|
-
let collision = false;
|
|
556
|
-
if (this.options.itemValidateCallback) {
|
|
557
|
-
collision = !this.options.itemValidateCallback(item);
|
|
558
|
-
}
|
|
559
|
-
if (!collision && this.checkGridCollision(item)) {
|
|
560
|
-
collision = true;
|
|
561
|
-
}
|
|
562
|
-
if (!collision) {
|
|
563
|
-
const c = this.findItemWithItemForSwapping(item);
|
|
564
|
-
if (c) {
|
|
565
|
-
collision = c;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
return collision;
|
|
569
|
-
}
|
|
570
|
-
// identical to findItemWithItem() except that this function calls checkCollisionTwoItemsForSwaping() instead of checkCollisionTwoItems()
|
|
571
|
-
findItemWithItemForSwapping(item) {
|
|
572
|
-
let widgetsIndex = this.grid.length - 1;
|
|
573
|
-
let widget;
|
|
574
|
-
for (; widgetsIndex > -1; widgetsIndex--) {
|
|
575
|
-
widget = this.grid[widgetsIndex];
|
|
576
|
-
if (widget.$item !== item &&
|
|
577
|
-
GridsterComponent.checkCollisionTwoItemsForSwaping(widget.$item, item)) {
|
|
578
|
-
return widget;
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
return false;
|
|
582
|
-
}
|
|
583
|
-
previewStyle(drag = false) {
|
|
584
|
-
if (this.movingItem) {
|
|
585
|
-
if (this.compact && drag) {
|
|
586
|
-
this.compact.checkCompactItem(this.movingItem);
|
|
587
|
-
}
|
|
588
|
-
this.previewStyle$.next(this.movingItem);
|
|
589
|
-
}
|
|
590
|
-
else {
|
|
591
|
-
this.previewStyle$.next(null);
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
// ------ End of functions for swapWhileDragging option
|
|
595
|
-
// eslint-disable-next-line @typescript-eslint/member-ordering
|
|
596
|
-
static getNewArrayLength(length, overallSize, size) {
|
|
597
|
-
const newLength = Math.max(length, Math.floor(overallSize / size));
|
|
598
|
-
if (newLength < 0) {
|
|
599
|
-
return 0;
|
|
600
|
-
}
|
|
601
|
-
if (Number.isFinite(newLength)) {
|
|
602
|
-
return Math.floor(newLength);
|
|
603
|
-
}
|
|
604
|
-
return 0;
|
|
605
|
-
}
|
|
606
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: GridsterComponent, deps: [{ token: ElementRef }, { token: Renderer2 }, { token: ChangeDetectorRef }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
607
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: GridsterComponent, isStandalone: true, selector: "gridster", inputs: { options: "options" }, usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"gridster-column\"\r\n *ngFor=\"let column of gridColumns; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"\r\n></div>\r\n<div\r\n class=\"gridster-row\"\r\n *ngFor=\"let row of gridRows; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"\r\n></div>\r\n<ng-content></ng-content>\r\n<gridster-preview\r\n [gridRenderer]=\"gridRenderer\"\r\n [previewStyle$]=\"previewStyle$\"\r\n class=\"gridster-preview\"\r\n></gridster-preview>\r\n", styles: ["gridster{position:relative;box-sizing:border-box;background:gray;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:block}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto}gridster.mobile gridster-item{position:relative}gridster.gridSize{height:initial;width:initial}gridster.gridSize.fit{height:100%;width:100%}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid white;border-right:1px solid white}gridster .gridster-row{border-top:1px solid white;border-bottom:1px solid white}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: GridsterPreviewComponent, selector: "gridster-preview", inputs: ["previewStyle$", "gridRenderer"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
608
|
-
}
|
|
609
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: GridsterComponent, decorators: [{
|
|
610
|
-
type: Component,
|
|
611
|
-
args: [{ selector: 'gridster', encapsulation: ViewEncapsulation.None, standalone: true, imports: [NgForOf, NgStyle, GridsterPreviewComponent], template: "<div\r\n class=\"gridster-column\"\r\n *ngFor=\"let column of gridColumns; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"\r\n></div>\r\n<div\r\n class=\"gridster-row\"\r\n *ngFor=\"let row of gridRows; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"\r\n></div>\r\n<ng-content></ng-content>\r\n<gridster-preview\r\n [gridRenderer]=\"gridRenderer\"\r\n [previewStyle$]=\"previewStyle$\"\r\n class=\"gridster-preview\"\r\n></gridster-preview>\r\n", styles: ["gridster{position:relative;box-sizing:border-box;background:gray;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:block}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto}gridster.mobile gridster-item{position:relative}gridster.gridSize{height:initial;width:initial}gridster.gridSize.fit{height:100%;width:100%}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid white;border-right:1px solid white}gridster .gridster-row{border-top:1px solid white;border-bottom:1px solid white}\n"] }]
|
|
612
|
-
}], ctorParameters: () => [{ type: i0.ElementRef, decorators: [{
|
|
613
|
-
type: Inject,
|
|
614
|
-
args: [ElementRef]
|
|
615
|
-
}] }, { type: i0.Renderer2, decorators: [{
|
|
616
|
-
type: Inject,
|
|
617
|
-
args: [Renderer2]
|
|
618
|
-
}] }, { type: i0.ChangeDetectorRef, decorators: [{
|
|
619
|
-
type: Inject,
|
|
620
|
-
args: [ChangeDetectorRef]
|
|
621
|
-
}] }, { type: i0.NgZone, decorators: [{
|
|
622
|
-
type: Inject,
|
|
623
|
-
args: [NgZone]
|
|
624
|
-
}] }], propDecorators: { options: [{
|
|
625
|
-
type: Input
|
|
626
|
-
}] } });
|
|
627
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmEtZGFzaGJvYXJkLWZyYW1ld29yay9zcmMvZ3JpZHN0ZXIvbGliL2dyaWRzdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JhLWRhc2hib2FyZC1mcmFtZXdvcmsvc3JjL2dyaWRzdGVyL2xpYi9ncmlkc3Rlci5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFJTixTQUFTLEVBRVQsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQWtCLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBS2hFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFXeEQsTUFBTSxPQUFPLGlCQUFpQjtJQTZCNUIsWUFDc0IsRUFBYyxFQUNSLFFBQW1CLEVBQ1gsS0FBd0IsRUFD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N0IsU0FBUzsrQkFFRSxVQUFVLGlCQUdMLGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQzs7MEJBZ0NsRCxNQUFNOzJCQUFDLFVBQVU7OzBCQUNqQixNQUFNOzJCQUFDLFNBQVM7OzBCQUNoQixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsTUFBTTt5Q0EvQlAsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdGb3JPZiwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0LCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGltZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVyQ29tcGFjdCB9IGZyb20gJy4vZ3JpZHN0ZXJDb21wYWN0LnNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZy5jb25zdGFudCc7XHJcbmltcG9ydCB7IEdyaWRzdGVyQ29uZmlnLCBHcmlkVHlwZSB9IGZyb20gJy4vZ3JpZHN0ZXJDb25maWcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWdTIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZ1MuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJFbXB0eUNlbGwgfSBmcm9tICcuL2dyaWRzdGVyRW1wdHlDZWxsLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEdyaWRzdGVySXRlbSxcclxuICBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2VcclxufSBmcm9tICcuL2dyaWRzdGVySXRlbS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlclByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuL2dyaWRzdGVyUHJldmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkc3RlclJlbmRlcmVyIH0gZnJvbSAnLi9ncmlkc3RlclJlbmRlcmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlclV0aWxzIH0gZnJvbSAnLi9ncmlkc3RlclV0aWxzLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2dyaWRzdGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZHN0ZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZHN0ZXIuY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtOZ0Zvck9mLCBOZ1N0eWxlLCBHcmlkc3RlclByZXZpZXdDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHcmlkc3RlckNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2Uge1xyXG4gIEBJbnB1dCgpIG9wdGlvbnMhOiBHcmlkc3RlckNvbmZpZztcclxuICBtb3ZpbmdJdGVtITogR3JpZHN0ZXJJdGVtIHwgbnVsbDtcclxuICBlbDogSFRNTEVsZW1lbnQ7XHJcbiAgJG9wdGlvbnM6IEdyaWRzdGVyQ29uZmlnUztcclxuICBtb2JpbGU6IGJvb2xlYW47XHJcbiAgY3VyV2lkdGg6IG51bWJlcjtcclxuICBjdXJIZWlnaHQ6IG51bWJlcjtcclxuICBncmlkOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2VbXTtcclxuICBjb2x1bW5zID0gMDtcclxuICByb3dzID0gMDtcclxuICBjdXJDb2xXaWR0aDogbnVtYmVyO1xyXG4gIGN1clJvd0hlaWdodDogbnVtYmVyO1xyXG4gIGdyaWRDb2x1bW5zID0gW107XHJcbiAgZ3JpZFJvd3MgPSBbXTtcclxuICB3aW5kb3dSZXNpemUhOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xyXG4gIGRyYWdJblByb2dyZXNzOiBib29sZWFuO1xyXG4gIGVtcHR5Q2VsbDogR3JpZHN0ZXJFbXB0eUNlbGw7XHJcbiAgY29tcGFjdDogR3JpZHN0ZXJDb21wYWN0O1xyXG4gIGdyaWRSZW5kZXJlcjogR3JpZHN0ZXJSZW5kZXJlcjtcclxuICBwcmV2aWV3U3R5bGUkOiBFdmVudEVtaXR0ZXI8R3JpZHN0ZXJJdGVtIHwgbnVsbD4gPVxyXG4gICAgbmV3IEV2ZW50RW1pdHRlcjxHcmlkc3Rlckl0ZW0gfCBudWxsPigpO1xyXG5cclxuICBjYWxjdWxhdGVMYXlvdXQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgcHJpdmF0ZSByZXNpemUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEVsZW1lbnRSZWYpIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgQEluamVjdChSZW5kZXJlcjIpIHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgQEluamVjdChDaGFuZ2VEZXRlY3RvclJlZikgcHVibGljIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIEBJbmplY3QoTmdab25lKSBwdWJsaWMgem9uZTogTmdab25lXHJcbiAgKSB7XHJcbiAgICB0aGlzLmVsID0gZWwubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuJG9wdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEdyaWRzdGVyQ29uZmlnU2VydmljZSkpO1xyXG4gICAgdGhpcy5tb2JpbGUgPSBmYWxzZTtcclxuICAgIHRoaXMuY3VyV2lkdGggPSAwO1xyXG4gICAgdGhpcy5jdXJIZWlnaHQgPSAwO1xyXG4gICAgdGhpcy5ncmlkID0gW107XHJcbiAgICB0aGlzLmN1ckNvbFdpZHRoID0gMDtcclxuICAgIHRoaXMuY3VyUm93SGVpZ2h0ID0gMDtcclxuICAgIHRoaXMuZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgIHRoaXMuZW1wdHlDZWxsID0gbmV3IEdyaWRzdGVyRW1wdHlDZWxsKHRoaXMpO1xyXG4gICAgdGhpcy5jb21wYWN0ID0gbmV3IEdyaWRzdGVyQ29tcGFjdCh0aGlzKTtcclxuICAgIHRoaXMuZ3JpZFJlbmRlcmVyID0gbmV3IEdyaWRzdGVyUmVuZGVyZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0gRnVuY3Rpb24gZm9yIHN3YXBXaGlsZURyYWdnaW5nIG9wdGlvblxyXG5cclxuICAvLyBpZGVudGljYWwgdG8gY2hlY2tDb2xsaXNpb24oKSBleGNlcHQgdGhhdCBoZXJlIHdlIGFkZCBib3VuZGFyaWVzLlxyXG4gIHN0YXRpYyBjaGVja0NvbGxpc2lvblR3b0l0ZW1zRm9yU3dhcGluZyhcclxuICAgIGl0ZW06IEdyaWRzdGVySXRlbSxcclxuICAgIGl0ZW0yOiBHcmlkc3Rlckl0ZW1cclxuICApOiBib29sZWFuIHtcclxuICAgIC8vIGlmIHRoZSBjb2xzIG9yIHJvd3Mgb2YgdGhlIGl0ZW1zIGFyZSAxICwgZG9lc250IG1ha2UgYW55IHNlbnNlIHRvIHNldCBhIGJvdW5kYXJ5LiBPbmx5IGlmIHRoZSBpdGVtIGlzIGJpZ2dlciB3ZSBzZXQgYSBib3VuZGFyeVxyXG4gICAgY29uc3QgaG9yaXpvbnRhbEJvdW5kYXJ5SXRlbTEgPSBpdGVtLmNvbHMgPT09IDEgPyAwIDogMTtcclxuICAgIGNvbnN0IGhvcml6b250YWxCb3VuZGFyeUl0ZW0yID0gaXRlbTIuY29scyA9PT0gMSA/IDAgOiAxO1xyXG4gICAgY29uc3QgdmVydGljYWxCb3VuZGFyeUl0ZW0xID0gaXRlbS5yb3dzID09PSAxID8gMCA6IDE7XHJcbiAgICBjb25zdCB2ZXJ0aWNhbEJvdW5kYXJ5SXRlbTIgPSBpdGVtMi5yb3dzID09PSAxID8gMCA6IDE7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBpdGVtLnggKyBob3Jpem9udGFsQm91bmRhcnlJdGVtMSA8IGl0ZW0yLnggKyBpdGVtMi5jb2xzICYmXHJcbiAgICAgIGl0ZW0ueCArIGl0ZW0uY29scyA+IGl0ZW0yLnggKyBob3Jpem9udGFsQm91bmRhcnlJdGVtMiAmJlxyXG4gICAgICBpdGVtLnkgKyB2ZXJ0aWNhbEJvdW5kYXJ5SXRlbTEgPCBpdGVtMi55ICsgaXRlbTIucm93cyAmJlxyXG4gICAgICBpdGVtLnkgKyBpdGVtLnJvd3MgPiBpdGVtMi55ICsgdmVydGljYWxCb3VuZGFyeUl0ZW0yXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tDb2xsaXNpb25Ud29JdGVtcyhpdGVtOiBHcmlkc3Rlckl0ZW0sIGl0ZW0yOiBHcmlkc3Rlckl0ZW0pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNvbGxpc2lvbiA9XHJcbiAgICAgIGl0ZW0ueCA8IGl0ZW0yLnggKyBpdGVtMi5jb2xzICYmXHJcbiAgICAgIGl0ZW0ueCArIGl0ZW0uY29scyA+IGl0ZW0yLnggJiZcclxuICAgICAgaXRlbS55IDwgaXRlbTIueSArIGl0ZW0yLnJvd3MgJiZcclxuICAgICAgaXRlbS55ICsgaXRlbS5yb3dzID4gaXRlbTIueTtcclxuICAgIGlmICghY29sbGlzaW9uKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy4kb3B0aW9ucy5hbGxvd011bHRpTGF5ZXIpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZWZhdWx0TGF5ZXJJbmRleCA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdExheWVySW5kZXg7XHJcbiAgICBjb25zdCBsYXllckluZGV4ID1cclxuICAgICAgaXRlbS5sYXllckluZGV4ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0TGF5ZXJJbmRleCA6IGl0ZW0ubGF5ZXJJbmRleDtcclxuICAgIGNvbnN0IGxheWVySW5kZXgyID1cclxuICAgICAgaXRlbTIubGF5ZXJJbmRleCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdExheWVySW5kZXggOiBpdGVtMi5sYXllckluZGV4O1xyXG4gICAgcmV0dXJuIGxheWVySW5kZXggPT09IGxheWVySW5kZXgyO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmluaXRDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaW5pdENhbGxiYWNrKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0JFxyXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNhbGN1bGF0ZUxheW91dCgpKTtcclxuXHJcbiAgICB0aGlzLnJlc2l6ZSRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgLy8gQ2FuY2VsIHByZXZpb3VzbHkgc2NoZWR1bGVkIERPTSB0aW1lciBpZiBgY2FsY3VsYXRlTGF5b3V0KClgIGhhcyBiZWVuIGNhbGxlZFxyXG4gICAgICAgIC8vIHdpdGhpbiB0aGlzIHRpbWUgcmFuZ2UuXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRpbWVyKDEwMCkpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNpemUoKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snb3B0aW9ucyddKSB7XHJcbiAgICAgIHRoaXMuc2V0T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBpID0ge1xyXG4gICAgICAgIG9wdGlvbnNDaGFuZ2VkOiB0aGlzLm9wdGlvbnNDaGFuZ2VkLmJpbmQodGhpcyksXHJcbiAgICAgICAgcmVzaXplOiB0aGlzLm9uUmVzaXplLmJpbmQodGhpcyksXHJcbiAgICAgICAgZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgICBnZXRGaXJzdFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0Rmlyc3RQb3NzaWJsZVBvc2l0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgICAgZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgICBnZXRJdGVtQ29tcG9uZW50OiAoaXRlbTogR3JpZHN0ZXJJdGVtKSA9PiB0aGlzLmdldEl0ZW1Db21wb25lbnQoaXRlbSksXHJcbiAgICAgICAgZ2V0Q3VycmVudFJvd0hlaWdodDogdGhpcy5nZXRDdXJyZW50Um93SGVpZ2h0LmJpbmQodGhpcylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy4kb3B0aW9ucy5taW5Db2xzO1xyXG4gICAgICB0aGlzLnJvd3MgPSB0aGlzLiRvcHRpb25zLm1pblJvd3MgKyB0aGlzLiRvcHRpb25zLmFkZEVtcHR5Um93c0NvdW50O1xyXG4gICAgICB0aGlzLnNldEdyaWRTaXplKCk7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50Um93SGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJSb3dIZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2l6ZSgpOiB2b2lkIHtcclxuICAgIGxldCBoZWlnaHQ7XHJcbiAgICBsZXQgd2lkdGg7XHJcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gJ2ZpdCcgJiYgIXRoaXMubW9iaWxlKSB7XHJcbiAgICAgIHdpZHRoID0gdGhpcy5lbC5vZmZzZXRXaWR0aDtcclxuICAgICAgaGVpZ2h0ID0gdGhpcy5lbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aWR0aCA9IHRoaXMuZWwuY2xpZW50V2lkdGg7XHJcbiAgICAgIGhlaWdodCA9IHRoaXMuZWwuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICAod2lkdGggIT09IHRoaXMuY3VyV2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLmN1ckhlaWdodCkgJiZcclxuICAgICAgdGhpcy5jaGVja0lmVG9SZXNpemUoKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMub25SZXNpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldE9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLiRvcHRpb25zID0gR3JpZHN0ZXJVdGlscy5tZXJnZShcclxuICAgICAgdGhpcy4kb3B0aW9ucyxcclxuICAgICAgdGhpcy5vcHRpb25zLFxyXG4gICAgICB0aGlzLiRvcHRpb25zXHJcbiAgICApO1xyXG4gICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVXaW5kb3dSZXNpemUgJiYgIXRoaXMud2luZG93UmVzaXplKSB7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oXHJcbiAgICAgICAgJ3dpbmRvdycsXHJcbiAgICAgICAgJ3Jlc2l6ZScsXHJcbiAgICAgICAgdGhpcy5vblJlc2l6ZVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLiRvcHRpb25zLmRpc2FibGVXaW5kb3dSZXNpemUgJiYgdGhpcy53aW5kb3dSZXNpemUpIHtcclxuICAgICAgdGhpcy53aW5kb3dSZXNpemUoKTtcclxuICAgICAgdGhpcy53aW5kb3dSZXNpemUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbXB0eUNlbGwudXBkYXRlT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgb3B0aW9uc0NoYW5nZWQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICB0aGlzLnNldE9wdGlvbnMoKTtcclxuICAgIGxldCB3aWRnZXRzSW5kZXg6IG51bWJlciA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxO1xyXG4gICAgbGV0IHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+PSAwOyB3aWRnZXRzSW5kZXgtLSkge1xyXG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcclxuICAgICAgd2lkZ2V0LnVwZGF0ZU9wdGlvbnMoKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0KCk7XHJcbiAgfTtcclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMucHJldmlld1N0eWxlJC5jb21wbGV0ZSgpO1xyXG4gICAgaWYgKHRoaXMud2luZG93UmVzaXplKSB7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5kZXN0cm95Q2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lDYWxsYmFjayh0aGlzKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmFwaSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLnJlc2l6ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwaS5vcHRpb25zQ2hhbmdlZCA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwaS5nZXROZXh0UG9zc2libGVQb3NpdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwaSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHRoaXMuZW1wdHlDZWxsLmRlc3Ryb3koKTtcclxuICAgIHRoaXMuZW1wdHlDZWxsID0gbnVsbCE7XHJcbiAgICB0aGlzLmNvbXBhY3QuZGVzdHJveSgpO1xyXG4gICAgdGhpcy5jb21wYWN0ID0gbnVsbCE7XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIGlmICh0aGlzLmVsLmNsaWVudFdpZHRoKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2V0R3JpZFNpemUpIHtcclxuICAgICAgICAvLyByZXNldCB3aWR0aC9oZWlnaHQgc28gdGhlIHNpemUgaXMgcmVjYWxjdWxhdGVkIGFmdGVyd2FyZHNcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICd3aWR0aCcsICcnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdoZWlnaHQnLCAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRHcmlkU2l6ZSgpO1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZUxheW91dCgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNoZWNrSWZUb1Jlc2l6ZSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNsaWVudFdpZHRoID0gdGhpcy5lbC5jbGllbnRXaWR0aDtcclxuICAgIGNvbnN0IG9mZnNldFdpZHRoID0gdGhpcy5lbC5vZmZzZXRXaWR0aDtcclxuICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gdGhpcy5lbC5zY3JvbGxXaWR0aDtcclxuICAgIGNvbnN0IGNsaWVudEhlaWdodCA9IHRoaXMuZWwuY2xpZW50SGVpZ2h0O1xyXG4gICAgY29uc3Qgb2Zmc2V0SGVpZ2h0ID0gdGhpcy5lbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBjb25zdCBzY3JvbGxIZWlnaHQgPSB0aGlzLmVsLnNjcm9sbEhlaWdodDtcclxuICAgIGNvbnN0IHZlcnRpY2FsU2Nyb2xsUHJlc2VudCA9XHJcbiAgICAgIGNsaWVudFdpZHRoIDwgb2Zmc2V0V2lkdGggJiZcclxuICAgICAgc2Nyb2xsSGVpZ2h0ID4gb2Zmc2V0SGVpZ2h0ICYmXHJcbiAgICAgIHNjcm9sbEhlaWdodCAtIG9mZnNldEhlaWdodCA8IG9mZnNldFdpZHRoIC0gY2xpZW50V2lkdGg7XHJcbiAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsUHJlc2VudCA9XHJcbiAgICAgIGNsaWVudEhlaWdodCA8IG9mZnNldEhlaWdodCAmJlxyXG4gICAgICBzY3JvbGxXaWR0aCA+IG9mZnNldFdpZHRoICYmXHJcbiAgICAgIHNjcm9sbFdpZHRoIC0gb2Zmc2V0V2lkdGggPCBvZmZzZXRIZWlnaHQgLSBjbGllbnRIZWlnaHQ7XHJcbiAgICBpZiAodmVydGljYWxTY3JvbGxQcmVzZW50KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAhaG9yaXpvbnRhbFNjcm9sbFByZXNlbnQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmTW9iaWxlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMudXNlQm9keUZvckJyZWFrcG9pbnQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuJG9wdGlvbnMubW9iaWxlQnJlYWtwb2ludCA+IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy4kb3B0aW9ucy5tb2JpbGVCcmVha3BvaW50ID4gdGhpcy5jdXJXaWR0aDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEdyaWRTaXplKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmVsO1xyXG4gICAgbGV0IHdpZHRoO1xyXG4gICAgbGV0IGhlaWdodDtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy4kb3B0aW9ucy5zZXRHcmlkU2l6ZSB8fFxyXG4gICAgICAodGhpcy4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuRml0ICYmICF0aGlzLm1vYmlsZSlcclxuICAgICkge1xyXG4gICAgICB3aWR0aCA9IGVsLm9mZnNldFdpZHRoO1xyXG4gICAgICBoZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aWR0aCA9IGVsLmNsaWVudFdpZHRoO1xyXG4gICAgICBoZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cldpZHRoID0gd2lkdGg7XHJcbiAgICB0aGlzLmN1ckhlaWdodCA9IGhlaWdodDtcclxuICB9XHJcblxyXG4gIHNldEdyaWREaW1lbnNpb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRHcmlkU2l6ZSgpO1xyXG4gICAgaWYgKCF0aGlzLm1vYmlsZSAmJiB0aGlzLmNoZWNrSWZNb2JpbGUoKSkge1xyXG4gICAgICB0aGlzLm1vYmlsZSA9ICF0aGlzLm1vYmlsZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnbW9iaWxlJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9iaWxlICYmICF0aGlzLmNoZWNrSWZNb2JpbGUoKSkge1xyXG4gICAgICB0aGlzLm1vYmlsZSA9ICF0aGlzLm1vYmlsZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLCAnbW9iaWxlJyk7XHJcbiAgICB9XHJcbiAgICBsZXQgcm93cyA9IHRoaXMuJG9wdGlvbnMubWluUm93cztcclxuICAgIGxldCBjb2x1bW5zID0gdGhpcy4kb3B0aW9ucy5taW5Db2xzO1xyXG5cclxuICAgIGxldCB3aWRnZXRzSW5kZXggPSB0aGlzLmdyaWQubGVuZ3RoIC0gMTtcclxuICAgIGxldCB3aWRnZXQ7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICBpZiAoIXdpZGdldC5ub3RQbGFjZWQpIHtcclxuICAgICAgICByb3dzID0gTWF0aC5tYXgocm93cywgd2lkZ2V0LiRpdGVtLnkgKyB3aWRnZXQuJGl0ZW0ucm93cyk7XHJcbiAgICAgICAgY29sdW1ucyA9IE1hdGgubWF4KGNvbHVtbnMsIHdpZGdldC4kaXRlbS54ICsgd2lkZ2V0LiRpdGVtLmNvbHMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByb3dzICs9IHRoaXMuJG9wdGlvbnMuYWRkRW1wdHlSb3dzQ291bnQ7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5zICE9PSBjb2x1bW5zIHx8IHRoaXMucm93cyAhPT0gcm93cykge1xyXG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xyXG4gICAgICB0aGlzLnJvd3MgPSByb3dzO1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmdyaWRTaXplQ2hhbmdlZENhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmdyaWRTaXplQ2hhbmdlZENhbGxiYWNrKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZUxheW91dCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbXBhY3QpIHtcclxuICAgICAgdGhpcy5jb21wYWN0LmNoZWNrQ29tcGFjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0R3JpZERpbWVuc2lvbnMoKTtcclxuICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luKSB7XHJcbiAgICAgIGxldCBtYXJnaW5XaWR0aCA9IC10aGlzLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQ7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIHRoaXMuZWwsXHJcbiAgICAgICAgICAncGFkZGluZy1sZWZ0JyxcclxuICAgICAgICAgIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0ICsgJ3B4J1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIHRoaXMuZWwsXHJcbiAgICAgICAgICAncGFkZGluZy1sZWZ0JyxcclxuICAgICAgICAgIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4J1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodDtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgdGhpcy5lbCxcclxuICAgICAgICAgICdwYWRkaW5nLXJpZ2h0JyxcclxuICAgICAgICAgIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodCArICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgICB0aGlzLmVsLFxyXG4gICAgICAgICAgJ3BhZGRpbmctcmlnaHQnLFxyXG4gICAgICAgICAgdGhpcy4kb3B0aW9ucy5tYXJnaW4gKyAncHgnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmN1ckNvbFdpZHRoID0gKHRoaXMuY3VyV2lkdGggLSBtYXJnaW5XaWR0aCkgLyB0aGlzLmNvbHVtbnM7XHJcbiAgICAgIGxldCBtYXJnaW5IZWlnaHQgPSAtdGhpcy4kb3B0aW9ucy5tYXJnaW47XHJcbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgbWFyZ2luSGVpZ2h0ICs9IHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Ub3A7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIHRoaXMuZWwsXHJcbiAgICAgICAgICAncGFkZGluZy10b3AnLFxyXG4gICAgICAgICAgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcCArICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgdGhpcy5lbCxcclxuICAgICAgICAgICdwYWRkaW5nLXRvcCcsXHJcbiAgICAgICAgICB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICE9PSBudWxsKSB7XHJcbiAgICAgICAgbWFyZ2luSGVpZ2h0ICs9IHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b207XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIHRoaXMuZWwsXHJcbiAgICAgICAgICAncGFkZGluZy1ib3R0b20nLFxyXG4gICAgICAgICAgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkJvdHRvbSArICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgdGhpcy5lbCxcclxuICAgICAgICAgICdwYWRkaW5nLWJvdHRvbScsXHJcbiAgICAgICAgICB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY3VyUm93SGVpZ2h0ID1cclxuICAgICAgICAoKHRoaXMuY3VySGVpZ2h0IC0gbWFyZ2luSGVpZ2h0KSAvIHRoaXMucm93cykgKlxyXG4gICAgICAgIHRoaXMuJG9wdGlvbnMucm93SGVpZ2h0UmF0aW87XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1ckNvbFdpZHRoID0gKHRoaXMuY3VyV2lkdGggKyB0aGlzLiRvcHRpb25zLm1hcmdpbikgLyB0aGlzLmNvbHVtbnM7XHJcbiAgICAgIHRoaXMuY3VyUm93SGVpZ2h0ID1cclxuICAgICAgICAoKHRoaXMuY3VySGVpZ2h0ICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4pIC8gdGhpcy5yb3dzKSAqXHJcbiAgICAgICAgdGhpcy4kb3B0aW9ucy5yb3dIZWlnaHRSYXRpbztcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1sZWZ0JywgMCArICdweCcpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXJpZ2h0JywgMCArICdweCcpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXRvcCcsIDAgKyAncHgnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1ib3R0b20nLCAwICsgJ3B4Jyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyaWRSZW5kZXJlci51cGRhdGVHcmlkc3RlcigpO1xyXG5cclxuICAgIGlmICh0aGlzLiRvcHRpb25zLnNldEdyaWRTaXplKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbCwgJ2dyaWRTaXplJyk7XHJcbiAgICAgIGlmICghdGhpcy5tb2JpbGUpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgdGhpcy5lbCxcclxuICAgICAgICAgICd3aWR0aCcsXHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgKiB0aGlzLmN1ckNvbFdpZHRoICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4gKyAncHgnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgdGhpcy5lbCxcclxuICAgICAgICAgICdoZWlnaHQnLFxyXG4gICAgICAgICAgdGhpcy5yb3dzICogdGhpcy5jdXJSb3dIZWlnaHQgKyB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwsICdncmlkU2l6ZScpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICd3aWR0aCcsICcnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnaGVpZ2h0JywgJycpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVHcmlkKCk7XHJcblxyXG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDE7XHJcbiAgICBsZXQgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICB3aWRnZXQuc2V0U2l6ZSgpO1xyXG4gICAgICB3aWRnZXQuZHJhZy50b2dnbGUoKTtcclxuICAgICAgd2lkZ2V0LnJlc2l6ZS50b2dnbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc2l6ZSQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlR3JpZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLiRvcHRpb25zLmRpc3BsYXlHcmlkID09PSAnYWx3YXlzJyAmJiAhdGhpcy5tb2JpbGUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnZGlzcGxheS1ncmlkJyk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLiRvcHRpb25zLmRpc3BsYXlHcmlkID09PSAnb25EcmFnJlJlc2l6ZScgJiZcclxuICAgICAgdGhpcy5kcmFnSW5Qcm9ncmVzc1xyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbCwgJ2Rpc3BsYXktZ3JpZCcpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdGhpcy4kb3B0aW9ucy5kaXNwbGF5R3JpZCA9PT0gJ25vbmUnIHx8XHJcbiAgICAgICF0aGlzLmRyYWdJblByb2dyZXNzIHx8XHJcbiAgICAgIHRoaXMubW9iaWxlXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLCAnZGlzcGxheS1ncmlkJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEdyaWREaW1lbnNpb25zKCk7XHJcbiAgICB0aGlzLmdyaWRDb2x1bW5zLmxlbmd0aCA9IEdyaWRzdGVyQ29tcG9uZW50LmdldE5ld0FycmF5TGVuZ3RoKFxyXG4gICAgICB0aGlzLmNvbHVtbnMsXHJcbiAgICAgIHRoaXMuY3VyV2lkdGgsXHJcbiAgICAgIHRoaXMuY3VyQ29sV2lkdGhcclxuICAgICk7XHJcbiAgICB0aGlzLmdyaWRSb3dzLmxlbmd0aCA9IEdyaWRzdGVyQ29tcG9uZW50LmdldE5ld0FycmF5TGVuZ3RoKFxyXG4gICAgICB0aGlzLnJvd3MsXHJcbiAgICAgIHRoaXMuY3VySGVpZ2h0LFxyXG4gICAgICB0aGlzLmN1clJvd0hlaWdodFxyXG4gICAgKTtcclxuICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBhZGRJdGVtKGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Db2xzO1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0uY29scyA9IGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scztcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Sb3dzO1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0ucm93cyA9IGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cztcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0ueCA9PT0gLTEgfHwgaXRlbUNvbXBvbmVudC4kaXRlbS55ID09PSAtMSkge1xyXG4gICAgICB0aGlzLmF1dG9Qb3NpdGlvbkl0ZW0oaXRlbUNvbXBvbmVudCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2tDb2xsaXNpb24oaXRlbUNvbXBvbmVudC4kaXRlbSkpIHtcclxuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVXYXJuaW5ncykge1xyXG4gICAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIkNhbid0IGJlIHBsYWNlZCBpbiB0aGUgYm91bmRzIG9mIHRoZSBkYXNoYm9hcmQsIHRyeWluZyB0byBhdXRvIHBvc2l0aW9uIS9uXCIgK1xyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbXBvbmVudC5pdGVtLCBbJ2NvbHMnLCAncm93cycsICd4JywgJ3knXSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlQXV0b1Bvc2l0aW9uT25Db25mbGljdCkge1xyXG4gICAgICAgIHRoaXMuYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtQ29tcG9uZW50Lm5vdFBsYWNlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZC5wdXNoKGl0ZW1Db21wb25lbnQpO1xyXG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQkLm5leHQoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQuc3BsaWNlKHRoaXMuZ3JpZC5pbmRleE9mKGl0ZW1Db21wb25lbnQpLCAxKTtcclxuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0JC5uZXh0KCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLml0ZW1SZW1vdmVkQ2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5vcHRpb25zLml0ZW1SZW1vdmVkQ2FsbGJhY2soaXRlbUNvbXBvbmVudC5pdGVtLCBpdGVtQ29tcG9uZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrQ29sbGlzaW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNvbGxpc2lvbjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pdGVtVmFsaWRhdGVDYWxsYmFjaykge1xyXG4gICAgICBjb2xsaXNpb24gPSAhdGhpcy5vcHRpb25zLml0ZW1WYWxpZGF0ZUNhbGxiYWNrKGl0ZW0pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb2xsaXNpb24gJiYgdGhpcy5jaGVja0dyaWRDb2xsaXNpb24oaXRlbSkpIHtcclxuICAgICAgY29sbGlzaW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghY29sbGlzaW9uKSB7XHJcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmZpbmRJdGVtV2l0aEl0ZW0oaXRlbSk7XHJcbiAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgY29sbGlzaW9uID0gYztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbGxpc2lvbjtcclxuICB9XHJcblxyXG4gIGNoZWNrR3JpZENvbGxpc2lvbihpdGVtOiBHcmlkc3Rlckl0ZW0pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG5vTmVnYXRpdmVQb3NpdGlvbiA9IGl0ZW0ueSA+IC0xICYmIGl0ZW0ueCA+IC0xO1xyXG4gICAgY29uc3QgbWF4R3JpZENvbHMgPSBpdGVtLmNvbHMgKyBpdGVtLnggPD0gdGhpcy4kb3B0aW9ucy5tYXhDb2xzO1xyXG4gICAgY29uc3QgbWF4R3JpZFJvd3MgPSBpdGVtLnJvd3MgKyBpdGVtLnkgPD0gdGhpcy4kb3B0aW9ucy5tYXhSb3dzO1xyXG4gICAgY29uc3QgbWF4SXRlbUNvbHMgPVxyXG4gICAgICBpdGVtLm1heEl0ZW1Db2xzID09PSB1bmRlZmluZWRcclxuICAgICAgICA/IHRoaXMuJG9wdGlvbnMubWF4SXRlbUNvbHNcclxuICAgICAgICA6IGl0ZW0ubWF4SXRlbUNvbHM7XHJcbiAgICBjb25zdCBtaW5JdGVtQ29scyA9XHJcbiAgICAgIGl0ZW0ubWluSXRlbUNvbHMgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gdGhpcy4kb3B0aW9ucy5taW5JdGVtQ29sc1xyXG4gICAgICAgIDogaXRlbS5taW5JdGVtQ29scztcclxuICAgIGNvbnN0IG1heEl0ZW1Sb3dzID1cclxuICAgICAgaXRlbS5tYXhJdGVtUm93cyA9PT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1Sb3dzXHJcbiAgICAgICAgOiBpdGVtLm1heEl0ZW1Sb3dzO1xyXG4gICAgY29uc3QgbWluSXRlbVJvd3MgPVxyXG4gICAgICBpdGVtLm1pbkl0ZW1Sb3dzID09PSB1bmRlZmluZWRcclxuICAgICAgICA/IHRoaXMuJG9wdGlvbnMubWluSXRlbVJvd3NcclxuICAgICAgICA6IGl0ZW0ubWluSXRlbVJvd3M7XHJcbiAgICBjb25zdCBpbkNvbHNMaW1pdHMgPSBpdGVtLmNvbHMgPD0gbWF4SXRlbUNvbHMgJiYgaXRlbS5jb2xzID49IG1pbkl0ZW1Db2xzO1xyXG4gICAgY29uc3QgaW5Sb3dzTGltaXRzID0gaXRlbS5yb3dzIDw9IG1heEl0ZW1Sb3dzICYmIGl0ZW0ucm93cyA+PSBtaW5JdGVtUm93cztcclxuICAgIGNvbnN0IG1pbkFyZWFMaW1pdCA9XHJcbiAgICAgIGl0ZW0ubWluSXRlbUFyZWEgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gdGhpcy4kb3B0aW9ucy5taW5JdGVtQXJlYVxyXG4gICAgICAgIDogaXRlbS5taW5JdGVtQXJlYTtcclxuICAgIGNvbnN0IG1heEFyZWFMaW1pdCA9XHJcbiAgICAgIGl0ZW0ubWF4SXRlbUFyZWEgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gdGhpcy4kb3B0aW9ucy5tYXhJdGVtQXJlYVxyXG4gICAgICAgIDogaXRlbS5tYXhJdGVtQXJlYTtcclxuICAgIGNvbnN0IGFyZWEgPSBpdGVtLmNvbHMgKiBpdGVtLnJvd3M7XHJcbiAgICBjb25zdCBpbk1pbkFyZWEgPSBtaW5BcmVhTGltaXQgPD0gYXJlYTtcclxuICAgIGNvbnN0IGluTWF4QXJlYSA9IG1heEFyZWFMaW1pdCA+PSBhcmVhO1xyXG4gICAgcmV0dXJuICEoXHJcbiAgICAgIG5vTmVnYXRpdmVQb3NpdGlvbiAmJlxyXG4gICAgICBtYXhHcmlkQ29scyAmJlxyXG4gICAgICBtYXhHcmlkUm93cyAmJlxyXG4gICAgICBpbkNvbHNMaW1pdHMgJiZcclxuICAgICAgaW5Sb3dzTGltaXRzICYmXHJcbiAgICAgIGluTWluQXJlYSAmJlxyXG4gICAgICBpbk1heEFyZWFcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBmaW5kSXRlbVdpdGhJdGVtKFxyXG4gICAgaXRlbTogR3JpZHN0ZXJJdGVtXHJcbiAgKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XHJcbiAgICBsZXQgd2lkZ2V0c0luZGV4ID0gMDtcclxuICAgIGxldCB3aWRnZXQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcclxuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPCB0aGlzLmdyaWQubGVuZ3RoOyB3aWRnZXRzSW5kZXgrKykge1xyXG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHdpZGdldC4kaXRlbSAhPT0gaXRlbSAmJlxyXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb25Ud29JdGVtcyh3aWRnZXQuJGl0ZW0sIGl0ZW0pXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiB3aWRnZXQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGZpbmRJdGVtc1dpdGhJdGVtKGl0ZW06IEdyaWRzdGVySXRlbSk6IEFycmF5PEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZT4ge1xyXG4gICAgY29uc3QgYTogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiA9IFtdO1xyXG4gICAgbGV0IHdpZGdldHNJbmRleCA9IDA7XHJcbiAgICBsZXQgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4IDwgdGhpcy5ncmlkLmxlbmd0aDsgd2lkZ2V0c0luZGV4KyspIHtcclxuICAgICAgd2lkZ2V0ID0gdGhpcy5ncmlkW3dpZGdldHNJbmRleF07XHJcbiAgICAgIGlmIChcclxuICAgICAgICB3aWRnZXQuJGl0ZW0gIT09IGl0ZW0gJiZcclxuICAgICAgICB0aGlzLmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMod2lkZ2V0LiRpdGVtLCBpdGVtKVxyXG4gICAgICApIHtcclxuICAgICAgICBhLnB1c2god2lkZ2V0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGE7XHJcbiAgfVxyXG5cclxuICBhdXRvUG9zaXRpb25JdGVtKGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24oaXRlbUNvbXBvbmVudC4kaXRlbSkpIHtcclxuICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSBmYWxzZTtcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLnggPSBpdGVtQ29tcG9uZW50LiRpdGVtLng7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS55ID0gaXRlbUNvbXBvbmVudC4kaXRlbS55O1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW1DaGFuZ2VkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lm5vdFBsYWNlZCA9IHRydWU7XHJcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlV2FybmluZ3MpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIkNhbid0IGJlIHBsYWNlZCBpbiB0aGUgYm91bmRzIG9mIHRoZSBkYXNoYm9hcmQhL25cIiArXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpdGVtQ29tcG9uZW50Lml0ZW0sIFsnY29scycsICdyb3dzJywgJ3gnLCAneSddKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE5leHRQb3NzaWJsZVBvc2l0aW9uID0gKFxyXG4gICAgbmV3SXRlbTogR3JpZHN0ZXJJdGVtLFxyXG4gICAgc3RhcnRpbmdGcm9tOiB7IHk/OiBudW1iZXI7IHg/OiBudW1iZXIgfSA9IHt9XHJcbiAgKTogYm9vbGVhbiA9PiB7XHJcbiAgICBpZiAobmV3SXRlbS5jb2xzID09PSAtMSkge1xyXG4gICAgICBuZXdJdGVtLmNvbHMgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtQ29scztcclxuICAgIH1cclxuICAgIGlmIChuZXdJdGVtLnJvd3MgPT09IC0xKSB7XHJcbiAgICAgIG5ld0l0ZW0ucm93cyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Sb3dzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRHcmlkRGltZW5zaW9ucygpO1xyXG4gICAgbGV0IHJvd3NJbmRleCA9IHN0YXJ0aW5nRnJvbS55IHx8IDA7XHJcbiAgICBsZXQgY29sc0luZGV4O1xyXG4gICAgZm9yICg7IHJvd3NJbmRleCA8IHRoaXMucm93czsgcm93c0luZGV4KyspIHtcclxuICAgICAgbmV3SXRlbS55ID0gcm93c0luZGV4O1xyXG4gICAgICBjb2xzSW5kZXggPSBzdGFydGluZ0Zyb20ueCB8fCAwO1xyXG4gICAgICBmb3IgKDsgY29sc0luZGV4IDwgdGhpcy5jb2x1bW5zOyBjb2xzSW5kZXgrKykge1xyXG4gICAgICAgIG5ld0l0ZW0ueCA9IGNvbHNJbmRleDtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tDb2xsaXNpb24obmV3SXRlbSkpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgY2FuQWRkVG9Sb3dzID0gdGhpcy4kb3B0aW9ucy5tYXhSb3dzID49IHRoaXMucm93cyArIG5ld0l0ZW0ucm93cztcclxuICAgIGNvbnN0IGNhbkFkZFRvQ29sdW1ucyA9XHJcbiAgICAgIHRoaXMuJG9wdGlvbnMubWF4Q29scyA+PSB0aGlzLmNvbHVtbnMgKyBuZXdJdGVtLmNvbHM7XHJcbiAgICBjb25zdCBhZGRUb1Jvd3MgPSB0aGlzLnJvd3MgPD0gdGhpcy5jb2x1bW5zICYmIGNhbkFkZFRvUm93cztcclxuICAgIGlmICghYWRkVG9Sb3dzICYmIGNhbkFkZFRvQ29sdW1ucykge1xyXG4gICAgICBuZXdJdGVtLnggPSB0aGlzLmNvbHVtbnM7XHJcbiAgICAgIG5ld0l0ZW0ueSA9IDA7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChjYW5BZGRUb1Jvd3MpIHtcclxuICAgICAgbmV3SXRlbS55ID0gdGhpcy5yb3dzO1xyXG4gICAgICBuZXdJdGVtLnggPSAwO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9O1xyXG5cclxuICBnZXRGaXJzdFBvc3NpYmxlUG9zaXRpb24gPSAoaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtID0+IHtcclxuICAgIGNvbnN0IHRtcEl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcclxuICAgIHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24odG1wSXRlbSk7XHJcbiAgICByZXR1cm4gdG1wSXRlbTtcclxuICB9O1xyXG5cclxuICBnZXRMYXN0UG9zc2libGVQb3NpdGlvbiA9IChpdGVtOiBHcmlkc3Rlckl0ZW0pOiBHcmlkc3Rlckl0ZW0gPT4ge1xyXG4gICAgbGV0IGZhcnRoZXN0SXRlbTogeyB5OiBudW1iZXI7IHg6IG51bWJlciB9ID0geyB5OiAwLCB4OiAwIH07XHJcbiAgICBmYXJ0aGVzdEl0ZW0gPSB0aGlzLmdyaWQucmVkdWNlKFxyXG4gICAgICAoXHJcbiAgICAgICAgcHJldjogeyB5OiBudW1iZXI7IHg6IG51bWJlciB9LFxyXG4gICAgICAgIGN1cnI6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZVxyXG4gICAgICApID0+IHtcclxuICAgICAgICBjb25zdCBjdXJyQ29vcmRzID0ge1xyXG4gICAgICAgICAgeTogY3Vyci4kaXRlbS55ICsgY3Vyci4kaXRlbS5yb3dzIC0gMSxcclxuICAgICAgICAgIHg6IGN1cnIuJGl0ZW0ueCArIGN1cnIuJGl0ZW0uY29scyAtIDFcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChHcmlkc3RlclV0aWxzLmNvbXBhcmVJdGVtcyhwcmV2LCBjdXJyQ29vcmRzKSA9PT0gMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGN1cnJDb29yZHM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBwcmV2O1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZmFydGhlc3RJdGVtXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHRtcEl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcclxuICAgIHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24odG1wSXRlbSwgZmFydGhlc3RJdGVtKTtcclxuICAgIHJldHVybiB0bXBJdGVtO1xyXG4gIH07XHJcblxyXG4gIHBpeGVsc1RvUG9zaXRpb25YKFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgcm91bmRpbmdNZXRob2Q6ICh4OiBudW1iZXIpID0+IG51bWJlcixcclxuICAgIG5vTGltaXQ/OiBib29sZWFuXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gcm91bmRpbmdNZXRob2QoeCAvIHRoaXMuY3VyQ29sV2lkdGgpO1xyXG4gICAgaWYgKG5vTGltaXQpIHtcclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIE1hdGgubWF4KHBvc2l0aW9uLCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBpeGVsc1RvUG9zaXRpb25ZKFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgcm91bmRpbmdNZXRob2Q6ICh4OiBudW1iZXIpID0+IG51bWJlcixcclxuICAgIG5vTGltaXQ/OiBib29sZWFuXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gcm91bmRpbmdNZXRob2QoeSAvIHRoaXMuY3VyUm93SGVpZ2h0KTtcclxuICAgIGlmIChub0xpbWl0KSB7XHJcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBNYXRoLm1heChwb3NpdGlvbiwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwb3NpdGlvblhUb1BpeGVscyh4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHggKiB0aGlzLmN1ckNvbFdpZHRoO1xyXG4gIH1cclxuXHJcbiAgcG9zaXRpb25ZVG9QaXhlbHMoeTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB5ICogdGhpcy5jdXJSb3dIZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtQ29tcG9uZW50KFxyXG4gICAgaXRlbTogR3JpZHN0ZXJJdGVtXHJcbiAgKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWQuZmluZChjID0+IGMuaXRlbSA9PT0gaXRlbSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0gRnVuY3Rpb25zIGZvciBzd2FwV2hpbGVEcmFnZ2luZyBvcHRpb25cclxuXHJcbiAgLy8gaWRlbnRpY2FsIHRvIGNoZWNrQ29sbGlzaW9uKCkgZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBjYWxscyBmaW5kSXRlbVdpdGhJdGVtRm9yU3dhcGluZygpIGluc3RlYWQgb2YgZmluZEl0ZW1XaXRoSXRlbSgpXHJcbiAgY2hlY2tDb2xsaXNpb25Gb3JTd2FwaW5nKFxyXG4gICAgaXRlbTogR3JpZHN0ZXJJdGVtXHJcbiAgKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XHJcbiAgICBsZXQgY29sbGlzaW9uOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfCBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLml0ZW1WYWxpZGF0ZUNhbGxiYWNrKSB7XHJcbiAgICAgIGNvbGxpc2lvbiA9ICF0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2soaXRlbSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbGxpc2lvbiAmJiB0aGlzLmNoZWNrR3JpZENvbGxpc2lvbihpdGVtKSkge1xyXG4gICAgICBjb2xsaXNpb24gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb2xsaXNpb24pIHtcclxuICAgICAgY29uc3QgYyA9IHRoaXMuZmluZEl0ZW1XaXRoSXRlbUZvclN3YXBwaW5nKGl0ZW0pO1xyXG4gICAgICBpZiAoYykge1xyXG4gICAgICAgIGNvbGxpc2lvbiA9IGM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb2xsaXNpb247XHJcbiAgfVxyXG5cclxuICAvLyBpZGVudGljYWwgdG8gZmluZEl0ZW1XaXRoSXRlbSgpIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gY2FsbHMgY2hlY2tDb2xsaXNpb25Ud29JdGVtc0ZvclN3YXBpbmcoKSBpbnN0ZWFkIG9mIGNoZWNrQ29sbGlzaW9uVHdvSXRlbXMoKVxyXG4gIGZpbmRJdGVtV2l0aEl0ZW1Gb3JTd2FwcGluZyhcclxuICAgIGl0ZW06IEdyaWRzdGVySXRlbVxyXG4gICk6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4ge1xyXG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDE7XHJcbiAgICBsZXQgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID4gLTE7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgd2lkZ2V0LiRpdGVtICE9PSBpdGVtICYmXHJcbiAgICAgICAgR3JpZHN0ZXJDb21wb25lbnQuY2hlY2tDb2xsaXNpb25Ud29JdGVtc0ZvclN3YXBpbmcod2lkZ2V0LiRpdGVtLCBpdGVtKVxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcmV2aWV3U3R5bGUoZHJhZyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5tb3ZpbmdJdGVtKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbXBhY3QgJiYgZHJhZykge1xyXG4gICAgICAgIHRoaXMuY29tcGFjdC5jaGVja0NvbXBhY3RJdGVtKHRoaXMubW92aW5nSXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wcmV2aWV3U3R5bGUkLm5leHQodGhpcy5tb3ZpbmdJdGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucHJldmlld1N0eWxlJC5uZXh0KG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tIEVuZCBvZiBmdW5jdGlvbnMgZm9yIHN3YXBXaGlsZURyYWdnaW5nIG9wdGlvblxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gIHByaXZhdGUgc3RhdGljIGdldE5ld0FycmF5TGVuZ3RoKFxyXG4gICAgbGVuZ3RoOiBudW1iZXIsXHJcbiAgICBvdmVyYWxsU2l6ZTogbnVtYmVyLFxyXG4gICAgc2l6ZTogbnVtYmVyXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG5ld0xlbmd0aCA9IE1hdGgubWF4KGxlbmd0aCwgTWF0aC5mbG9vcihvdmVyYWxsU2l6ZSAvIHNpemUpKTtcclxuXHJcbiAgICBpZiAobmV3TGVuZ3RoIDwgMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG5ld0xlbmd0aCkpIHtcclxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IobmV3TGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gIGNsYXNzPVwiZ3JpZHN0ZXItY29sdW1uXCJcclxuICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGdyaWRDb2x1bW5zOyBsZXQgaSA9IGluZGV4O1wiXHJcbiAgW25nU3R5bGVdPVwiZ3JpZFJlbmRlcmVyLmdldEdyaWRDb2x1bW5TdHlsZShpKVwiXHJcbj48L2Rpdj5cclxuPGRpdlxyXG4gIGNsYXNzPVwiZ3JpZHN0ZXItcm93XCJcclxuICAqbmdGb3I9XCJsZXQgcm93IG9mIGdyaWRSb3dzOyBsZXQgaSA9IGluZGV4O1wiXHJcbiAgW25nU3R5bGVdPVwiZ3JpZFJlbmRlcmVyLmdldEdyaWRSb3dTdHlsZShpKVwiXHJcbj48L2Rpdj5cclxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48Z3JpZHN0ZXItcHJldmlld1xyXG4gIFtncmlkUmVuZGVyZXJdPVwiZ3JpZFJlbmRlcmVyXCJcclxuICBbcHJldmlld1N0eWxlJF09XCJwcmV2aWV3U3R5bGUkXCJcclxuICBjbGFzcz1cImdyaWRzdGVyLXByZXZpZXdcIlxyXG4+PC9ncmlkc3Rlci1wcmV2aWV3PlxyXG4iXX0=
|