sidesys-generic-ui 2.4.8 → 2.4.9
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/esm2022/lib/animation/animation.component.mjs +2 -2
- package/esm2022/lib/badge/s-badge.component.mjs +7 -5
- package/esm2022/lib/button/components/button/s-button.component.mjs +4 -4
- package/esm2022/lib/navbar/components/icon-menu/s-icon-menu.component.mjs +1 -1
- package/esm2022/lib/select/select-multiple/s-select-multiple.component.mjs +10 -3
- package/esm2022/lib/sidebar/s-sidebar.component.mjs +1 -1
- package/esm2022/lib/table-double/table-double.component.mjs +42 -18
- package/esm2022/lib/table-double-complete/table-double-complete.component.mjs +161 -39
- package/esm2022/lib/table-double-complete/table-double-complete.model.mjs +1 -1
- package/esm2022/lib/tabs/s-tabs.component.mjs +1 -1
- package/esm2022/lib/theme/s-theme.component.mjs +2 -2
- package/esm2022/lib/toolbar-top/toolbar-top.component.mjs +6 -3
- package/fesm2022/sidesys-generic-ui.mjs +228 -71
- package/fesm2022/sidesys-generic-ui.mjs.map +1 -1
- package/lib/badge/s-badge.component.d.ts +3 -2
- package/lib/button/components/button/s-button.component.d.ts +1 -1
- package/lib/select/select-multiple/s-select-multiple.component.d.ts +3 -2
- package/lib/table-double/table-double.component.d.ts +6 -5
- package/lib/table-double-complete/table-double-complete.component.d.ts +25 -9
- package/lib/table-double-complete/table-double-complete.model.d.ts +11 -5
- package/package.json +1 -1
|
@@ -40,6 +40,7 @@ export class STableDoubleComponent {
|
|
|
40
40
|
this.toggleExpandEvent = new EventEmitter();
|
|
41
41
|
this.reorderItemEvent = new EventEmitter();
|
|
42
42
|
this.switchChangeEvent = new EventEmitter();
|
|
43
|
+
this.searchEvent = new EventEmitter();
|
|
43
44
|
this.disabledButtonLeft = signal(true);
|
|
44
45
|
this.disabledButtonRight = signal(true);
|
|
45
46
|
this.itemsTableLeft = [];
|
|
@@ -62,6 +63,17 @@ export class STableDoubleComponent {
|
|
|
62
63
|
title: this._sTranslateService.instant('ui.tableDouble.emptyTitleRight'), //'No hay elementos agregados',
|
|
63
64
|
};
|
|
64
65
|
}
|
|
66
|
+
//si tiene items checkeados hay que actualizar el contador del bottomStatusBarEvent
|
|
67
|
+
const itemsChecked = this.config.tableLeftItems.filter(item => item.checked);
|
|
68
|
+
if (itemsChecked.length > 0) {
|
|
69
|
+
this.updateCounter();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
ngOnChanges(changes) {
|
|
73
|
+
if (changes['config'] && !changes['config'].isFirstChange()) {
|
|
74
|
+
this.id = this.config.id ?? this.id;
|
|
75
|
+
this.cloneItemsTables();
|
|
76
|
+
}
|
|
65
77
|
}
|
|
66
78
|
onDragStart(event, itemId) {
|
|
67
79
|
this.dragItemId = itemId;
|
|
@@ -171,6 +183,20 @@ export class STableDoubleComponent {
|
|
|
171
183
|
this.emptyPositionEvent.emit(isLeftTable);
|
|
172
184
|
}
|
|
173
185
|
orderBy(event, isLeftTable) {
|
|
186
|
+
const tableConfig = isLeftTable ? this.config.tableLeftConfig : this.config.tableRightConfig;
|
|
187
|
+
if (tableConfig.hidePagination && !tableConfig.scroll) {
|
|
188
|
+
const sortedItems = [...this.getItems(isLeftTable)].sort((a, b) => {
|
|
189
|
+
const valueA = a[event.SortField];
|
|
190
|
+
const valueB = b[event.SortField];
|
|
191
|
+
if (valueA < valueB)
|
|
192
|
+
return event.SortAsc ? -1 : 1;
|
|
193
|
+
if (valueA > valueB)
|
|
194
|
+
return event.SortAsc ? 1 : -1;
|
|
195
|
+
return 0;
|
|
196
|
+
});
|
|
197
|
+
this.setItems(isLeftTable, sortedItems);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
174
200
|
this.orderByPositionEvent.emit({ isLeftTable, value: event });
|
|
175
201
|
}
|
|
176
202
|
page(event, isLeftTable) {
|
|
@@ -214,20 +240,16 @@ export class STableDoubleComponent {
|
|
|
214
240
|
this.updateCounter();
|
|
215
241
|
}
|
|
216
242
|
search(event, isLeftTable) {
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
if (
|
|
220
|
-
this.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
this.
|
|
243
|
+
// Si la tabla no tiene paginación ni scroll, se asume que el filtrado es local
|
|
244
|
+
const tableConfig = isLeftTable ? this.config.tableLeftConfig : this.config.tableRightConfig;
|
|
245
|
+
if (tableConfig.hidePagination && !tableConfig.scroll) {
|
|
246
|
+
const sourceItems = isLeftTable ? this.itemsTableLeft : this.itemsTableRightData;
|
|
247
|
+
const lowerCaseEvent = event.toLowerCase();
|
|
248
|
+
const filteredItems = sourceItems.filter(item => Object.values(item).some(val => String(val).toLowerCase().includes(lowerCaseEvent)));
|
|
249
|
+
this.setItems(isLeftTable, filteredItems);
|
|
250
|
+
return;
|
|
224
251
|
}
|
|
225
|
-
|
|
226
|
-
getFilteredItems(original, searchTerm) {
|
|
227
|
-
const term = searchTerm.toLowerCase().trim();
|
|
228
|
-
if (!term)
|
|
229
|
-
return [...original];
|
|
230
|
-
return original.filter(item => Object.values(item).some(value => String(value).toLowerCase().includes(term)));
|
|
252
|
+
this.searchEvent.emit({ isLeftTable, value: event });
|
|
231
253
|
}
|
|
232
254
|
updateCounter() {
|
|
233
255
|
const updateStatusBar = (items, config, setter) => {
|
|
@@ -240,8 +262,8 @@ export class STableDoubleComponent {
|
|
|
240
262
|
disabled: items.length === 0,
|
|
241
263
|
total: items.length,
|
|
242
264
|
});
|
|
243
|
-
// Habilitar botón si hay items
|
|
244
|
-
setter.set(counterCheckbox === 0
|
|
265
|
+
// Habilitar botón si hay items checkeados
|
|
266
|
+
setter.set(counterCheckbox === 0);
|
|
245
267
|
};
|
|
246
268
|
updateStatusBar(this.config.tableLeftItems, this.config.tableLeftConfig, this.disabledButtonLeft);
|
|
247
269
|
updateStatusBar(this.config.tableRightItems, this.config.tableRightConfig, this.disabledButtonRight);
|
|
@@ -330,7 +352,7 @@ export class STableDoubleComponent {
|
|
|
330
352
|
this.switchChangeEvent.emit({ isLeftTable, itemId, columnId, value });
|
|
331
353
|
}
|
|
332
354
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: STableDoubleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
333
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: STableDoubleComponent, isStandalone: true, selector: "s-table-double", inputs: { config: "config" }, outputs: { actionPositionEvent: "actionPositionEvent", bottomStatusBarPositionEvent: "bottomStatusBarPositionEvent", checkAllPositionEvent: "checkAllPositionEvent", deletePositionEvent: "deletePositionEvent", emptyPositionEvent: "emptyPositionEvent", eventUpdateTables: "eventUpdateTables", filterPositionEvent: "filterPositionEvent", multiSelectPositionEvent: "multiSelectPositionEvent", orderByPositionEvent: "orderByPositionEvent", pagePositionEvent: "pagePositionEvent", paginationPositionEvent: "paginationPositionEvent", pillButtonPositionEvent: "pillButtonPositionEvent", scrollPositionEvent: "scrollPositionEvent", selectPositionEvent: "selectPositionEvent", rowSelectPositionEvent: "rowSelectPositionEvent", actionEvent: "actionEvent", toggleExpandEvent: "toggleExpandEvent", reorderItemEvent: "reorderItemEvent", switchChangeEvent: "switchChangeEvent" }, ngImport: i0, template: "<div class=\"s-table-double\" [id]=\"id\">\n <div class=\"s-table-double__header\"></div>\n <div class=\"s-table-double__body\">\n <div class=\"s-table-double__body__left\">\n <s-table-complete\n [config]=\"config.tableLeftConfig\"\n (actionEvent)=\"action(true)\"\n (bottomStatusBarEvent)=\"bottomStatusBarChange($event, true)\"\n (checkAllEvent)=\"checkAllEvent($event, true)\"\n (deleteEvent)=\"delete(true)\"\n (emptyEvent)=\"empty(true)\"\n (filterEvent)=\"filter($event, true)\"\n (multiSelectEvent)=\"multiSelect($event, true)\"\n (orderByEvent)=\"orderBy($event, true)\"\n (pageEvent)=\"page($event, true)\"\n (paginationEvent)=\"paginationEmitter($event, true)\"\n (pillButtonEvent)=\"pillButton(true)\"\n (scrollEvent)=\"onScroll(true)\"\n (searchEvent)=\"search($event, true)\">\n @if (config.dragAndDrop) {\n @for (item of config.tableLeftItems; track item) {\n <div class=\"s-table-double__list\">\n <s-list\n [size]=\"'xs'\"\n [attr.data-item-id]=\"item.id\"\n [draggable]=\"true\"\n [id]=\"id + '-listLeft-' + item.id\"\n [selected]=\"item.checked\"\n (dragstart)=\"onDragStart($event, item.id)\"\n (dragover)=\"onDragOver($event, item.id)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item.id, true)\"\n (click)=\"selectItem(item.id, true)\">\n <div class=\"s-table-double__drag\">\n <h5 class=\"ml-2\">{{ item.name }}</h5>\n @if (item.iconAction) {\n <div class=\"s-table-double__drag-icon\">\n <s-icon-mat (click)=\"iconAction(item.id, true)\">{{ item.iconAction }}</s-icon-mat>\n </div>\n }\n </div>\n </s-list>\n </div>\n }\n } @else {\n @for (item of config.tableLeftItems; track item) {\n <tr\n [ngClass]=\"{\n active: !config.disableLeftRowSelection && config.isTreeMode && item.selected,\n }\"\n (click)=\"!config.disableLeftRowSelection && config.isTreeMode && rowClick(item, true)\">\n <td (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [id]=\"id + '-checkboxLeft-' + item.id\"\n [(ngModel)]=\"item.checked\"\n (change)=\"changeCheckbox()\" />\n </td>\n @for (column of config.tableLeftConfig.columns; track column) {\n @if (column.id !== 'checkbox' && column.id !== undefined) {\n <td [id]=\"id + '-itemLeft-' + item.id\">{{ item[column.id] }}</td>\n }\n }\n </tr>\n }\n }\n </s-table-complete>\n </div>\n <div class=\"s-table-double__body__middle\">\n <div>\n <s-button\n [id]=\"id + '-addButton'\"\n (click)=\"addItem()\"\n (keydown.enter)=\"addItem()\"\n position=\"normal\"\n [disabled]=\"disabledButtonLeft()\"\n [pill]=\"true\"\n ><s-icon-mat\n ><span class=\"material-symbols-outlined\">\n {{ config.additionButton ? 'add' : 'arrow_forward' }}\n </span></s-icon-mat\n ></s-button\n >\n </div>\n <div>\n <s-button\n [id]=\"id + '-removeButton'\"\n (click)=\"removeItem()\"\n (keydown.enter)=\"removeItem()\"\n position=\"normal\"\n type=\"secondary\"\n [disabled]=\"disabledButtonRight()\"\n [pill]=\"true\"\n ><s-icon-mat\n ><span class=\"material-symbols-outlined\">\n {{ config.additionButton ? 'remove' : 'arrow_back' }}\n </span></s-icon-mat\n ></s-button\n >\n </div>\n </div>\n <div class=\"s-table-double__body__right\">\n <s-table-complete\n [config]=\"config.tableRightConfig\"\n (actionEvent)=\"action(false)\"\n (bottomStatusBarEvent)=\"bottomStatusBarChange($event, false)\"\n (checkAllEvent)=\"checkAllEvent($event, false)\"\n (deleteEvent)=\"delete(false)\"\n (emptyEvent)=\"empty(false)\"\n (filterEvent)=\"filter($event, false)\"\n (multiSelectEvent)=\"multiSelect($event, false)\"\n (orderByEvent)=\"orderBy($event, false)\"\n (pageEvent)=\"page($event, false)\"\n (paginationEvent)=\"paginationEmitter($event, false)\"\n (pillButtonEvent)=\"pillButton(false)\"\n (scrollEvent)=\"onScroll(false)\"\n (searchEvent)=\"search($event, false)\">\n @if (config.dragAndDrop) {\n @for (item of config.tableRightItems; track item) {\n <s-list\n [size]=\"'xs'\"\n [id]=\"id + '-listRight-' + item.id\"\n [attr.data-item-id]=\"item.id\"\n [draggable]=\"true\"\n [selected]=\"item.checked\"\n (dragstart)=\"onDragStart($event, item.id)\"\n (dragover)=\"onDragOver($event, item.id)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item.id, false)\"\n (click)=\"selectItem(item.id, false)\">\n <div class=\"s-table-double__drag\">\n <h5 class=\"ml-2\">{{ item.name }}</h5>\n @if (item.iconAction) {\n <div class=\"s-table-double__drag-icon\">\n <s-icon-mat (click)=\"iconAction(item.id, false)\">{{ item.iconAction }}</s-icon-mat>\n </div>\n }\n </div>\n </s-list>\n }\n } @else {\n @for (item of config.tableRightItems; track item) {\n <tr\n [ngClass]=\"{ active: config.isTreeMode && item.selected }\"\n (click)=\"config.isTreeMode && rowClick(item, false)\">\n <td\n class=\"s-table-double__tree-cell\"\n [class.s-table-double__tree-cell--tree]=\"config.isTreeMode\"\n [attr.colspan]=\"config.isTreeMode ? getTreeCellColspan() : null\">\n <div class=\"s-table-double__tree-cell-content\" [ngClass]=\"getTreeLevelClass(item)\">\n @if (config.isTreeMode && item.hasChildren) {\n <s-icon-mat\n class=\"s-table-double__tree-toggle\"\n [class.s-table-double__tree-toggle--expanded]=\"item.expanded\"\n (click)=\"toggleExpand($event, item.id)\">\n <span class=\"material-symbols-outlined\">chevron_right</span>\n </s-icon-mat>\n } @else if (config.isTreeMode) {\n <span class=\"s-table-double__tree-spacer\"></span>\n }\n <input\n type=\"checkbox\"\n [id]=\"id + '-checkboxRight-' + item.id\"\n [(ngModel)]=\"item.checked\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"changeCheckbox()\" />\n @if (config.isTreeMode) {\n <span class=\"s-table-double__tree-name\">{{ item.name }}</span>\n }\n </div>\n </td>\n @for (column of config.tableRightConfig.columns; track column) {\n @if (\n column.id !== 'checkbox' &&\n column.id !== undefined &&\n !(config.isTreeMode && column.id === 'name') &&\n column.id !== 'actions'\n ) {\n <td [id]=\"id + '-itemRight-' + item.id\" (click)=\"column.switchConfig && $event.stopPropagation()\">\n @if (column.switchConfig && item[column.id!] !== undefined) {\n <s-toggle-switch\n [config]=\"column.switchConfig\"\n [(ngModel)]=\"item[column.id!]\"\n (valueChange)=\"onSwitchChange($event, item.id, column.id!, false)\">\n </s-toggle-switch>\n } @else if (!column.switchConfig) {\n {{ item[column.id] }}\n }\n </td>\n }\n }\n @if (config.showOrderButtons) {\n <td class=\"s-table-double__order-actions\" (click)=\"$event.stopPropagation()\">\n <s-table-actions-buttons\n [tableActionsButtons]=\"getOrderButtons(item)\"\n (clickButtonEvent)=\"onOrderButtonClick($event, item.id)\">\n </s-table-actions-buttons>\n </td>\n }\n </tr>\n }\n }\n </s-table-complete>\n </div>\n </div>\n</div>\n", styles: [".s-table-double__body{display:flex;gap:.625rem}.s-table-double__body .s-tablet tr{cursor:pointer;-webkit-user-select:none;user-select:none}.s-table-double__body .s-tablet tr:hover{background-color:var(--primary-200)}.s-table-double__body .s-tablet tr.active{background-color:var(--neutrals-1100)}.s-table-double__body__left{flex:5}.s-table-double__body__middle{display:flex;flex-direction:column;gap:.625rem;justify-content:center;padding:1.25rem;background-color:var(--primary-100);border-radius:.5rem}.s-table-double__body__right{flex:5}.s-table-double .s-table-double__tree-cell{padding-left:0!important}.s-table-double__tree-cell-content{display:flex;align-items:center;gap:.5rem}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__list{margin:.5rem}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag{display:flex;justify-content:space-between;width:100%}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag-icon{color:var(--primary-600)}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag-icon:hover{cursor:pointer;color:var(--secondary-600)}.s-table-double .s-table-double__tree-level-0{padding-left:11px!important}.s-table-double .s-table-double__tree-level-1{padding-left:35px!important}.s-table-double .s-table-double__tree-level-2{padding-left:59px!important}.s-table-double .s-table-double__tree-level-3{padding-left:83px!important}.s-table-double .s-table-double__tree-level-4{padding-left:107px!important}.s-table-double .s-table-double__tree-level-5{padding-left:131px!important}.s-table-double .s-table-double__tree-level-6{padding-left:155px!important}.s-table-double .s-table-double__tree-level-7{padding-left:179px!important}.s-table-double .s-table-double__tree-level-8{padding-left:203px!important}.s-table-double .s-table-double__tree-level-9{padding-left:227px!important}.s-table-double .s-table-double__tree-level-10{padding-left:251px!important}.s-table-double .s-table-double__tree-level-11{padding-left:275px!important}.s-table-double .s-table-double__tree-level-12{padding-left:299px!important}.s-table-double .s-table-double__tree-level-13{padding-left:323px!important}.s-table-double .s-table-double__tree-level-14{padding-left:347px!important}.s-table-double .s-table-double__tree-level-15{padding-left:371px!important}.s-table-double .s-table-double__tree-level-16{padding-left:395px!important}.s-table-double .s-table-double__tree-level-17{padding-left:419px!important}.s-table-double .s-table-double__tree-level-18{padding-left:443px!important}.s-table-double .s-table-double__tree-level-19{padding-left:467px!important}.s-table-double .s-table-double__tree-level-20{padding-left:491px!important}.s-table-double__tree-toggle{cursor:pointer;transition:transform .2s ease;display:inline-flex;align-items:center;justify-content:center;color:var(--neutrals-600);font-size:1.25rem}.s-table-double__tree-toggle:hover{color:var(--primary-600)}.s-table-double__tree-toggle--expanded{transform:rotate(90deg)}.s-table-double__tree-spacer{display:inline-block;width:24px}.s-table-double__tree-name{margin-left:.25rem;white-space:nowrap;cursor:pointer;flex:1}.s-table-double .s-table-double__drag{display:flex;justify-content:space-between;color:var(--primary-600)}.s-table-double__order-actions{width:1px;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: STableCompleteModule }, { kind: "component", type: i2.TableCompleteComponent, selector: "s-table-complete", inputs: ["config", "id"], outputs: ["actionEvent", "checkAllEvent", "deleteEvent", "emptyEvent", "filterEvent", "orderByEvent", "pageEvent", "paginationEvent", "multiSelectEvent", "pillButtonEvent", "selectEvent", "searchEvent", "bottomStatusBarEvent", "scrollEvent"] }, { kind: "ngmodule", type: SButtonModule }, { kind: "component", type: i3.SButtonComponent, selector: "s-button", inputs: ["disabled", "id", "pill", "size", "invert", "type", "loading", "position", "theme", "active"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SIconMaterialModule }, { kind: "component", type: i5.SIconMaterialComponent, selector: "s-icon-mat", inputs: ["name", "size", "fill", "weight", "grade", "style", "type", "id"] }, { kind: "ngmodule", type: SListModule }, { kind: "component", type: i6.SListComponent, selector: "s-list", inputs: ["disabled", "selected", "size", "id"] }, { kind: "ngmodule", type: TableActionsButtonsModule }, { kind: "component", type: i7.TableActionsButtonsComponent, selector: "s-table-actions-buttons", inputs: ["tableActionsButtons", "id"], outputs: ["clickButtonEvent"] }, { kind: "ngmodule", type: SToggleSwitchModule }, { kind: "component", type: i8.ToggleSwitchFormComponent, selector: "s-toggle-switch", inputs: ["config", "id"], outputs: ["blur", "focus", "valueChange"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
355
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: STableDoubleComponent, isStandalone: true, selector: "s-table-double", inputs: { config: "config" }, outputs: { actionPositionEvent: "actionPositionEvent", bottomStatusBarPositionEvent: "bottomStatusBarPositionEvent", checkAllPositionEvent: "checkAllPositionEvent", deletePositionEvent: "deletePositionEvent", emptyPositionEvent: "emptyPositionEvent", eventUpdateTables: "eventUpdateTables", filterPositionEvent: "filterPositionEvent", multiSelectPositionEvent: "multiSelectPositionEvent", orderByPositionEvent: "orderByPositionEvent", pagePositionEvent: "pagePositionEvent", paginationPositionEvent: "paginationPositionEvent", pillButtonPositionEvent: "pillButtonPositionEvent", scrollPositionEvent: "scrollPositionEvent", selectPositionEvent: "selectPositionEvent", rowSelectPositionEvent: "rowSelectPositionEvent", actionEvent: "actionEvent", toggleExpandEvent: "toggleExpandEvent", reorderItemEvent: "reorderItemEvent", switchChangeEvent: "switchChangeEvent", searchEvent: "searchEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"s-table-double\" [id]=\"id\">\n <div class=\"s-table-double__header\"></div>\n <div class=\"s-table-double__body\">\n <div class=\"s-table-double__body__left\">\n <s-table-complete [config]=\"config.tableLeftConfig\" (actionEvent)=\"action(true)\"\n (bottomStatusBarEvent)=\"bottomStatusBarChange($event, true)\" (checkAllEvent)=\"checkAllEvent($event, true)\"\n (deleteEvent)=\"delete(true)\" (emptyEvent)=\"empty(true)\" (filterEvent)=\"filter($event, true)\"\n (multiSelectEvent)=\"multiSelect($event, true)\" (orderByEvent)=\"orderBy($event, true)\"\n (pageEvent)=\"page($event, true)\" (paginationEvent)=\"paginationEmitter($event, true)\"\n (pillButtonEvent)=\"pillButton(true)\" (scrollEvent)=\"onScroll(true)\" (searchEvent)=\"search($event, true)\">\n @if (config.dragAndDrop) {\n @for (item of config.tableLeftItems; track $index) {\n <div class=\"s-table-double__list\">\n <s-list [size]=\"'xs'\" [attr.data-item-id]=\"item.id\" [draggable]=\"true\" [id]=\"id + '-listLeft-' + item.id\"\n [selected]=\"item.checked\" (dragstart)=\"onDragStart($event, item.id)\"\n (dragover)=\"onDragOver($event, item.id)\" (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item.id, true)\" (click)=\"selectItem(item.id, true)\">\n <div class=\"s-table-double__drag\">\n <h5 class=\"ml-2\">{{ item.name }}</h5>\n @if (item.iconAction) {\n <div class=\"s-table-double__drag-icon\">\n <s-icon-mat (click)=\"iconAction(item.id, true)\">{{ item.iconAction }}</s-icon-mat>\n </div>\n }\n </div>\n </s-list>\n </div>\n }\n } @else {\n @for (item of config.tableLeftItems; track $index) {\n <tr [ngClass]=\"{\n active: !config.disableLeftRowSelection && config.isTreeMode && item.selected,\n }\" (click)=\"!config.disableLeftRowSelection && config.isTreeMode && rowClick(item, true)\">\n <td (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" [id]=\"id + '-checkboxLeft-' + item.id\" [(ngModel)]=\"item.checked\"\n (change)=\"changeCheckbox()\" />\n </td>\n @for (column of config.tableLeftConfig.columns; track column) {\n @if (column.id !== 'checkbox' && column.id !== undefined) {\n <td [id]=\"id + '-itemLeft-' + item.id\">{{ item[column.id] }}</td>\n }\n }\n </tr>\n }\n }\n </s-table-complete>\n </div>\n <div class=\"s-table-double__body__middle\">\n <div>\n <s-button [id]=\"id + '-addButton'\" (click)=\"addItem()\" (keydown.enter)=\"addItem()\" position=\"normal\"\n [disabled]=\"disabledButtonLeft()\" [pill]=\"true\"><s-icon-mat><span class=\"material-symbols-outlined\">\n {{ config.additionButton ? 'add' : 'arrow_forward' }}\n </span></s-icon-mat></s-button>\n </div>\n <div>\n <s-button [id]=\"id + '-removeButton'\" (click)=\"removeItem()\" (keydown.enter)=\"removeItem()\" position=\"normal\"\n type=\"secondary\" [disabled]=\"disabledButtonRight()\" [pill]=\"true\"><s-icon-mat><span\n class=\"material-symbols-outlined\">\n {{ config.additionButton ? 'remove' : 'arrow_back' }}\n </span></s-icon-mat></s-button>\n </div>\n </div>\n <div class=\"s-table-double__body__right\">\n <s-table-complete [config]=\"config.tableRightConfig\" (actionEvent)=\"action(false)\"\n (bottomStatusBarEvent)=\"bottomStatusBarChange($event, false)\" (checkAllEvent)=\"checkAllEvent($event, false)\"\n (deleteEvent)=\"delete(false)\" (emptyEvent)=\"empty(false)\" (filterEvent)=\"filter($event, false)\"\n (multiSelectEvent)=\"multiSelect($event, false)\" (orderByEvent)=\"orderBy($event, false)\"\n (pageEvent)=\"page($event, false)\" (paginationEvent)=\"paginationEmitter($event, false)\"\n (pillButtonEvent)=\"pillButton(false)\" (scrollEvent)=\"onScroll(false)\" (searchEvent)=\"search($event, false)\">\n @if (config.dragAndDrop) {\n @for (item of config.tableRightItems; track $index) {\n <div class=\"s-table-double__list\">\n <s-list [size]=\"'xs'\" [id]=\"id + '-listRight-' + item.id\" [attr.data-item-id]=\"item.id\" [draggable]=\"true\"\n [selected]=\"item.checked\" (dragstart)=\"onDragStart($event, item.id)\"\n (dragover)=\"onDragOver($event, item.id)\" (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item.id, false)\" (click)=\"selectItem(item.id, false)\">\n <div class=\"s-table-double__drag\">\n <h5 class=\"ml-2\">{{ item.name }}</h5>\n @if (item.iconAction) {\n <div class=\"s-table-double__drag-icon\">\n <s-icon-mat (click)=\"iconAction(item.id, false)\">{{ item.iconAction }}</s-icon-mat>\n </div>\n }\n </div>\n </s-list>\n </div>\n }\n } @else {\n @for (item of config.tableRightItems; track $index) {\n <tr [ngClass]=\"{ active: config.isTreeMode && item.selected }\"\n (click)=\"config.isTreeMode && rowClick(item, false)\">\n <td class=\"s-table-double__tree-cell\" [class.s-table-double__tree-cell--tree]=\"config.isTreeMode\"\n [attr.colspan]=\"config.isTreeMode ? getTreeCellColspan() : null\">\n <div class=\"s-table-double__tree-cell-content\" [ngClass]=\"getTreeLevelClass(item)\">\n @if (config.isTreeMode && item.hasChildren) {\n <s-icon-mat class=\"s-table-double__tree-toggle\"\n [class.s-table-double__tree-toggle--expanded]=\"item.expanded\" (click)=\"toggleExpand($event, item.id)\">\n <span class=\"material-symbols-outlined\">chevron_right</span>\n </s-icon-mat>\n } @else if (config.isTreeMode) {\n <span class=\"s-table-double__tree-spacer\"></span>\n }\n <input type=\"checkbox\" [id]=\"id + '-checkboxRight-' + item.id\" [(ngModel)]=\"item.checked\"\n (click)=\"$event.stopPropagation()\" (change)=\"changeCheckbox()\" />\n @if (config.isTreeMode) {\n <span class=\"s-table-double__tree-name\">{{ item.name }}</span>\n }\n </div>\n </td>\n @for (column of config.tableRightConfig.columns; track column) {\n @if (\n column.id !== 'checkbox' &&\n column.id !== undefined &&\n !(config.isTreeMode && column.id === 'name') &&\n column.id !== 'actions'\n ) {\n <td [id]=\"id + '-itemRight-' + item.id\" (click)=\"column.switchConfig && $event.stopPropagation()\">\n @if (column.switchConfig && item[column.id!] !== undefined) {\n <s-toggle-switch [config]=\"column.switchConfig\" [(ngModel)]=\"item[column.id!]\"\n (valueChange)=\"onSwitchChange($event, item.id, column.id!, false)\">\n </s-toggle-switch>\n } @else if (!column.switchConfig) {\n {{ item[column.id] }}\n }\n </td>\n }\n }\n @if (config.showOrderButtons) {\n <td class=\"s-table-double__order-actions\" (click)=\"$event.stopPropagation()\">\n <s-table-actions-buttons [tableActionsButtons]=\"getOrderButtons(item)\"\n (clickButtonEvent)=\"onOrderButtonClick($event, item.id)\">\n </s-table-actions-buttons>\n </td>\n }\n </tr>\n }\n }\n </s-table-complete>\n </div>\n </div>\n</div>", styles: [".s-table-double__body{display:flex;gap:.625rem}.s-table-double__body .s-tablet tr{cursor:pointer;-webkit-user-select:none;user-select:none}.s-table-double__body .s-tablet tr:hover{background-color:var(--primary-200)}.s-table-double__body .s-tablet tr.active{background-color:var(--neutrals-1100)}.s-table-double__body__left{flex:5}.s-table-double__body__middle{display:flex;flex-direction:column;gap:.625rem;justify-content:center;padding:1.25rem;background-color:var(--primary-100);border-radius:.5rem}.s-table-double__body__right{flex:5}.s-table-double__list{margin:.5rem .8rem}.s-table-double .s-table-double__tree-cell{padding-left:0!important}.s-table-double__tree-cell-content{display:flex;align-items:center;gap:.5rem}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__list{margin:.5rem}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag{display:flex;justify-content:space-between;width:100%}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag-icon{color:var(--primary-600)}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag-icon:hover{cursor:pointer;color:var(--secondary-600)}.s-table-double .s-table-double__tree-level-0{padding-left:11px!important}.s-table-double .s-table-double__tree-level-1{padding-left:35px!important}.s-table-double .s-table-double__tree-level-2{padding-left:59px!important}.s-table-double .s-table-double__tree-level-3{padding-left:83px!important}.s-table-double .s-table-double__tree-level-4{padding-left:107px!important}.s-table-double .s-table-double__tree-level-5{padding-left:131px!important}.s-table-double .s-table-double__tree-level-6{padding-left:155px!important}.s-table-double .s-table-double__tree-level-7{padding-left:179px!important}.s-table-double .s-table-double__tree-level-8{padding-left:203px!important}.s-table-double .s-table-double__tree-level-9{padding-left:227px!important}.s-table-double .s-table-double__tree-level-10{padding-left:251px!important}.s-table-double .s-table-double__tree-level-11{padding-left:275px!important}.s-table-double .s-table-double__tree-level-12{padding-left:299px!important}.s-table-double .s-table-double__tree-level-13{padding-left:323px!important}.s-table-double .s-table-double__tree-level-14{padding-left:347px!important}.s-table-double .s-table-double__tree-level-15{padding-left:371px!important}.s-table-double .s-table-double__tree-level-16{padding-left:395px!important}.s-table-double .s-table-double__tree-level-17{padding-left:419px!important}.s-table-double .s-table-double__tree-level-18{padding-left:443px!important}.s-table-double .s-table-double__tree-level-19{padding-left:467px!important}.s-table-double .s-table-double__tree-level-20{padding-left:491px!important}.s-table-double__tree-toggle{cursor:pointer;transition:transform .2s ease;display:inline-flex;align-items:center;justify-content:center;color:var(--neutrals-600);font-size:1.25rem}.s-table-double__tree-toggle:hover{color:var(--primary-600)}.s-table-double__tree-toggle--expanded{transform:rotate(90deg)}.s-table-double__tree-spacer{display:inline-block;width:24px}.s-table-double__tree-name{margin-left:.25rem;white-space:nowrap;cursor:pointer;flex:1}.s-table-double .s-table-double__drag{display:flex;justify-content:space-between;color:var(--primary-600)}.s-table-double__order-actions{width:1px;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: STableCompleteModule }, { kind: "component", type: i2.TableCompleteComponent, selector: "s-table-complete", inputs: ["config", "id"], outputs: ["actionEvent", "checkAllEvent", "deleteEvent", "emptyEvent", "filterEvent", "orderByEvent", "pageEvent", "paginationEvent", "multiSelectEvent", "pillButtonEvent", "selectEvent", "searchEvent", "bottomStatusBarEvent", "scrollEvent"] }, { kind: "ngmodule", type: SButtonModule }, { kind: "component", type: i3.SButtonComponent, selector: "s-button", inputs: ["disabled", "id", "pill", "size", "invert", "type", "loading", "position", "theme", "active"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SIconMaterialModule }, { kind: "component", type: i5.SIconMaterialComponent, selector: "s-icon-mat", inputs: ["name", "size", "fill", "weight", "grade", "style", "type", "id"] }, { kind: "ngmodule", type: SListModule }, { kind: "component", type: i6.SListComponent, selector: "s-list", inputs: ["disabled", "selected", "size", "id"] }, { kind: "ngmodule", type: TableActionsButtonsModule }, { kind: "component", type: i7.TableActionsButtonsComponent, selector: "s-table-actions-buttons", inputs: ["tableActionsButtons", "id"], outputs: ["clickButtonEvent"] }, { kind: "ngmodule", type: SToggleSwitchModule }, { kind: "component", type: i8.ToggleSwitchFormComponent, selector: "s-toggle-switch", inputs: ["config", "id"], outputs: ["blur", "focus", "valueChange"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
334
356
|
}
|
|
335
357
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: STableDoubleComponent, decorators: [{
|
|
336
358
|
type: Component,
|
|
@@ -343,7 +365,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
343
365
|
SListModule,
|
|
344
366
|
TableActionsButtonsModule,
|
|
345
367
|
SToggleSwitchModule,
|
|
346
|
-
], encapsulation: ViewEncapsulation.None, template: "<div class=\"s-table-double\" [id]=\"id\">\n <div class=\"s-table-double__header\"></div>\n <div class=\"s-table-double__body\">\n <div class=\"s-table-double__body__left\">\n <s-table-complete\n [config]=\"config.tableLeftConfig\"\n (actionEvent)=\"action(true)\"\n (bottomStatusBarEvent)=\"bottomStatusBarChange($event, true)\"\n (checkAllEvent)=\"checkAllEvent($event, true)\"\n (deleteEvent)=\"delete(true)\"\n (emptyEvent)=\"empty(true)\"\n (filterEvent)=\"filter($event, true)\"\n (multiSelectEvent)=\"multiSelect($event, true)\"\n (orderByEvent)=\"orderBy($event, true)\"\n (pageEvent)=\"page($event, true)\"\n (paginationEvent)=\"paginationEmitter($event, true)\"\n (pillButtonEvent)=\"pillButton(true)\"\n (scrollEvent)=\"onScroll(true)\"\n (searchEvent)=\"search($event, true)\">\n @if (config.dragAndDrop) {\n @for (item of config.tableLeftItems; track item) {\n <div class=\"s-table-double__list\">\n <s-list\n [size]=\"'xs'\"\n [attr.data-item-id]=\"item.id\"\n [draggable]=\"true\"\n [id]=\"id + '-listLeft-' + item.id\"\n [selected]=\"item.checked\"\n (dragstart)=\"onDragStart($event, item.id)\"\n (dragover)=\"onDragOver($event, item.id)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item.id, true)\"\n (click)=\"selectItem(item.id, true)\">\n <div class=\"s-table-double__drag\">\n <h5 class=\"ml-2\">{{ item.name }}</h5>\n @if (item.iconAction) {\n <div class=\"s-table-double__drag-icon\">\n <s-icon-mat (click)=\"iconAction(item.id, true)\">{{ item.iconAction }}</s-icon-mat>\n </div>\n }\n </div>\n </s-list>\n </div>\n }\n } @else {\n @for (item of config.tableLeftItems; track item) {\n <tr\n [ngClass]=\"{\n active: !config.disableLeftRowSelection && config.isTreeMode && item.selected,\n }\"\n (click)=\"!config.disableLeftRowSelection && config.isTreeMode && rowClick(item, true)\">\n <td (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [id]=\"id + '-checkboxLeft-' + item.id\"\n [(ngModel)]=\"item.checked\"\n (change)=\"changeCheckbox()\" />\n </td>\n @for (column of config.tableLeftConfig.columns; track column) {\n @if (column.id !== 'checkbox' && column.id !== undefined) {\n <td [id]=\"id + '-itemLeft-' + item.id\">{{ item[column.id] }}</td>\n }\n }\n </tr>\n }\n }\n </s-table-complete>\n </div>\n <div class=\"s-table-double__body__middle\">\n <div>\n <s-button\n [id]=\"id + '-addButton'\"\n (click)=\"addItem()\"\n (keydown.enter)=\"addItem()\"\n position=\"normal\"\n [disabled]=\"disabledButtonLeft()\"\n [pill]=\"true\"\n ><s-icon-mat\n ><span class=\"material-symbols-outlined\">\n {{ config.additionButton ? 'add' : 'arrow_forward' }}\n </span></s-icon-mat\n ></s-button\n >\n </div>\n <div>\n <s-button\n [id]=\"id + '-removeButton'\"\n (click)=\"removeItem()\"\n (keydown.enter)=\"removeItem()\"\n position=\"normal\"\n type=\"secondary\"\n [disabled]=\"disabledButtonRight()\"\n [pill]=\"true\"\n ><s-icon-mat\n ><span class=\"material-symbols-outlined\">\n {{ config.additionButton ? 'remove' : 'arrow_back' }}\n </span></s-icon-mat\n ></s-button\n >\n </div>\n </div>\n <div class=\"s-table-double__body__right\">\n <s-table-complete\n [config]=\"config.tableRightConfig\"\n (actionEvent)=\"action(false)\"\n (bottomStatusBarEvent)=\"bottomStatusBarChange($event, false)\"\n (checkAllEvent)=\"checkAllEvent($event, false)\"\n (deleteEvent)=\"delete(false)\"\n (emptyEvent)=\"empty(false)\"\n (filterEvent)=\"filter($event, false)\"\n (multiSelectEvent)=\"multiSelect($event, false)\"\n (orderByEvent)=\"orderBy($event, false)\"\n (pageEvent)=\"page($event, false)\"\n (paginationEvent)=\"paginationEmitter($event, false)\"\n (pillButtonEvent)=\"pillButton(false)\"\n (scrollEvent)=\"onScroll(false)\"\n (searchEvent)=\"search($event, false)\">\n @if (config.dragAndDrop) {\n @for (item of config.tableRightItems; track item) {\n <s-list\n [size]=\"'xs'\"\n [id]=\"id + '-listRight-' + item.id\"\n [attr.data-item-id]=\"item.id\"\n [draggable]=\"true\"\n [selected]=\"item.checked\"\n (dragstart)=\"onDragStart($event, item.id)\"\n (dragover)=\"onDragOver($event, item.id)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item.id, false)\"\n (click)=\"selectItem(item.id, false)\">\n <div class=\"s-table-double__drag\">\n <h5 class=\"ml-2\">{{ item.name }}</h5>\n @if (item.iconAction) {\n <div class=\"s-table-double__drag-icon\">\n <s-icon-mat (click)=\"iconAction(item.id, false)\">{{ item.iconAction }}</s-icon-mat>\n </div>\n }\n </div>\n </s-list>\n }\n } @else {\n @for (item of config.tableRightItems; track item) {\n <tr\n [ngClass]=\"{ active: config.isTreeMode && item.selected }\"\n (click)=\"config.isTreeMode && rowClick(item, false)\">\n <td\n class=\"s-table-double__tree-cell\"\n [class.s-table-double__tree-cell--tree]=\"config.isTreeMode\"\n [attr.colspan]=\"config.isTreeMode ? getTreeCellColspan() : null\">\n <div class=\"s-table-double__tree-cell-content\" [ngClass]=\"getTreeLevelClass(item)\">\n @if (config.isTreeMode && item.hasChildren) {\n <s-icon-mat\n class=\"s-table-double__tree-toggle\"\n [class.s-table-double__tree-toggle--expanded]=\"item.expanded\"\n (click)=\"toggleExpand($event, item.id)\">\n <span class=\"material-symbols-outlined\">chevron_right</span>\n </s-icon-mat>\n } @else if (config.isTreeMode) {\n <span class=\"s-table-double__tree-spacer\"></span>\n }\n <input\n type=\"checkbox\"\n [id]=\"id + '-checkboxRight-' + item.id\"\n [(ngModel)]=\"item.checked\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"changeCheckbox()\" />\n @if (config.isTreeMode) {\n <span class=\"s-table-double__tree-name\">{{ item.name }}</span>\n }\n </div>\n </td>\n @for (column of config.tableRightConfig.columns; track column) {\n @if (\n column.id !== 'checkbox' &&\n column.id !== undefined &&\n !(config.isTreeMode && column.id === 'name') &&\n column.id !== 'actions'\n ) {\n <td [id]=\"id + '-itemRight-' + item.id\" (click)=\"column.switchConfig && $event.stopPropagation()\">\n @if (column.switchConfig && item[column.id!] !== undefined) {\n <s-toggle-switch\n [config]=\"column.switchConfig\"\n [(ngModel)]=\"item[column.id!]\"\n (valueChange)=\"onSwitchChange($event, item.id, column.id!, false)\">\n </s-toggle-switch>\n } @else if (!column.switchConfig) {\n {{ item[column.id] }}\n }\n </td>\n }\n }\n @if (config.showOrderButtons) {\n <td class=\"s-table-double__order-actions\" (click)=\"$event.stopPropagation()\">\n <s-table-actions-buttons\n [tableActionsButtons]=\"getOrderButtons(item)\"\n (clickButtonEvent)=\"onOrderButtonClick($event, item.id)\">\n </s-table-actions-buttons>\n </td>\n }\n </tr>\n }\n }\n </s-table-complete>\n </div>\n </div>\n</div>\n", styles: [".s-table-double__body{display:flex;gap:.625rem}.s-table-double__body .s-tablet tr{cursor:pointer;-webkit-user-select:none;user-select:none}.s-table-double__body .s-tablet tr:hover{background-color:var(--primary-200)}.s-table-double__body .s-tablet tr.active{background-color:var(--neutrals-1100)}.s-table-double__body__left{flex:5}.s-table-double__body__middle{display:flex;flex-direction:column;gap:.625rem;justify-content:center;padding:1.25rem;background-color:var(--primary-100);border-radius:.5rem}.s-table-double__body__right{flex:5}.s-table-double .s-table-double__tree-cell{padding-left:0!important}.s-table-double__tree-cell-content{display:flex;align-items:center;gap:.5rem}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__list{margin:.5rem}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag{display:flex;justify-content:space-between;width:100%}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag-icon{color:var(--primary-600)}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag-icon:hover{cursor:pointer;color:var(--secondary-600)}.s-table-double .s-table-double__tree-level-0{padding-left:11px!important}.s-table-double .s-table-double__tree-level-1{padding-left:35px!important}.s-table-double .s-table-double__tree-level-2{padding-left:59px!important}.s-table-double .s-table-double__tree-level-3{padding-left:83px!important}.s-table-double .s-table-double__tree-level-4{padding-left:107px!important}.s-table-double .s-table-double__tree-level-5{padding-left:131px!important}.s-table-double .s-table-double__tree-level-6{padding-left:155px!important}.s-table-double .s-table-double__tree-level-7{padding-left:179px!important}.s-table-double .s-table-double__tree-level-8{padding-left:203px!important}.s-table-double .s-table-double__tree-level-9{padding-left:227px!important}.s-table-double .s-table-double__tree-level-10{padding-left:251px!important}.s-table-double .s-table-double__tree-level-11{padding-left:275px!important}.s-table-double .s-table-double__tree-level-12{padding-left:299px!important}.s-table-double .s-table-double__tree-level-13{padding-left:323px!important}.s-table-double .s-table-double__tree-level-14{padding-left:347px!important}.s-table-double .s-table-double__tree-level-15{padding-left:371px!important}.s-table-double .s-table-double__tree-level-16{padding-left:395px!important}.s-table-double .s-table-double__tree-level-17{padding-left:419px!important}.s-table-double .s-table-double__tree-level-18{padding-left:443px!important}.s-table-double .s-table-double__tree-level-19{padding-left:467px!important}.s-table-double .s-table-double__tree-level-20{padding-left:491px!important}.s-table-double__tree-toggle{cursor:pointer;transition:transform .2s ease;display:inline-flex;align-items:center;justify-content:center;color:var(--neutrals-600);font-size:1.25rem}.s-table-double__tree-toggle:hover{color:var(--primary-600)}.s-table-double__tree-toggle--expanded{transform:rotate(90deg)}.s-table-double__tree-spacer{display:inline-block;width:24px}.s-table-double__tree-name{margin-left:.25rem;white-space:nowrap;cursor:pointer;flex:1}.s-table-double .s-table-double__drag{display:flex;justify-content:space-between;color:var(--primary-600)}.s-table-double__order-actions{width:1px;white-space:nowrap}\n"] }]
|
|
368
|
+
], encapsulation: ViewEncapsulation.None, template: "<div class=\"s-table-double\" [id]=\"id\">\n <div class=\"s-table-double__header\"></div>\n <div class=\"s-table-double__body\">\n <div class=\"s-table-double__body__left\">\n <s-table-complete [config]=\"config.tableLeftConfig\" (actionEvent)=\"action(true)\"\n (bottomStatusBarEvent)=\"bottomStatusBarChange($event, true)\" (checkAllEvent)=\"checkAllEvent($event, true)\"\n (deleteEvent)=\"delete(true)\" (emptyEvent)=\"empty(true)\" (filterEvent)=\"filter($event, true)\"\n (multiSelectEvent)=\"multiSelect($event, true)\" (orderByEvent)=\"orderBy($event, true)\"\n (pageEvent)=\"page($event, true)\" (paginationEvent)=\"paginationEmitter($event, true)\"\n (pillButtonEvent)=\"pillButton(true)\" (scrollEvent)=\"onScroll(true)\" (searchEvent)=\"search($event, true)\">\n @if (config.dragAndDrop) {\n @for (item of config.tableLeftItems; track $index) {\n <div class=\"s-table-double__list\">\n <s-list [size]=\"'xs'\" [attr.data-item-id]=\"item.id\" [draggable]=\"true\" [id]=\"id + '-listLeft-' + item.id\"\n [selected]=\"item.checked\" (dragstart)=\"onDragStart($event, item.id)\"\n (dragover)=\"onDragOver($event, item.id)\" (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item.id, true)\" (click)=\"selectItem(item.id, true)\">\n <div class=\"s-table-double__drag\">\n <h5 class=\"ml-2\">{{ item.name }}</h5>\n @if (item.iconAction) {\n <div class=\"s-table-double__drag-icon\">\n <s-icon-mat (click)=\"iconAction(item.id, true)\">{{ item.iconAction }}</s-icon-mat>\n </div>\n }\n </div>\n </s-list>\n </div>\n }\n } @else {\n @for (item of config.tableLeftItems; track $index) {\n <tr [ngClass]=\"{\n active: !config.disableLeftRowSelection && config.isTreeMode && item.selected,\n }\" (click)=\"!config.disableLeftRowSelection && config.isTreeMode && rowClick(item, true)\">\n <td (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" [id]=\"id + '-checkboxLeft-' + item.id\" [(ngModel)]=\"item.checked\"\n (change)=\"changeCheckbox()\" />\n </td>\n @for (column of config.tableLeftConfig.columns; track column) {\n @if (column.id !== 'checkbox' && column.id !== undefined) {\n <td [id]=\"id + '-itemLeft-' + item.id\">{{ item[column.id] }}</td>\n }\n }\n </tr>\n }\n }\n </s-table-complete>\n </div>\n <div class=\"s-table-double__body__middle\">\n <div>\n <s-button [id]=\"id + '-addButton'\" (click)=\"addItem()\" (keydown.enter)=\"addItem()\" position=\"normal\"\n [disabled]=\"disabledButtonLeft()\" [pill]=\"true\"><s-icon-mat><span class=\"material-symbols-outlined\">\n {{ config.additionButton ? 'add' : 'arrow_forward' }}\n </span></s-icon-mat></s-button>\n </div>\n <div>\n <s-button [id]=\"id + '-removeButton'\" (click)=\"removeItem()\" (keydown.enter)=\"removeItem()\" position=\"normal\"\n type=\"secondary\" [disabled]=\"disabledButtonRight()\" [pill]=\"true\"><s-icon-mat><span\n class=\"material-symbols-outlined\">\n {{ config.additionButton ? 'remove' : 'arrow_back' }}\n </span></s-icon-mat></s-button>\n </div>\n </div>\n <div class=\"s-table-double__body__right\">\n <s-table-complete [config]=\"config.tableRightConfig\" (actionEvent)=\"action(false)\"\n (bottomStatusBarEvent)=\"bottomStatusBarChange($event, false)\" (checkAllEvent)=\"checkAllEvent($event, false)\"\n (deleteEvent)=\"delete(false)\" (emptyEvent)=\"empty(false)\" (filterEvent)=\"filter($event, false)\"\n (multiSelectEvent)=\"multiSelect($event, false)\" (orderByEvent)=\"orderBy($event, false)\"\n (pageEvent)=\"page($event, false)\" (paginationEvent)=\"paginationEmitter($event, false)\"\n (pillButtonEvent)=\"pillButton(false)\" (scrollEvent)=\"onScroll(false)\" (searchEvent)=\"search($event, false)\">\n @if (config.dragAndDrop) {\n @for (item of config.tableRightItems; track $index) {\n <div class=\"s-table-double__list\">\n <s-list [size]=\"'xs'\" [id]=\"id + '-listRight-' + item.id\" [attr.data-item-id]=\"item.id\" [draggable]=\"true\"\n [selected]=\"item.checked\" (dragstart)=\"onDragStart($event, item.id)\"\n (dragover)=\"onDragOver($event, item.id)\" (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item.id, false)\" (click)=\"selectItem(item.id, false)\">\n <div class=\"s-table-double__drag\">\n <h5 class=\"ml-2\">{{ item.name }}</h5>\n @if (item.iconAction) {\n <div class=\"s-table-double__drag-icon\">\n <s-icon-mat (click)=\"iconAction(item.id, false)\">{{ item.iconAction }}</s-icon-mat>\n </div>\n }\n </div>\n </s-list>\n </div>\n }\n } @else {\n @for (item of config.tableRightItems; track $index) {\n <tr [ngClass]=\"{ active: config.isTreeMode && item.selected }\"\n (click)=\"config.isTreeMode && rowClick(item, false)\">\n <td class=\"s-table-double__tree-cell\" [class.s-table-double__tree-cell--tree]=\"config.isTreeMode\"\n [attr.colspan]=\"config.isTreeMode ? getTreeCellColspan() : null\">\n <div class=\"s-table-double__tree-cell-content\" [ngClass]=\"getTreeLevelClass(item)\">\n @if (config.isTreeMode && item.hasChildren) {\n <s-icon-mat class=\"s-table-double__tree-toggle\"\n [class.s-table-double__tree-toggle--expanded]=\"item.expanded\" (click)=\"toggleExpand($event, item.id)\">\n <span class=\"material-symbols-outlined\">chevron_right</span>\n </s-icon-mat>\n } @else if (config.isTreeMode) {\n <span class=\"s-table-double__tree-spacer\"></span>\n }\n <input type=\"checkbox\" [id]=\"id + '-checkboxRight-' + item.id\" [(ngModel)]=\"item.checked\"\n (click)=\"$event.stopPropagation()\" (change)=\"changeCheckbox()\" />\n @if (config.isTreeMode) {\n <span class=\"s-table-double__tree-name\">{{ item.name }}</span>\n }\n </div>\n </td>\n @for (column of config.tableRightConfig.columns; track column) {\n @if (\n column.id !== 'checkbox' &&\n column.id !== undefined &&\n !(config.isTreeMode && column.id === 'name') &&\n column.id !== 'actions'\n ) {\n <td [id]=\"id + '-itemRight-' + item.id\" (click)=\"column.switchConfig && $event.stopPropagation()\">\n @if (column.switchConfig && item[column.id!] !== undefined) {\n <s-toggle-switch [config]=\"column.switchConfig\" [(ngModel)]=\"item[column.id!]\"\n (valueChange)=\"onSwitchChange($event, item.id, column.id!, false)\">\n </s-toggle-switch>\n } @else if (!column.switchConfig) {\n {{ item[column.id] }}\n }\n </td>\n }\n }\n @if (config.showOrderButtons) {\n <td class=\"s-table-double__order-actions\" (click)=\"$event.stopPropagation()\">\n <s-table-actions-buttons [tableActionsButtons]=\"getOrderButtons(item)\"\n (clickButtonEvent)=\"onOrderButtonClick($event, item.id)\">\n </s-table-actions-buttons>\n </td>\n }\n </tr>\n }\n }\n </s-table-complete>\n </div>\n </div>\n</div>", styles: [".s-table-double__body{display:flex;gap:.625rem}.s-table-double__body .s-tablet tr{cursor:pointer;-webkit-user-select:none;user-select:none}.s-table-double__body .s-tablet tr:hover{background-color:var(--primary-200)}.s-table-double__body .s-tablet tr.active{background-color:var(--neutrals-1100)}.s-table-double__body__left{flex:5}.s-table-double__body__middle{display:flex;flex-direction:column;gap:.625rem;justify-content:center;padding:1.25rem;background-color:var(--primary-100);border-radius:.5rem}.s-table-double__body__right{flex:5}.s-table-double__list{margin:.5rem .8rem}.s-table-double .s-table-double__tree-cell{padding-left:0!important}.s-table-double__tree-cell-content{display:flex;align-items:center;gap:.5rem}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__list{margin:.5rem}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag{display:flex;justify-content:space-between;width:100%}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag-icon{color:var(--primary-600)}.s-table-double .s-table-double__tree-cell.s-table-double__tree-cell--tree__drag-icon:hover{cursor:pointer;color:var(--secondary-600)}.s-table-double .s-table-double__tree-level-0{padding-left:11px!important}.s-table-double .s-table-double__tree-level-1{padding-left:35px!important}.s-table-double .s-table-double__tree-level-2{padding-left:59px!important}.s-table-double .s-table-double__tree-level-3{padding-left:83px!important}.s-table-double .s-table-double__tree-level-4{padding-left:107px!important}.s-table-double .s-table-double__tree-level-5{padding-left:131px!important}.s-table-double .s-table-double__tree-level-6{padding-left:155px!important}.s-table-double .s-table-double__tree-level-7{padding-left:179px!important}.s-table-double .s-table-double__tree-level-8{padding-left:203px!important}.s-table-double .s-table-double__tree-level-9{padding-left:227px!important}.s-table-double .s-table-double__tree-level-10{padding-left:251px!important}.s-table-double .s-table-double__tree-level-11{padding-left:275px!important}.s-table-double .s-table-double__tree-level-12{padding-left:299px!important}.s-table-double .s-table-double__tree-level-13{padding-left:323px!important}.s-table-double .s-table-double__tree-level-14{padding-left:347px!important}.s-table-double .s-table-double__tree-level-15{padding-left:371px!important}.s-table-double .s-table-double__tree-level-16{padding-left:395px!important}.s-table-double .s-table-double__tree-level-17{padding-left:419px!important}.s-table-double .s-table-double__tree-level-18{padding-left:443px!important}.s-table-double .s-table-double__tree-level-19{padding-left:467px!important}.s-table-double .s-table-double__tree-level-20{padding-left:491px!important}.s-table-double__tree-toggle{cursor:pointer;transition:transform .2s ease;display:inline-flex;align-items:center;justify-content:center;color:var(--neutrals-600);font-size:1.25rem}.s-table-double__tree-toggle:hover{color:var(--primary-600)}.s-table-double__tree-toggle--expanded{transform:rotate(90deg)}.s-table-double__tree-spacer{display:inline-block;width:24px}.s-table-double__tree-name{margin-left:.25rem;white-space:nowrap;cursor:pointer;flex:1}.s-table-double .s-table-double__drag{display:flex;justify-content:space-between;color:var(--primary-600)}.s-table-double__order-actions{width:1px;white-space:nowrap}\n"] }]
|
|
347
369
|
}], propDecorators: { config: [{
|
|
348
370
|
type: Input
|
|
349
371
|
}], actionPositionEvent: [{
|
|
@@ -384,5 +406,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
384
406
|
type: Output
|
|
385
407
|
}], switchChangeEvent: [{
|
|
386
408
|
type: Output
|
|
409
|
+
}], searchEvent: [{
|
|
410
|
+
type: Output
|
|
387
411
|
}] } });
|
|
388
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZG91YmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpZGVzeXMtZ2VuZXJpYy11aS9zcmMvbGliL3RhYmxlLWRvdWJsZS90YWJsZS1kb3VibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lkZXN5cy1nZW5lcmljLXVpL3NyYy9saWIvdGFibGUtZG91YmxlL3RhYmxlLWRvdWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04saUJBQWlCLEdBRWxCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQWdCdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFFMUcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7Ozs7Ozs7Ozs7QUFFcEcsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBbUIxQixNQUFNLE9BQU8scUJBQXFCO0lBakJsQztRQW1C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LGlCQUFpQixDQUFDLElBQUk7OEJBRzVCLE1BQU07c0JBQWQsS0FBSztnQkFDSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csNEJBQTRCO3NCQUFyQyxNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFFRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBzaWduYWwsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBXcml0YWJsZVNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTVGFibGVDb21wbGV0ZU1vZHVsZSB9IGZyb20gJy4uL3RhYmxlLWNvbXBsZXRlJztcbmltcG9ydCB7IFNCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9idXR0b24nO1xuaW1wb3J0IHsgU0ljb25NYXRlcmlhbE1vZHVsZSB9IGZyb20gJy4uL2ljb24tbWF0ZXJpYWwnO1xuaW1wb3J0IHsgU29ydFRhYmxlIH0gZnJvbSAnLi4vdGFibGUtdCc7XG5pbXBvcnQge1xuICBSZW9yZGVyRGlyZWN0aW9uLFxuICBTVGFibGVEb3VibGUsXG4gIFNUYWJsZURvdWJsZUFjdGlvbkV2ZW50LFxuICBTVGFibGVEb3VibGVCb29sZWFuRXZlbnQsXG4gIFNUYWJsZURvdWJsZUl0ZW0sXG4gIFNUYWJsZURvdWJsZU51bWJlckV2ZW50LFxuICBTVGFibGVEb3VibGVSZW9yZGVyRXZlbnQsXG4gIFNUYWJsZURvdWJsZVNvcnRFdmVudCxcbiAgU1RhYmxlRG91YmxlU3RyaW5nQXJyYXlFdmVudCxcbiAgU1RhYmxlRG91YmxlU3RyaW5nRXZlbnQsXG4gIFNUYWJsZURvdWJsZVN3aXRjaEV2ZW50LFxuICBTVGFibGVzRGF0YSxcbn0gZnJvbSAnLi90YWJsZS1kb3VibGUubW9kZWwnO1xuaW1wb3J0IHsgU1RvZ2dsZVN3aXRjaE1vZHVsZSB9IGZyb20gJy4uL3RvZ2dsZS1zd2l0Y2gnO1xuaW1wb3J0IHsgU1RyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBTTGlzdE1vZHVsZSB9IGZyb20gJy4uL2xpc3QnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb25zQnV0dG9uc01vZHVsZSB9IGZyb20gJy4uL3RhYmxlLXQvdGFibGUtYWN0aW9ucy1idXR0b25zL3RhYmxlLWFjdGlvbnMtYnV0dG9ucy5tb2R1bGUnO1xuaW1wb3J0IHsgQWN0aW9uQnV0dG9uIH0gZnJvbSAnLi4vdGFibGUtdC90YWJsZS1hY3Rpb25zLWJ1dHRvbnMvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBY3Rpb25zQnV0dG9uc1R5cGUgfSBmcm9tICcuLi90YWJsZS10L3RhYmxlLWFjdGlvbnMtYnV0dG9ucy9lbnVtcy9BY3Rpb25zQnV0dG9uc1R5cGUuZW51bSc7XG5cbmNvbnN0IE1BWF9UUkVFX0xFVkVMID0gMjA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3MtdGFibGUtZG91YmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBTVGFibGVDb21wbGV0ZU1vZHVsZSxcbiAgICBTQnV0dG9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFNJY29uTWF0ZXJpYWxNb2R1bGUsXG4gICAgU0xpc3RNb2R1bGUsXG4gICAgVGFibGVBY3Rpb25zQnV0dG9uc01vZHVsZSxcbiAgICBTVG9nZ2xlU3dpdGNoTW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtZG91YmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3RhYmxlLWRvdWJsZS5jb21wb25lbnQuc2NzcycsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNUYWJsZURvdWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IFNUYWJsZURvdWJsZTtcbiAgQE91dHB1dCgpIGFjdGlvblBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBib3R0b21TdGF0dXNCYXJQb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVCb29sZWFuRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjaGVja0FsbFBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZUJvb2xlYW5FdmVudD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBlbXB0eVBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBldmVudFVwZGF0ZVRhYmxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8U1RhYmxlc0RhdGE+KCk7XG4gIEBPdXRwdXQoKSBmaWx0ZXJQb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVTdHJpbmdBcnJheUV2ZW50PigpO1xuICBAT3V0cHV0KCkgbXVsdGlTZWxlY3RQb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVTdHJpbmdBcnJheUV2ZW50PigpO1xuICBAT3V0cHV0KCkgb3JkZXJCeVBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZVNvcnRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHBhZ2VQb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVOdW1iZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIHBhZ2luYXRpb25Qb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVOdW1iZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIHBpbGxCdXR0b25Qb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgc2Nyb2xsUG9zaXRpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdFBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZVN0cmluZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgcm93U2VsZWN0UG9zaXRpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpc0xlZnRUYWJsZTogYm9vbGVhbjsgdmFsdWU6IGFueSB9PigpO1xuICBAT3V0cHV0KCkgYWN0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZUFjdGlvbkV2ZW50PigpO1xuICBAT3V0cHV0KCkgdG9nZ2xlRXhwYW5kRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgaWQhOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSByZW9yZGVySXRlbUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVSZW9yZGVyRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBzd2l0Y2hDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8U1RhYmxlRG91YmxlU3dpdGNoRXZlbnQ+KCk7XG5cbiAgZGlzYWJsZWRCdXR0b25MZWZ0ID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICBkaXNhYmxlZEJ1dHRvblJpZ2h0ID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICBpdGVtc1RhYmxlTGVmdDogYW55W10gPSBbXTtcbiAgaXRlbXNUYWJsZVJpZ2h0RGF0YTogYW55W10gPSBbXTtcblxuICBkcmFnSXRlbUlkITogc3RyaW5nIHwgbnVsbDtcbiAgZHJhZ092ZXJJdGVtSWQhOiBzdHJpbmcgfCBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NUcmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFNUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQgPz8gYHMtdGFibGUtZG91YmxlYDtcbiAgICB0aGlzLmNsb25lSXRlbXNUYWJsZXMoKTtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnRhYmxlTGVmdENvbmZpZy5lbXB0eUNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcudGFibGVMZWZ0Q29uZmlnLmVtcHR5Q29uZmlnID0ge1xuICAgICAgICBpbWFnZTogJ2Fzc2V0cy9lbXB0eS9lbXB0eS5wbmcnLFxuICAgICAgICB0aXRsZTogdGhpcy5fc1RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndWkudGFibGVEb3VibGUuZW1wdHlUaXRsZUxlZnQnKSwgLy8nTm8gaGF5IGVsZW1lbnRvcyBkaXNwb25pYmxlcycsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY29uZmlnLnRhYmxlUmlnaHRDb25maWcuZW1wdHlDb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLnRhYmxlUmlnaHRDb25maWcuZW1wdHlDb25maWcgPSB7XG4gICAgICAgIGRldGFpbDogdGhpcy5fc1RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndWkudGFibGVEb3VibGUuZW1wdHlEZXRhaWxSaWdodCcpLCAvLydTZWxlY2Npb25lIGxvcyDDrXRlbXMgZGVzZWFkb3MgeSBsdWVnbyBoYWdhIGNsaWMgZW4gZWwgYm90w7NuIGRlIGxhIGNvbHVtbmEgY2VudHJhbC4nLFxuICAgICAgICBpbWFnZTogJ2Fzc2V0cy9lbXB0eS9lbXB0eS5wbmcnLFxuICAgICAgICB0aXRsZTogdGhpcy5fc1RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndWkudGFibGVEb3VibGUuZW1wdHlUaXRsZVJpZ2h0JyksIC8vJ05vIGhheSBlbGVtZW50b3MgYWdyZWdhZG9zJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCwgaXRlbUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRyYWdJdGVtSWQgPSBpdGVtSWQ7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREYXRhKCd0ZXh0L3BsYWluJywgJycpOyAvLyBOZWNlc2FyaW8gcGFyYSBoYWJpbGl0YXIgZWwgYXJyYXN0cmUgZW4gYWxndW5vcyBuYXZlZ2Fkb3Jlc1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50LCBpdGVtSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRyYWdJdGVtSWQgPT09IG51bGwgfHwgdGhpcy5kcmFnSXRlbUlkID09PSBpdGVtSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kcmFnT3Zlckl0ZW1JZCA9IGl0ZW1JZDtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIHRoaXMuZHJhZ092ZXJJdGVtSWQgPSBudWxsO1xuICB9XG5cbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQsIGl0ZW1JZDogc3RyaW5nLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmRyYWdJdGVtSWQgPT09IG51bGwgfHwgdGhpcy5kcmFnSXRlbUlkID09PSBpdGVtSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW9yZGVuYXIgbG9zIGVsZW1lbnRvc1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpc0xlZnRUYWJsZSk7XG4gICAgY29uc3QgZHJhZ0luZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiB7IGlkOiBzdHJpbmcgfSkgPT4gaXRlbS5pZCA9PT0gdGhpcy5kcmFnSXRlbUlkKTtcbiAgICBjb25zdCBkcm9wSW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IHsgaWQ6IHN0cmluZyB9KSA9PiBpdGVtLmlkID09PSBpdGVtSWQpO1xuICAgIGlmIChkcmFnSW5kZXggIT09IC0xICYmIGRyb3BJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGRyYWdnZWRJdGVtID0gaXRlbXNbZHJhZ0luZGV4XTtcbiAgICAgIGl0ZW1zLnNwbGljZShkcmFnSW5kZXgsIDEpO1xuICAgICAgaXRlbXMuc3BsaWNlKGRyb3BJbmRleCwgMCwgZHJhZ2dlZEl0ZW0pO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ0l0ZW1JZCA9IG51bGw7XG4gICAgdGhpcy5kcmFnT3Zlckl0ZW1JZCA9IG51bGw7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmV2ZW50VXBkYXRlVGFibGVzRW1pdCgpO1xuICB9XG5cbiAgaWNvbkFjdGlvbihpdGVtSWQ6IHN0cmluZywgaXNMZWZ0VGFibGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXNMZWZ0VGFibGUpO1xuICAgIGNvbnN0IGl0ZW0gPSBpdGVtcy5maW5kKChpdGVtOiB7IGlkOiBzdHJpbmcgfSkgPT4gaXRlbS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbSkgdGhpcy5hY3Rpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIGlkOiBpdGVtSWQgfSk7XG4gIH1cblxuICBzZWxlY3RJdGVtKGl0ZW1JZDogc3RyaW5nLCBpc0xlZnRUYWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpc0xlZnRUYWJsZSk7XG4gICAgY29uc3QgaXRlbUluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiB7IGlkOiBzdHJpbmcgfSkgPT4gaXRlbS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbUluZGV4ICE9PSAtMSkge1xuICAgICAgaXRlbXNbaXRlbUluZGV4XS5jaGVja2VkID0gIWl0ZW1zW2l0ZW1JbmRleF0uY2hlY2tlZDtcbiAgICAgIHRoaXMudXBkYXRlQ291bnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lSXRlbXNUYWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtc1RhYmxlTGVmdCA9IFsuLi50aGlzLmNvbmZpZy50YWJsZUxlZnRJdGVtc107XG4gICAgdGhpcy5pdGVtc1RhYmxlUmlnaHREYXRhID0gWy4uLnRoaXMuY29uZmlnLnRhYmxlUmlnaHRJdGVtc107XG4gIH1cblxuICBtb3ZlSXRlbXMoaXNMZWZ0VGFibGVTb3VyY2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5nZXRJdGVtcyhpc0xlZnRUYWJsZVNvdXJjZSk7XG4gICAgY29uc3QgdGFyZ2V0RGF0YSA9IHRoaXMuZ2V0SXRlbXMoIWlzTGVmdFRhYmxlU291cmNlKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsU291cmNlRGF0YSA9IGlzTGVmdFRhYmxlU291cmNlID8gdGhpcy5pdGVtc1RhYmxlTGVmdCA6IHRoaXMuaXRlbXNUYWJsZVJpZ2h0RGF0YTtcbiAgICBjb25zdCBvcmlnaW5hbFRhcmdldERhdGEgPSBpc0xlZnRUYWJsZVNvdXJjZSA/IHRoaXMuaXRlbXNUYWJsZVJpZ2h0RGF0YSA6IHRoaXMuaXRlbXNUYWJsZUxlZnQ7XG5cbiAgICBjb25zdCBoYXNJdGVtU2VsZWN0aW9uID0gc291cmNlRGF0YS5zb21lKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHNvdXJjZURhdGFcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiAoaGFzSXRlbVNlbGVjdGlvbiA/IGl0ZW0uc2VsZWN0ZWQgOiBpdGVtLmNoZWNrZWQpKVxuICAgICAgLm1hcChpdGVtID0+ICh7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICB9KSk7XG5cbiAgICB0YXJnZXREYXRhLnB1c2goLi4uc2VsZWN0ZWRJdGVtcyk7XG4gICAgdGhpcy5zZXRJdGVtcyhcbiAgICAgIGlzTGVmdFRhYmxlU291cmNlLFxuICAgICAgc291cmNlRGF0YS5maWx0ZXIoaXRlbSA9PiAoaGFzSXRlbVNlbGVjdGlvbiA/ICFpdGVtLnNlbGVjdGVkIDogIWl0ZW0uY2hlY2tlZCkpXG4gICAgKTtcblxuICAgIG9yaWdpbmFsVGFyZ2V0RGF0YS5wdXNoKC4uLnNlbGVjdGVkSXRlbXMpO1xuICAgIGNvbnN0IGZpbHRlcmVkT3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbFNvdXJjZURhdGEuZmlsdGVyKFxuICAgICAgaXRlbSA9PiAhc2VsZWN0ZWRJdGVtcy5zb21lKHNlbCA9PiBzZWwubmFtZSA9PT0gaXRlbS5uYW1lKVxuICAgICk7XG4gICAgaWYgKGlzTGVmdFRhYmxlU291cmNlKSB7XG4gICAgICB0aGlzLml0ZW1zVGFibGVMZWZ0ID0gZmlsdGVyZWRPcmlnaW5hbFNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pdGVtc1RhYmxlUmlnaHREYXRhID0gZmlsdGVyZWRPcmlnaW5hbFNvdXJjZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0NvbHVtblJpZ2h0ID0gdGhpcy5jb25maWcudGFibGVSaWdodENvbmZpZy5jb2x1bW5zWzBdPy5jaGVja2JveFZhbHVlO1xuICAgIGNvbnN0IGNoZWNrQ29sdW1uTGVmdCA9IHRoaXMuY29uZmlnLnRhYmxlTGVmdENvbmZpZy5jb2x1bW5zWzBdPy5jaGVja2JveFZhbHVlO1xuXG4gICAgaWYgKGNoZWNrQ29sdW1uUmlnaHQpIHRoaXMuY29uZmlnLnRhYmxlUmlnaHRDb25maWcuY29sdW1uc1swXS5jaGVja2JveFZhbHVlID0gZmFsc2U7XG4gICAgaWYgKGNoZWNrQ29sdW1uTGVmdCkgdGhpcy5jb25maWcudGFibGVMZWZ0Q29uZmlnLmNvbHVtbnNbMF0uY2hlY2tib3hWYWx1ZSA9IGZhbHNlO1xuICAgIHRoaXMuY29uZmlnLnRhYmxlTGVmdENvbmZpZy50b3RhbEl0ZW1zID0gdGhpcy5jb25maWcudGFibGVMZWZ0SXRlbXMubGVuZ3RoO1xuICAgIHRoaXMuY29uZmlnLnRhYmxlUmlnaHRDb25maWcudG90YWxJdGVtcyA9IHRoaXMuY29uZmlnLnRhYmxlUmlnaHRJdGVtcy5sZW5ndGg7XG4gICAgdGhpcy5ldmVudFVwZGF0ZVRhYmxlc0VtaXQoKTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcbiAgfVxuXG4gIGV2ZW50VXBkYXRlVGFibGVzRW1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50VXBkYXRlVGFibGVzLmVtaXQoe1xuICAgICAgdGFibGVMZWZ0SXRlbXM6IHRoaXMuY29uZmlnLnRhYmxlTGVmdEl0ZW1zLFxuICAgICAgdGFibGVSaWdodEl0ZW1zOiB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXMsXG4gICAgfSk7XG4gIH1cblxuICBhZGRJdGVtKCk6IHZvaWQge1xuICAgIHRoaXMubW92ZUl0ZW1zKHRydWUpO1xuICAgIHRoaXMuY2xvbmVJdGVtc1RhYmxlcygpO1xuICB9XG5cbiAgcmVtb3ZlSXRlbSgpOiB2b2lkIHtcbiAgICB0aGlzLm1vdmVJdGVtcyhmYWxzZSk7XG4gICAgdGhpcy5jbG9uZUl0ZW1zVGFibGVzKCk7XG4gIH1cblxuICBhY3Rpb24oaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFjdGlvblBvc2l0aW9uRXZlbnQuZW1pdChpc0xlZnRUYWJsZSk7XG4gIH1cblxuICBkZWxldGUoaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRlbGV0ZVBvc2l0aW9uRXZlbnQuZW1pdChpc0xlZnRUYWJsZSk7XG4gIH1cblxuICBlbXB0eShpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuZW1wdHlQb3NpdGlvbkV2ZW50LmVtaXQoaXNMZWZ0VGFibGUpO1xuICB9XG5cbiAgb3JkZXJCeShldmVudDogU29ydFRhYmxlLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMub3JkZXJCeVBvc2l0aW9uRXZlbnQuZW1pdCh7IGlzTGVmdFRhYmxlLCB2YWx1ZTogZXZlbnQgfSk7XG4gIH1cblxuICBwYWdlKGV2ZW50OiBudW1iZXIsIGlzTGVmdFRhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYWdlUG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBldmVudCB9KTtcbiAgfVxuXG4gIHBhZ2luYXRpb25FbWl0dGVyKGV2ZW50OiBudW1iZXIsIGlzTGVmdFRhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBldmVudCB9KTtcbiAgfVxuXG4gIHNlbGVjdChldmVudDogc3RyaW5nLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0UG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBldmVudCB9KTtcbiAgfVxuXG4gIHBpbGxCdXR0b24oaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnBpbGxCdXR0b25Qb3NpdGlvbkV2ZW50LmVtaXQoaXNMZWZ0VGFibGUpO1xuICB9XG5cbiAgZmlsdGVyKGV2ZW50OiBzdHJpbmdbXSwgaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmZpbHRlclBvc2l0aW9uRXZlbnQuZW1pdCh7IGlzTGVmdFRhYmxlLCB2YWx1ZTogZXZlbnQgfSk7XG4gIH1cblxuICBtdWx0aVNlbGVjdChldmVudDogc3RyaW5nW10sIGlzTGVmdFRhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5tdWx0aVNlbGVjdFBvc2l0aW9uRXZlbnQuZW1pdCh7IGlzTGVmdFRhYmxlLCB2YWx1ZTogZXZlbnQgfSk7XG4gIH1cblxuICBjaGVja0FsbEV2ZW50KGV2ZW50OiBib29sZWFuLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpc0xlZnRUYWJsZSk7XG4gICAgdGhpcy5zZXRJdGVtcyhcbiAgICAgIGlzTGVmdFRhYmxlLFxuICAgICAgaXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgY2hlY2tlZDogZXZlbnQsXG4gICAgICB9KSlcbiAgICApO1xuICAgIHRoaXMudXBkYXRlQ291bnRlcigpO1xuICB9XG5cbiAgb25TY3JvbGwoaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNjcm9sbFBvc2l0aW9uRXZlbnQuZW1pdChpc0xlZnRUYWJsZSk7XG4gIH1cblxuICBjaGFuZ2VDaGVja2JveCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0Q29uZmlnLmNvbHVtbnNbMF0uY2hlY2tib3hWYWx1ZSA9XG4gICAgICB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXMuZXZlcnkoaXRlbSA9PiBpdGVtLmNoZWNrZWQpO1xuXG4gICAgdGhpcy5jb25maWcudGFibGVMZWZ0Q29uZmlnLmNvbHVtbnNbMF0uY2hlY2tib3hWYWx1ZSA9XG4gICAgICB0aGlzLmNvbmZpZy50YWJsZUxlZnRJdGVtcy5sZW5ndGggPiAwICYmIHRoaXMuY29uZmlnLnRhYmxlTGVmdEl0ZW1zLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5jaGVja2VkKTtcblxuICAgIHRoaXMudXBkYXRlQ291bnRlcigpO1xuICB9XG5cbiAgYm90dG9tU3RhdHVzQmFyQ2hhbmdlKHN0YXRlOiBib29sZWFuLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuYm90dG9tU3RhdHVzQmFyUG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBzdGF0ZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcbiAgfVxuXG4gIHNlYXJjaChldmVudDogc3RyaW5nLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG9yaWdpbmFsID0gaXNMZWZ0VGFibGUgPyB0aGlzLml0ZW1zVGFibGVMZWZ0IDogdGhpcy5pdGVtc1RhYmxlUmlnaHREYXRhO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5nZXRGaWx0ZXJlZEl0ZW1zKG9yaWdpbmFsLCBldmVudCk7XG5cbiAgICBpZiAoaXNMZWZ0VGFibGUpIHtcbiAgICAgIHRoaXMuY29uZmlnLnRhYmxlTGVmdEl0ZW1zID0gZmlsdGVyZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLnRhYmxlUmlnaHRJdGVtcyA9IGZpbHRlcmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWRJdGVtcyhvcmlnaW5hbDogYW55W10sIHNlYXJjaFRlcm06IHN0cmluZyk6IGFueVtdIHtcbiAgICBjb25zdCB0ZXJtID0gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBpZiAoIXRlcm0pIHJldHVybiBbLi4ub3JpZ2luYWxdO1xuXG4gICAgcmV0dXJuIG9yaWdpbmFsLmZpbHRlcihpdGVtID0+IE9iamVjdC52YWx1ZXMoaXRlbSkuc29tZSh2YWx1ZSA9PiBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ291bnRlcigpIHtcbiAgICBjb25zdCB1cGRhdGVTdGF0dXNCYXIgPSAoXG4gICAgICBpdGVtczogYW55W10sXG4gICAgICBjb25maWc6IHsgY29uZmlnQm90dG9tU3RhdHVzQmFyPzogV3JpdGFibGVTaWduYWw8YW55PiB9LFxuICAgICAgc2V0dGVyOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPlxuICAgICkgPT4ge1xuICAgICAgY29uc3QgY291bnRlckNoZWNrYm94ID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5jaGVja2VkKS5sZW5ndGg7XG4gICAgICBjb25zdCBjb3VudGVySXRlbSA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uc2VsZWN0ZWQpLmxlbmd0aDtcbiAgICAgIGNvbnN0IGNvdW50ZXIgPSBNYXRoLm1heChjb3VudGVyQ2hlY2tib3gsIGNvdW50ZXJJdGVtKTtcblxuICAgICAgY29uZmlnLmNvbmZpZ0JvdHRvbVN0YXR1c0JhciA9IHNpZ25hbCh7XG4gICAgICAgIC4uLmNvbmZpZy5jb25maWdCb3R0b21TdGF0dXNCYXI/LigpLFxuICAgICAgICBjb3VudGVyLFxuICAgICAgICBkaXNhYmxlZDogaXRlbXMubGVuZ3RoID09PSAwLFxuICAgICAgICB0b3RhbDogaXRlbXMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgICAvLyBIYWJpbGl0YXIgYm90w7NuIHNpIGhheSBpdGVtcyBzZWxlY2Npb25hZG9zIChwb3IgY2hlY2tib3ggTyBwb3IgaXRlbSlcbiAgICAgIHNldHRlci5zZXQoY291bnRlckNoZWNrYm94ID09PSAwICYmIGNvdW50ZXJJdGVtID09PSAwKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlU3RhdHVzQmFyKHRoaXMuY29uZmlnLnRhYmxlTGVmdEl0ZW1zLCB0aGlzLmNvbmZpZy50YWJsZUxlZnRDb25maWcsIHRoaXMuZGlzYWJsZWRCdXR0b25MZWZ0KTtcbiAgICB1cGRhdGVTdGF0dXNCYXIodGhpcy5jb25maWcudGFibGVSaWdodEl0ZW1zLCB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0Q29uZmlnLCB0aGlzLmRpc2FibGVkQnV0dG9uUmlnaHQpO1xuICB9XG5cbiAgZ2V0VHJlZUNlbGxDb2xzcGFuKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRhYmxlUmlnaHRDb25maWcuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmlkID09PSAnY2hlY2tib3gnIHx8IGMuaWQgPT09ICduYW1lJykubGVuZ3RoO1xuICB9XG5cbiAgZ2V0VHJlZUxldmVsQ2xhc3MoaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzVHJlZU1vZGUgfHwgIWl0ZW0ubGV2ZWwpIHtcbiAgICAgIHJldHVybiAncy10YWJsZS1kb3VibGVfX3RyZWUtbGV2ZWwtMCc7XG4gICAgfVxuICAgIGNvbnN0IGxldmVsID0gTWF0aC5taW4oaXRlbS5sZXZlbCwgTUFYX1RSRUVfTEVWRUwpO1xuICAgIHJldHVybiBgcy10YWJsZS1kb3VibGVfX3RyZWUtbGV2ZWwtJHtsZXZlbH1gO1xuICB9XG5cbiAgdG9nZ2xlRXhwYW5kKGV2ZW50OiBFdmVudCwgaXRlbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnRvZ2dsZUV4cGFuZEV2ZW50LmVtaXQoaXRlbUlkKTtcbiAgfVxuXG4gIHJvd0NsaWNrKGl0ZW06IGFueSwgaXNMZWZ0VGFibGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaXNMZWZ0VGFibGUgJiYgdGhpcy5jb25maWcuZGlzYWJsZUxlZnRSb3dTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc0xlZnRUYWJsZSkge1xuICAgICAgdGhpcy5jb25maWcudGFibGVSaWdodEl0ZW1zLmZvckVhY2goaSA9PiB7XG4gICAgICAgIGkuc2VsZWN0ZWQgPSBpLmlkID09PSBpdGVtLmlkID8gIWkuc2VsZWN0ZWQgOiBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtLnNlbGVjdGVkID0gIWl0ZW0uc2VsZWN0ZWQ7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ291bnRlcigpO1xuICAgIHRoaXMucm93U2VsZWN0UG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBpdGVtIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJdGVtcyhpc0xlZnRUYWJsZTogYm9vbGVhbik6IFNUYWJsZURvdWJsZUl0ZW1bXSB7XG4gICAgcmV0dXJuIGlzTGVmdFRhYmxlID8gdGhpcy5jb25maWcudGFibGVMZWZ0SXRlbXMgOiB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXM7XG4gIH1cblxuICBwcml2YXRlIHNldEl0ZW1zKGlzTGVmdFRhYmxlOiBib29sZWFuLCBpdGVtczogU1RhYmxlRG91YmxlSXRlbVtdKTogdm9pZCB7XG4gICAgaWYgKGlzTGVmdFRhYmxlKSB7XG4gICAgICB0aGlzLmNvbmZpZy50YWJsZUxlZnRJdGVtcyA9IGl0ZW1zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXMgPSBpdGVtcztcbiAgICB9XG4gIH1cblxuICBnZXRPcmRlckJ1dHRvbnMoaXRlbTogYW55KTogQWN0aW9uQnV0dG9uW10ge1xuICAgIGNvbnN0IGlzRmlyc3QgPSAhIWl0ZW0uX19pc0ZpcnN0U2libGluZztcbiAgICBjb25zdCBpc0xhc3QgPSAhIWl0ZW0uX19pc0xhc3RTaWJsaW5nO1xuXG4gICAgaWYgKFxuICAgICAgaXRlbS5fX29yZGVyQnV0dG9ucyAmJlxuICAgICAgaXRlbS5fX29yZGVyQnV0dG9uc1swXS5kaXNhYmxlZCA9PT0gaXNGaXJzdCAmJlxuICAgICAgaXRlbS5fX29yZGVyQnV0dG9uc1syXS5kaXNhYmxlZCA9PT0gaXNMYXN0XG4gICAgKSB7XG4gICAgICByZXR1cm4gaXRlbS5fX29yZGVyQnV0dG9ucztcbiAgICB9XG5cbiAgICBpdGVtLl9fb3JkZXJCdXR0b25zID0gW1xuICAgICAge1xuICAgICAgICB0eXBlOiBBY3Rpb25zQnV0dG9uc1R5cGUuRE9VQkxFX0FSUk9XX1VQLFxuICAgICAgICB0b29sdGlwOiB0aGlzLl9zVHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5nZW5lcmljLmZpcnN0JyksXG4gICAgICAgIGRpc2FibGVkOiBpc0ZpcnN0LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogQWN0aW9uc0J1dHRvbnNUeXBlLkFSUk9XX1VQLFxuICAgICAgICB0b29sdGlwOiB0aGlzLl9zVHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5nZW5lcmljLnVwJyksXG4gICAgICAgIGRpc2FibGVkOiBpc0ZpcnN0LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogQWN0aW9uc0J1dHRvbnNUeXBlLkFSUk9XX0RPV04sXG4gICAgICAgIHRvb2x0aXA6IHRoaXMuX3NUcmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3VpLmdlbmVyaWMuZG93bicpLFxuICAgICAgICBkaXNhYmxlZDogaXNMYXN0LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogQWN0aW9uc0J1dHRvbnNUeXBlLkRPVUJMRV9BUlJPV19ET1dOLFxuICAgICAgICB0b29sdGlwOiB0aGlzLl9zVHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5nZW5lcmljLmxhc3QnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGlzTGFzdCxcbiAgICAgIH0sXG4gICAgXTtcbiAgICByZXR1cm4gaXRlbS5fX29yZGVyQnV0dG9ucztcbiAgfVxuXG4gIG9uT3JkZXJCdXR0b25DbGljayh0eXBlOiBzdHJpbmcsIGl0ZW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZW9yZGVySXRlbUV2ZW50LmVtaXQoeyBpdGVtSWQsIGRpcmVjdGlvbjogdHlwZSBhcyBSZW9yZGVyRGlyZWN0aW9uIH0pO1xuICB9XG5cbiAgb25Td2l0Y2hDaGFuZ2UodmFsdWU6IGJvb2xlYW4sIGl0ZW1JZDogc3RyaW5nLCBjb2x1bW5JZDogc3RyaW5nLCBpc0xlZnRUYWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpc0xlZnRUYWJsZSk7XG4gICAgY29uc3QgaXRlbSA9IGl0ZW1zLmZpbmQoaSA9PiBpLmlkID09PSBpdGVtSWQpO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBpdGVtW2NvbHVtbklkXSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLnN3aXRjaENoYW5nZUV2ZW50LmVtaXQoeyBpc0xlZnRUYWJsZSwgaXRlbUlkLCBjb2x1bW5JZCwgdmFsdWUgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzLXRhYmxlLWRvdWJsZVwiIFtpZF09XCJpZFwiPlxuICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2hlYWRlclwiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2JvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2JvZHlfX2xlZnRcIj5cbiAgICAgIDxzLXRhYmxlLWNvbXBsZXRlXG4gICAgICAgIFtjb25maWddPVwiY29uZmlnLnRhYmxlTGVmdENvbmZpZ1wiXG4gICAgICAgIChhY3Rpb25FdmVudCk9XCJhY3Rpb24odHJ1ZSlcIlxuICAgICAgICAoYm90dG9tU3RhdHVzQmFyRXZlbnQpPVwiYm90dG9tU3RhdHVzQmFyQ2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAoY2hlY2tBbGxFdmVudCk9XCJjaGVja0FsbEV2ZW50KCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAoZGVsZXRlRXZlbnQpPVwiZGVsZXRlKHRydWUpXCJcbiAgICAgICAgKGVtcHR5RXZlbnQpPVwiZW1wdHkodHJ1ZSlcIlxuICAgICAgICAoZmlsdGVyRXZlbnQpPVwiZmlsdGVyKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAobXVsdGlTZWxlY3RFdmVudCk9XCJtdWx0aVNlbGVjdCgkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgKG9yZGVyQnlFdmVudCk9XCJvcmRlckJ5KCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAocGFnZUV2ZW50KT1cInBhZ2UoJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgIChwYWdpbmF0aW9uRXZlbnQpPVwicGFnaW5hdGlvbkVtaXR0ZXIoJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgIChwaWxsQnV0dG9uRXZlbnQpPVwicGlsbEJ1dHRvbih0cnVlKVwiXG4gICAgICAgIChzY3JvbGxFdmVudCk9XCJvblNjcm9sbCh0cnVlKVwiXG4gICAgICAgIChzZWFyY2hFdmVudCk9XCJzZWFyY2goJGV2ZW50LCB0cnVlKVwiPlxuICAgICAgICBAaWYgKGNvbmZpZy5kcmFnQW5kRHJvcCkge1xuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgY29uZmlnLnRhYmxlTGVmdEl0ZW1zOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2xpc3RcIj5cbiAgICAgICAgICAgICAgPHMtbGlzdFxuICAgICAgICAgICAgICAgIFtzaXplXT1cIid4cydcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaXRlbS1pZF09XCJpdGVtLmlkXCJcbiAgICAgICAgICAgICAgICBbZHJhZ2dhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJpZCArICctbGlzdExlZnQtJyArIGl0ZW0uaWRcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpdGVtLmlkKVwiXG4gICAgICAgICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpdGVtLmlkKVwiXG4gICAgICAgICAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpdGVtLmlkLCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEl0ZW0oaXRlbS5pZCwgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2RyYWdcIj5cbiAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1sLTJcIj57eyBpdGVtLm5hbWUgfX08L2g1PlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmljb25BY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19kcmFnLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cy1pY29uLW1hdCAoY2xpY2spPVwiaWNvbkFjdGlvbihpdGVtLmlkLCB0cnVlKVwiPnt7IGl0ZW0uaWNvbkFjdGlvbiB9fTwvcy1pY29uLW1hdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvcy1saXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGNvbmZpZy50YWJsZUxlZnRJdGVtczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICBhY3RpdmU6ICFjb25maWcuZGlzYWJsZUxlZnRSb3dTZWxlY3Rpb24gJiYgY29uZmlnLmlzVHJlZU1vZGUgJiYgaXRlbS5zZWxlY3RlZCxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIhY29uZmlnLmRpc2FibGVMZWZ0Um93U2VsZWN0aW9uICYmIGNvbmZpZy5pc1RyZWVNb2RlICYmIHJvd0NsaWNrKGl0ZW0sIHRydWUpXCI+XG4gICAgICAgICAgICAgIDx0ZCAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1jaGVja2JveExlZnQtJyArIGl0ZW0uaWRcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VDaGVja2JveCgpXCIgLz5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbmZpZy50YWJsZUxlZnRDb25maWcuY29sdW1uczsgdHJhY2sgY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgQGlmIChjb2x1bW4uaWQgIT09ICdjaGVja2JveCcgJiYgY29sdW1uLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIDx0ZCBbaWRdPVwiaWQgKyAnLWl0ZW1MZWZ0LScgKyBpdGVtLmlkXCI+e3sgaXRlbVtjb2x1bW4uaWRdIH19PC90ZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L3MtdGFibGUtY29tcGxldGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19ib2R5X19taWRkbGVcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgIFtpZF09XCJpZCArICctYWRkQnV0dG9uJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW0oKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWRkSXRlbSgpXCJcbiAgICAgICAgICBwb3NpdGlvbj1cIm5vcm1hbFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkQnV0dG9uTGVmdCgpXCJcbiAgICAgICAgICBbcGlsbF09XCJ0cnVlXCJcbiAgICAgICAgICA+PHMtaWNvbi1tYXRcbiAgICAgICAgICAgID48c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5cbiAgICAgICAgICAgICAge3sgY29uZmlnLmFkZGl0aW9uQnV0dG9uID8gJ2FkZCcgOiAnYXJyb3dfZm9yd2FyZCcgfX1cbiAgICAgICAgICAgIDwvc3Bhbj48L3MtaWNvbi1tYXRcbiAgICAgICAgICA+PC9zLWJ1dHRvblxuICAgICAgICA+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgIFtpZF09XCJpZCArICctcmVtb3ZlQnV0dG9uJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUl0ZW0oKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlSXRlbSgpXCJcbiAgICAgICAgICBwb3NpdGlvbj1cIm5vcm1hbFwiXG4gICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkQnV0dG9uUmlnaHQoKVwiXG4gICAgICAgICAgW3BpbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgPjxzLWljb24tbWF0XG4gICAgICAgICAgICA+PHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+XG4gICAgICAgICAgICAgIHt7IGNvbmZpZy5hZGRpdGlvbkJ1dHRvbiA/ICdyZW1vdmUnIDogJ2Fycm93X2JhY2snIH19XG4gICAgICAgICAgICA8L3NwYW4+PC9zLWljb24tbWF0XG4gICAgICAgICAgPjwvcy1idXR0b25cbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19ib2R5X19yaWdodFwiPlxuICAgICAgPHMtdGFibGUtY29tcGxldGVcbiAgICAgICAgW2NvbmZpZ109XCJjb25maWcudGFibGVSaWdodENvbmZpZ1wiXG4gICAgICAgIChhY3Rpb25FdmVudCk9XCJhY3Rpb24oZmFsc2UpXCJcbiAgICAgICAgKGJvdHRvbVN0YXR1c0JhckV2ZW50KT1cImJvdHRvbVN0YXR1c0JhckNoYW5nZSgkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgIChjaGVja0FsbEV2ZW50KT1cImNoZWNrQWxsRXZlbnQoJGV2ZW50LCBmYWxzZSlcIlxuICAgICAgICAoZGVsZXRlRXZlbnQpPVwiZGVsZXRlKGZhbHNlKVwiXG4gICAgICAgIChlbXB0eUV2ZW50KT1cImVtcHR5KGZhbHNlKVwiXG4gICAgICAgIChmaWx0ZXJFdmVudCk9XCJmaWx0ZXIoJGV2ZW50LCBmYWxzZSlcIlxuICAgICAgICAobXVsdGlTZWxlY3RFdmVudCk9XCJtdWx0aVNlbGVjdCgkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgIChvcmRlckJ5RXZlbnQpPVwib3JkZXJCeSgkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgIChwYWdlRXZlbnQpPVwicGFnZSgkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgIChwYWdpbmF0aW9uRXZlbnQpPVwicGFnaW5hdGlvbkVtaXR0ZXIoJGV2ZW50LCBmYWxzZSlcIlxuICAgICAgICAocGlsbEJ1dHRvbkV2ZW50KT1cInBpbGxCdXR0b24oZmFsc2UpXCJcbiAgICAgICAgKHNjcm9sbEV2ZW50KT1cIm9uU2Nyb2xsKGZhbHNlKVwiXG4gICAgICAgIChzZWFyY2hFdmVudCk9XCJzZWFyY2goJGV2ZW50LCBmYWxzZSlcIj5cbiAgICAgICAgQGlmIChjb25maWcuZHJhZ0FuZERyb3ApIHtcbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGNvbmZpZy50YWJsZVJpZ2h0SXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgIDxzLWxpc3RcbiAgICAgICAgICAgICAgW3NpemVdPVwiJ3hzJ1wiXG4gICAgICAgICAgICAgIFtpZF09XCJpZCArICctbGlzdFJpZ2h0LScgKyBpdGVtLmlkXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pdGVtLWlkXT1cIml0ZW0uaWRcIlxuICAgICAgICAgICAgICBbZHJhZ2dhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiaXRlbS5jaGVja2VkXCJcbiAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGl0ZW0uaWQpXCJcbiAgICAgICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpdGVtLmlkKVwiXG4gICAgICAgICAgICAgIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGl0ZW0uaWQsIGZhbHNlKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJdGVtKGl0ZW0uaWQsIGZhbHNlKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2RyYWdcIj5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtbC0yXCI+e3sgaXRlbS5uYW1lIH19PC9oNT5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uaWNvbkFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19kcmFnLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPHMtaWNvbi1tYXQgKGNsaWNrKT1cImljb25BY3Rpb24oaXRlbS5pZCwgZmFsc2UpXCI+e3sgaXRlbS5pY29uQWN0aW9uIH19PC9zLWljb24tbWF0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvcy1saXN0PlxuICAgICAgICAgIH1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBjb25maWcudGFibGVSaWdodEl0ZW1zOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IGNvbmZpZy5pc1RyZWVNb2RlICYmIGl0ZW0uc2VsZWN0ZWQgfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjb25maWcuaXNUcmVlTW9kZSAmJiByb3dDbGljayhpdGVtLCBmYWxzZSlcIj5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzLXRhYmxlLWRvdWJsZV9fdHJlZS1jZWxsXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mucy10YWJsZS1kb3VibGVfX3RyZWUtY2VsbC0tdHJlZV09XCJjb25maWcuaXNUcmVlTW9kZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb25maWcuaXNUcmVlTW9kZSA/IGdldFRyZWVDZWxsQ29sc3BhbigpIDogbnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzLXRhYmxlLWRvdWJsZV9fdHJlZS1jZWxsLWNvbnRlbnRcIiBbbmdDbGFzc109XCJnZXRUcmVlTGV2ZWxDbGFzcyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChjb25maWcuaXNUcmVlTW9kZSAmJiBpdGVtLmhhc0NoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzLWljb24tbWF0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzLXRhYmxlLWRvdWJsZV9fdHJlZS10b2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zLXRhYmxlLWRvdWJsZV9fdHJlZS10b2dnbGUtLWV4cGFuZGVkXT1cIml0ZW0uZXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFeHBhbmQoJGV2ZW50LCBpdGVtLmlkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmNoZXZyb25fcmlnaHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcy1pY29uLW1hdD5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbmZpZy5pc1RyZWVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicy10YWJsZS1kb3VibGVfX3RyZWUtc3BhY2VyXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJpZCArICctY2hlY2tib3hSaWdodC0nICsgaXRlbS5pZFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQ2hlY2tib3goKVwiIC8+XG4gICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZy5pc1RyZWVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicy10YWJsZS1kb3VibGVfX3RyZWUtbmFtZVwiPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbmZpZy50YWJsZVJpZ2h0Q29uZmlnLmNvbHVtbnM7IHRyYWNrIGNvbHVtbikge1xuICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICBjb2x1bW4uaWQgIT09ICdjaGVja2JveCcgJiZcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5pZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAhKGNvbmZpZy5pc1RyZWVNb2RlICYmIGNvbHVtbi5pZCA9PT0gJ25hbWUnKSAmJlxuICAgICAgICAgICAgICAgICAgY29sdW1uLmlkICE9PSAnYWN0aW9ucydcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIDx0ZCBbaWRdPVwiaWQgKyAnLWl0ZW1SaWdodC0nICsgaXRlbS5pZFwiIChjbGljayk9XCJjb2x1bW4uc3dpdGNoQ29uZmlnICYmICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbHVtbi5zd2l0Y2hDb25maWcgJiYgaXRlbVtjb2x1bW4uaWQhXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHMtdG9nZ2xlLXN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb2x1bW4uc3dpdGNoQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbVtjb2x1bW4uaWQhXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25Td2l0Y2hDaGFuZ2UoJGV2ZW50LCBpdGVtLmlkLCBjb2x1bW4uaWQhLCBmYWxzZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3MtdG9nZ2xlLXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoIWNvbHVtbi5zd2l0Y2hDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbHVtbi5pZF0gfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChjb25maWcuc2hvd09yZGVyQnV0dG9ucykge1xuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInMtdGFibGUtZG91YmxlX19vcmRlci1hY3Rpb25zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgPHMtdGFibGUtYWN0aW9ucy1idXR0b25zXG4gICAgICAgICAgICAgICAgICAgIFt0YWJsZUFjdGlvbnNCdXR0b25zXT1cImdldE9yZGVyQnV0dG9ucyhpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0J1dHRvbkV2ZW50KT1cIm9uT3JkZXJCdXR0b25DbGljaygkZXZlbnQsIGl0ZW0uaWQpXCI+XG4gICAgICAgICAgICAgICAgICA8L3MtdGFibGUtYWN0aW9ucy1idXR0b25zPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L3MtdGFibGUtY29tcGxldGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
412
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZG91YmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpZGVzeXMtZ2VuZXJpYy11aS9zcmMvbGliL3RhYmxlLWRvdWJsZS90YWJsZS1kb3VibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lkZXN5cy1nZW5lcmljLXVpL3NyYy9saWIvdGFibGUtZG91YmxlL3RhYmxlLWRvdWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixNQUFNLEVBQ04saUJBQWlCLEdBRWxCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQWdCdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFFMUcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7Ozs7Ozs7Ozs7QUFFcEcsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBbUIxQixNQUFNLE9BQU8scUJBQXFCO0lBakJsQztRQW1C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ZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgc2lnbmFsLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU1RhYmxlQ29tcGxldGVNb2R1bGUgfSBmcm9tICcuLi90YWJsZS1jb21wbGV0ZSc7XG5pbXBvcnQgeyBTQnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vYnV0dG9uJztcbmltcG9ydCB7IFNJY29uTWF0ZXJpYWxNb2R1bGUgfSBmcm9tICcuLi9pY29uLW1hdGVyaWFsJztcbmltcG9ydCB7IFNvcnRUYWJsZSB9IGZyb20gJy4uL3RhYmxlLXQnO1xuaW1wb3J0IHtcbiAgUmVvcmRlckRpcmVjdGlvbixcbiAgU1RhYmxlRG91YmxlLFxuICBTVGFibGVEb3VibGVBY3Rpb25FdmVudCxcbiAgU1RhYmxlRG91YmxlQm9vbGVhbkV2ZW50LFxuICBTVGFibGVEb3VibGVJdGVtLFxuICBTVGFibGVEb3VibGVOdW1iZXJFdmVudCxcbiAgU1RhYmxlRG91YmxlUmVvcmRlckV2ZW50LFxuICBTVGFibGVEb3VibGVTb3J0RXZlbnQsXG4gIFNUYWJsZURvdWJsZVN0cmluZ0FycmF5RXZlbnQsXG4gIFNUYWJsZURvdWJsZVN0cmluZ0V2ZW50LFxuICBTVGFibGVEb3VibGVTd2l0Y2hFdmVudCxcbiAgU1RhYmxlc0RhdGEsXG59IGZyb20gJy4vdGFibGUtZG91YmxlLm1vZGVsJztcbmltcG9ydCB7IFNUb2dnbGVTd2l0Y2hNb2R1bGUgfSBmcm9tICcuLi90b2dnbGUtc3dpdGNoJztcbmltcG9ydCB7IFNUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgU0xpc3RNb2R1bGUgfSBmcm9tICcuLi9saXN0JztcbmltcG9ydCB7IFRhYmxlQWN0aW9uc0J1dHRvbnNNb2R1bGUgfSBmcm9tICcuLi90YWJsZS10L3RhYmxlLWFjdGlvbnMtYnV0dG9ucy90YWJsZS1hY3Rpb25zLWJ1dHRvbnMubW9kdWxlJztcbmltcG9ydCB7IEFjdGlvbkJ1dHRvbiB9IGZyb20gJy4uL3RhYmxlLXQvdGFibGUtYWN0aW9ucy1idXR0b25zL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQWN0aW9uc0J1dHRvbnNUeXBlIH0gZnJvbSAnLi4vdGFibGUtdC90YWJsZS1hY3Rpb25zLWJ1dHRvbnMvZW51bXMvQWN0aW9uc0J1dHRvbnNUeXBlLmVudW0nO1xuXG5jb25zdCBNQVhfVFJFRV9MRVZFTCA9IDIwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzLXRhYmxlLWRvdWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgU1RhYmxlQ29tcGxldGVNb2R1bGUsXG4gICAgU0J1dHRvbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTSWNvbk1hdGVyaWFsTW9kdWxlLFxuICAgIFNMaXN0TW9kdWxlLFxuICAgIFRhYmxlQWN0aW9uc0J1dHRvbnNNb2R1bGUsXG4gICAgU1RvZ2dsZVN3aXRjaE1vZHVsZSxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWRvdWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90YWJsZS1kb3VibGUuY29tcG9uZW50LnNjc3MnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBTVGFibGVEb3VibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IFNUYWJsZURvdWJsZTtcbiAgQE91dHB1dCgpIGFjdGlvblBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBib3R0b21TdGF0dXNCYXJQb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVCb29sZWFuRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjaGVja0FsbFBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZUJvb2xlYW5FdmVudD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBlbXB0eVBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBldmVudFVwZGF0ZVRhYmxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8U1RhYmxlc0RhdGE+KCk7XG4gIEBPdXRwdXQoKSBmaWx0ZXJQb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVTdHJpbmdBcnJheUV2ZW50PigpO1xuICBAT3V0cHV0KCkgbXVsdGlTZWxlY3RQb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVTdHJpbmdBcnJheUV2ZW50PigpO1xuICBAT3V0cHV0KCkgb3JkZXJCeVBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZVNvcnRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHBhZ2VQb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVOdW1iZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIHBhZ2luYXRpb25Qb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVOdW1iZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIHBpbGxCdXR0b25Qb3NpdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgc2Nyb2xsUG9zaXRpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdFBvc2l0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZVN0cmluZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgcm93U2VsZWN0UG9zaXRpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpc0xlZnRUYWJsZTogYm9vbGVhbjsgdmFsdWU6IGFueSB9PigpO1xuICBAT3V0cHV0KCkgYWN0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZUFjdGlvbkV2ZW50PigpO1xuICBAT3V0cHV0KCkgdG9nZ2xlRXhwYW5kRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlb3JkZXJJdGVtRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNUYWJsZURvdWJsZVJlb3JkZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIHN3aXRjaENoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVTd2l0Y2hFdmVudD4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTVGFibGVEb3VibGVTdHJpbmdFdmVudD4oKTtcblxuICBpZCE6IHN0cmluZztcblxuICBkaXNhYmxlZEJ1dHRvbkxlZnQgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIGRpc2FibGVkQnV0dG9uUmlnaHQgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIGl0ZW1zVGFibGVMZWZ0OiBhbnlbXSA9IFtdO1xuICBpdGVtc1RhYmxlUmlnaHREYXRhOiBhbnlbXSA9IFtdO1xuXG4gIGRyYWdJdGVtSWQhOiBzdHJpbmcgfCBudWxsO1xuICBkcmFnT3Zlckl0ZW1JZCE6IHN0cmluZyB8IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc1RyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoU1RyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaWQgPSB0aGlzLmNvbmZpZy5pZCA/PyBgcy10YWJsZS1kb3VibGVgO1xuICAgIHRoaXMuY2xvbmVJdGVtc1RhYmxlcygpO1xuICAgIGlmICghdGhpcy5jb25maWcudGFibGVMZWZ0Q29uZmlnLmVtcHR5Q29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZy50YWJsZUxlZnRDb25maWcuZW1wdHlDb25maWcgPSB7XG4gICAgICAgIGltYWdlOiAnYXNzZXRzL2VtcHR5L2VtcHR5LnBuZycsXG4gICAgICAgIHRpdGxlOiB0aGlzLl9zVHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS50YWJsZURvdWJsZS5lbXB0eVRpdGxlTGVmdCcpLCAvLydObyBoYXkgZWxlbWVudG9zIGRpc3BvbmlibGVzJyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcudGFibGVSaWdodENvbmZpZy5lbXB0eUNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcudGFibGVSaWdodENvbmZpZy5lbXB0eUNvbmZpZyA9IHtcbiAgICAgICAgZGV0YWlsOiB0aGlzLl9zVHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS50YWJsZURvdWJsZS5lbXB0eURldGFpbFJpZ2h0JyksIC8vJ1NlbGVjY2lvbmUgbG9zIMOtdGVtcyBkZXNlYWRvcyB5IGx1ZWdvIGhhZ2EgY2xpYyBlbiBlbCBib3TDs24gZGUgbGEgY29sdW1uYSBjZW50cmFsLicsXG4gICAgICAgIGltYWdlOiAnYXNzZXRzL2VtcHR5L2VtcHR5LnBuZycsXG4gICAgICAgIHRpdGxlOiB0aGlzLl9zVHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS50YWJsZURvdWJsZS5lbXB0eVRpdGxlUmlnaHQnKSwgLy8nTm8gaGF5IGVsZW1lbnRvcyBhZ3JlZ2Fkb3MnLFxuICAgICAgfTtcbiAgICB9XG4gICAgLy9zaSB0aWVuZSBpdGVtcyBjaGVja2VhZG9zIGhheSBxdWUgYWN0dWFsaXphciBlbCBjb250YWRvciBkZWwgYm90dG9tU3RhdHVzQmFyRXZlbnRcbiAgICBjb25zdCBpdGVtc0NoZWNrZWQgPSB0aGlzLmNvbmZpZy50YWJsZUxlZnRJdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmNoZWNrZWQpO1xuICAgIGlmIChpdGVtc0NoZWNrZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51cGRhdGVDb3VudGVyKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSAmJiAhY2hhbmdlc1snY29uZmlnJ10uaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQgPz8gdGhpcy5pZDtcbiAgICAgIHRoaXMuY2xvbmVJdGVtc1RhYmxlcygpO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGl0ZW1JZDogc3RyaW5nKSB7XG4gICAgdGhpcy5kcmFnSXRlbUlkID0gaXRlbUlkO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlcj8uc2V0RGF0YSgndGV4dC9wbGFpbicsICcnKTsgLy8gTmVjZXNhcmlvIHBhcmEgaGFiaWxpdGFyIGVsIGFycmFzdHJlIGVuIGFsZ3Vub3MgbmF2ZWdhZG9yZXNcbiAgfVxuXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCwgaXRlbUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5kcmFnSXRlbUlkID09PSBudWxsIHx8IHRoaXMuZHJhZ0l0ZW1JZCA9PT0gaXRlbUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZHJhZ092ZXJJdGVtSWQgPSBpdGVtSWQ7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICB0aGlzLmRyYWdPdmVySXRlbUlkID0gbnVsbDtcbiAgfVxuXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50LCBpdGVtSWQ6IHN0cmluZywgaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5kcmFnSXRlbUlkID09PSBudWxsIHx8IHRoaXMuZHJhZ0l0ZW1JZCA9PT0gaXRlbUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVvcmRlbmFyIGxvcyBlbGVtZW50b3NcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXNMZWZ0VGFibGUpO1xuICAgIGNvbnN0IGRyYWdJbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogeyBpZDogc3RyaW5nIH0pID0+IGl0ZW0uaWQgPT09IHRoaXMuZHJhZ0l0ZW1JZCk7XG4gICAgY29uc3QgZHJvcEluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiB7IGlkOiBzdHJpbmcgfSkgPT4gaXRlbS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoZHJhZ0luZGV4ICE9PSAtMSAmJiBkcm9wSW5kZXggIT09IC0xKSB7XG4gICAgICBjb25zdCBkcmFnZ2VkSXRlbSA9IGl0ZW1zW2RyYWdJbmRleF07XG4gICAgICBpdGVtcy5zcGxpY2UoZHJhZ0luZGV4LCAxKTtcbiAgICAgIGl0ZW1zLnNwbGljZShkcm9wSW5kZXgsIDAsIGRyYWdnZWRJdGVtKTtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdJdGVtSWQgPSBudWxsO1xuICAgIHRoaXMuZHJhZ092ZXJJdGVtSWQgPSBudWxsO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5ldmVudFVwZGF0ZVRhYmxlc0VtaXQoKTtcbiAgfVxuXG4gIGljb25BY3Rpb24oaXRlbUlkOiBzdHJpbmcsIGlzTGVmdFRhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKGlzTGVmdFRhYmxlKTtcbiAgICBjb25zdCBpdGVtID0gaXRlbXMuZmluZCgoaXRlbTogeyBpZDogc3RyaW5nIH0pID0+IGl0ZW0uaWQgPT09IGl0ZW1JZCk7XG4gICAgaWYgKGl0ZW0pIHRoaXMuYWN0aW9uRXZlbnQuZW1pdCh7IGlzTGVmdFRhYmxlLCBpZDogaXRlbUlkIH0pO1xuICB9XG5cbiAgc2VsZWN0SXRlbShpdGVtSWQ6IHN0cmluZywgaXNMZWZ0VGFibGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXNMZWZ0VGFibGUpO1xuICAgIGNvbnN0IGl0ZW1JbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogeyBpZDogc3RyaW5nIH0pID0+IGl0ZW0uaWQgPT09IGl0ZW1JZCk7XG4gICAgaWYgKGl0ZW1JbmRleCAhPT0gLTEpIHtcbiAgICAgIGl0ZW1zW2l0ZW1JbmRleF0uY2hlY2tlZCA9ICFpdGVtc1tpdGVtSW5kZXhdLmNoZWNrZWQ7XG4gICAgICB0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcbiAgICB9XG4gIH1cblxuICBjbG9uZUl0ZW1zVGFibGVzKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXNUYWJsZUxlZnQgPSBbLi4udGhpcy5jb25maWcudGFibGVMZWZ0SXRlbXNdO1xuICAgIHRoaXMuaXRlbXNUYWJsZVJpZ2h0RGF0YSA9IFsuLi50aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXNdO1xuICB9XG5cbiAgbW92ZUl0ZW1zKGlzTGVmdFRhYmxlU291cmNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuZ2V0SXRlbXMoaXNMZWZ0VGFibGVTb3VyY2UpO1xuICAgIGNvbnN0IHRhcmdldERhdGEgPSB0aGlzLmdldEl0ZW1zKCFpc0xlZnRUYWJsZVNvdXJjZSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbFNvdXJjZURhdGEgPSBpc0xlZnRUYWJsZVNvdXJjZSA/IHRoaXMuaXRlbXNUYWJsZUxlZnQgOiB0aGlzLml0ZW1zVGFibGVSaWdodERhdGE7XG4gICAgY29uc3Qgb3JpZ2luYWxUYXJnZXREYXRhID0gaXNMZWZ0VGFibGVTb3VyY2UgPyB0aGlzLml0ZW1zVGFibGVSaWdodERhdGEgOiB0aGlzLml0ZW1zVGFibGVMZWZ0O1xuXG4gICAgY29uc3QgaGFzSXRlbVNlbGVjdGlvbiA9IHNvdXJjZURhdGEuc29tZShpdGVtID0+IGl0ZW0uc2VsZWN0ZWQpO1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBzb3VyY2VEYXRhXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gKGhhc0l0ZW1TZWxlY3Rpb24gPyBpdGVtLnNlbGVjdGVkIDogaXRlbS5jaGVja2VkKSlcbiAgICAgIC5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgdGFyZ2V0RGF0YS5wdXNoKC4uLnNlbGVjdGVkSXRlbXMpO1xuICAgIHRoaXMuc2V0SXRlbXMoXG4gICAgICBpc0xlZnRUYWJsZVNvdXJjZSxcbiAgICAgIHNvdXJjZURhdGEuZmlsdGVyKGl0ZW0gPT4gKGhhc0l0ZW1TZWxlY3Rpb24gPyAhaXRlbS5zZWxlY3RlZCA6ICFpdGVtLmNoZWNrZWQpKVxuICAgICk7XG5cbiAgICBvcmlnaW5hbFRhcmdldERhdGEucHVzaCguLi5zZWxlY3RlZEl0ZW1zKTtcbiAgICBjb25zdCBmaWx0ZXJlZE9yaWdpbmFsU291cmNlID0gb3JpZ2luYWxTb3VyY2VEYXRhLmZpbHRlcihcbiAgICAgIGl0ZW0gPT4gIXNlbGVjdGVkSXRlbXMuc29tZShzZWwgPT4gc2VsLm5hbWUgPT09IGl0ZW0ubmFtZSlcbiAgICApO1xuICAgIGlmIChpc0xlZnRUYWJsZVNvdXJjZSkge1xuICAgICAgdGhpcy5pdGVtc1RhYmxlTGVmdCA9IGZpbHRlcmVkT3JpZ2luYWxTb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXNUYWJsZVJpZ2h0RGF0YSA9IGZpbHRlcmVkT3JpZ2luYWxTb3VyY2U7XG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tDb2x1bW5SaWdodCA9IHRoaXMuY29uZmlnLnRhYmxlUmlnaHRDb25maWcuY29sdW1uc1swXT8uY2hlY2tib3hWYWx1ZTtcbiAgICBjb25zdCBjaGVja0NvbHVtbkxlZnQgPSB0aGlzLmNvbmZpZy50YWJsZUxlZnRDb25maWcuY29sdW1uc1swXT8uY2hlY2tib3hWYWx1ZTtcblxuICAgIGlmIChjaGVja0NvbHVtblJpZ2h0KSB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0Q29uZmlnLmNvbHVtbnNbMF0uY2hlY2tib3hWYWx1ZSA9IGZhbHNlO1xuICAgIGlmIChjaGVja0NvbHVtbkxlZnQpIHRoaXMuY29uZmlnLnRhYmxlTGVmdENvbmZpZy5jb2x1bW5zWzBdLmNoZWNrYm94VmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLmNvbmZpZy50YWJsZUxlZnRDb25maWcudG90YWxJdGVtcyA9IHRoaXMuY29uZmlnLnRhYmxlTGVmdEl0ZW1zLmxlbmd0aDtcbiAgICB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0Q29uZmlnLnRvdGFsSXRlbXMgPSB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXMubGVuZ3RoO1xuICAgIHRoaXMuZXZlbnRVcGRhdGVUYWJsZXNFbWl0KCk7XG4gICAgdGhpcy51cGRhdGVDb3VudGVyKCk7XG4gIH1cblxuICBldmVudFVwZGF0ZVRhYmxlc0VtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudFVwZGF0ZVRhYmxlcy5lbWl0KHtcbiAgICAgIHRhYmxlTGVmdEl0ZW1zOiB0aGlzLmNvbmZpZy50YWJsZUxlZnRJdGVtcyxcbiAgICAgIHRhYmxlUmlnaHRJdGVtczogdGhpcy5jb25maWcudGFibGVSaWdodEl0ZW1zLFxuICAgIH0pO1xuICB9XG5cbiAgYWRkSXRlbSgpOiB2b2lkIHtcbiAgICB0aGlzLm1vdmVJdGVtcyh0cnVlKTtcbiAgICB0aGlzLmNsb25lSXRlbXNUYWJsZXMoKTtcbiAgfVxuXG4gIHJlbW92ZUl0ZW0oKTogdm9pZCB7XG4gICAgdGhpcy5tb3ZlSXRlbXMoZmFsc2UpO1xuICAgIHRoaXMuY2xvbmVJdGVtc1RhYmxlcygpO1xuICB9XG5cbiAgYWN0aW9uKGlzTGVmdFRhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5hY3Rpb25Qb3NpdGlvbkV2ZW50LmVtaXQoaXNMZWZ0VGFibGUpO1xuICB9XG5cbiAgZGVsZXRlKGlzTGVmdFRhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5kZWxldGVQb3NpdGlvbkV2ZW50LmVtaXQoaXNMZWZ0VGFibGUpO1xuICB9XG5cbiAgZW1wdHkoaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVtcHR5UG9zaXRpb25FdmVudC5lbWl0KGlzTGVmdFRhYmxlKTtcbiAgfVxuXG4gIG9yZGVyQnkoZXZlbnQ6IFNvcnRUYWJsZSwgaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB0YWJsZUNvbmZpZyA9IGlzTGVmdFRhYmxlID8gdGhpcy5jb25maWcudGFibGVMZWZ0Q29uZmlnIDogdGhpcy5jb25maWcudGFibGVSaWdodENvbmZpZztcblxuICAgIGlmICh0YWJsZUNvbmZpZy5oaWRlUGFnaW5hdGlvbiAmJiAhdGFibGVDb25maWcuc2Nyb2xsKSB7XG4gICAgICBjb25zdCBzb3J0ZWRJdGVtcyA9IFsuLi50aGlzLmdldEl0ZW1zKGlzTGVmdFRhYmxlKV0uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUEgPSBhW2V2ZW50LlNvcnRGaWVsZF07XG4gICAgICAgIGNvbnN0IHZhbHVlQiA9IGJbZXZlbnQuU29ydEZpZWxkXTtcbiAgICAgICAgaWYgKHZhbHVlQSA8IHZhbHVlQikgcmV0dXJuIGV2ZW50LlNvcnRBc2MgPyAtMSA6IDE7XG4gICAgICAgIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHJldHVybiBldmVudC5Tb3J0QXNjID8gMSA6IC0xO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRJdGVtcyhpc0xlZnRUYWJsZSwgc29ydGVkSXRlbXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3JkZXJCeVBvc2l0aW9uRXZlbnQuZW1pdCh7IGlzTGVmdFRhYmxlLCB2YWx1ZTogZXZlbnQgfSk7XG4gIH1cblxuICBwYWdlKGV2ZW50OiBudW1iZXIsIGlzTGVmdFRhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYWdlUG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBldmVudCB9KTtcbiAgfVxuXG4gIHBhZ2luYXRpb25FbWl0dGVyKGV2ZW50OiBudW1iZXIsIGlzTGVmdFRhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBldmVudCB9KTtcbiAgfVxuXG4gIHNlbGVjdChldmVudDogc3RyaW5nLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0UG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBldmVudCB9KTtcbiAgfVxuXG4gIHBpbGxCdXR0b24oaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnBpbGxCdXR0b25Qb3NpdGlvbkV2ZW50LmVtaXQoaXNMZWZ0VGFibGUpO1xuICB9XG5cbiAgZmlsdGVyKGV2ZW50OiBzdHJpbmdbXSwgaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmZpbHRlclBvc2l0aW9uRXZlbnQuZW1pdCh7IGlzTGVmdFRhYmxlLCB2YWx1ZTogZXZlbnQgfSk7XG4gIH1cblxuICBtdWx0aVNlbGVjdChldmVudDogc3RyaW5nW10sIGlzTGVmdFRhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5tdWx0aVNlbGVjdFBvc2l0aW9uRXZlbnQuZW1pdCh7IGlzTGVmdFRhYmxlLCB2YWx1ZTogZXZlbnQgfSk7XG4gIH1cblxuICBjaGVja0FsbEV2ZW50KGV2ZW50OiBib29sZWFuLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpc0xlZnRUYWJsZSk7XG4gICAgdGhpcy5zZXRJdGVtcyhcbiAgICAgIGlzTGVmdFRhYmxlLFxuICAgICAgaXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgY2hlY2tlZDogZXZlbnQsXG4gICAgICB9KSlcbiAgICApO1xuICAgIHRoaXMudXBkYXRlQ291bnRlcigpO1xuICB9XG5cbiAgb25TY3JvbGwoaXNMZWZ0VGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNjcm9sbFBvc2l0aW9uRXZlbnQuZW1pdChpc0xlZnRUYWJsZSk7XG4gIH1cblxuICBjaGFuZ2VDaGVja2JveCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0Q29uZmlnLmNvbHVtbnNbMF0uY2hlY2tib3hWYWx1ZSA9XG4gICAgICB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0SXRlbXMuZXZlcnkoaXRlbSA9PiBpdGVtLmNoZWNrZWQpO1xuXG4gICAgdGhpcy5jb25maWcudGFibGVMZWZ0Q29uZmlnLmNvbHVtbnNbMF0uY2hlY2tib3hWYWx1ZSA9XG4gICAgICB0aGlzLmNvbmZpZy50YWJsZUxlZnRJdGVtcy5sZW5ndGggPiAwICYmIHRoaXMuY29uZmlnLnRhYmxlTGVmdEl0ZW1zLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5jaGVja2VkKTtcblxuICAgIHRoaXMudXBkYXRlQ291bnRlcigpO1xuICB9XG5cbiAgYm90dG9tU3RhdHVzQmFyQ2hhbmdlKHN0YXRlOiBib29sZWFuLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuYm90dG9tU3RhdHVzQmFyUG9zaXRpb25FdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBzdGF0ZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcbiAgfVxuXG4gIHNlYXJjaChldmVudDogc3RyaW5nLCBpc0xlZnRUYWJsZTogYm9vbGVhbikge1xuICAgIC8vIFNpIGxhIHRhYmxhIG5vIHRpZW5lIHBhZ2luYWNpw7NuIG5pIHNjcm9sbCwgc2UgYXN1bWUgcXVlIGVsIGZpbHRyYWRvIGVzIGxvY2FsXG4gICAgY29uc3QgdGFibGVDb25maWcgPSBpc0xlZnRUYWJsZSA/IHRoaXMuY29uZmlnLnRhYmxlTGVmdENvbmZpZyA6IHRoaXMuY29uZmlnLnRhYmxlUmlnaHRDb25maWc7XG5cbiAgICBpZiAodGFibGVDb25maWcuaGlkZVBhZ2luYXRpb24gJiYgIXRhYmxlQ29uZmlnLnNjcm9sbCkge1xuICAgICAgY29uc3Qgc291cmNlSXRlbXMgPSBpc0xlZnRUYWJsZSA/IHRoaXMuaXRlbXNUYWJsZUxlZnQgOiB0aGlzLml0ZW1zVGFibGVSaWdodERhdGE7XG4gICAgICBjb25zdCBsb3dlckNhc2VFdmVudCA9IGV2ZW50LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBzb3VyY2VJdGVtcy5maWx0ZXIoaXRlbSA9PlxuICAgICAgICBPYmplY3QudmFsdWVzKGl0ZW0pLnNvbWUodmFsID0+IFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlRXZlbnQpKVxuICAgICAgKTtcblxuICAgICAgdGhpcy5zZXRJdGVtcyhpc0xlZnRUYWJsZSwgZmlsdGVyZWRJdGVtcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hFdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIHZhbHVlOiBldmVudCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ291bnRlcigpIHtcbiAgICBjb25zdCB1cGRhdGVTdGF0dXNCYXIgPSAoXG4gICAgICBpdGVtczogYW55W10sXG4gICAgICBjb25maWc6IHsgY29uZmlnQm90dG9tU3RhdHVzQmFyPzogV3JpdGFibGVTaWduYWw8YW55PiB9LFxuICAgICAgc2V0dGVyOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPlxuICAgICkgPT4ge1xuICAgICAgY29uc3QgY291bnRlckNoZWNrYm94ID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5jaGVja2VkKS5sZW5ndGg7XG4gICAgICBjb25zdCBjb3VudGVySXRlbSA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uc2VsZWN0ZWQpLmxlbmd0aDtcbiAgICAgIGNvbnN0IGNvdW50ZXIgPSBNYXRoLm1heChjb3VudGVyQ2hlY2tib3gsIGNvdW50ZXJJdGVtKTtcblxuICAgICAgY29uZmlnLmNvbmZpZ0JvdHRvbVN0YXR1c0JhciA9IHNpZ25hbCh7XG4gICAgICAgIC4uLmNvbmZpZy5jb25maWdCb3R0b21TdGF0dXNCYXI/LigpLFxuICAgICAgICBjb3VudGVyLFxuICAgICAgICBkaXNhYmxlZDogaXRlbXMubGVuZ3RoID09PSAwLFxuICAgICAgICB0b3RhbDogaXRlbXMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgICAvLyBIYWJpbGl0YXIgYm90w7NuIHNpIGhheSBpdGVtcyBjaGVja2VhZG9zXG4gICAgICBzZXR0ZXIuc2V0KGNvdW50ZXJDaGVja2JveCA9PT0gMCk7XG4gICAgfTtcblxuICAgIHVwZGF0ZVN0YXR1c0Jhcih0aGlzLmNvbmZpZy50YWJsZUxlZnRJdGVtcywgdGhpcy5jb25maWcudGFibGVMZWZ0Q29uZmlnLCB0aGlzLmRpc2FibGVkQnV0dG9uTGVmdCk7XG4gICAgdXBkYXRlU3RhdHVzQmFyKHRoaXMuY29uZmlnLnRhYmxlUmlnaHRJdGVtcywgdGhpcy5jb25maWcudGFibGVSaWdodENvbmZpZywgdGhpcy5kaXNhYmxlZEJ1dHRvblJpZ2h0KTtcbiAgfVxuXG4gIGdldFRyZWVDZWxsQ29sc3BhbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50YWJsZVJpZ2h0Q29uZmlnLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pZCA9PT0gJ2NoZWNrYm94JyB8fCBjLmlkID09PSAnbmFtZScpLmxlbmd0aDtcbiAgfVxuXG4gIGdldFRyZWVMZXZlbENsYXNzKGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc1RyZWVNb2RlIHx8ICFpdGVtLmxldmVsKSB7XG4gICAgICByZXR1cm4gJ3MtdGFibGUtZG91YmxlX190cmVlLWxldmVsLTAnO1xuICAgIH1cbiAgICBjb25zdCBsZXZlbCA9IE1hdGgubWluKGl0ZW0ubGV2ZWwsIE1BWF9UUkVFX0xFVkVMKTtcbiAgICByZXR1cm4gYHMtdGFibGUtZG91YmxlX190cmVlLWxldmVsLSR7bGV2ZWx9YDtcbiAgfVxuXG4gIHRvZ2dsZUV4cGFuZChldmVudDogRXZlbnQsIGl0ZW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRFdmVudC5lbWl0KGl0ZW1JZCk7XG4gIH1cblxuICByb3dDbGljayhpdGVtOiBhbnksIGlzTGVmdFRhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGlzTGVmdFRhYmxlICYmIHRoaXMuY29uZmlnLmRpc2FibGVMZWZ0Um93U2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNMZWZ0VGFibGUpIHtcbiAgICAgIHRoaXMuY29uZmlnLnRhYmxlUmlnaHRJdGVtcy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICBpLnNlbGVjdGVkID0gaS5pZCA9PT0gaXRlbS5pZCA/ICFpLnNlbGVjdGVkIDogZmFsc2U7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbS5zZWxlY3RlZCA9ICFpdGVtLnNlbGVjdGVkO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcbiAgICB0aGlzLnJvd1NlbGVjdFBvc2l0aW9uRXZlbnQuZW1pdCh7IGlzTGVmdFRhYmxlLCB2YWx1ZTogaXRlbSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SXRlbXMoaXNMZWZ0VGFibGU6IGJvb2xlYW4pOiBTVGFibGVEb3VibGVJdGVtW10ge1xuICAgIHJldHVybiBpc0xlZnRUYWJsZSA/IHRoaXMuY29uZmlnLnRhYmxlTGVmdEl0ZW1zIDogdGhpcy5jb25maWcudGFibGVSaWdodEl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJdGVtcyhpc0xlZnRUYWJsZTogYm9vbGVhbiwgaXRlbXM6IFNUYWJsZURvdWJsZUl0ZW1bXSk6IHZvaWQge1xuICAgIGlmIChpc0xlZnRUYWJsZSkge1xuICAgICAgdGhpcy5jb25maWcudGFibGVMZWZ0SXRlbXMgPSBpdGVtcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcudGFibGVSaWdodEl0ZW1zID0gaXRlbXM7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3JkZXJCdXR0b25zKGl0ZW06IGFueSk6IEFjdGlvbkJ1dHRvbltdIHtcbiAgICBjb25zdCBpc0ZpcnN0ID0gISFpdGVtLl9faXNGaXJzdFNpYmxpbmc7XG4gICAgY29uc3QgaXNMYXN0ID0gISFpdGVtLl9faXNMYXN0U2libGluZztcblxuICAgIGlmIChcbiAgICAgIGl0ZW0uX19vcmRlckJ1dHRvbnMgJiZcbiAgICAgIGl0ZW0uX19vcmRlckJ1dHRvbnNbMF0uZGlzYWJsZWQgPT09IGlzRmlyc3QgJiZcbiAgICAgIGl0ZW0uX19vcmRlckJ1dHRvbnNbMl0uZGlzYWJsZWQgPT09IGlzTGFzdFxuICAgICkge1xuICAgICAgcmV0dXJuIGl0ZW0uX19vcmRlckJ1dHRvbnM7XG4gICAgfVxuXG4gICAgaXRlbS5fX29yZGVyQnV0dG9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogQWN0aW9uc0J1dHRvbnNUeXBlLkRPVUJMRV9BUlJPV19VUCxcbiAgICAgICAgdG9vbHRpcDogdGhpcy5fc1RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndWkuZ2VuZXJpYy5maXJzdCcpLFxuICAgICAgICBkaXNhYmxlZDogaXNGaXJzdCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IEFjdGlvbnNCdXR0b25zVHlwZS5BUlJPV19VUCxcbiAgICAgICAgdG9vbHRpcDogdGhpcy5fc1RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndWkuZ2VuZXJpYy51cCcpLFxuICAgICAgICBkaXNhYmxlZDogaXNGaXJzdCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IEFjdGlvbnNCdXR0b25zVHlwZS5BUlJPV19ET1dOLFxuICAgICAgICB0b29sdGlwOiB0aGlzLl9zVHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5nZW5lcmljLmRvd24nKSxcbiAgICAgICAgZGlzYWJsZWQ6IGlzTGFzdCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IEFjdGlvbnNCdXR0b25zVHlwZS5ET1VCTEVfQVJST1dfRE9XTixcbiAgICAgICAgdG9vbHRpcDogdGhpcy5fc1RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndWkuZ2VuZXJpYy5sYXN0JyksXG4gICAgICAgIGRpc2FibGVkOiBpc0xhc3QsXG4gICAgICB9LFxuICAgIF07XG4gICAgcmV0dXJuIGl0ZW0uX19vcmRlckJ1dHRvbnM7XG4gIH1cblxuICBvbk9yZGVyQnV0dG9uQ2xpY2sodHlwZTogc3RyaW5nLCBpdGVtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVvcmRlckl0ZW1FdmVudC5lbWl0KHsgaXRlbUlkLCBkaXJlY3Rpb246IHR5cGUgYXMgUmVvcmRlckRpcmVjdGlvbiB9KTtcbiAgfVxuXG4gIG9uU3dpdGNoQ2hhbmdlKHZhbHVlOiBib29sZWFuLCBpdGVtSWQ6IHN0cmluZywgY29sdW1uSWQ6IHN0cmluZywgaXNMZWZ0VGFibGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXNMZWZ0VGFibGUpO1xuICAgIGNvbnN0IGl0ZW0gPSBpdGVtcy5maW5kKGkgPT4gaS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgaXRlbVtjb2x1bW5JZF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5zd2l0Y2hDaGFuZ2VFdmVudC5lbWl0KHsgaXNMZWZ0VGFibGUsIGl0ZW1JZCwgY29sdW1uSWQsIHZhbHVlIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVcIiBbaWRdPVwiaWRcIj5cbiAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19oZWFkZXJcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19ib2R5X19sZWZ0XCI+XG4gICAgICA8cy10YWJsZS1jb21wbGV0ZSBbY29uZmlnXT1cImNvbmZpZy50YWJsZUxlZnRDb25maWdcIiAoYWN0aW9uRXZlbnQpPVwiYWN0aW9uKHRydWUpXCJcbiAgICAgICAgKGJvdHRvbVN0YXR1c0JhckV2ZW50KT1cImJvdHRvbVN0YXR1c0JhckNoYW5nZSgkZXZlbnQsIHRydWUpXCIgKGNoZWNrQWxsRXZlbnQpPVwiY2hlY2tBbGxFdmVudCgkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgKGRlbGV0ZUV2ZW50KT1cImRlbGV0ZSh0cnVlKVwiIChlbXB0eUV2ZW50KT1cImVtcHR5KHRydWUpXCIgKGZpbHRlckV2ZW50KT1cImZpbHRlcigkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgKG11bHRpU2VsZWN0RXZlbnQpPVwibXVsdGlTZWxlY3QoJGV2ZW50LCB0cnVlKVwiIChvcmRlckJ5RXZlbnQpPVwib3JkZXJCeSgkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgKHBhZ2VFdmVudCk9XCJwYWdlKCRldmVudCwgdHJ1ZSlcIiAocGFnaW5hdGlvbkV2ZW50KT1cInBhZ2luYXRpb25FbWl0dGVyKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAocGlsbEJ1dHRvbkV2ZW50KT1cInBpbGxCdXR0b24odHJ1ZSlcIiAoc2Nyb2xsRXZlbnQpPVwib25TY3JvbGwodHJ1ZSlcIiAoc2VhcmNoRXZlbnQpPVwic2VhcmNoKCRldmVudCwgdHJ1ZSlcIj5cbiAgICAgICAgQGlmIChjb25maWcuZHJhZ0FuZERyb3ApIHtcbiAgICAgICAgQGZvciAoaXRlbSBvZiBjb25maWcudGFibGVMZWZ0SXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2xpc3RcIj5cbiAgICAgICAgICA8cy1saXN0IFtzaXplXT1cIid4cydcIiBbYXR0ci5kYXRhLWl0ZW0taWRdPVwiaXRlbS5pZFwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIFtpZF09XCJpZCArICctbGlzdExlZnQtJyArIGl0ZW0uaWRcIlxuICAgICAgICAgICAgW3NlbGVjdGVkXT1cIml0ZW0uY2hlY2tlZFwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpdGVtLmlkKVwiXG4gICAgICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGl0ZW0uaWQpXCIgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGl0ZW0uaWQsIHRydWUpXCIgKGNsaWNrKT1cInNlbGVjdEl0ZW0oaXRlbS5pZCwgdHJ1ZSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzLXRhYmxlLWRvdWJsZV9fZHJhZ1wiPlxuICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtbC0yXCI+e3sgaXRlbS5uYW1lIH19PC9oNT5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLmljb25BY3Rpb24pIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19kcmFnLWljb25cIj5cbiAgICAgICAgICAgICAgICA8cy1pY29uLW1hdCAoY2xpY2spPVwiaWNvbkFjdGlvbihpdGVtLmlkLCB0cnVlKVwiPnt7IGl0ZW0uaWNvbkFjdGlvbiB9fTwvcy1pY29uLW1hdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvcy1saXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgQGZvciAoaXRlbSBvZiBjb25maWcudGFibGVMZWZ0SXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8dHIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogIWNvbmZpZy5kaXNhYmxlTGVmdFJvd1NlbGVjdGlvbiAmJiBjb25maWcuaXNUcmVlTW9kZSAmJiBpdGVtLnNlbGVjdGVkLFxuICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cIiFjb25maWcuZGlzYWJsZUxlZnRSb3dTZWxlY3Rpb24gJiYgY29uZmlnLmlzVHJlZU1vZGUgJiYgcm93Q2xpY2soaXRlbSwgdHJ1ZSlcIj5cbiAgICAgICAgICA8dGQgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCJpZCArICctY2hlY2tib3hMZWZ0LScgKyBpdGVtLmlkXCIgWyhuZ01vZGVsKV09XCJpdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUNoZWNrYm94KClcIiAvPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbmZpZy50YWJsZUxlZnRDb25maWcuY29sdW1uczsgdHJhY2sgY29sdW1uKSB7XG4gICAgICAgICAgQGlmIChjb2x1bW4uaWQgIT09ICdjaGVja2JveCcgJiYgY29sdW1uLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICA8dGQgW2lkXT1cImlkICsgJy1pdGVtTGVmdC0nICsgaXRlbS5pZFwiPnt7IGl0ZW1bY29sdW1uLmlkXSB9fTwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L3MtdGFibGUtY29tcGxldGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19ib2R5X19taWRkbGVcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxzLWJ1dHRvbiBbaWRdPVwiaWQgKyAnLWFkZEJ1dHRvbidcIiAoY2xpY2spPVwiYWRkSXRlbSgpXCIgKGtleWRvd24uZW50ZXIpPVwiYWRkSXRlbSgpXCIgcG9zaXRpb249XCJub3JtYWxcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZEJ1dHRvbkxlZnQoKVwiIFtwaWxsXT1cInRydWVcIj48cy1pY29uLW1hdD48c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5cbiAgICAgICAgICAgICAge3sgY29uZmlnLmFkZGl0aW9uQnV0dG9uID8gJ2FkZCcgOiAnYXJyb3dfZm9yd2FyZCcgfX1cbiAgICAgICAgICAgIDwvc3Bhbj48L3MtaWNvbi1tYXQ+PC9zLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPHMtYnV0dG9uIFtpZF09XCJpZCArICctcmVtb3ZlQnV0dG9uJ1wiIChjbGljayk9XCJyZW1vdmVJdGVtKClcIiAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVJdGVtKClcIiBwb3NpdGlvbj1cIm5vcm1hbFwiXG4gICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZEJ1dHRvblJpZ2h0KClcIiBbcGlsbF09XCJ0cnVlXCI+PHMtaWNvbi1tYXQ+PHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+XG4gICAgICAgICAgICAgIHt7IGNvbmZpZy5hZGRpdGlvbkJ1dHRvbiA/ICdyZW1vdmUnIDogJ2Fycm93X2JhY2snIH19XG4gICAgICAgICAgICA8L3NwYW4+PC9zLWljb24tbWF0Pjwvcy1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2JvZHlfX3JpZ2h0XCI+XG4gICAgICA8cy10YWJsZS1jb21wbGV0ZSBbY29uZmlnXT1cImNvbmZpZy50YWJsZVJpZ2h0Q29uZmlnXCIgKGFjdGlvbkV2ZW50KT1cImFjdGlvbihmYWxzZSlcIlxuICAgICAgICAoYm90dG9tU3RhdHVzQmFyRXZlbnQpPVwiYm90dG9tU3RhdHVzQmFyQ2hhbmdlKCRldmVudCwgZmFsc2UpXCIgKGNoZWNrQWxsRXZlbnQpPVwiY2hlY2tBbGxFdmVudCgkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgIChkZWxldGVFdmVudCk9XCJkZWxldGUoZmFsc2UpXCIgKGVtcHR5RXZlbnQpPVwiZW1wdHkoZmFsc2UpXCIgKGZpbHRlckV2ZW50KT1cImZpbHRlcigkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgIChtdWx0aVNlbGVjdEV2ZW50KT1cIm11bHRpU2VsZWN0KCRldmVudCwgZmFsc2UpXCIgKG9yZGVyQnlFdmVudCk9XCJvcmRlckJ5KCRldmVudCwgZmFsc2UpXCJcbiAgICAgICAgKHBhZ2VFdmVudCk9XCJwYWdlKCRldmVudCwgZmFsc2UpXCIgKHBhZ2luYXRpb25FdmVudCk9XCJwYWdpbmF0aW9uRW1pdHRlcigkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgIChwaWxsQnV0dG9uRXZlbnQpPVwicGlsbEJ1dHRvbihmYWxzZSlcIiAoc2Nyb2xsRXZlbnQpPVwib25TY3JvbGwoZmFsc2UpXCIgKHNlYXJjaEV2ZW50KT1cInNlYXJjaCgkZXZlbnQsIGZhbHNlKVwiPlxuICAgICAgICBAaWYgKGNvbmZpZy5kcmFnQW5kRHJvcCkge1xuICAgICAgICBAZm9yIChpdGVtIG9mIGNvbmZpZy50YWJsZVJpZ2h0SXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicy10YWJsZS1kb3VibGVfX2xpc3RcIj5cbiAgICAgICAgICA8cy1saXN0IFtzaXplXT1cIid4cydcIiBbaWRdPVwiaWQgKyAnLWxpc3RSaWdodC0nICsgaXRlbS5pZFwiIFthdHRyLmRhdGEtaXRlbS1pZF09XCJpdGVtLmlkXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpdGVtLmNoZWNrZWRcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaXRlbS5pZClcIlxuICAgICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpdGVtLmlkKVwiIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpdGVtLmlkLCBmYWxzZSlcIiAoY2xpY2spPVwic2VsZWN0SXRlbShpdGVtLmlkLCBmYWxzZSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzLXRhYmxlLWRvdWJsZV9fZHJhZ1wiPlxuICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtbC0yXCI+e3sgaXRlbS5uYW1lIH19PC9oNT5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLmljb25BY3Rpb24pIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInMtdGFibGUtZG91YmxlX19kcmFnLWljb25cIj5cbiAgICAgICAgICAgICAgICA8cy1pY29uLW1hdCAoY2xpY2spPVwiaWNvbkFjdGlvbihpdGVtLmlkLCBmYWxzZSlcIj57eyBpdGVtLmljb25BY3Rpb24gfX08L3MtaWNvbi1tYXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3MtbGlzdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgY29uZmlnLnRhYmxlUmlnaHRJdGVtczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDx0ciBbbmdDbGFzc109XCJ7IGFjdGl2ZTogY29uZmlnLmlzVHJlZU1vZGUgJiYgaXRlbS5zZWxlY3RlZCB9XCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlnLmlzVHJlZU1vZGUgJiYgcm93Q2xpY2soaXRlbSwgZmFsc2UpXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwicy10YWJsZS1kb3VibGVfX3RyZWUtY2VsbFwiIFtjbGFzcy5zLXRhYmxlLWRvdWJsZV9fdHJlZS1jZWxsLS10cmVlXT1cImNvbmZpZy5pc1RyZWVNb2RlXCJcbiAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY29uZmlnLmlzVHJlZU1vZGUgPyBnZXRUcmVlQ2VsbENvbHNwYW4oKSA6IG51bGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzLXRhYmxlLWRvdWJsZV9fdHJlZS1jZWxsLWNvbnRlbnRcIiBbbmdDbGFzc109XCJnZXRUcmVlTGV2ZWxDbGFzcyhpdGVtKVwiPlxuICAgICAgICAgICAgICBAaWYgKGNvbmZpZy5pc1RyZWVNb2RlICYmIGl0ZW0uaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgPHMtaWNvbi1tYXQgY2xhc3M9XCJzLXRhYmxlLWRvdWJsZV9fdHJlZS10b2dnbGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5zLXRhYmxlLWRvdWJsZV9fdHJlZS10b2dnbGUtLWV4cGFuZGVkXT1cIml0ZW0uZXhwYW5kZWRcIiAoY2xpY2spPVwidG9nZ2xlRXhwYW5kKCRldmVudCwgaXRlbS5pZClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5jaGV2cm9uX3JpZ2h0PC9zcGFuPlxuICAgICAgICAgICAgICA8L3MtaWNvbi1tYXQ+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbmZpZy5pc1RyZWVNb2RlKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicy10YWJsZS1kb3VibGVfX3RyZWUtc3BhY2VyXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwiaWQgKyAnLWNoZWNrYm94UmlnaHQtJyArIGl0ZW0uaWRcIiBbKG5nTW9kZWwpXT1cIml0ZW0uY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwiY2hhbmdlQ2hlY2tib3goKVwiIC8+XG4gICAgICAgICAgICAgIEBpZiAoY29uZmlnLmlzVHJlZU1vZGUpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzLXRhYmxlLWRvdWJsZV9fdHJlZS1uYW1lXCI+e3sgaXRlbS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb25maWcudGFibGVSaWdodENvbmZpZy5jb2x1bW5zOyB0cmFjayBjb2x1bW4pIHtcbiAgICAgICAgICBAaWYgKFxuICAgICAgICAgIGNvbHVtbi5pZCAhPT0gJ2NoZWNrYm94JyAmJlxuICAgICAgICAgIGNvbHVtbi5pZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgIShjb25maWcuaXNUcmVlTW9kZSAmJiBjb2x1bW4uaWQgPT09ICduYW1lJykgJiZcbiAgICAgICAgICBjb2x1bW4uaWQgIT09ICdhY3Rpb25zJ1xuICAgICAgICAgICkge1xuICAgICAgICAgIDx0ZCBbaWRdPVwiaWQgKyAnLWl0ZW1SaWdodC0nICsgaXRlbS5pZFwiIChjbGljayk9XCJjb2x1bW4uc3dpdGNoQ29uZmlnICYmICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgQGlmIChjb2x1bW4uc3dpdGNoQ29uZmlnICYmIGl0ZW1bY29sdW1uLmlkIV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgPHMtdG9nZ2xlLXN3aXRjaCBbY29uZmlnXT1cImNvbHVtbi5zd2l0Y2hDb25maWdcIiBbKG5nTW9kZWwpXT1cIml0ZW1bY29sdW1uLmlkIV1cIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25Td2l0Y2hDaGFuZ2UoJGV2ZW50LCBpdGVtLmlkLCBjb2x1bW4uaWQhLCBmYWxzZSlcIj5cbiAgICAgICAgICAgIDwvcy10b2dnbGUtc3dpdGNoPlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoIWNvbHVtbi5zd2l0Y2hDb25maWcpIHtcbiAgICAgICAgICAgIHt7IGl0ZW1bY29sdW1uLmlkXSB9fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZy5zaG93T3JkZXJCdXR0b25zKSB7XG4gICAgICAgICAgPHRkIGNsYXNzPVwicy10YWJsZS1kb3VibGVfX29yZGVyLWFjdGlvbnNcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICA8cy10YWJsZS1hY3Rpb25zLWJ1dHRvbnMgW3RhYmxlQWN0aW9uc0J1dHRvbnNdPVwiZ2V0T3JkZXJCdXR0b25zKGl0ZW0pXCJcbiAgICAgICAgICAgICAgKGNsaWNrQnV0dG9uRXZlbnQpPVwib25PcmRlckJ1dHRvbkNsaWNrKCRldmVudCwgaXRlbS5pZClcIj5cbiAgICAgICAgICAgIDwvcy10YWJsZS1hY3Rpb25zLWJ1dHRvbnM+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdHI+XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9zLXRhYmxlLWNvbXBsZXRlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|