@acorex/layout 16.18.50 → 16.19.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/acorex-layout.mjs +31 -31
- package/fesm2022/acorex-layout.mjs.map +1 -1
- package/package.json +3 -5
- package/esm2022/acorex-layout.mjs +0 -5
- package/esm2022/index.mjs +0 -7
- package/esm2022/lib/widget-board/editors/widget-size-editor/widget-size.editor.mjs +0 -49
- package/esm2022/lib/widget-board/editors/widget-size-editor/widget-size.module.mjs +0 -22
- package/esm2022/lib/widget-board/widget-board.component.mjs +0 -452
- package/esm2022/lib/widget-board/widget-board.module.mjs +0 -118
- package/esm2022/lib/widget-board/widget-config.component.mjs +0 -85
- package/esm2022/lib/widget-board/widget-host.component.mjs +0 -311
- package/esm2022/lib/widget-board/widget-save.component.mjs +0 -79
- package/esm2022/lib/widget-board/widget.class.mjs +0 -130
@@ -1,452 +0,0 @@
|
|
1
|
-
import { Component, Input, ViewEncapsulation, ElementRef, ViewChild, NgZone, ChangeDetectionStrategy, ChangeDetectorRef, Output, EventEmitter, ViewChildren, QueryList } from '@angular/core';
|
2
|
-
import { AXWidgetHostComponent } from './widget-host.component';
|
3
|
-
import { AXHtmlUtil, AXClientRec } from '@acorex/core';
|
4
|
-
import { Subject } from 'rxjs';
|
5
|
-
import { debounceTime } from 'rxjs/operators';
|
6
|
-
import * as i0 from "@angular/core";
|
7
|
-
import * as i1 from "@angular/common";
|
8
|
-
import * as i2 from "./widget-host.component";
|
9
|
-
export class AXWidgetBoardComponent {
|
10
|
-
ref;
|
11
|
-
zone;
|
12
|
-
cdr;
|
13
|
-
container;
|
14
|
-
widgetHosts;
|
15
|
-
widgets = [];
|
16
|
-
galleryItems = [];
|
17
|
-
tileSize = 80;
|
18
|
-
gapSize = 5;
|
19
|
-
readonly = false;
|
20
|
-
newWidget = null;
|
21
|
-
rtl;
|
22
|
-
_isInEditing = false;
|
23
|
-
isInEditing() {
|
24
|
-
return this._isInEditing;
|
25
|
-
}
|
26
|
-
isDragging = false;
|
27
|
-
dragItem;
|
28
|
-
saveSubject = new Subject();
|
29
|
-
provideValue;
|
30
|
-
DATA_COL = 'data-col';
|
31
|
-
DATA_ROW = 'data-row';
|
32
|
-
DATA_SIZE_X = 'data-size-x';
|
33
|
-
DATA_SIZE_Y = 'data-size-y';
|
34
|
-
DATA_OLD_COL = 'data-old-col';
|
35
|
-
DATA_OLD_ROW = 'data-old-row';
|
36
|
-
onConfigChanged = new EventEmitter();
|
37
|
-
onWidgetSave = new EventEmitter();
|
38
|
-
constructor(ref, zone, cdr) {
|
39
|
-
this.ref = ref;
|
40
|
-
this.zone = zone;
|
41
|
-
this.cdr = cdr;
|
42
|
-
}
|
43
|
-
ngOnInit() {
|
44
|
-
if (this.rtl == null) {
|
45
|
-
this.rtl = window.getComputedStyle(this.ref.nativeElement, null).getPropertyValue('direction') === 'rtl';
|
46
|
-
}
|
47
|
-
this.saveSubject.pipe(debounceTime(750)).subscribe((value) => {
|
48
|
-
this.emitConfigChanged(value);
|
49
|
-
});
|
50
|
-
}
|
51
|
-
ngOnDestroy() {
|
52
|
-
this.saveSubject?.unsubscribe();
|
53
|
-
}
|
54
|
-
ngAfterViewInit() {
|
55
|
-
this.zone.runOutsideAngular((c) => {
|
56
|
-
const style = document.createElement('style');
|
57
|
-
style.type = 'text/css';
|
58
|
-
this.ref.nativeElement.appendChild(style);
|
59
|
-
// add css data classes
|
60
|
-
for (let i = 1; i <= 50; i++) {
|
61
|
-
style.innerHTML += `[${this.DATA_COL}="${i}"] { ${this.rtl ? 'right' : 'left'}: ${(i - 1) * (this.tileSize + this.gapSize)}px; }`;
|
62
|
-
style.innerHTML += `[${this.DATA_ROW}="${i}"] { top: ${(i - 1) * (this.tileSize + this.gapSize)}px; }`;
|
63
|
-
style.innerHTML += `[${this.DATA_SIZE_X}="${i}"] { width: ${(i * this.tileSize) + ((i - 1) * this.gapSize)}px; }`;
|
64
|
-
style.innerHTML += `[${this.DATA_SIZE_Y}="${i}"] { height: ${(i * this.tileSize) + ((i - 1) * this.gapSize)}px; }`;
|
65
|
-
}
|
66
|
-
});
|
67
|
-
}
|
68
|
-
calcGridSize() {
|
69
|
-
this.zone.runOutsideAngular(() => {
|
70
|
-
const width = (Math.max(...this.widgets.map((c) => c.col + c.sizeX - 1))) * (this.tileSize + this.gapSize);
|
71
|
-
const height = (Math.max(...this.widgets.map((c) => c.row + c.sizeY - 1))) * (this.tileSize + this.gapSize);
|
72
|
-
this.container.nativeElement.style.width = width + 'px';
|
73
|
-
this.container.nativeElement.style.height = height + 'px';
|
74
|
-
});
|
75
|
-
}
|
76
|
-
toggleEdit() {
|
77
|
-
this._isInEditing ? this.finishEdit() : this.startEdit();
|
78
|
-
}
|
79
|
-
dragStart(e) {
|
80
|
-
e.preventDefault();
|
81
|
-
e.stopPropagation();
|
82
|
-
this.zone.runOutsideAngular(() => {
|
83
|
-
if (this._isInEditing && e.which === 1) {
|
84
|
-
this.dragItem = e.currentTarget;
|
85
|
-
this.dragItem.setAttribute('data-x-offset', (this.dragItem.offsetLeft - e.clientX).toString());
|
86
|
-
//
|
87
|
-
this.dragItem.setAttribute('data-y-offset', (this.dragItem.offsetTop - e.clientY).toString());
|
88
|
-
this.dragItem.classList.add('widget-dragging');
|
89
|
-
this.dragItem.classList.remove('animate__animated', 'animate__pulse');
|
90
|
-
}
|
91
|
-
});
|
92
|
-
return false;
|
93
|
-
}
|
94
|
-
removePositionData() {
|
95
|
-
this.zone.runOutsideAngular(() => {
|
96
|
-
if (this.dragItem && this._isInEditing && this.dragItem.getAttribute(this.DATA_OLD_COL) == null) {
|
97
|
-
this.dragItem.setAttribute(this.DATA_OLD_COL, this.dragItem.getAttribute(this.DATA_COL));
|
98
|
-
this.dragItem.setAttribute(this.DATA_OLD_ROW, this.dragItem.getAttribute(this.DATA_ROW));
|
99
|
-
this.dragItem.removeAttribute(this.DATA_COL);
|
100
|
-
this.dragItem.removeAttribute(this.DATA_ROW);
|
101
|
-
}
|
102
|
-
});
|
103
|
-
}
|
104
|
-
resetPositionData() {
|
105
|
-
this.zone.runOutsideAngular(() => {
|
106
|
-
if (this.dragItem && this._isInEditing) {
|
107
|
-
this.setPosition(this.dragItem, this.dragItem.getAttribute(this.DATA_OLD_COL), this.dragItem.getAttribute(this.DATA_OLD_ROW));
|
108
|
-
}
|
109
|
-
});
|
110
|
-
}
|
111
|
-
setPosition(element, col, row) {
|
112
|
-
this.zone.runOutsideAngular(() => {
|
113
|
-
element.setAttribute(this.DATA_COL, col);
|
114
|
-
element.setAttribute(this.DATA_ROW, row);
|
115
|
-
element.removeAttribute(this.DATA_OLD_COL);
|
116
|
-
element.removeAttribute(this.DATA_OLD_ROW);
|
117
|
-
element.style.removeProperty('top');
|
118
|
-
element.style.removeProperty('left');
|
119
|
-
const widget = this.widgets.find(c => c['__meta__'].instance.element === element);
|
120
|
-
widget.col = Number(col);
|
121
|
-
widget.row = Number(row);
|
122
|
-
});
|
123
|
-
}
|
124
|
-
drag(e) {
|
125
|
-
e.preventDefault();
|
126
|
-
e.stopPropagation();
|
127
|
-
this.zone.runOutsideAngular(() => {
|
128
|
-
if (this.dragItem && this._isInEditing) {
|
129
|
-
this.isDragging = true;
|
130
|
-
this.addPlaceholder();
|
131
|
-
const xOffset = Number(this.dragItem.getAttribute('data-x-offset'));
|
132
|
-
const yOffset = Number(this.dragItem.getAttribute('data-y-offset'));
|
133
|
-
this.dragItem.style.left = e.clientX + xOffset + 'px';
|
134
|
-
this.dragItem.style.top = e.clientY + yOffset + 'px';
|
135
|
-
//
|
136
|
-
this.detectBestPlacement();
|
137
|
-
this.removePositionData();
|
138
|
-
}
|
139
|
-
});
|
140
|
-
return false;
|
141
|
-
}
|
142
|
-
dragEnd(e) {
|
143
|
-
this.zone.runOutsideAngular(() => {
|
144
|
-
if (this.dragItem && this._isInEditing && this.isDragging) {
|
145
|
-
this.dragItem.classList.remove('widget-dragging');
|
146
|
-
this.dragItem.classList.add('animate__animated', 'animate__pulse');
|
147
|
-
//
|
148
|
-
const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
|
149
|
-
if (this.newWidget) {
|
150
|
-
const w = {
|
151
|
-
uniqueName: this.newWidget.uniqueName,
|
152
|
-
component: this.newWidget.component,
|
153
|
-
title: this.newWidget.title,
|
154
|
-
options: this.newWidget.options,
|
155
|
-
sizeX: this.newWidget.sizeX,
|
156
|
-
sizeY: this.newWidget.sizeY,
|
157
|
-
col: Number(p.getAttribute(this.DATA_COL)),
|
158
|
-
row: Number(p.getAttribute(this.DATA_ROW))
|
159
|
-
};
|
160
|
-
this.widgets.push(w);
|
161
|
-
this.newWidget = null;
|
162
|
-
this.container.nativeElement.removeChild(this.dragItem);
|
163
|
-
this.zone.run(() => {
|
164
|
-
this.cdr.detectChanges();
|
165
|
-
this.calcGridSize();
|
166
|
-
setTimeout(() => {
|
167
|
-
w['__meta__'].instance.element.addEventListener('mousedown', this.dragStart.bind(this), false);
|
168
|
-
}, 1000);
|
169
|
-
});
|
170
|
-
}
|
171
|
-
else {
|
172
|
-
if (p) {
|
173
|
-
this.setPosition(this.dragItem, p.getAttribute(this.DATA_COL), p.getAttribute(this.DATA_ROW));
|
174
|
-
}
|
175
|
-
else {
|
176
|
-
this.setPosition(this.dragItem, this.dragItem.getAttribute(this.DATA_OLD_COL), this.dragItem.getAttribute(this.DATA_OLD_ROW));
|
177
|
-
}
|
178
|
-
}
|
179
|
-
//
|
180
|
-
this.removePlaceholder();
|
181
|
-
this.dragItem = null;
|
182
|
-
this.calcGridSize();
|
183
|
-
this.saveSubject.next('config');
|
184
|
-
}
|
185
|
-
this.isDragging = false;
|
186
|
-
});
|
187
|
-
}
|
188
|
-
detectFirstEmptySlot(w) {
|
189
|
-
const xTile = Math.floor(this.ref.nativeElement.parentElement.offsetWidth / this.tileSize);
|
190
|
-
for (let j = 1; j <= 100; j++) {
|
191
|
-
for (let i = 1; i <= xTile - w.sizeX; i++) {
|
192
|
-
const rec = new AXClientRec({
|
193
|
-
left: i,
|
194
|
-
top: j,
|
195
|
-
width: w.sizeX,
|
196
|
-
height: w.sizeY
|
197
|
-
});
|
198
|
-
const el = this.widgets.filter(c => c !== w).find((c) => rec.intersect({
|
199
|
-
left: c.col,
|
200
|
-
top: c.row,
|
201
|
-
width: c.sizeX,
|
202
|
-
height: c.sizeY
|
203
|
-
}));
|
204
|
-
if (el == null) {
|
205
|
-
w.col = i;
|
206
|
-
w.row = j;
|
207
|
-
return;
|
208
|
-
}
|
209
|
-
}
|
210
|
-
}
|
211
|
-
}
|
212
|
-
detectBestPlacement() {
|
213
|
-
this.zone.runOutsideAngular(() => {
|
214
|
-
const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
|
215
|
-
let col = Math.ceil(this.dragItem.offsetLeft / this.tileSize);
|
216
|
-
if (this.rtl) {
|
217
|
-
col = Math.ceil((this.container.nativeElement.clientWidth - (this.dragItem.offsetLeft + this.dragItem.clientWidth)) / this.tileSize);
|
218
|
-
}
|
219
|
-
let row = Math.ceil(this.dragItem.offsetTop / this.tileSize);
|
220
|
-
if (col < 1) {
|
221
|
-
col = 1;
|
222
|
-
}
|
223
|
-
if (row < 1) {
|
224
|
-
row = 1;
|
225
|
-
}
|
226
|
-
const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host')).map((c) => c);
|
227
|
-
p.setAttribute(this.DATA_COL, col.toString());
|
228
|
-
p.setAttribute(this.DATA_ROW, row.toString());
|
229
|
-
const collision = widgets.filter(c => c !== this.dragItem).some(c => AXHtmlUtil.collision(c, this.dragItem));
|
230
|
-
if (collision) {
|
231
|
-
this.removePlaceholder();
|
232
|
-
}
|
233
|
-
});
|
234
|
-
}
|
235
|
-
addPlaceholder() {
|
236
|
-
this.zone.runOutsideAngular(() => {
|
237
|
-
this.removePlaceholder();
|
238
|
-
if (this.dragItem) {
|
239
|
-
const p = document.createElement('div');
|
240
|
-
p.classList.add('widget-blank-placeholder');
|
241
|
-
p.setAttribute(this.DATA_COL, this.dragItem.getAttribute(this.DATA_COL));
|
242
|
-
p.setAttribute(this.DATA_ROW, this.dragItem.getAttribute(this.DATA_ROW));
|
243
|
-
p.setAttribute(this.DATA_SIZE_X, this.dragItem.getAttribute(this.DATA_SIZE_X));
|
244
|
-
p.setAttribute(this.DATA_SIZE_Y, this.dragItem.getAttribute(this.DATA_SIZE_Y));
|
245
|
-
this.container.nativeElement.appendChild(p);
|
246
|
-
}
|
247
|
-
});
|
248
|
-
}
|
249
|
-
removePlaceholder() {
|
250
|
-
const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
|
251
|
-
p?.remove();
|
252
|
-
}
|
253
|
-
startEdit() {
|
254
|
-
this._isInEditing = true;
|
255
|
-
this.calcGridSize();
|
256
|
-
this.ref.nativeElement.classList.add('grid-background');
|
257
|
-
const bg = this.ref.nativeElement;
|
258
|
-
bg.style.setProperty('background-position', `${this.rtl ? 'right' : 'left'} top`);
|
259
|
-
// tslint:disable-next-line: max-line-length
|
260
|
-
const pattern = `url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="${this.tileSize + this.gapSize}" height="${this.tileSize + this.gapSize}"> <rect style="fill: %23dadada" x="${this.rtl ? this.gapSize : 0}" width="${this.tileSize}" height="${this.tileSize}" y="0"></rect></svg>')`;
|
261
|
-
bg.style.setProperty('background-image', pattern);
|
262
|
-
//
|
263
|
-
const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host'));
|
264
|
-
widgets.forEach((w) => {
|
265
|
-
w.addEventListener('mousedown', this.dragStart.bind(this), false);
|
266
|
-
});
|
267
|
-
this.ref.nativeElement.addEventListener('mousemove', this.drag.bind(this), false);
|
268
|
-
this.ref.nativeElement.addEventListener('mouseup', this.dragEnd.bind(this), false);
|
269
|
-
}
|
270
|
-
finishEdit() {
|
271
|
-
this.ref.nativeElement.classList.remove('grid-background');
|
272
|
-
const bg = this.ref.nativeElement;
|
273
|
-
bg.style.removeProperty('background-image');
|
274
|
-
//
|
275
|
-
this._isInEditing = false;
|
276
|
-
const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host'));
|
277
|
-
widgets.forEach((w) => {
|
278
|
-
w.removeEventListener('mousedown', this.dragStart.bind(this), false);
|
279
|
-
});
|
280
|
-
this.ref.nativeElement.removeEventListener('mousemove', this.drag.bind(this), false);
|
281
|
-
this.ref.nativeElement.removeEventListener('mouseup', this.dragEnd.bind(this), false);
|
282
|
-
this.saveSubject.next('config');
|
283
|
-
}
|
284
|
-
addWidget(widget) {
|
285
|
-
this.zone.runOutsideAngular(() => {
|
286
|
-
this.newWidget = {
|
287
|
-
uniqueName: widget.uniqueName,
|
288
|
-
component: widget.component,
|
289
|
-
title: widget.title,
|
290
|
-
col: 1,
|
291
|
-
row: 1,
|
292
|
-
sizeX: widget.sizeX,
|
293
|
-
sizeY: widget.sizeY,
|
294
|
-
options: widget.options,
|
295
|
-
props: widget.props
|
296
|
-
};
|
297
|
-
this.detectFirstEmptySlot(this.newWidget);
|
298
|
-
const w = {
|
299
|
-
uniqueName: this.newWidget.uniqueName,
|
300
|
-
component: this.newWidget.component,
|
301
|
-
title: this.newWidget.title,
|
302
|
-
options: this.newWidget.options,
|
303
|
-
props: this.newWidget.props,
|
304
|
-
sizeX: this.newWidget.sizeX,
|
305
|
-
sizeY: this.newWidget.sizeY,
|
306
|
-
col: this.newWidget.col,
|
307
|
-
row: this.newWidget.row
|
308
|
-
};
|
309
|
-
this.widgets.push(w);
|
310
|
-
this.newWidget = null;
|
311
|
-
this.zone.run(() => {
|
312
|
-
this.cdr.detectChanges();
|
313
|
-
this.calcGridSize();
|
314
|
-
this.emitConfigChanged('add');
|
315
|
-
setTimeout(() => {
|
316
|
-
w['__meta__'].instance.element.addEventListener('mousedown', this.dragStart.bind(this), false);
|
317
|
-
}, 1000);
|
318
|
-
});
|
319
|
-
});
|
320
|
-
}
|
321
|
-
handleOnRemove(w) {
|
322
|
-
w.element.classList.add('animate__animated', 'animate__zoomOut');
|
323
|
-
w.element.addEventListener('animationend', () => {
|
324
|
-
this.widgets = this.widgets.filter((c) => c.__meta__.id !== w.config.__meta__.id);
|
325
|
-
this.cdr.detectChanges();
|
326
|
-
this.calcGridSize();
|
327
|
-
this.emitConfigChanged('remove');
|
328
|
-
});
|
329
|
-
}
|
330
|
-
handleOnSave(e) {
|
331
|
-
this.onWidgetSave.emit(e);
|
332
|
-
}
|
333
|
-
trackByFn(index, item) {
|
334
|
-
if (!item['__meta__']?.id) {
|
335
|
-
item['__meta__'] = {};
|
336
|
-
item['__meta__'].id = AXHtmlUtil.getUID();
|
337
|
-
}
|
338
|
-
return item['__meta__']?.id;
|
339
|
-
}
|
340
|
-
load(widgets) {
|
341
|
-
this.clear();
|
342
|
-
return new Promise((resolve, reject) => {
|
343
|
-
if (widgets) {
|
344
|
-
const loadedWidgets = [];
|
345
|
-
if (typeof widgets === 'string') {
|
346
|
-
try {
|
347
|
-
loadedWidgets.push(...JSON.parse(widgets));
|
348
|
-
this.emitConfigChanged('load');
|
349
|
-
}
|
350
|
-
catch (error) {
|
351
|
-
reject('Invalid widget json data!');
|
352
|
-
}
|
353
|
-
}
|
354
|
-
else {
|
355
|
-
loadedWidgets.push(...widgets);
|
356
|
-
this.emitConfigChanged('load');
|
357
|
-
}
|
358
|
-
let intervalId = -1;
|
359
|
-
const loadFunc = () => {
|
360
|
-
if (this.galleryItems && this.galleryItems.length > 0) {
|
361
|
-
loadedWidgets.forEach(w => {
|
362
|
-
const gitem = this.galleryItems.find(c => c.uniqueName === w.uniqueName);
|
363
|
-
if (gitem) {
|
364
|
-
w.component = gitem.component;
|
365
|
-
if (gitem.props) {
|
366
|
-
w.props = JSON.parse(JSON.stringify(gitem.props));
|
367
|
-
}
|
368
|
-
}
|
369
|
-
});
|
370
|
-
this.widgets.push(...loadedWidgets);
|
371
|
-
this.emitConfigChanged('load');
|
372
|
-
window.clearInterval(intervalId);
|
373
|
-
this.cdr.detectChanges();
|
374
|
-
resolve();
|
375
|
-
}
|
376
|
-
};
|
377
|
-
intervalId = window.setInterval(loadFunc, 200);
|
378
|
-
}
|
379
|
-
else {
|
380
|
-
resolve();
|
381
|
-
}
|
382
|
-
});
|
383
|
-
}
|
384
|
-
clear() {
|
385
|
-
if (this.widgets.length) {
|
386
|
-
this.widgets = [];
|
387
|
-
this.cdr.detectChanges();
|
388
|
-
this.saveSubject.next('clear');
|
389
|
-
}
|
390
|
-
}
|
391
|
-
save() {
|
392
|
-
const obj = this.widgets.map(c => ({
|
393
|
-
uniqueName: c.uniqueName,
|
394
|
-
component: c.component,
|
395
|
-
title: c.title,
|
396
|
-
sizeX: c.sizeX,
|
397
|
-
sizeY: c.sizeY,
|
398
|
-
col: c.col,
|
399
|
-
row: c.row,
|
400
|
-
options: c.options,
|
401
|
-
props: c.props
|
402
|
-
}));
|
403
|
-
return Promise.resolve(JSON.stringify(obj));
|
404
|
-
}
|
405
|
-
refresh() {
|
406
|
-
this.widgetHosts.forEach(host => {
|
407
|
-
host.widget.refresh();
|
408
|
-
});
|
409
|
-
}
|
410
|
-
handleOnConfigChanged(e) {
|
411
|
-
this.cdr.detectChanges();
|
412
|
-
this.saveSubject.next('config');
|
413
|
-
}
|
414
|
-
handleOnResizedChanged(e) {
|
415
|
-
this.detectFirstEmptySlot(e.config);
|
416
|
-
this.cdr.detectChanges();
|
417
|
-
this.saveSubject.next('config');
|
418
|
-
}
|
419
|
-
emitConfigChanged(mode) {
|
420
|
-
this.onConfigChanged.emit({
|
421
|
-
component: this,
|
422
|
-
mode: mode
|
423
|
-
});
|
424
|
-
}
|
425
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.7", ngImport: i0, type: AXWidgetBoardComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
426
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.7", type: AXWidgetBoardComponent, selector: "ax-widget-board", inputs: { galleryItems: "galleryItems", tileSize: "tileSize", gapSize: "gapSize", readonly: "readonly", provideValue: "provideValue" }, outputs: { onConfigChanged: "onConfigChanged", onWidgetSave: "onWidgetSave" }, host: { classAttribute: "ax widget-board" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "widgetHosts", predicate: AXWidgetHostComponent, descendants: true }], ngImport: i0, template: "<div class=\"widgets-container\" [class.rtl]=\"rtl\" #container>\n <ax-widget-host *ngFor=\"let w of widgets;trackBy: trackByFn\" [config]='w' [sizeX]=\"w.sizeX\" [readonly]=\"readonly || w.readonly\"\n [sizeY]=\"w.sizeY\" [col]=\"w.col\" [row]=\"w.row\" (onRemove)=\"handleOnRemove($event)\" (onSave)=\"handleOnSave($event)\"\n (onConfigChanged)=\"handleOnConfigChanged($event)\" (onResized)=\"handleOnResizedChanged($event)\"\n [provideValue]=\"provideValue\">\n </ax-widget-host>\n</div>\n", styles: [".widget-board{overflow:scroll;scrollbar-width:thin;display:inline-block;margin:15px 20px;min-width:calc(100% - 18px);min-height:calc(100% - 18px);--animate-duration: .5s;background-repeat:no-repeat}.widget-board.grid-background{background-repeat:repeat!important}.widget-board.grid-background .widgets-container .widget-host{touch-action:none;-webkit-user-select:none;user-select:none}.widget-board.grid-background .widgets-container .widget-host .widget-edit-overlay{display:block;cursor:move}.widget-board.grid-background .widgets-container .widget-host.widget-dragging{z-index:1000}.widget-board.grid-background .widgets-container .widget-host:focus{outline-width:1px;outline-style:solid;outline-color:var(--ax-primary-color)}.widget-board.grid-background .widget-blank-placeholder{background:var(--ax-primary-trans-light-color);position:absolute}.widget-board .widgets-container{position:relative;touch-action:none}.widget-board .widgets-container.rtl .widget-host .widget-options-menu{right:unset!important;left:0!important}.widget-board .widgets-container .widget-host{position:absolute;background:#fff;box-shadow:2px 2px 3px #dadada}.widget-board .widgets-container .widget-host .widget-content{width:100%;height:100%;display:flex;flex-direction:column}.widget-board .widgets-container .widget-host .widget-content .widget-title{padding:var(--ax-size-md);text-align:start;font-size:1.5em;position:absolute}.widget-board .widgets-container .widget-host .widget-edit-loading{display:none;background:#ffffffd9;position:absolute;width:100%;height:100%;top:0;left:0;z-index:2;display:flex}.widget-board .widgets-container .widget-host .widget-config-overlay{position:absolute;background:#fff;width:100%;height:100%;top:0;left:0;z-index:1;padding:var(--ax-size-md);cursor:pointer}.widget-board .widgets-container .widget-host .widget-config-overlay:hover .widget-title{text-decoration:underline}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-title{text-align:start;font-size:1.5em}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-config-box{align-self:center;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--ax-gray-dark-color)}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-config-box .config-title{font-size:1.2em;margin-bottom:var(--ax-size-md)}.widget-board .widgets-container .widget-host .widget-edit-overlay{display:none;background:#ffffff80;position:absolute;width:100%;height:100%;top:0;left:0;z-index:10}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu{margin:6px;text-align:end;float:inline-end;opacity:1;transition:opacity 1s ease}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu .widget-edit-menu-button{display:inline-block;background-color:#f0f0f0;border-radius:1px;border:2px solid #fff;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;padding:0;height:32px;width:32px;cursor:pointer;color:#666}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu .widget-edit-menu-button:hover{border-color:#a6a6a6;background-color:#c8c8c8}.widget-board .widgets-container .widget-host .widget-options-menu{display:none;position:absolute;top:0;right:0;z-index:2;cursor:pointer;padding:2px 5px}.widget-board .widgets-container .widget-host .widget-options-menu:hover{background-color:#f0f0f0}.widget-board .widgets-container .widget-host .widget-container{padding:1px;height:100%}.widget-board .widgets-container .widget-host .widget-container:hover .widget-options-menu{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2.AXWidgetHostComponent, selector: "ax-widget-host", inputs: ["provideValue", "config", "readonly", "sizeX", "sizeY", "col", "row"], outputs: ["onRemove", "onConfigChanged", "onResized", "onSave"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
427
|
-
}
|
428
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.7", ngImport: i0, type: AXWidgetBoardComponent, decorators: [{
|
429
|
-
type: Component,
|
430
|
-
args: [{ selector: 'ax-widget-board', host: { class: 'ax widget-board' }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"widgets-container\" [class.rtl]=\"rtl\" #container>\n <ax-widget-host *ngFor=\"let w of widgets;trackBy: trackByFn\" [config]='w' [sizeX]=\"w.sizeX\" [readonly]=\"readonly || w.readonly\"\n [sizeY]=\"w.sizeY\" [col]=\"w.col\" [row]=\"w.row\" (onRemove)=\"handleOnRemove($event)\" (onSave)=\"handleOnSave($event)\"\n (onConfigChanged)=\"handleOnConfigChanged($event)\" (onResized)=\"handleOnResizedChanged($event)\"\n [provideValue]=\"provideValue\">\n </ax-widget-host>\n</div>\n", styles: [".widget-board{overflow:scroll;scrollbar-width:thin;display:inline-block;margin:15px 20px;min-width:calc(100% - 18px);min-height:calc(100% - 18px);--animate-duration: .5s;background-repeat:no-repeat}.widget-board.grid-background{background-repeat:repeat!important}.widget-board.grid-background .widgets-container .widget-host{touch-action:none;-webkit-user-select:none;user-select:none}.widget-board.grid-background .widgets-container .widget-host .widget-edit-overlay{display:block;cursor:move}.widget-board.grid-background .widgets-container .widget-host.widget-dragging{z-index:1000}.widget-board.grid-background .widgets-container .widget-host:focus{outline-width:1px;outline-style:solid;outline-color:var(--ax-primary-color)}.widget-board.grid-background .widget-blank-placeholder{background:var(--ax-primary-trans-light-color);position:absolute}.widget-board .widgets-container{position:relative;touch-action:none}.widget-board .widgets-container.rtl .widget-host .widget-options-menu{right:unset!important;left:0!important}.widget-board .widgets-container .widget-host{position:absolute;background:#fff;box-shadow:2px 2px 3px #dadada}.widget-board .widgets-container .widget-host .widget-content{width:100%;height:100%;display:flex;flex-direction:column}.widget-board .widgets-container .widget-host .widget-content .widget-title{padding:var(--ax-size-md);text-align:start;font-size:1.5em;position:absolute}.widget-board .widgets-container .widget-host .widget-edit-loading{display:none;background:#ffffffd9;position:absolute;width:100%;height:100%;top:0;left:0;z-index:2;display:flex}.widget-board .widgets-container .widget-host .widget-config-overlay{position:absolute;background:#fff;width:100%;height:100%;top:0;left:0;z-index:1;padding:var(--ax-size-md);cursor:pointer}.widget-board .widgets-container .widget-host .widget-config-overlay:hover .widget-title{text-decoration:underline}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-title{text-align:start;font-size:1.5em}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-config-box{align-self:center;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--ax-gray-dark-color)}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-config-box .config-title{font-size:1.2em;margin-bottom:var(--ax-size-md)}.widget-board .widgets-container .widget-host .widget-edit-overlay{display:none;background:#ffffff80;position:absolute;width:100%;height:100%;top:0;left:0;z-index:10}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu{margin:6px;text-align:end;float:inline-end;opacity:1;transition:opacity 1s ease}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu .widget-edit-menu-button{display:inline-block;background-color:#f0f0f0;border-radius:1px;border:2px solid #fff;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;padding:0;height:32px;width:32px;cursor:pointer;color:#666}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu .widget-edit-menu-button:hover{border-color:#a6a6a6;background-color:#c8c8c8}.widget-board .widgets-container .widget-host .widget-options-menu{display:none;position:absolute;top:0;right:0;z-index:2;cursor:pointer;padding:2px 5px}.widget-board .widgets-container .widget-host .widget-options-menu:hover{background-color:#f0f0f0}.widget-board .widgets-container .widget-host .widget-container{padding:1px;height:100%}.widget-board .widgets-container .widget-host .widget-container:hover .widget-options-menu{display:block}\n"] }]
|
431
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }], propDecorators: { container: [{
|
432
|
-
type: ViewChild,
|
433
|
-
args: ['container']
|
434
|
-
}], widgetHosts: [{
|
435
|
-
type: ViewChildren,
|
436
|
-
args: [AXWidgetHostComponent]
|
437
|
-
}], galleryItems: [{
|
438
|
-
type: Input
|
439
|
-
}], tileSize: [{
|
440
|
-
type: Input
|
441
|
-
}], gapSize: [{
|
442
|
-
type: Input
|
443
|
-
}], readonly: [{
|
444
|
-
type: Input
|
445
|
-
}], provideValue: [{
|
446
|
-
type: Input
|
447
|
-
}], onConfigChanged: [{
|
448
|
-
type: Output
|
449
|
-
}], onWidgetSave: [{
|
450
|
-
type: Output
|
451
|
-
}] } });
|
452
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbGF5b3V0L3NyYy9saWIvd2lkZ2V0LWJvYXJkL3dpZGdldC1ib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2xheW91dC9zcmMvbGliL3dpZGdldC1ib2FyZC93aWRnZXQtYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUN0QyxNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTs7OztBQVc3QyxNQUFNLE9BQU8sc0JBQXNCO0lBc0R2QjtJQUNBO0lBQ0E7SUFyREYsU0FBUyxDQUE2QjtJQUd0QyxXQUFXLENBQW1DO0lBRXRELE9BQU8sR0FBcUIsRUFBRSxDQUFDO0lBRy9CLFlBQVksR0FBcUIsRUFBRSxDQUFDO0lBR3BDLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFHdEIsT0FBTyxHQUFXLENBQUMsQ0FBQztJQUlwQixRQUFRLEdBQVksS0FBSyxDQUFDO0lBRWxCLFNBQVMsR0FBbUIsSUFBSSxDQUFDO0lBRWxDLEdBQUcsQ0FBVTtJQUVaLFlBQVksR0FBWSxLQUFLLENBQUM7SUFDL0IsV0FBVztRQUNoQixPQUFPLElB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WU4sZUFBZTtzQkFEZCxNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgTmdab25lLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFYV2lkZ2V0Q29uZmlnLFxuICBBWFdpZGdldENvbmZpZ0NoYW5nZWQsXG4gIEFYV2lkZ2V0Qm9hcmRDb25maWdDaGFuZ2VkLFxuICBBWFdpZGdldENvbmZpZ1NhdmVkRXZlbnRcbn0gZnJvbSAnLi93aWRnZXQuY2xhc3MnO1xuaW1wb3J0IHsgQVhXaWRnZXRIb3N0Q29tcG9uZW50IH0gZnJvbSAnLi93aWRnZXQtaG9zdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQVhIdG1sVXRpbCwgQVhDbGllbnRSZWMgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtd2lkZ2V0LWJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1ib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dpZGdldC1ib2FyZC5jb21wb25lbnQuc2NzcyddLFxuICBob3N0OiB7IGNsYXNzOiAnYXggd2lkZ2V0LWJvYXJkJyB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBWFdpZGdldEJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBAVmlld0NoaWxkKCdjb250YWluZXInKVxuICBwcml2YXRlIGNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZHJlbihBWFdpZGdldEhvc3RDb21wb25lbnQpXG4gIHByaXZhdGUgd2lkZ2V0SG9zdHM6IFF1ZXJ5TGlzdDxBWFdpZGdldEhvc3RDb21wb25lbnQ+O1xuXG4gIHdpZGdldHM6IEFYV2lkZ2V0Q29uZmlnW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBnYWxsZXJ5SXRlbXM6IEFYV2lkZ2V0Q29uZmlnW10gPSBbXTtcblxuICBASW5wdXQoKVxuICB0aWxlU2l6ZTogbnVtYmVyID0gODA7XG5cbiAgQElucHV0KClcbiAgZ2FwU2l6ZTogbnVtYmVyID0gNTtcblxuXG4gIEBJbnB1dCgpXG4gIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBuZXdXaWRnZXQ6IEFYV2lkZ2V0Q29uZmlnID0gbnVsbDtcblxuICBwdWJsaWMgcnRsOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2lzSW5FZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBpc0luRWRpdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbkVkaXRpbmc7XG4gIH1cbiAgcHJpdmF0ZSBpc0RyYWdnaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZHJhZ0l0ZW06IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgc2F2ZVN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgQElucHV0KClcbiAgcHJvdmlkZVZhbHVlOiAoZTogYW55KSA9PiBhbnk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX0NPTCA9ICdkYXRhLWNvbCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFUQV9ST1cgPSAnZGF0YS1yb3cnO1xuICBwcml2YXRlIHJlYWRvbmx5IERBVEFfU0laRV9YID0gJ2RhdGEtc2l6ZS14JztcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX1NJWkVfWSA9ICdkYXRhLXNpemUteSc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFUQV9PTERfQ09MID0gJ2RhdGEtb2xkLWNvbCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFUQV9PTERfUk9XID0gJ2RhdGEtb2xkLXJvdyc7XG5cblxuICBAT3V0cHV0KClcbiAgb25Db25maWdDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QVhXaWRnZXRCb2FyZENvbmZpZ0NoYW5nZWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWFdpZGdldEJvYXJkQ29uZmlnQ2hhbmdlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgb25XaWRnZXRTYXZlOiBFdmVudEVtaXR0ZXI8QVhXaWRnZXRDb25maWdTYXZlZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhXaWRnZXRDb25maWdTYXZlZEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PixcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7IH1cblxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnJ0bCA9PSBudWxsKSB7XG4gICAgICB0aGlzLnJ0bCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ2RpcmVjdGlvbicpID09PSAncnRsJztcbiAgICB9XG4gICAgdGhpcy5zYXZlU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSg3NTApKS5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKVxuICB7XG4gICAgdGhpcy5zYXZlU3ViamVjdD8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKGMpID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAvLyBhZGQgY3NzIGRhdGEgY2xhc3Nlc1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNTA7IGkrKykge1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgKz0gYFske3RoaXMuREFUQV9DT0x9PVwiJHtpfVwiXSB7ICAke3RoaXMucnRsID8gJ3JpZ2h0JyA6ICdsZWZ0J306ICR7KGkgLSAxKSAqICh0aGlzLnRpbGVTaXplICsgdGhpcy5nYXBTaXplKX1weDsgfWA7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCArPSBgWyR7dGhpcy5EQVRBX1JPV309XCIke2l9XCJdIHsgIHRvcDogJHsoaSAtIDEpICogKHRoaXMudGlsZVNpemUgKyB0aGlzLmdhcFNpemUpfXB4OyB9YDtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MICs9IGBbJHt0aGlzLkRBVEFfU0laRV9YfT1cIiR7aX1cIl0geyAgd2lkdGg6ICAkeyhpICogdGhpcy50aWxlU2l6ZSkgKyAoKGkgLSAxKSAqIHRoaXMuZ2FwU2l6ZSl9cHg7IH1gO1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgKz0gYFske3RoaXMuREFUQV9TSVpFX1l9PVwiJHtpfVwiXSB7ICBoZWlnaHQ6ICR7KGkgKiB0aGlzLnRpbGVTaXplKSArICgoaSAtIDEpICogdGhpcy5nYXBTaXplKX1weDsgfWA7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGNHcmlkU2l6ZSgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3Qgd2lkdGggPVxuICAgICAgICAoTWF0aC5tYXgoLi4udGhpcy53aWRnZXRzLm1hcCgoYykgPT4gYy5jb2wgKyBjLnNpemVYIC0gMSkpKSAqICh0aGlzLnRpbGVTaXplICsgdGhpcy5nYXBTaXplKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9XG4gICAgICAgIChNYXRoLm1heCguLi50aGlzLndpZGdldHMubWFwKChjKSA9PiBjLnJvdyArIGMuc2l6ZVkgLSAxKSkpICogKHRoaXMudGlsZVNpemUgKyB0aGlzLmdhcFNpemUpO1xuICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZUVkaXQoKSB7XG4gICAgdGhpcy5faXNJbkVkaXRpbmcgPyB0aGlzLmZpbmlzaEVkaXQoKSA6IHRoaXMuc3RhcnRFZGl0KCk7XG4gIH1cblxuXG5cbiAgcHJpdmF0ZSBkcmFnU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNJbkVkaXRpbmcgJiYgZS53aGljaCA9PT0gMSkge1xuICAgICAgICB0aGlzLmRyYWdJdGVtID0gZS5jdXJyZW50VGFyZ2V0IGFzIGFueTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5zZXRBdHRyaWJ1dGUoJ2RhdGEteC1vZmZzZXQnLCAodGhpcy5kcmFnSXRlbS5vZmZzZXRMZWZ0IC0gZS5jbGllbnRYKS50b1N0cmluZygpKTtcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5kcmFnSXRlbS5zZXRBdHRyaWJ1dGUoJ2RhdGEteS1vZmZzZXQnLCAodGhpcy5kcmFnSXRlbS5vZmZzZXRUb3AgLSBlLmNsaWVudFkpLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmRyYWdJdGVtLmNsYXNzTGlzdC5hZGQoJ3dpZGdldC1kcmFnZ2luZycpO1xuICAgICAgICB0aGlzLmRyYWdJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2FuaW1hdGVfX2FuaW1hdGVkJywgJ2FuaW1hdGVfX3B1bHNlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmVtb3ZlUG9zaXRpb25EYXRhKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kcmFnSXRlbSAmJiB0aGlzLl9pc0luRWRpdGluZyAmJiB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX0NPTCkgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRyYWdJdGVtLnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX0NPTCwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCkpO1xuICAgICAgICB0aGlzLmRyYWdJdGVtLnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX1JPVywgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVykpO1xuICAgICAgICB0aGlzLmRyYWdJdGVtLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLkRBVEFfQ09MKTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXNldFBvc2l0aW9uRGF0YSgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZHJhZ0l0ZW0gJiYgdGhpcy5faXNJbkVkaXRpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLmRyYWdJdGVtLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX0NPTCksIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfUk9XKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb2w6IHN0cmluZywgcm93OiBzdHJpbmcpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCwgY29sKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1csIHJvdyk7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX0NPTCk7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX1JPVyk7XG4gICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTtcbiAgICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKGMgPT4gY1snX19tZXRhX18nXS5pbnN0YW5jZS5lbGVtZW50ID09PSBlbGVtZW50KTtcbiAgICAgIHdpZGdldC5jb2wgPSBOdW1iZXIoY29sKTtcbiAgICAgIHdpZGdldC5yb3cgPSBOdW1iZXIocm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhZyhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRyYWdJdGVtICYmIHRoaXMuX2lzSW5FZGl0aW5nKSB7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuYWRkUGxhY2Vob2xkZXIoKTtcbiAgICAgICAgY29uc3QgeE9mZnNldCA9IE51bWJlcih0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS14LW9mZnNldCcpKTtcbiAgICAgICAgY29uc3QgeU9mZnNldCA9IE51bWJlcih0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS15LW9mZnNldCcpKTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5zdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgeE9mZnNldCArICdweCc7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uc3R5bGUudG9wID0gZS5jbGllbnRZICsgeU9mZnNldCArICdweCc7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuZGV0ZWN0QmVzdFBsYWNlbWVudCgpO1xuICAgICAgICB0aGlzLnJlbW92ZVBvc2l0aW9uRGF0YSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhZ0VuZChlKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRyYWdJdGVtICYmIHRoaXMuX2lzSW5FZGl0aW5nICYmIHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICB0aGlzLmRyYWdJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3dpZGdldC1kcmFnZ2luZycpO1xuICAgICAgICB0aGlzLmRyYWdJdGVtLmNsYXNzTGlzdC5hZGQoJ2FuaW1hdGVfX2FuaW1hdGVkJywgJ2FuaW1hdGVfX3B1bHNlJyk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy53aWRnZXQtYmxhbmstcGxhY2Vob2xkZXInKTtcbiAgICAgICAgaWYgKHRoaXMubmV3V2lkZ2V0KSB7XG4gICAgICAgICAgY29uc3QgdyA9IHtcbiAgICAgICAgICAgIHVuaXF1ZU5hbWU6IHRoaXMubmV3V2lkZ2V0LnVuaXF1ZU5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMubmV3V2lkZ2V0LmNvbXBvbmVudCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLm5ld1dpZGdldC50aXRsZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMubmV3V2lkZ2V0Lm9wdGlvbnMsXG4gICAgICAgICAgICBzaXplWDogdGhpcy5uZXdXaWRnZXQuc2l6ZVgsXG4gICAgICAgICAgICBzaXplWTogdGhpcy5uZXdXaWRnZXQuc2l6ZVksXG4gICAgICAgICAgICBjb2w6IE51bWJlcihwLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfQ09MKSksXG4gICAgICAgICAgICByb3c6IE51bWJlcihwLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfUk9XKSlcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy53aWRnZXRzLnB1c2godyk7XG4gICAgICAgICAgdGhpcy5uZXdXaWRnZXQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5kcmFnSXRlbSk7XG4gICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmNhbGNHcmlkU2l6ZSgpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHdbJ19fbWV0YV9fJ10uaW5zdGFuY2UuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmRyYWdTdGFydC5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLmRyYWdJdGVtLCBwLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfQ09MKSwgcC5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5kcmFnSXRlbSwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9DT0wpLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX1JPVykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICB0aGlzLnJlbW92ZVBsYWNlaG9sZGVyKCk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLmNhbGNHcmlkU2l6ZSgpO1xuICAgICAgICB0aGlzLnNhdmVTdWJqZWN0Lm5leHQoJ2NvbmZpZycpO1xuICAgICAgfVxuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdEZpcnN0RW1wdHlTbG90KHc6IEFYV2lkZ2V0Q29uZmlnKSB7XG4gICAgY29uc3QgeFRpbGUgPSBNYXRoLmZsb29yKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCAvIHRoaXMudGlsZVNpemUpO1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IDEwMDsgaisrKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB4VGlsZSAtIHcuc2l6ZVg7IGkrKykge1xuICAgICAgICBjb25zdCByZWMgPSBuZXcgQVhDbGllbnRSZWMoe1xuICAgICAgICAgIGxlZnQ6IGksXG4gICAgICAgICAgdG9wOiBqLFxuICAgICAgICAgIHdpZHRoOiB3LnNpemVYLFxuICAgICAgICAgIGhlaWdodDogdy5zaXplWVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLndpZGdldHMuZmlsdGVyKGMgPT4gYyAhPT0gdykuZmluZCgoYykgPT5cbiAgICAgICAgICByZWMuaW50ZXJzZWN0KHtcbiAgICAgICAgICAgIGxlZnQ6IGMuY29sLFxuICAgICAgICAgICAgdG9wOiBjLnJvdyxcbiAgICAgICAgICAgIHdpZHRoOiBjLnNpemVYLFxuICAgICAgICAgICAgaGVpZ2h0OiBjLnNpemVZXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsID09IG51bGwpIHtcbiAgICAgICAgICB3LmNvbCA9IGk7XG4gICAgICAgICAgdy5yb3cgPSBqO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0QmVzdFBsYWNlbWVudCgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgcCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLndpZGdldC1ibGFuay1wbGFjZWhvbGRlcicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgbGV0IGNvbCA9IE1hdGguY2VpbCh0aGlzLmRyYWdJdGVtLm9mZnNldExlZnQgLyB0aGlzLnRpbGVTaXplKTtcbiAgICAgIGlmICh0aGlzLnJ0bCkge1xuICAgICAgICBjb2wgPSBNYXRoLmNlaWwoKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggLSAodGhpcy5kcmFnSXRlbS5vZmZzZXRMZWZ0ICsgdGhpcy5kcmFnSXRlbS5jbGllbnRXaWR0aCkpIC8gdGhpcy50aWxlU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIGxldCByb3cgPSBNYXRoLmNlaWwodGhpcy5kcmFnSXRlbS5vZmZzZXRUb3AgLyB0aGlzLnRpbGVTaXplKTtcbiAgICAgIGlmIChjb2wgPCAxKSB7XG4gICAgICAgIGNvbCA9IDE7XG4gICAgICB9XG4gICAgICBpZiAocm93IDwgMSkge1xuICAgICAgICByb3cgPSAxO1xuICAgICAgfVxuICAgICAgY29uc3Qgd2lkZ2V0cyA9IEFycmF5LmZyb20odGhpcy5yZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcud2lkZ2V0LWhvc3QnKSkubWFwKChjKSA9PiBjIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wsIGNvbC50b1N0cmluZygpKTtcbiAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1csIHJvdy50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNvbGxpc2lvbiA9IHdpZGdldHMuZmlsdGVyKGMgPT4gYyAhPT0gdGhpcy5kcmFnSXRlbSkuc29tZShjID0+IEFYSHRtbFV0aWwuY29sbGlzaW9uKGMsIHRoaXMuZHJhZ0l0ZW0pKTtcbiAgICAgIGlmIChjb2xsaXNpb24pIHtcbiAgICAgICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBwcml2YXRlIGFkZFBsYWNlaG9sZGVyKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnJlbW92ZVBsYWNlaG9sZGVyKCk7XG4gICAgICBpZiAodGhpcy5kcmFnSXRlbSkge1xuICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHAuY2xhc3NMaXN0LmFkZCgnd2lkZ2V0LWJsYW5rLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wsIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wpKTtcbiAgICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVywgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVykpO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfU0laRV9YLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfU0laRV9YKSk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9TSVpFX1ksIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9TSVpFX1kpKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGxhY2Vob2xkZXIoKSB7XG4gICAgY29uc3QgcCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLndpZGdldC1ibGFuay1wbGFjZWhvbGRlcicpO1xuICAgIHA/LnJlbW92ZSgpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0RWRpdCgpIHtcbiAgICB0aGlzLl9pc0luRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5jYWxjR3JpZFNpemUoKTtcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2dyaWQtYmFja2dyb3VuZCcpO1xuICAgIGNvbnN0IGJnID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICBiZy5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1wb3NpdGlvbicsIGAke3RoaXMucnRsID8gJ3JpZ2h0JyA6ICdsZWZ0J30gdG9wYCk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICBjb25zdCBwYXR0ZXJuID0gYHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgd2lkdGg9XCIke3RoaXMudGlsZVNpemUgKyB0aGlzLmdhcFNpemV9XCIgaGVpZ2h0PVwiJHt0aGlzLnRpbGVTaXplICsgdGhpcy5nYXBTaXplfVwiPiA8cmVjdCBzdHlsZT1cImZpbGw6ICUyM2RhZGFkYVwiIHg9XCIke3RoaXMucnRsID8gdGhpcy5nYXBTaXplIDogMH1cIiB3aWR0aD1cIiR7dGhpcy50aWxlU2l6ZX1cIiBoZWlnaHQ9XCIke3RoaXMudGlsZVNpemV9XCIgeT1cIjBcIj48L3JlY3Q+PC9zdmc+JylgO1xuICAgIGJnLnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWltYWdlJywgcGF0dGVybik7XG4gICAgLy9cbiAgICBjb25zdCB3aWRnZXRzID0gQXJyYXkuZnJvbSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aWRnZXQtaG9zdCcpKTtcbiAgICB3aWRnZXRzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kcmFnU3RhcnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdFbmQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGZpbmlzaEVkaXQoKSB7XG4gICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdncmlkLWJhY2tncm91bmQnKTtcbiAgICBjb25zdCBiZyA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgYmcuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2JhY2tncm91bmQtaW1hZ2UnKTtcbiAgICAvL1xuICAgIHRoaXMuX2lzSW5FZGl0aW5nID0gZmFsc2U7XG4gICAgY29uc3Qgd2lkZ2V0cyA9IEFycmF5LmZyb20odGhpcy5yZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcud2lkZ2V0LWhvc3QnKSk7XG4gICAgd2lkZ2V0cy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZHJhZ1N0YXJ0LmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZy5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnRW5kLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB0aGlzLnNhdmVTdWJqZWN0Lm5leHQoJ2NvbmZpZycpO1xuICB9XG5cblxuICBhZGRXaWRnZXQod2lkZ2V0OiBBWFdpZGdldENvbmZpZykge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLm5ld1dpZGdldCA9IHtcbiAgICAgICAgdW5pcXVlTmFtZTogd2lkZ2V0LnVuaXF1ZU5hbWUsXG4gICAgICAgIGNvbXBvbmVudDogd2lkZ2V0LmNvbXBvbmVudCxcbiAgICAgICAgdGl0bGU6IHdpZGdldC50aXRsZSxcbiAgICAgICAgY29sOiAxLFxuICAgICAgICByb3c6IDEsXG4gICAgICAgIHNpemVYOiB3aWRnZXQuc2l6ZVgsXG4gICAgICAgIHNpemVZOiB3aWRnZXQuc2l6ZVksXG4gICAgICAgIG9wdGlvbnM6IHdpZGdldC5vcHRpb25zLFxuICAgICAgICBwcm9wczogd2lkZ2V0LnByb3BzXG4gICAgICB9O1xuICAgICAgdGhpcy5kZXRlY3RGaXJzdEVtcHR5U2xvdCh0aGlzLm5ld1dpZGdldCk7XG4gICAgICBjb25zdCB3ID0ge1xuICAgICAgICB1bmlxdWVOYW1lOiB0aGlzLm5ld1dpZGdldC51bmlxdWVOYW1lLFxuICAgICAgICBjb21wb25lbnQ6IHRoaXMubmV3V2lkZ2V0LmNvbXBvbmVudCxcbiAgICAgICAgdGl0bGU6IHRoaXMubmV3V2lkZ2V0LnRpdGxlLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm5ld1dpZGdldC5vcHRpb25zLFxuICAgICAgICBwcm9wczogdGhpcy5uZXdXaWRnZXQucHJvcHMsXG4gICAgICAgIHNpemVYOiB0aGlzLm5ld1dpZGdldC5zaXplWCxcbiAgICAgICAgc2l6ZVk6IHRoaXMubmV3V2lkZ2V0LnNpemVZLFxuICAgICAgICBjb2w6IHRoaXMubmV3V2lkZ2V0LmNvbCxcbiAgICAgICAgcm93OiB0aGlzLm5ld1dpZGdldC5yb3dcbiAgICAgIH07XG4gICAgICB0aGlzLndpZGdldHMucHVzaCh3KTtcbiAgICAgIHRoaXMubmV3V2lkZ2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2FsY0dyaWRTaXplKCk7XG4gICAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQoJ2FkZCcpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB3WydfX21ldGFfXyddLmluc3RhbmNlLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kcmFnU3RhcnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cblxuICBoYW5kbGVPblJlbW92ZSh3OiBBWFdpZGdldEhvc3RDb21wb25lbnQpIHtcbiAgICB3LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYW5pbWF0ZV9fYW5pbWF0ZWQnLCAnYW5pbWF0ZV9fem9vbU91dCcpO1xuICAgIHcuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKChjKSA9PiAoYyBhcyBhbnkpLl9fbWV0YV9fLmlkICE9PSAody5jb25maWcgYXMgYW55KS5fX21ldGFfXy5pZCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmNhbGNHcmlkU2l6ZSgpO1xuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgncmVtb3ZlJyk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVPblNhdmUoZTogQVhXaWRnZXRDb25maWdTYXZlZEV2ZW50KSB7XG4gICAgdGhpcy5vbldpZGdldFNhdmUuZW1pdChlKTtcbiAgfVxuXG4gIHRyYWNrQnlGbihpbmRleCwgaXRlbSkge1xuICAgIGlmICghaXRlbVsnX19tZXRhX18nXT8uaWQpIHtcbiAgICAgIGl0ZW1bJ19fbWV0YV9fJ10gPSB7fTtcbiAgICAgIGl0ZW1bJ19fbWV0YV9fJ10uaWQgPSBBWEh0bWxVdGlsLmdldFVJRCgpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbVsnX19tZXRhX18nXT8uaWQ7XG4gIH1cblxuXG4gIGxvYWQod2lkZ2V0czogc3RyaW5nIHwgQVhXaWRnZXRDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHdpZGdldHMpIHtcbiAgICAgICAgY29uc3QgbG9hZGVkV2lkZ2V0czogQVhXaWRnZXRDb25maWdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIHdpZGdldHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvYWRlZFdpZGdldHMucHVzaCguLi5KU09OLnBhcnNlKHdpZGdldHMpKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQoJ2xvYWQnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KCdJbnZhbGlkIHdpZGdldCBqc29uIGRhdGEhJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGxvYWRlZFdpZGdldHMucHVzaCguLi53aWRnZXRzKTtcbiAgICAgICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdsb2FkJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGludGVydmFsSWQ6IG51bWJlciA9IC0xO1xuICAgICAgICBjb25zdCBsb2FkRnVuYyA9ICgpID0+IHtcblxuICAgICAgICAgIGlmICh0aGlzLmdhbGxlcnlJdGVtcyAmJiB0aGlzLmdhbGxlcnlJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2FkZWRXaWRnZXRzLmZvckVhY2godyA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGdpdGVtID0gdGhpcy5nYWxsZXJ5SXRlbXMuZmluZChjID0+IGMudW5pcXVlTmFtZSA9PT0gdy51bmlxdWVOYW1lKTtcbiAgICAgICAgICAgICAgaWYgKGdpdGVtKSB7XG4gICAgICAgICAgICAgICAgdy5jb21wb25lbnQgPSBnaXRlbS5jb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGdpdGVtLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgICB3LnByb3BzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnaXRlbS5wcm9wcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndpZGdldHMucHVzaCguLi5sb2FkZWRXaWRnZXRzKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQoJ2xvYWQnKTtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbChsb2FkRnVuYywgMjAwKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy53aWRnZXRzLmxlbmd0aCkge1xuICAgICAgdGhpcy53aWRnZXRzID0gW107XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLnNhdmVTdWJqZWN0Lm5leHQoJ2NsZWFyJyk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMud2lkZ2V0cy5tYXAoYyA9PiAoe1xuICAgICAgdW5pcXVlTmFtZTogYy51bmlxdWVOYW1lLFxuICAgICAgY29tcG9uZW50OiBjLmNvbXBvbmVudCxcbiAgICAgIHRpdGxlOiBjLnRpdGxlLFxuICAgICAgc2l6ZVg6IGMuc2l6ZVgsXG4gICAgICBzaXplWTogYy5zaXplWSxcbiAgICAgIGNvbDogYy5jb2wsXG4gICAgICByb3c6IGMucm93LFxuICAgICAgb3B0aW9uczogYy5vcHRpb25zLFxuICAgICAgcHJvcHM6IGMucHJvcHNcbiAgICB9KSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy53aWRnZXRIb3N0cy5mb3JFYWNoKGhvc3QgPT4ge1xuICAgICAgaG9zdC53aWRnZXQucmVmcmVzaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlT25Db25maWdDaGFuZ2VkKGU6IEFYV2lkZ2V0Q29uZmlnQ2hhbmdlZCkge1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnNhdmVTdWJqZWN0Lm5leHQoJ2NvbmZpZycpO1xuICB9XG5cbiAgaGFuZGxlT25SZXNpemVkQ2hhbmdlZChlOiBBWFdpZGdldENvbmZpZ0NoYW5nZWQpIHtcbiAgICB0aGlzLmRldGVjdEZpcnN0RW1wdHlTbG90KGUuY29uZmlnKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zYXZlU3ViamVjdC5uZXh0KCdjb25maWcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbmZpZ0NoYW5nZWQobW9kZTogJ2NsZWFyJyB8ICdhZGQnIHwgJ3JlbW92ZScgfCAnbG9hZCcgfCAnY29uZmlnJykge1xuICAgIHRoaXMub25Db25maWdDaGFuZ2VkLmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbW9kZTogbW9kZVxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwid2lkZ2V0cy1jb250YWluZXJcIiBbY2xhc3MucnRsXT1cInJ0bFwiICNjb250YWluZXI+XG4gICAgPGF4LXdpZGdldC1ob3N0ICpuZ0Zvcj1cImxldCB3IG9mIHdpZGdldHM7dHJhY2tCeTogdHJhY2tCeUZuXCIgIFtjb25maWddPSd3JyBbc2l6ZVhdPVwidy5zaXplWFwiIFtyZWFkb25seV09XCJyZWFkb25seSB8fCB3LnJlYWRvbmx5XCJcbiAgICAgICAgW3NpemVZXT1cIncuc2l6ZVlcIiBbY29sXT1cIncuY29sXCIgW3Jvd109XCJ3LnJvd1wiIChvblJlbW92ZSk9XCJoYW5kbGVPblJlbW92ZSgkZXZlbnQpXCIgKG9uU2F2ZSk9XCJoYW5kbGVPblNhdmUoJGV2ZW50KVwiXG4gICAgICAgIChvbkNvbmZpZ0NoYW5nZWQpPVwiaGFuZGxlT25Db25maWdDaGFuZ2VkKCRldmVudClcIiAob25SZXNpemVkKT1cImhhbmRsZU9uUmVzaXplZENoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIFtwcm92aWRlVmFsdWVdPVwicHJvdmlkZVZhbHVlXCI+XG4gICAgPC9heC13aWRnZXQtaG9zdD5cbjwvZGl2PlxuIl19
|