@seniorsistemas/data-seniorx-core 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/types/table-options.type.d.ts +11 -0
- package/core/types/table.type.d.ts +2 -1
- package/esm2022/core/types/table-options.type.mjs +8 -2
- package/esm2022/core/types/table.type.mjs +2 -2
- package/esm2022/features/loading-state/loading-state.component.mjs +63 -6
- package/esm2022/features/table/components/table-actions-menu.component.mjs +151 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +6 -3
- package/esm2022/features/table/table.component.mjs +42 -5
- package/features/loading-state/loading-state.component.d.ts +2 -0
- package/features/table/components/table-actions-menu.component.d.ts +18 -4
- package/features/table/components/table-cell-content.component.d.ts +2 -1
- package/features/table/table.component.d.ts +6 -2
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +381 -133
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,9 @@ import { CommonModule } from '@angular/common';
|
|
|
2
2
|
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewEncapsulation, computed, signal } from '@angular/core';
|
|
3
3
|
import { TranslateModule } from '@ngx-translate/core';
|
|
4
4
|
import { getViewportWidth, isMobileViewport } from '../../core/utils/layout.util';
|
|
5
|
+
import { getFocusableElements } from '../../core/utils/focus.util';
|
|
5
6
|
import { DEFAULT_TABLE_OPTIONS, TABLE_DEFAULT_LOADING_VERTICAL_PADDING_PX as DEFAULT_LOADING_VERTICAL_PADDING_PX, TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX as DEFAULT_MIN_LOADING_HEIGHT_PX, TABLE_DEFAULT_ROW_HEIGHT_PX as DEFAULT_ROW_HEIGHT_PX, TABLE_DEFAULT_ROWS_PER_PAGE as DEFAULT_ROWS_PER_PAGE, TABLE_INDEX_ZERO as INDEX_ZERO, TABLE_MENU_GAP_PX as MENU_GAP_PX, TABLE_MOBILE_CARD_ESTIMATED_HEIGHT_PX } from '../../core/constants/table.const';
|
|
7
|
+
import { TableMenuFocusTarget } from '../../core/types/table.type';
|
|
6
8
|
import { ButtonComponent } from '../button/button.component';
|
|
7
9
|
import { EmptyStateComponent } from '../empty-state/empty-state.component';
|
|
8
10
|
import { PaginatorComponent } from '../paginator/paginator.component';
|
|
@@ -18,6 +20,7 @@ import * as i0 from "@angular/core";
|
|
|
18
20
|
import * as i1 from "@angular/common";
|
|
19
21
|
import * as i2 from "@ngx-translate/core";
|
|
20
22
|
export class TableComponent {
|
|
23
|
+
actionsMenuIdSequence = 0;
|
|
21
24
|
colsSignal = signal([]);
|
|
22
25
|
dataSignal = signal([]);
|
|
23
26
|
loadingSignal = signal(false);
|
|
@@ -158,7 +161,7 @@ export class TableComponent {
|
|
|
158
161
|
this.closeActionsMenu();
|
|
159
162
|
}
|
|
160
163
|
onEscapeKey() {
|
|
161
|
-
this.closeActionsMenu();
|
|
164
|
+
this.closeActionsMenu(TableMenuFocusTarget.Trigger);
|
|
162
165
|
}
|
|
163
166
|
onWindowResize() {
|
|
164
167
|
this.viewportWidthSignal.set(getViewportWidth());
|
|
@@ -315,18 +318,26 @@ export class TableComponent {
|
|
|
315
318
|
const actionsOptions = this.cellCfg('actions');
|
|
316
319
|
const items = this.actionItemsFor(row, actionsOptions);
|
|
317
320
|
const rect = triggerElement.getBoundingClientRect();
|
|
321
|
+
const menuId = this.nextActionsMenuId();
|
|
318
322
|
this.openMenuState.set({
|
|
319
323
|
row,
|
|
320
324
|
col,
|
|
321
325
|
items,
|
|
326
|
+
menuId,
|
|
322
327
|
closeOnClick: actionsOptions?.closeOnClick !== false,
|
|
328
|
+
trigger: triggerElement,
|
|
323
329
|
top: rect.bottom + MENU_GAP_PX,
|
|
324
330
|
left: rect.left,
|
|
325
331
|
width: rect.width
|
|
326
332
|
});
|
|
327
333
|
}
|
|
328
|
-
closeActionsMenu() {
|
|
334
|
+
closeActionsMenu(focusTarget = TableMenuFocusTarget.None) {
|
|
335
|
+
const menu = this.openMenuState();
|
|
329
336
|
this.openMenuState.set(null);
|
|
337
|
+
if (!menu || focusTarget === TableMenuFocusTarget.None) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
queueMicrotask(() => this.focusClosedMenuTarget(menu.trigger, menu.menuId, focusTarget));
|
|
330
341
|
}
|
|
331
342
|
isActionsMenuOpen(row, col) {
|
|
332
343
|
const menu = this.openMenuState();
|
|
@@ -357,6 +368,9 @@ export class TableComponent {
|
|
|
357
368
|
this.closeActionsMenu();
|
|
358
369
|
}
|
|
359
370
|
}
|
|
371
|
+
onMenuClose(event) {
|
|
372
|
+
this.closeActionsMenu(event.focusTarget);
|
|
373
|
+
}
|
|
360
374
|
onActionSelect(row, col, item) {
|
|
361
375
|
if (item.disabled) {
|
|
362
376
|
return;
|
|
@@ -401,8 +415,31 @@ export class TableComponent {
|
|
|
401
415
|
}
|
|
402
416
|
return item.disabled === true;
|
|
403
417
|
}
|
|
418
|
+
nextActionsMenuId() {
|
|
419
|
+
this.actionsMenuIdSequence += 1;
|
|
420
|
+
return `sdc-table-actions-menu-${this.actionsMenuIdSequence}`;
|
|
421
|
+
}
|
|
422
|
+
focusClosedMenuTarget(trigger, menuId, focusTarget) {
|
|
423
|
+
if (!trigger.isConnected) {
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
if (focusTarget === TableMenuFocusTarget.Trigger) {
|
|
427
|
+
trigger.focus();
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
const ownerDocument = trigger.ownerDocument;
|
|
431
|
+
const menuElement = ownerDocument.getElementById(menuId);
|
|
432
|
+
const focusableElements = getFocusableElements(ownerDocument).filter((element) => !menuElement?.contains(element));
|
|
433
|
+
const currentIndex = focusableElements.indexOf(trigger);
|
|
434
|
+
if (currentIndex === -1) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
const targetIndex = focusTarget === TableMenuFocusTarget.Next ? currentIndex + 1 : currentIndex - 1;
|
|
438
|
+
const nextElement = focusableElements[targetIndex];
|
|
439
|
+
nextElement?.focus();
|
|
440
|
+
}
|
|
404
441
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
405
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", loading: "loading", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", lazyLoad: "lazyLoad" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div class=\"sdc-table-scroll\" [style.--sdc-table-min-width.px]=\"tableMinWidthPx()\">\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"col.width ?? (columnMinWidthPx(col) + 'px')\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"isSortableColumn(col)\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-overlay{position:relative;margin-left:auto}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.sdc-table-mobile-list{display:flex;flex-direction:column;gap:.375rem;width:100%}.sdc-table-mobile-card{display:flex;flex-direction:column;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.25rem;background:var(--sdc-surface-bg, #ffffff);overflow:hidden}.sdc-table-mobile-card--loading{gap:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,8.5rem) minmax(0,1fr);gap:.875rem 1rem;align-items:start;padding:.9rem 1rem;border-top:1px solid var(--sdc-border-default, #cccccc);background:transparent}.sdc-table-mobile-field:first-child{border-top:0}.sdc-table-mobile-field--selected{background:#11182705}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.625rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.75rem;font-weight:600;line-height:1.35;letter-spacing:.01em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:7rem;height:.75rem;border-radius:999px;background:linear-gradient(90deg,#94a3b82e,#94a3b852,#94a3b82e)}.sdc-table-mobile-skeleton{min-height:2.75rem;border-radius:.75rem;background:linear-gradient(90deg,#94a3b81f,#94a3b833,#94a3b81f)}.sdc-table-mobile-value{display:flex;align-items:flex-start}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182706}}@media (max-width: 540px){.sdc-table-mobile-field{grid-template-columns:1fr;gap:.5rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["items", "left", "top", "width"], outputs: ["select"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
442
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", loading: "loading", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", lazyLoad: "lazyLoad" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div class=\"sdc-table-scroll\" [style.--sdc-table-min-width.px]=\"tableMinWidthPx()\">\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"col.width ?? (columnMinWidthPx(col) + 'px')\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"isSortableColumn(col)\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-overlay{position:relative;margin-left:auto}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.sdc-table-mobile-list{display:flex;flex-direction:column;gap:.375rem;width:100%}.sdc-table-mobile-card{display:flex;flex-direction:column;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.25rem;background:var(--sdc-surface-bg, #ffffff);overflow:hidden}.sdc-table-mobile-card--loading{gap:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,8.5rem) minmax(0,1fr);gap:.875rem 1rem;align-items:start;padding:.9rem 1rem;border-top:1px solid var(--sdc-border-default, #cccccc);background:transparent}.sdc-table-mobile-field:first-child{border-top:0}.sdc-table-mobile-field--selected{background:#11182705}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.625rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.75rem;font-weight:600;line-height:1.35;letter-spacing:.01em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:7rem;height:.75rem;border-radius:999px;background:linear-gradient(90deg,#94a3b82e,#94a3b852,#94a3b82e)}.sdc-table-mobile-skeleton{min-height:2.75rem;border-radius:.75rem;background:linear-gradient(90deg,#94a3b81f,#94a3b833,#94a3b81f)}.sdc-table-mobile-value{display:flex;align-items:flex-start}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182706}}@media (max-width: 540px){.sdc-table-mobile-field{grid-template-columns:1fr;gap:.5rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["ariaLabel", "items", "left", "menuId", "top", "width"], outputs: ["close", "select"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
406
443
|
}
|
|
407
444
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, decorators: [{
|
|
408
445
|
type: Component,
|
|
@@ -417,7 +454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
417
454
|
TableSortIndicatorComponent,
|
|
418
455
|
TableCellContentComponent,
|
|
419
456
|
TableActionsMenuComponent
|
|
420
|
-
], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div class=\"sdc-table-scroll\" [style.--sdc-table-min-width.px]=\"tableMinWidthPx()\">\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"col.width ?? (columnMinWidthPx(col) + 'px')\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"isSortableColumn(col)\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-overlay{position:relative;margin-left:auto}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.sdc-table-mobile-list{display:flex;flex-direction:column;gap:.375rem;width:100%}.sdc-table-mobile-card{display:flex;flex-direction:column;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.25rem;background:var(--sdc-surface-bg, #ffffff);overflow:hidden}.sdc-table-mobile-card--loading{gap:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,8.5rem) minmax(0,1fr);gap:.875rem 1rem;align-items:start;padding:.9rem 1rem;border-top:1px solid var(--sdc-border-default, #cccccc);background:transparent}.sdc-table-mobile-field:first-child{border-top:0}.sdc-table-mobile-field--selected{background:#11182705}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.625rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.75rem;font-weight:600;line-height:1.35;letter-spacing:.01em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:7rem;height:.75rem;border-radius:999px;background:linear-gradient(90deg,#94a3b82e,#94a3b852,#94a3b82e)}.sdc-table-mobile-skeleton{min-height:2.75rem;border-radius:.75rem;background:linear-gradient(90deg,#94a3b81f,#94a3b833,#94a3b81f)}.sdc-table-mobile-value{display:flex;align-items:flex-start}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182706}}@media (max-width: 540px){.sdc-table-mobile-field{grid-template-columns:1fr;gap:.5rem}}\n"] }]
|
|
457
|
+
], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div class=\"sdc-table-scroll\" [style.--sdc-table-min-width.px]=\"tableMinWidthPx()\">\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"col.width ?? (columnMinWidthPx(col) + 'px')\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"isSortableColumn(col)\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-overlay{position:relative;margin-left:auto}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.sdc-table-mobile-list{display:flex;flex-direction:column;gap:.375rem;width:100%}.sdc-table-mobile-card{display:flex;flex-direction:column;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.25rem;background:var(--sdc-surface-bg, #ffffff);overflow:hidden}.sdc-table-mobile-card--loading{gap:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,8.5rem) minmax(0,1fr);gap:.875rem 1rem;align-items:start;padding:.9rem 1rem;border-top:1px solid var(--sdc-border-default, #cccccc);background:transparent}.sdc-table-mobile-field:first-child{border-top:0}.sdc-table-mobile-field--selected{background:#11182705}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.625rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.75rem;font-weight:600;line-height:1.35;letter-spacing:.01em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:7rem;height:.75rem;border-radius:999px;background:linear-gradient(90deg,#94a3b82e,#94a3b852,#94a3b82e)}.sdc-table-mobile-skeleton{min-height:2.75rem;border-radius:.75rem;background:linear-gradient(90deg,#94a3b81f,#94a3b833,#94a3b81f)}.sdc-table-mobile-value{display:flex;align-items:flex-start}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182706}}@media (max-width: 540px){.sdc-table-mobile-field{grid-template-columns:1fr;gap:.5rem}}\n"] }]
|
|
421
458
|
}], propDecorators: { cols: [{
|
|
422
459
|
type: Input,
|
|
423
460
|
args: [{ required: true }]
|
|
@@ -449,4 +486,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
449
486
|
type: HostListener,
|
|
450
487
|
args: ['window:scroll']
|
|
451
488
|
}] } });
|
|
452
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xGLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIseUNBQXlDLElBQUksbUNBQW1DLEVBQ2hGLG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELGdCQUFnQixJQUFJLFVBQVUsRUFDOUIsaUJBQWlCLElBQUksV0FBVyxFQUNoQyxxQ0FBcUMsRUFDdEMsTUFBTSxrQ0FBa0MsQ0FBQztBQWlCMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBD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a0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsMkJBQTJCO3dCQUMzQix5QkFBeUI7d0JBQ3pCLHlCQUF5QjtxQkFDMUIsaUJBR2MsaUJBQWlCLENBQUMsUUFBUSxtQkFDeEIsdUJBQXVCLENBQUMsTUFBTTs4QkF5QjNDLElBQUk7c0JBRFAsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBVXJCLElBQUk7c0JBRFAsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBYXJCLE9BQU87c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBY3RCLE1BQU07c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBeUJ0QixTQUFTO3NCQURaLEtBQUs7Z0JBU0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBc0dHLGVBQWU7c0JBRHhCLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQU1wQixXQUFXO3NCQURwQixZQUFZO3VCQUFDLHlCQUF5QjtnQkFNN0IsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlO2dCQU9uQixjQUFjO3NCQUR2QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7IGdldFZpZXdwb3J0V2lkdGgsIGlzTW9iaWxlVmlld3BvcnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2xheW91dC51dGlsJztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEFCTEVfT1BUSU9OUyxcbiAgVEFCTEVfREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFggYXMgREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFgsXG4gIFRBQkxFX0RFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYIGFzIERFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYLFxuICBUQUJMRV9ERUZBVUxUX1JPV19IRUlHSFRfUFggYXMgREVGQVVMVF9ST1dfSEVJR0hUX1BYLFxuICBUQUJMRV9ERUZBVUxUX1JPV1NfUEVSX1BBR0UgYXMgREVGQVVMVF9ST1dTX1BFUl9QQUdFLFxuICBUQUJMRV9JTkRFWF9aRVJPIGFzIElOREVYX1pFUk8sXG4gIFRBQkxFX01FTlVfR0FQX1BYIGFzIE1FTlVfR0FQX1BYLFxuICBUQUJMRV9NT0JJTEVfQ0FSRF9FU1RJTUFURURfSEVJR0hUX1BYXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL3RhYmxlLmNvbnN0JztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdG9yU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3BhZ2luYXRvci50eXBlJztcbmltcG9ydCB7IHR5cGUgU2VhcmNoVHJpZ2dlck1vZGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3NlYXJjaGJveC50eXBlJztcbmltcG9ydCB7XG4gIHR5cGUgQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgUm93QmFzZSxcbiAgdHlwZSBTb3J0T3JkZXIsXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51SXRlbSBhcyBOYXRpdmVBY3Rpb25NZW51SXRlbSxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWcsXG4gIHR5cGUgVGFibGVDZWxsQ29uZmlnS2V5LFxuICB0eXBlIFRhYmxlQ29sdW1uLFxuICB0eXBlIFRhYmxlT3Blbk1lbnVTdGF0ZSBhcyBPcGVuTWVudVN0YXRlLFxuICB0eXBlIFRhYmxlT3B0aW9ucyxcbiAgdHlwZSBUYWJsZVJvd0lkZW50aXR5LFxuICB0eXBlIFRhYmxlU2VhcmNoRXZlbnRcbn0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90YWJsZS50eXBlJztcblxuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hib3hDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hib3gvc2VhcmNoYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkaW5nU3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9sb2FkaW5nLXN0YXRlL2xvYWRpbmctc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWN0aW9uc01lbnVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWN0aW9ucy1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUNlbGxDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWNlbGwtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVTb3J0SW5kaWNhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLXNvcnQtaW5kaWNhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCwgbWVyZ2VUYWJsZU9wdGlvbnMgfSBmcm9tICcuL3V0aWxzL3RhYmxlLWNvbmZpZy51dGlsJztcbmltcG9ydCB7XG4gIGJ1aWxkUm93Q2hlY2tib3hJZCxcbiAgZmlsdGVyVGFibGVSb3dzLFxuICBnZXROZXN0ZWRWYWx1ZSxcbiAgcmVzb2x2ZVJvd0lkZW50aXR5TGFiZWxcbn0gZnJvbSAnLi91dGlscy90YWJsZS1kYXRhLnV0aWwnO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4LFxuICBnZXRUYWJsZU1pbldpZHRoUHgsXG4gIG5vcm1hbGl6ZVRhYmxlQ29sdW1uQWxpZ25tZW50XG59IGZyb20gJy4vdXRpbHMvdGFibGUtbGF5b3V0LnV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtdGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNlYXJjaGJveENvbXBvbmVudCxcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIExvYWRpbmdTdGF0ZUNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQsXG4gICAgVGFibGVDZWxsQ29udGVudENvbXBvbmVudCxcbiAgICBUYWJsZUFjdGlvbnNNZW51Q29tcG9uZW50XG4gIF0sXG4gIHN0eWxlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuc2NzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xzU2lnbmFsID0gc2lnbmFsPFRhYmxlQ29sdW1uPFQ+W10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU2lnbmFsID0gc2lnbmFsPFRbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmdTaWduYWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdwb3J0V2lkdGhTaWduYWwgPSBzaWduYWw8bnVtYmVyPihnZXRWaWV3cG9ydFdpZHRoKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2lnbmFsID0gc2lnbmFsPFRhYmxlT3B0aW9uczxUPj4obWVyZ2VUYWJsZU9wdGlvbnMoREVGQVVMVF9UQUJMRV9PUFRJT05TIGFzIFRhYmxlT3B0aW9uczxUPikpO1xuICBwcml2YXRlIF9jb25maWc6IFRhYmxlT3B0aW9uczxUPiA9IERFRkFVTFRfVEFCTEVfT1BUSU9OUyBhcyBUYWJsZU9wdGlvbnM8VD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoUGFydHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByb3dDaGVja2JveElkQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3Blbk1lbnVTdGF0ZSA9IHNpZ25hbDxPcGVuTWVudVN0YXRlPFQ+IHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhcmlhTGFiZWxTaWduYWwgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxGaWx0ZXIgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0RmllbGQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0T3JkZXIgPSBzaWduYWw8U29ydE9yZGVyPigwKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGlvbiA9IHNpZ25hbDxUW10+KFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpcnN0ID0gc2lnbmFsPG51bWJlcj4oSU5ERVhfWkVSTyk7XG4gIHByb3RlY3RlZCByZWFkb25seSByb3dzID0gc2lnbmFsPG51bWJlcj4oREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzZXQgY29scyh2YWx1ZTogVGFibGVDb2x1bW48VD5bXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNvbHNTaWduYWwuc2V0KHZhbHVlID8/IFtdKTtcbiAgfVxuXG4gIGdldCBjb2xzKCk6IFRhYmxlQ29sdW1uPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLmNvbHNTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBkYXRhKHZhbHVlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5kYXRhU2lnbmFsLnNldCh2YWx1ZSA/PyBbXSk7XG4gICAgdGhpcy5yZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpO1xuICAgIHRoaXMuY2xhbXBQYWdlKCk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBnZXQgZGF0YSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiBmYWxzZSB9KVxuICBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmxvYWRpbmdTaWduYWwuc2V0KHZhbHVlID09PSB0cnVlKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1NpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IGZhbHNlIH0pXG4gIHNldCBjb25maWcodmFsdWU6IFRhYmxlT3B0aW9uczxUPiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gKERFRkFVTFRfVEFCTEVfT1BUSU9OUyBhcyBUYWJsZU9wdGlvbnM8VD4pO1xuXG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbmV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbmZpZyA9IG5leHQ7XG4gICAgdGhpcy5jb25maWdTaWduYWwuc2V0KG1lcmdlVGFibGVPcHRpb25zKG5leHQpKTtcblxuICAgIGNvbnN0IG5leHRSb3dzID0gdGhpcy5jb25maWdTaWduYWwoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgdGhpcy5yb3dzLnNldChuZXh0Um93cyk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG5cbiAgICB0aGlzLnBhdGhQYXJ0c0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZz4oKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBjb25maWcoKTogVGFibGVPcHRpb25zPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGFyaWFMYWJlbCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hcmlhTGFiZWxTaWduYWwuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxTaWduYWwoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29sdW1uOiBUYWJsZUNvbHVtbjxUPjsgcm93OiBUOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgbGF6eUxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmlyc3Q6IG51bWJlcjsgcm93czogbnVtYmVyIH0+KCk7XG5cbiAgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPFRhYmxlT3B0aW9uczxUPj4oKCkgPT4gdGhpcy5jb25maWdTaWduYWwoKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc01vYmlsZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IGlzTW9iaWxlVmlld3BvcnQodGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1NlYXJjaCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8uc2hvdyA/PyBmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93UGFnaW5hdG9yID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8uc2hvdyA/PyBmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93SW5pdGlhbExvYWRpbmcgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLmxvYWRpbmdTaWduYWwoKSAmJiB0aGlzLmRhdGFTaWduYWwoKS5sZW5ndGggPT09IDApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByb3dzUGVyUGFnZU9wdGlvbnMgPSBjb21wdXRlZDxudW1iZXJbXT4oKCkgPT4gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2VPcHRpb25zID8/IFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaFBsYWNlaG9sZGVyID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnBsYWNlaG9sZGVyID8/ICcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyaWdnZXJNb2RlID0gY29tcHV0ZWQ8U2VhcmNoVHJpZ2dlck1vZGU+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8udHlwZSA/PyAnYXV0bycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxSZWNvcmRzTGFiZWwgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy50b3RhbFJlY29yZHNMYWJlbCA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0VGV4dE92ZXJmbG93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LnRleHRPdmVyZmxvdyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRpdGxlID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGl0bGUgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW1wdHlUZXh0ID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGV4dCA/PyAnJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxzQ2ZnID0gY29tcHV0ZWQoKCkgPT4gYnVpbGRUYWJsZUNlbGxDb25maWdNYXAodGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PlxuICAgIGZpbHRlclRhYmxlUm93cyh0aGlzLmRhdGFTaWduYWwoKSwgdGhpcy5jb2xzU2lnbmFsKCksIHRoaXMuZ2xvYmFsRmlsdGVyKCksIHRoaXMucmVzb2x2ZVZhbHVlKVxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0ZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLnNvcnRGaWVsZCgpO1xuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcbiAgICBjb25zdCByb3dzID0gWy4uLnRoaXMuZmlsdGVyZWREYXRhKCldO1xuXG4gICAgaWYgKCFmaWVsZCB8fCBvcmRlciA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3Muc29ydCgobGVmdFJvdywgcmlnaHRSb3cpID0+IHtcbiAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IHRoaXMucmVzb2x2ZVZhbHVlKGxlZnRSb3csIGZpZWxkKTtcbiAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPSB0aGlzLnJlc29sdmVWYWx1ZShyaWdodFJvdywgZmllbGQpO1xuXG4gICAgICBpZiAobGVmdFZhbHVlID09IG51bGwgJiYgcmlnaHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBpZiAobGVmdFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIC1vcmRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJpZ2h0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbGVmdFZhbHVlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgcmlnaHRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIChsZWZ0VmFsdWUgLSByaWdodFZhbHVlKSAqIG9yZGVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gU3RyaW5nKGxlZnRWYWx1ZSkubG9jYWxlQ29tcGFyZShTdHJpbmcocmlnaHRWYWx1ZSkpICogb3JkZXI7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0b3RhbFJlY29yZHMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHRoaXMuc29ydGVkRGF0YSgpLmxlbmd0aCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZ2VEYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5maXJzdCgpO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5yb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5pdGlhbExvYWRpbmdSb3dzID0gY29tcHV0ZWQ8bnVtYmVyW10+KCgpID0+IHtcbiAgICBjb25zdCByb3dzRnJvbVN0YXRlID0gdGhpcy5yb3dzKCk7XG4gICAgY29uc3Qgcm93c0Zyb21Db25maWcgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJvd3MgPSBOdW1iZXIocm93c0Zyb21TdGF0ZSB8fCByb3dzRnJvbUNvbmZpZyB8fCBERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuICAgIGNvbnN0IHNhZmVSb3dzID0gTnVtYmVyLmlzRmluaXRlKG5vcm1hbGl6ZWRSb3dzKSAmJiBub3JtYWxpemVkUm93cyA+IDAgPyBub3JtYWxpemVkUm93cyA6IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBzYWZlUm93cyB9LCAoXywgaW5kZXgpID0+IGluZGV4KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGlvblNldCA9IGNvbXB1dGVkPFNldDxUPj4oKCkgPT4gbmV3IFNldCh0aGlzLnNlbGVjdGlvbigpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJvZHlWaWV3cG9ydEhlaWdodFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgY29uc3Qgcm93c0Zyb21TdGF0ZSA9IHRoaXMucm93cygpO1xuICAgIGNvbnN0IHJvd3NGcm9tQ29uZmlnID0gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSb3dzID0gTnVtYmVyKHJvd3NGcm9tU3RhdGUgfHwgcm93c0Zyb21Db25maWcgfHwgREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcbiAgICBjb25zdCBzYWZlUm93cyA9IE51bWJlci5pc0Zpbml0ZShub3JtYWxpemVkUm93cykgJiYgbm9ybWFsaXplZFJvd3MgPiAwID8gbm9ybWFsaXplZFJvd3MgOiBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICBjb25zdCByb3dIZWlnaHQgPSB0aGlzLmlzTW9iaWxlKCkgPyBUQUJMRV9NT0JJTEVfQ0FSRF9FU1RJTUFURURfSEVJR0hUX1BYIDogREVGQVVMVF9ST1dfSEVJR0hUX1BYO1xuICAgIGNvbnN0IGVzdGltYXRlZEhlaWdodCA9IHNhZmVSb3dzICogcm93SGVpZ2h0ICsgREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFg7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsIGVzdGltYXRlZEhlaWdodCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eUJvZHlIZWlnaHRQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gdGhpcy5ib2R5Vmlld3BvcnRIZWlnaHRQeCgpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlTWluV2lkdGhQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gZ2V0VGFibGVNaW5XaWR0aFB4KHRoaXMuY29sc1NpZ25hbCgpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVWYWx1ZSA9IChvYmo6IFQsIHBhdGg/OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoLCB0aGlzLnBhdGhQYXJ0c0NhY2hlKTtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXG4gIHByb3RlY3RlZCBvbkRvY3VtZW50Q2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIHByb3RlY3RlZCBvbkVzY2FwZUtleSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsLnNldChnZXRWaWV3cG9ydFdpZHRoKCkpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXG4gIHByb3RlY3RlZCBvbldpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlYXJjaFRlcm0oZXZlbnRPclZhbHVlOiBUYWJsZVNlYXJjaEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGVybSA9IHR5cGVvZiBldmVudE9yVmFsdWUgPT09ICdzdHJpbmcnID8gZXZlbnRPclZhbHVlIDogZXZlbnRPclZhbHVlPy5kZXRhaWwgPz8gJyc7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXIuc2V0KFN0cmluZyh0ZXJtKSk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoJycpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNvcnQoZmllbGQ6IHN0cmluZywgZW5hYmxlZCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVuYWJsZWQgfHwgIWZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEZpZWxkKCkgIT09IGZpZWxkKSB7XG4gICAgICB0aGlzLnNvcnRGaWVsZC5zZXQoZmllbGQpO1xuICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50T3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuXG4gICAgICBpZiAoY3VycmVudE9yZGVyID09PSAxKSB7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNldCgtMSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRPcmRlciA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDApO1xuICAgICAgICB0aGlzLnNvcnRGaWVsZC5zZXQobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMSk7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkLnNldChmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbC5zb3J0YWJsZSA9PT0gZmFsc2UgfHwgIWNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm4gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcblxuICAgIGlmIChvcmRlciA9PT0gMSkge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIGlmIChvcmRlciA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdub25lJztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5BbGlnbkNsYXNzKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBhbGlnbiA9IG5vcm1hbGl6ZVRhYmxlQ29sdW1uQWxpZ25tZW50KGNvbC5hbGlnbik7XG4gICAgcmV0dXJuIGFsaWduID8gYHNkYy10YWJsZS10ZC1hbGlnbi0ke2FsaWdufWAgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU29ydGFibGVDb2x1bW4oY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2wuc29ydGFibGUgIT09IGZhbHNlICYmICEhY29sLmZpZWxkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbHVtbk1pbldpZHRoUHgoY29sOiBUYWJsZUNvbHVtbjxUPik6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uTWluV2lkdGhQeChjb2wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vYmlsZUZpZWxkTGFiZWwoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5oZWFkZXIpIHtcbiAgICAgIHJldHVybiBjb2wuaGVhZGVyO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2FjdGlvbnMnOlxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpLmFjdGlvbnMuYnV0dG9uTGFiZWwgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uc19tZW51JztcbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKCkuYnV0dG9uLmxhYmVsXG4gICAgICAgICAgfHwgdGhpcy5jZWxsc0NmZygpLmJ1dHRvbi50b29sdGlwXG4gICAgICAgICAgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uX2J1dHRvbic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZShldmVudDogUGFnaW5hdG9yU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0Rmlyc3QgPSBldmVudC5maXJzdCA/PyBJTkRFWF9aRVJPO1xuICAgIGNvbnN0IG5leHRSb3dzID0gZXZlbnQucm93cyA/PyB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICB0aGlzLmZpcnN0LnNldChuZXh0Rmlyc3QpO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMubGF6eUxvYWQuZW1pdCh7IGZpcnN0OiBuZXh0Rmlyc3QsIHJvd3M6IG5leHRSb3dzIH0pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlUm93KHJvdzogVCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2V0KCkpO1xuXG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uZGVsZXRlKHJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KFsuLi5uZXh0U2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNSb3dTZWxlY3RlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXQoKS5oYXMocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVTZWxlY3RQYWdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNldCgpKTtcblxuICAgIHRoaXMucGFnZURhdGEoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U2VsZWN0aW9uLmRlbGV0ZShyb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KFsuLi5uZXh0U2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNQYWdlRnVsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IHRoaXMucGFnZURhdGEoKTtcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIHJldHVybiB2aXNpYmxlUm93cy5ldmVyeSgocm93KSA9PiBzZWxlY3RlZFJvd3MuaGFzKHJvdykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENoZWNrZWRWYWx1ZShldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0NoZWNrYm94SWQocm93OiBUKTogc3RyaW5nIHtcbiAgICBpZiAoIXJvdyB8fCB0eXBlb2Ygcm93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGJ1aWxkUm93Q2hlY2tib3hJZChyb3cpO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucm93Q2hlY2tib3hJZENhY2hlLmdldChyb3cgYXMgb2JqZWN0KTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dElkID0gYnVpbGRSb3dDaGVja2JveElkKHJvdyk7XG4gICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuc2V0KHJvdyBhcyBvYmplY3QsIG5leHRJZCk7XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveExhYmVsKHJvdzogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVSb3dJZGVudGl0eUxhYmVsKHJvdyBhcyBUYWJsZVJvd0lkZW50aXR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0YWJsZUFyaWFMYWJlbEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpID8/ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnRhYmxlX2Rlc2NyaXB0aW9uJztcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVBY3Rpb25zTWVudShldmVudDogRXZlbnQsIHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5pc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnNPcHRpb25zID0gdGhpcy5jZWxsQ2ZnKCdhY3Rpb25zJyk7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmFjdGlvbkl0ZW1zRm9yKHJvdywgYWN0aW9uc09wdGlvbnMpO1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMub3Blbk1lbnVTdGF0ZS5zZXQoe1xuICAgICAgcm93LFxuICAgICAgY29sLFxuICAgICAgaXRlbXMsXG4gICAgICBjbG9zZU9uQ2xpY2s6IGFjdGlvbnNPcHRpb25zPy5jbG9zZU9uQ2xpY2sgIT09IGZhbHNlLFxuICAgICAgdG9wOiByZWN0LmJvdHRvbSArIE1FTlVfR0FQX1BYLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZUFjdGlvbnNNZW51KCk6IHZvaWQge1xuICAgIHRoaXMub3Blbk1lbnVTdGF0ZS5zZXQobnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3Rpb25zTWVudU9wZW4ocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnUucm93ID09PSByb3cgJiYgbWVudS5jb2wgPT09IGNvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25JdGVtc0Zvcihyb3c6IFQsIG9wdGlvbnM6IFRhYmxlQ2VsbENvbmZpZzxULCAnYWN0aW9ucyc+KTogTmF0aXZlQWN0aW9uTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBvcHRpb25zLml0ZW1zID8/IFtdO1xuXG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4pID0+ICh7XG4gICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICBpY29uOiBpdGVtLmljb24sXG4gICAgICBkaXNhYmxlZDogdGhpcy5yZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbSwgcm93KVxuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblBvcnRhbEFjdGlvbkNsaWNrKGl0ZW06IE5hdGl2ZUFjdGlvbk1lbnVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG5cbiAgICBpZiAoIW1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VsZWN0KG1lbnUucm93LCBtZW51LmNvbCwgaXRlbSk7XG5cbiAgICBpZiAobWVudS5jbG9zZU9uQ2xpY2spIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkFjdGlvblNlbGVjdChyb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4sIGl0ZW06IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IGljb24/OiBzdHJpbmc7IGRpc2FibGVkPzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbC5hY3Rpb25GaWVsZCA/PyBjb2wuZmllbGQ7XG4gICAgY29uc3Qgcm93VmFsdWUgPSBmaWVsZEtleSA/IHRoaXMucmVzb2x2ZVZhbHVlKHJvdywgZmllbGRLZXkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyByb3csIGNvbHVtbjogY29sLCB2YWx1ZTogeyBhY3Rpb246IGl0ZW0sIHJvd1ZhbHVlIH0gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CdXR0b25DbGljayhyb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBjb2wuYWN0aW9uRmllbGQgPz8gY29sLmZpZWxkO1xuICAgIGNvbnN0IHZhbHVlID0ga2V5ID8gdGhpcy5yZXNvbHZlVmFsdWUocm93LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyByb3csIHZhbHVlLCBjb2x1bW46IGNvbCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQ2VsbElkKGNvbDogVGFibGVDb2x1bW48VD4sIHJvdzogVCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29sLmNlbGxJZCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIHJldHVybiB0eXBlb2YgY29sLmNlbGxJZCA9PT0gJ2Z1bmN0aW9uJyA/IChjb2wuY2VsbElkKHJvdykgfHwgbnVsbCkgOiAoY29sLmNlbGxJZCB8fCBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgY2VsbENmZzxLIGV4dGVuZHMgVGFibGVDZWxsQ29uZmlnS2V5PihraW5kOiBLKSB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHNDZmcoKVtraW5kXTtcbiAgfVxuXG4gIHByaXZhdGUgY2xhbXBQYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdG9yKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhGaXJzdCA9IE1hdGgubWF4KElOREVYX1pFUk8sIHRoaXMudG90YWxSZWNvcmRzKCkgLSB0aGlzLnJvd3MoKSk7XG5cbiAgICBpZiAodGhpcy5maXJzdCgpID4gbWF4Rmlyc3QpIHtcbiAgICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVNldCA9IG5ldyBTZXQodGhpcy5kYXRhU2lnbmFsKCkpO1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbigpLmZpbHRlcigocm93KSA9PiBkYXRhU2V0Lmhhcyhyb3cpKTtcblxuICAgIGlmIChuZXh0U2VsZWN0aW9uLmxlbmd0aCAhPT0gdGhpcy5zZWxlY3Rpb24oKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNldChuZXh0U2VsZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVBY3Rpb25EaXNhYmxlZChpdGVtOiBBY3Rpb25NZW51SXRlbTxUPiwgcm93OiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLmRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlbS5kaXNhYmxlZChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtLmRpc2FibGVkID09PSB0cnVlO1xuICB9XG59XG4iLCI8c2VjdGlvblxuICBjbGFzcz1cInNkYy10YWJsZVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtc3RhY2tdPVwiaXNNb2JpbGUoKVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtZmlsdGVyZWRdPVwiISFnbG9iYWxGaWx0ZXIoKS50cmltKClcIlxuICBbY2xhc3Muc2RjLXRhYmxlLS1sb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWluaXRpYWwtbG9hZGluZ109XCJzaG93SW5pdGlhbExvYWRpbmcoKVwiXG4+XG4gIDxzZGMtbG9hZGluZy1zdGF0ZVxuICAgIGNsYXNzPVwic2RjLXRhYmxlLWxvYWRpbmctd3JhcFwiXG4gICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgICBbYmxvY2tXaW5kb3ddPVwiZmFsc2VcIlxuICAgIFtibG9ja0RlbGF5TXNdPVwiMFwiXG4gICAgW2luZGljYXRvcl09XCInZG90cydcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1zaGVsbFwiIFtzdHlsZS4tLXNkYy10YWJsZS1ib2R5LWhlaWdodC5weF09XCJib2R5Vmlld3BvcnRIZWlnaHRQeCgpXCI+XG4gICAgICBAaWYgKHNob3dTZWFyY2goKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWNhcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWNhcHRpb25fX3NlYXJjaFwiPlxuICAgICAgICAgICAgPHNkYy1zZWFyY2hib3hcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgICAgW3RyaWdnZXJNb2RlXT1cInRyaWdnZXJNb2RlKClcIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25TZWFyY2hUZXJtKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkNsZWFyU2VhcmNoKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnNlYXJjaF9maWVsZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoIWlzTW9iaWxlKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1zY3JvbGxcIiBbc3R5bGUuLS1zZGMtdGFibGUtbWluLXdpZHRoLnB4XT1cInRhYmxlTWluV2lkdGhQeCgpXCI+XG4gICAgICAgICAgPHRhYmxlXG4gICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1ncmlkXCJcbiAgICAgICAgICAgIHJvbGU9XCJ0YWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3djb3VudF09XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Y29sZ3JvdXA+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8Y29sIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggPz8gKGNvbHVtbk1pbldpZHRoUHgoY29sKSArICdweCcpXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9jb2xncm91cD5cblxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICA8dHIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWJ1dHRvbl09XCJjb2wudHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1pcy1zZWxlY3RlZF09XCJzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldFNvcnRBcmlhQXR0cmlidXRlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbCkgPyAwIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNTb3J0YWJsZUNvbHVtbihjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc29ydGFibGVfY29sdW1uJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGgtaW5uZXJcIiBbY2xhc3Muc2RjLXRhYmxlLXNvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRoLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgY29sLmhlYWRlciB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXNvcnQtb3ZlcmxheVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1zb3J0LWluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRmllbGRdPVwiY29sLmZpZWxkIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2wudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydEZpZWxkXT1cInNvcnRGaWVsZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRPcmRlcl09XCJzb3J0T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtc29ydC1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJyAmJiAoY2VsbHNDZmcoKS5jaGVja2JveC5zZWxlY3RBbGwgPz8gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10aC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3NlbGVjdC1hbGwtY2hlY2tib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNQYWdlRnVsbHlTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0UGFnZShnZXRDaGVja2VkVmFsdWUoJGV2ZW50KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlU2VsZWN0UGFnZSghaXNQYWdlRnVsbHlTZWxlY3RlZCgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VsZWN0X2FsbF9yb3dzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc1BhZ2VGdWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZWxlY3QtYWxsLWNoZWNrYm94XCIgY2xhc3M9XCJzci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnNlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG5cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInNkYy10YWJsZS1pbml0aWFsLWxvYWRpbmctcm93XCIgcm9sZT1cInJvd1wiIFthdHRyLmFyaWEtcm93aW5kZXhdPVwiciArIDFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtdGQgc2RjLXRhYmxlLXRkYyBzZGMtdGFibGUtdGQtLWluaXRpYWwtbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWN1cnJlbmN5XT1cImNvbC50eXBlID09PSAnY3VycmVuY3knXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbCBzZGMtdGFibGUtdGQtdmFsLS1pbml0aWFsLWxvYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2VEYXRhKCk7IHRyYWNrICRpbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0ciByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyICsgMVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaXMtc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNvbC5jb2xJZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5jZWxsVGFnID09PSAnc3BhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbC5jZWxsVGFnID09PSAnaScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbC5jZWxsVGFnID09PSAncCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgaWQ9XCJteS1lbXB0eS1zdGF0ZVwiXG4gICAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJlbXB0eVRleHQoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgICA+PC9zZGMtZW1wdHktc3RhdGU+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxpc3RcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGFibGVBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1idXN5XT1cImlzTG9hZGluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICBAaWYgKHNob3dJbml0aWFsTG9hZGluZygpKSB7XG4gICAgICAgICAgICBAZm9yIChyb3dJbmRleCBvZiBpbml0aWFsTG9hZGluZ1Jvd3MoKTsgdHJhY2sgcm93SW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWNhcmQgc2RjLXRhYmxlLW1vYmlsZS1jYXJkLS1sb2FkaW5nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtZmllbGQgc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tbG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbCBzZGMtdGFibGUtbW9iaWxlLWxhYmVsLS1sb2FkaW5nXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLXNrZWxldG9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2VEYXRhKCk7IHRyYWNrICRpbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtY2FyZFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1tb2JpbGUtZmllbGQtLWZ1bGwtd2lkdGhdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09ICdidXR0b24nIHx8IGNvbC50eXBlID09PSAnYWN0aW9ucycgfHwgY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1zZWxlY3RlZF09XCJzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1tb2JpbGUtZmllbGQtLXNvcnRhYmxlXT1cImNvbC5maWVsZCAmJiBpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sLmZpZWxkICYmIHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtb2JpbGVGaWVsZExhYmVsKGNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5maWVsZCAmJiBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbCBzZGMtdGFibGUtbW9iaWxlLWxhYmVsLS1zb3J0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyAtICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc29ydGFibGVfY29sdW1uJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJ0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRmllbGRdPVwiY29sLmZpZWxkIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtblR5cGVdPVwiY29sLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydEZpZWxkXT1cInNvcnRGaWVsZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0T3JkZXJdPVwic29ydE9yZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1zb3J0LWluZGljYXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtdmFsdWVcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICA8c2RjLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJlbXB0eVRpdGxlKClcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cImVtcHR5Qm9keUhlaWdodFB4KClcIlxuICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXBhZ2luYXRvclwiPlxuICAgICAgICAgIDxzZGMtcGFnaW5hdG9yXG4gICAgICAgICAgICBbZmlyc3RdPVwiZmlyc3QoKVwiXG4gICAgICAgICAgICBbcm93c109XCJyb3dzKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cImlzTW9iaWxlKCkgPyBbXSA6IHJvd3NQZXJQYWdlT3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtpc01vYmlsZV09XCJpc01vYmlsZSgpXCJcbiAgICAgICAgICAgIFt0b3RhbFJlY29yZHNMYWJlbF09XCJ0b3RhbFJlY29yZHNMYWJlbCgpXCJcbiAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zZGMtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9zZGMtbG9hZGluZy1zdGF0ZT5cbjwvc2VjdGlvbj5cblxuQGlmIChvcGVuTWVudVN0YXRlKCk7IGFzIG1lbnUpIHtcbiAgPHNkYy10YWJsZS1hY3Rpb25zLW1lbnVcbiAgICBbaXRlbXNdPVwibWVudS5pdGVtc1wiXG4gICAgW3RvcF09XCJtZW51LnRvcFwiXG4gICAgW2xlZnRdPVwibWVudS5sZWZ0XCJcbiAgICBbd2lkdGhdPVwibWVudS53aWR0aFwiXG4gICAgKHNlbGVjdCk9XCJvblBvcnRhbEFjdGlvbkNsaWNrKCRldmVudClcIlxuICA+PC9zZGMtdGFibGUtYWN0aW9ucy1tZW51PlxufVxuIl19
|
|
489
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIseUNBQXlDLElBQUksbUNBQW1DLEVBQ2hGLG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELGdCQUFnQixJQUFJLFVBQVUsRUFDOUIsaUJBQWlCLElBQUksV0FBVyxFQUNoQyxxQ0FBcUMsRUFDdEMsTUFBTSxrQ0FBa0MsQ0FBQztBQUcxQyxPQUFPLEVBYUwsb0JBQW9CLEVBQ3JCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtD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LFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBeUJ0QixTQUFTO3NCQURaLEtBQUs7Z0JBU0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBc0dHLGVBQWU7c0JBRHhCLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQU1wQixXQUFXO3NCQURwQixZQUFZO3VCQUFDLHlCQUF5QjtnQkFNN0IsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlO2dCQU9uQixjQUFjO3NCQUR2QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7IGdldFZpZXdwb3J0V2lkdGgsIGlzTW9iaWxlVmlld3BvcnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2xheW91dC51dGlsJztcbmltcG9ydCB7IGdldEZvY3VzYWJsZUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9mb2N1cy51dGlsJztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEFCTEVfT1BUSU9OUyxcbiAgVEFCTEVfREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFggYXMgREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFgsXG4gIFRBQkxFX0RFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYIGFzIERFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYLFxuICBUQUJMRV9ERUZBVUxUX1JPV19IRUlHSFRfUFggYXMgREVGQVVMVF9ST1dfSEVJR0hUX1BYLFxuICBUQUJMRV9ERUZBVUxUX1JPV1NfUEVSX1BBR0UgYXMgREVGQVVMVF9ST1dTX1BFUl9QQUdFLFxuICBUQUJMRV9JTkRFWF9aRVJPIGFzIElOREVYX1pFUk8sXG4gIFRBQkxFX01FTlVfR0FQX1BYIGFzIE1FTlVfR0FQX1BYLFxuICBUQUJMRV9NT0JJTEVfQ0FSRF9FU1RJTUFURURfSEVJR0hUX1BYXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL3RhYmxlLmNvbnN0JztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdG9yU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3BhZ2luYXRvci50eXBlJztcbmltcG9ydCB7IHR5cGUgU2VhcmNoVHJpZ2dlck1vZGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3NlYXJjaGJveC50eXBlJztcbmltcG9ydCB7XG4gIHR5cGUgQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgUm93QmFzZSxcbiAgdHlwZSBTb3J0T3JkZXIsXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51SXRlbSBhcyBOYXRpdmVBY3Rpb25NZW51SXRlbSxcbiAgdHlwZSBUYWJsZUFjdGlvbk1lbnVDbG9zZUV2ZW50LFxuICB0eXBlIFRhYmxlQ2VsbENvbmZpZyxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWdLZXksXG4gIHR5cGUgVGFibGVDb2x1bW4sXG4gIHR5cGUgVGFibGVPcGVuTWVudVN0YXRlIGFzIE9wZW5NZW51U3RhdGUsXG4gIHR5cGUgVGFibGVPcHRpb25zLFxuICB0eXBlIFRhYmxlUm93SWRlbnRpdHksXG4gIHR5cGUgVGFibGVTZWFyY2hFdmVudCxcbiAgVGFibGVNZW51Rm9jdXNUYXJnZXRcbn0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90YWJsZS50eXBlJztcblxuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hib3hDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hib3gvc2VhcmNoYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkaW5nU3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9sb2FkaW5nLXN0YXRlL2xvYWRpbmctc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWN0aW9uc01lbnVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWN0aW9ucy1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUNlbGxDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWNlbGwtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVTb3J0SW5kaWNhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLXNvcnQtaW5kaWNhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCwgbWVyZ2VUYWJsZU9wdGlvbnMgfSBmcm9tICcuL3V0aWxzL3RhYmxlLWNvbmZpZy51dGlsJztcbmltcG9ydCB7XG4gIGJ1aWxkUm93Q2hlY2tib3hJZCxcbiAgZmlsdGVyVGFibGVSb3dzLFxuICBnZXROZXN0ZWRWYWx1ZSxcbiAgcmVzb2x2ZVJvd0lkZW50aXR5TGFiZWxcbn0gZnJvbSAnLi91dGlscy90YWJsZS1kYXRhLnV0aWwnO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4LFxuICBnZXRUYWJsZU1pbldpZHRoUHgsXG4gIG5vcm1hbGl6ZVRhYmxlQ29sdW1uQWxpZ25tZW50XG59IGZyb20gJy4vdXRpbHMvdGFibGUtbGF5b3V0LnV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtdGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNlYXJjaGJveENvbXBvbmVudCxcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIExvYWRpbmdTdGF0ZUNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQsXG4gICAgVGFibGVDZWxsQ29udGVudENvbXBvbmVudCxcbiAgICBUYWJsZUFjdGlvbnNNZW51Q29tcG9uZW50XG4gIF0sXG4gIHN0eWxlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuc2NzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IHtcbiAgcHJpdmF0ZSBhY3Rpb25zTWVudUlkU2VxdWVuY2UgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbHNTaWduYWwgPSBzaWduYWw8VGFibGVDb2x1bW48VD5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTaWduYWwgPSBzaWduYWw8VFtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1NpZ25hbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRXaWR0aFNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KGdldFZpZXdwb3J0V2lkdGgoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTaWduYWwgPSBzaWduYWw8VGFibGVPcHRpb25zPFQ+PihtZXJnZVRhYmxlT3B0aW9ucyhERUZBVUxUX1RBQkxFX09QVElPTlMgYXMgVGFibGVPcHRpb25zPFQ+KSk7XG4gIHByaXZhdGUgX2NvbmZpZzogVGFibGVPcHRpb25zPFQ+ID0gREVGQVVMVF9UQUJMRV9PUFRJT05TIGFzIFRhYmxlT3B0aW9uczxUPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhQYXJ0c0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBwcml2YXRlIHJvd0NoZWNrYm94SWRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBvcGVuTWVudVN0YXRlID0gc2lnbmFsPE9wZW5NZW51U3RhdGU8VD4gfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFyaWFMYWJlbFNpZ25hbCA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdsb2JhbEZpbHRlciA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvcnRGaWVsZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvcnRPcmRlciA9IHNpZ25hbDxTb3J0T3JkZXI+KDApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0aW9uID0gc2lnbmFsPFRbXT4oW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlyc3QgPSBzaWduYWw8bnVtYmVyPihJTkRFWF9aRVJPKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3MgPSBzaWduYWw8bnVtYmVyPihERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBjb2xzKHZhbHVlOiBUYWJsZUNvbHVtbjxUPltdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY29sc1NpZ25hbC5zZXQodmFsdWUgPz8gW10pO1xuICB9XG5cbiAgZ2V0IGNvbHMoKTogVGFibGVDb2x1bW48VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sc1NpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc2V0IGRhdGEodmFsdWU6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRhdGFTaWduYWwuc2V0KHZhbHVlID8/IFtdKTtcbiAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGlvbldpdGhEYXRhKCk7XG4gICAgdGhpcy5jbGFtcFBhZ2UoKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBkYXRhKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IGZhbHNlIH0pXG4gIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMubG9hZGluZ1NpZ25hbC5zZXQodmFsdWUgPT09IHRydWUpO1xuXG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoeyByZXF1aXJlZDogZmFsc2UgfSlcbiAgc2V0IGNvbmZpZyh2YWx1ZTogVGFibGVPcHRpb25zPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA/PyAoREVGQVVMVF9UQUJMRV9PUFRJT05TIGFzIFRhYmxlT3B0aW9uczxUPik7XG5cbiAgICBpZiAodGhpcy5fY29uZmlnID09PSBuZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnID0gbmV4dDtcbiAgICB0aGlzLmNvbmZpZ1NpZ25hbC5zZXQobWVyZ2VUYWJsZU9wdGlvbnMobmV4dCkpO1xuXG4gICAgY29uc3QgbmV4dFJvd3MgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICB0aGlzLnJvd3Muc2V0KG5leHRSb3dzKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcblxuICAgIHRoaXMucGF0aFBhcnRzQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJvd0NoZWNrYm94SWRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpOiBUYWJsZU9wdGlvbnM8VD4ge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYXJpYUxhYmVsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFyaWFMYWJlbFNpZ25hbC5zZXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGFyaWFMYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpO1xuICB9XG5cbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFRhYmxlQ29sdW1uPFQ+OyByb3c6IFQ7IHZhbHVlOiB1bmtub3duIH0+KCk7XG4gIEBPdXRwdXQoKSBsYXp5TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBmaXJzdDogbnVtYmVyOyByb3dzOiBudW1iZXIgfT4oKTtcblxuICBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTaWduYWwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zID0gY29tcHV0ZWQ8VGFibGVPcHRpb25zPFQ+PigoKSA9PiB0aGlzLmNvbmZpZ1NpZ25hbCgpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTW9iaWxlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gaXNNb2JpbGVWaWV3cG9ydCh0aGlzLnZpZXdwb3J0V2lkdGhTaWduYWwoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93U2VhcmNoID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy5zaG93ID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dQYWdpbmF0b3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5zaG93ID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dJbml0aWFsTG9hZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMubG9hZGluZ1NpZ25hbCgpICYmIHRoaXMuZGF0YVNpZ25hbCgpLmxlbmd0aCA9PT0gMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IGNvbXB1dGVkPG51bWJlcltdPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZU9wdGlvbnMgPz8gW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VhcmNoUGxhY2Vob2xkZXIgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8ucGxhY2Vob2xkZXIgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJpZ2dlck1vZGUgPSBjb21wdXRlZDxTZWFyY2hUcmlnZ2VyTW9kZT4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy50eXBlID8/ICdhdXRvJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0b3RhbFJlY29yZHNMYWJlbCA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LnRvdGFsUmVjb3Jkc0xhYmVsID8/ICcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRUZXh0T3ZlcmZsb3cgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8udGV4dE92ZXJmbG93KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5VGl0bGUgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLmVtcHR5Py50aXRsZSA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRleHQgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLmVtcHR5Py50ZXh0ID8/ICcnKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2VsbHNDZmcgPSBjb21wdXRlZCgoKSA9PiBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJlZERhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+XG4gICAgZmlsdGVyVGFibGVSb3dzKHRoaXMuZGF0YVNpZ25hbCgpLCB0aGlzLmNvbHNTaWduYWwoKSwgdGhpcy5nbG9iYWxGaWx0ZXIoKSwgdGhpcy5yZXNvbHZlVmFsdWUpXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvcnRlZERhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuc29ydEZpZWxkKCk7XG4gICAgY29uc3Qgb3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy5maWx0ZXJlZERhdGEoKV07XG5cbiAgICBpZiAoIWZpZWxkIHx8IG9yZGVyID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cy5zb3J0KChsZWZ0Um93LCByaWdodFJvdykgPT4ge1xuICAgICAgY29uc3QgbGVmdFZhbHVlID0gdGhpcy5yZXNvbHZlVmFsdWUobGVmdFJvdywgZmllbGQpO1xuICAgICAgY29uc3QgcmlnaHRWYWx1ZSA9IHRoaXMucmVzb2x2ZVZhbHVlKHJpZ2h0Um93LCBmaWVsZCk7XG5cbiAgICAgIGlmIChsZWZ0VmFsdWUgPT0gbnVsbCAmJiByaWdodFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChsZWZ0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gLW9yZGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsZWZ0VmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiByaWdodFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gKGxlZnRWYWx1ZSAtIHJpZ2h0VmFsdWUpICogb3JkZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBTdHJpbmcobGVmdFZhbHVlKS5sb2NhbGVDb21wYXJlKFN0cmluZyhyaWdodFZhbHVlKSkgKiBvcmRlcjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvdGFsUmVjb3JkcyA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gdGhpcy5zb3J0ZWREYXRhKCkubGVuZ3RoKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFnZURhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0KCk7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnJvd3MoKTtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpbml0aWFsTG9hZGluZ1Jvd3MgPSBjb21wdXRlZDxudW1iZXJbXT4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3NGcm9tU3RhdGUgPSB0aGlzLnJvd3MoKTtcbiAgICBjb25zdCByb3dzRnJvbUNvbmZpZyA9IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICBjb25zdCBub3JtYWxpemVkUm93cyA9IE51bWJlcihyb3dzRnJvbVN0YXRlIHx8IHJvd3NGcm9tQ29uZmlnIHx8IERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG4gICAgY29uc3Qgc2FmZVJvd3MgPSBOdW1iZXIuaXNGaW5pdGUobm9ybWFsaXplZFJvd3MpICYmIG5vcm1hbGl6ZWRSb3dzID4gMCA/IG5vcm1hbGl6ZWRSb3dzIDogREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHNhZmVSb3dzIH0sIChfLCBpbmRleCkgPT4gaW5kZXgpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0aW9uU2V0ID0gY29tcHV0ZWQ8U2V0PFQ+PigoKSA9PiBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYm9keVZpZXdwb3J0SGVpZ2h0UHggPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICBjb25zdCByb3dzRnJvbVN0YXRlID0gdGhpcy5yb3dzKCk7XG4gICAgY29uc3Qgcm93c0Zyb21Db25maWcgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJvd3MgPSBOdW1iZXIocm93c0Zyb21TdGF0ZSB8fCByb3dzRnJvbUNvbmZpZyB8fCBERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuICAgIGNvbnN0IHNhZmVSb3dzID0gTnVtYmVyLmlzRmluaXRlKG5vcm1hbGl6ZWRSb3dzKSAmJiBub3JtYWxpemVkUm93cyA+IDAgPyBub3JtYWxpemVkUm93cyA6IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMuaXNNb2JpbGUoKSA/IFRBQkxFX01PQklMRV9DQVJEX0VTVElNQVRFRF9IRUlHSFRfUFggOiBERUZBVUxUX1JPV19IRUlHSFRfUFg7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gc2FmZVJvd3MgKiByb3dIZWlnaHQgKyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWDtcblxuICAgIHJldHVybiBNYXRoLm1heChERUZBVUxUX01JTl9MT0FESU5HX0hFSUdIVF9QWCwgZXN0aW1hdGVkSGVpZ2h0KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5Qm9keUhlaWdodFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB0aGlzLmJvZHlWaWV3cG9ydEhlaWdodFB4KCkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFibGVNaW5XaWR0aFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiBnZXRUYWJsZU1pbldpZHRoUHgodGhpcy5jb2xzU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZVZhbHVlID0gKG9iajogVCwgcGF0aD86IHN0cmluZyk6IHVua25vd24gPT5cbiAgICBnZXROZXN0ZWRWYWx1ZShvYmosIHBhdGgsIHRoaXMucGF0aFBhcnRzQ2FjaGUpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgcHJvdGVjdGVkIG9uRG9jdW1lbnRDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgcHJvdGVjdGVkIG9uRXNjYXBlS2V5KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudShUYWJsZU1lbnVGb2N1c1RhcmdldC5UcmlnZ2VyKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsLnNldChnZXRWaWV3cG9ydFdpZHRoKCkpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXG4gIHByb3RlY3RlZCBvbldpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlYXJjaFRlcm0oZXZlbnRPclZhbHVlOiBUYWJsZVNlYXJjaEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGVybSA9IHR5cGVvZiBldmVudE9yVmFsdWUgPT09ICdzdHJpbmcnID8gZXZlbnRPclZhbHVlIDogZXZlbnRPclZhbHVlPy5kZXRhaWwgPz8gJyc7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXIuc2V0KFN0cmluZyh0ZXJtKSk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoJycpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNvcnQoZmllbGQ6IHN0cmluZywgZW5hYmxlZCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVuYWJsZWQgfHwgIWZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEZpZWxkKCkgIT09IGZpZWxkKSB7XG4gICAgICB0aGlzLnNvcnRGaWVsZC5zZXQoZmllbGQpO1xuICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50T3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuXG4gICAgICBpZiAoY3VycmVudE9yZGVyID09PSAxKSB7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNldCgtMSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRPcmRlciA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDApO1xuICAgICAgICB0aGlzLnNvcnRGaWVsZC5zZXQobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMSk7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkLnNldChmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbC5zb3J0YWJsZSA9PT0gZmFsc2UgfHwgIWNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm4gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcblxuICAgIGlmIChvcmRlciA9PT0gMSkge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIGlmIChvcmRlciA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdub25lJztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5BbGlnbkNsYXNzKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBhbGlnbiA9IG5vcm1hbGl6ZVRhYmxlQ29sdW1uQWxpZ25tZW50KGNvbC5hbGlnbik7XG4gICAgcmV0dXJuIGFsaWduID8gYHNkYy10YWJsZS10ZC1hbGlnbi0ke2FsaWdufWAgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU29ydGFibGVDb2x1bW4oY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2wuc29ydGFibGUgIT09IGZhbHNlICYmICEhY29sLmZpZWxkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbHVtbk1pbldpZHRoUHgoY29sOiBUYWJsZUNvbHVtbjxUPik6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uTWluV2lkdGhQeChjb2wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vYmlsZUZpZWxkTGFiZWwoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5oZWFkZXIpIHtcbiAgICAgIHJldHVybiBjb2wuaGVhZGVyO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2FjdGlvbnMnOlxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpLmFjdGlvbnMuYnV0dG9uTGFiZWwgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uc19tZW51JztcbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKCkuYnV0dG9uLmxhYmVsXG4gICAgICAgICAgfHwgdGhpcy5jZWxsc0NmZygpLmJ1dHRvbi50b29sdGlwXG4gICAgICAgICAgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uX2J1dHRvbic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZShldmVudDogUGFnaW5hdG9yU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0Rmlyc3QgPSBldmVudC5maXJzdCA/PyBJTkRFWF9aRVJPO1xuICAgIGNvbnN0IG5leHRSb3dzID0gZXZlbnQucm93cyA/PyB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICB0aGlzLmZpcnN0LnNldChuZXh0Rmlyc3QpO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMubGF6eUxvYWQuZW1pdCh7IGZpcnN0OiBuZXh0Rmlyc3QsIHJvd3M6IG5leHRSb3dzIH0pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlUm93KHJvdzogVCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2V0KCkpO1xuXG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uZGVsZXRlKHJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KFsuLi5uZXh0U2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNSb3dTZWxlY3RlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXQoKS5oYXMocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVTZWxlY3RQYWdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNldCgpKTtcblxuICAgIHRoaXMucGFnZURhdGEoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U2VsZWN0aW9uLmRlbGV0ZShyb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KFsuLi5uZXh0U2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNQYWdlRnVsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IHRoaXMucGFnZURhdGEoKTtcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIHJldHVybiB2aXNpYmxlUm93cy5ldmVyeSgocm93KSA9PiBzZWxlY3RlZFJvd3MuaGFzKHJvdykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENoZWNrZWRWYWx1ZShldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0NoZWNrYm94SWQocm93OiBUKTogc3RyaW5nIHtcbiAgICBpZiAoIXJvdyB8fCB0eXBlb2Ygcm93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGJ1aWxkUm93Q2hlY2tib3hJZChyb3cpO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucm93Q2hlY2tib3hJZENhY2hlLmdldChyb3cgYXMgb2JqZWN0KTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dElkID0gYnVpbGRSb3dDaGVja2JveElkKHJvdyk7XG4gICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuc2V0KHJvdyBhcyBvYmplY3QsIG5leHRJZCk7XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveExhYmVsKHJvdzogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVSb3dJZGVudGl0eUxhYmVsKHJvdyBhcyBUYWJsZVJvd0lkZW50aXR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0YWJsZUFyaWFMYWJlbEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpID8/ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnRhYmxlX2Rlc2NyaXB0aW9uJztcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVBY3Rpb25zTWVudShldmVudDogRXZlbnQsIHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5pc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnNPcHRpb25zID0gdGhpcy5jZWxsQ2ZnKCdhY3Rpb25zJyk7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmFjdGlvbkl0ZW1zRm9yKHJvdywgYWN0aW9uc09wdGlvbnMpO1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtZW51SWQgPSB0aGlzLm5leHRBY3Rpb25zTWVudUlkKCk7XG5cbiAgICB0aGlzLm9wZW5NZW51U3RhdGUuc2V0KHtcbiAgICAgIHJvdyxcbiAgICAgIGNvbCxcbiAgICAgIGl0ZW1zLFxuICAgICAgbWVudUlkLFxuICAgICAgY2xvc2VPbkNsaWNrOiBhY3Rpb25zT3B0aW9ucz8uY2xvc2VPbkNsaWNrICE9PSBmYWxzZSxcbiAgICAgIHRyaWdnZXI6IHRyaWdnZXJFbGVtZW50LFxuICAgICAgdG9wOiByZWN0LmJvdHRvbSArIE1FTlVfR0FQX1BYLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZUFjdGlvbnNNZW51KGZvY3VzVGFyZ2V0OiBUYWJsZU1lbnVGb2N1c1RhcmdldCA9IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5vbmUpOiB2b2lkIHtcbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG4gICAgdGhpcy5vcGVuTWVudVN0YXRlLnNldChudWxsKTtcblxuICAgIGlmICghbWVudSB8fCBmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuTm9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZm9jdXNDbG9zZWRNZW51VGFyZ2V0KG1lbnUudHJpZ2dlciwgbWVudS5tZW51SWQsIGZvY3VzVGFyZ2V0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3Rpb25zTWVudU9wZW4ocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnUucm93ID09PSByb3cgJiYgbWVudS5jb2wgPT09IGNvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25JdGVtc0Zvcihyb3c6IFQsIG9wdGlvbnM6IFRhYmxlQ2VsbENvbmZpZzxULCAnYWN0aW9ucyc+KTogTmF0aXZlQWN0aW9uTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBvcHRpb25zLml0ZW1zID8/IFtdO1xuXG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4pID0+ICh7XG4gICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICBpY29uOiBpdGVtLmljb24sXG4gICAgICBkaXNhYmxlZDogdGhpcy5yZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbSwgcm93KVxuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblBvcnRhbEFjdGlvbkNsaWNrKGl0ZW06IE5hdGl2ZUFjdGlvbk1lbnVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG5cbiAgICBpZiAoIW1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VsZWN0KG1lbnUucm93LCBtZW51LmNvbCwgaXRlbSk7XG5cbiAgICBpZiAobWVudS5jbG9zZU9uQ2xpY2spIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1lbnVDbG9zZShldmVudDogVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudShldmVudC5mb2N1c1RhcmdldCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BY3Rpb25TZWxlY3Qocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+LCBpdGVtOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBkaXNhYmxlZD86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2wuYWN0aW9uRmllbGQgPz8gY29sLmZpZWxkO1xuICAgIGNvbnN0IHJvd1ZhbHVlID0gZmllbGRLZXkgPyB0aGlzLnJlc29sdmVWYWx1ZShyb3csIGZpZWxkS2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCBjb2x1bW46IGNvbCwgdmFsdWU6IHsgYWN0aW9uOiBpdGVtLCByb3dWYWx1ZSB9IH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQnV0dG9uQ2xpY2socm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gY29sLmFjdGlvbkZpZWxkID8/IGNvbC5maWVsZDtcbiAgICBjb25zdCB2YWx1ZSA9IGtleSA/IHRoaXMucmVzb2x2ZVZhbHVlKHJvdywga2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCB2YWx1ZSwgY29sdW1uOiBjb2wgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUNlbGxJZChjb2w6IFRhYmxlQ29sdW1uPFQ+LCByb3c6IFQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWNvbC5jZWxsSWQpIHsgcmV0dXJuIG51bGw7IH1cbiAgICByZXR1cm4gdHlwZW9mIGNvbC5jZWxsSWQgPT09ICdmdW5jdGlvbicgPyAoY29sLmNlbGxJZChyb3cpIHx8IG51bGwpIDogKGNvbC5jZWxsSWQgfHwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGNlbGxDZmc8SyBleHRlbmRzIFRhYmxlQ2VsbENvbmZpZ0tleT4oa2luZDogSykge1xuICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKClba2luZF07XG4gIH1cblxuICBwcml2YXRlIGNsYW1wUGFnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4Rmlyc3QgPSBNYXRoLm1heChJTkRFWF9aRVJPLCB0aGlzLnRvdGFsUmVjb3JkcygpIC0gdGhpcy5yb3dzKCkpO1xuXG4gICAgaWYgKHRoaXMuZmlyc3QoKSA+IG1heEZpcnN0KSB7XG4gICAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZVNlbGVjdGlvbldpdGhEYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFTZXQgPSBuZXcgU2V0KHRoaXMuZGF0YVNpZ25hbCgpKTtcbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24oKS5maWx0ZXIoKHJvdykgPT4gZGF0YVNldC5oYXMocm93KSk7XG5cbiAgICBpZiAobmV4dFNlbGVjdGlvbi5sZW5ndGggIT09IHRoaXMuc2VsZWN0aW9uKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZXQobmV4dFNlbGVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4sIHJvdzogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgaXRlbS5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW0uZGlzYWJsZWQocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbS5kaXNhYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dEFjdGlvbnNNZW51SWQoKTogc3RyaW5nIHtcbiAgICB0aGlzLmFjdGlvbnNNZW51SWRTZXF1ZW5jZSArPSAxO1xuICAgIHJldHVybiBgc2RjLXRhYmxlLWFjdGlvbnMtbWVudS0ke3RoaXMuYWN0aW9uc01lbnVJZFNlcXVlbmNlfWA7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQ2xvc2VkTWVudVRhcmdldChcbiAgICB0cmlnZ2VyOiBIVE1MRWxlbWVudCxcbiAgICBtZW51SWQ6IHN0cmluZyxcbiAgICBmb2N1c1RhcmdldDogVGFibGVNZW51Rm9jdXNUYXJnZXRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0cmlnZ2VyLmlzQ29ubmVjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvY3VzVGFyZ2V0ID09PSBUYWJsZU1lbnVGb2N1c1RhcmdldC5UcmlnZ2VyKSB7XG4gICAgICB0cmlnZ2VyLmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IHRyaWdnZXIub3duZXJEb2N1bWVudDtcbiAgICBjb25zdCBtZW51RWxlbWVudCA9IG93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVudUlkKTtcbiAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKG93bmVyRG9jdW1lbnQpLmZpbHRlcigoZWxlbWVudCkgPT4gIW1lbnVFbGVtZW50Py5jb250YWlucyhlbGVtZW50KSk7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gZm9jdXNhYmxlRWxlbWVudHMuaW5kZXhPZih0cmlnZ2VyKTtcblxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSBmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuTmV4dCA/IGN1cnJlbnRJbmRleCArIDEgOiBjdXJyZW50SW5kZXggLSAxO1xuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbdGFyZ2V0SW5kZXhdO1xuXG4gICAgbmV4dEVsZW1lbnQ/LmZvY3VzKCk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uXG4gIGNsYXNzPVwic2RjLXRhYmxlXCJcbiAgW2NsYXNzLnNkYy10YWJsZS1zdGFja109XCJpc01vYmlsZSgpXCJcbiAgW2NsYXNzLnNkYy10YWJsZS1maWx0ZXJlZF09XCIhIWdsb2JhbEZpbHRlcigpLnRyaW0oKVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWxvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgW2NsYXNzLnNkYy10YWJsZS0taW5pdGlhbC1sb2FkaW5nXT1cInNob3dJbml0aWFsTG9hZGluZygpXCJcbj5cbiAgPHNkYy1sb2FkaW5nLXN0YXRlXG4gICAgY2xhc3M9XCJzZGMtdGFibGUtbG9hZGluZy13cmFwXCJcbiAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgIFtibG9ja1dpbmRvd109XCJmYWxzZVwiXG4gICAgW2Jsb2NrRGVsYXlNc109XCIwXCJcbiAgICBbaW5kaWNhdG9yXT1cIidkb3RzJ1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXNoZWxsXCIgW3N0eWxlLi0tc2RjLXRhYmxlLWJvZHktaGVpZ2h0LnB4XT1cImJvZHlWaWV3cG9ydEhlaWdodFB4KClcIj5cbiAgICAgIEBpZiAoc2hvd1NlYXJjaCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2FwdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2FwdGlvbl9fc2VhcmNoXCI+XG4gICAgICAgICAgICA8c2RjLXNlYXJjaGJveFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyKClcIlxuICAgICAgICAgICAgICBbdHJpZ2dlck1vZGVdPVwidHJpZ2dlck1vZGUoKVwiXG4gICAgICAgICAgICAgIChvblNlYXJjaCk9XCJvblNlYXJjaFRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvbkNsZWFyKT1cIm9uQ2xlYXJTZWFyY2goKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VhcmNoX2ZpZWxkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmICghaXNNb2JpbGUoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXNjcm9sbFwiIFtzdHlsZS4tLXNkYy10YWJsZS1taW4td2lkdGgucHhdPVwidGFibGVNaW5XaWR0aFB4KClcIj5cbiAgICAgICAgICA8dGFibGVcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWdyaWRcIlxuICAgICAgICAgICAgcm9sZT1cInRhYmxlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGFibGVBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJvd2NvdW50XT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjb2xncm91cD5cbiAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxjb2wgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/PyAoY29sdW1uTWluV2lkdGhQeChjb2wpICsgJ3B4JylcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2NvbGdyb3VwPlxuXG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciByb2xlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1zb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWlzLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzU29ydGFibGVDb2x1bW4oY29sKSA/IDAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBpc1NvcnRhYmxlQ29sdW1uKGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2wuaGVhZGVyIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyAtICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChjb2wuaGVhZGVyIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10aC1pbm5lclwiIFtjbGFzcy5zZGMtdGFibGUtc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBjb2wuaGVhZGVyIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtc29ydC1vdmVybGF5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5UeXBlXT1cImNvbC50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydE9yZGVyXT1cInNvcnRPcmRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1zb3J0LWluZGljYXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nICYmIChjZWxsc0NmZygpLmNoZWNrYm94LnNlbGVjdEFsbCA/PyB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRoLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInc2VsZWN0LWFsbC1jaGVja2JveCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1BhZ2VGdWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RQYWdlKGdldENoZWNrZWRWYWx1ZSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVTZWxlY3RQYWdlKCFpc1BhZ2VGdWxseVNlbGVjdGVkKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zZWxlY3RfYWxsX3Jvd3MnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzUGFnZUZ1bGx5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlbGVjdC1hbGwtY2hlY2tib3hcIiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VsZWN0X2FsbF9yb3dzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICBAaWYgKHNob3dJbml0aWFsTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic2RjLXRhYmxlLWluaXRpYWwtbG9hZGluZy1yb3dcIiByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyICsgMVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjIHNkYy10YWJsZS10ZC0taW5pdGlhbC1sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImNvbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsIHNkYy10YWJsZS10ZC12YWwtLWluaXRpYWwtbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyIHJvbGU9XCJyb3dcIiBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInIgKyAxXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXRkIHNkYy10YWJsZS10ZGNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1jaGVja2JveF09XCJjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWJ1dHRvbl09XCJjb2wudHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1hY3Rpb25zXT1cImNvbC50eXBlID09PSAnYWN0aW9ucydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1pcy1zZWxlY3RlZF09XCJzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImNvbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY29sLmNvbElkIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmNlbGxUYWcgPT09ICdzcGFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdpJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdwJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgICAgPHNkYy1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZW1wdHlUaXRsZSgpXCJcbiAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodC5weF09XCJlbXB0eUJvZHlIZWlnaHRQeCgpXCJcbiAgICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGlzdFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0YWJsZUFyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoc2hvd0luaXRpYWxMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtY2FyZCBzZGMtdGFibGUtbW9iaWxlLWNhcmQtLWxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1maWVsZCBzZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsIHNkYy10YWJsZS1tb2JpbGUtbGFiZWwtLWxvYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtc2tlbGV0b25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tZnVsbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gJ2J1dHRvbicgfHwgY29sLnR5cGUgPT09ICdhY3Rpb25zJyB8fCBjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbidcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1tb2JpbGUtZmllbGQtLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tc29ydGFibGVdPVwiY29sLmZpZWxkICYmIGlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wuZmllbGQgJiYgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1vYmlsZUZpZWxkTGFiZWwoY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmZpZWxkICYmIGlzU29ydGFibGVDb2x1bW4oY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsIHNkYy10YWJsZS1tb2JpbGUtbGFiZWwtLXNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIC0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtc29ydC1pbmRpY2F0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2wudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRPcmRlcl09XCJzb3J0T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS12YWx1ZVwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtcGFnaW5hdG9yXCI+XG4gICAgICAgICAgPHNkYy1wYWdpbmF0b3JcbiAgICAgICAgICAgIFtmaXJzdF09XCJmaXJzdCgpXCJcbiAgICAgICAgICAgIFtyb3dzXT1cInJvd3MoKVwiXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiaXNNb2JpbGUoKSA/IFtdIDogcm93c1BlclBhZ2VPcHRpb25zKClcIlxuICAgICAgICAgICAgW2lzTW9iaWxlXT1cImlzTW9iaWxlKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc0xhYmVsXT1cInRvdGFsUmVjb3Jkc0xhYmVsKClcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L3NkYy1wYWdpbmF0b3I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L3NkYy1sb2FkaW5nLXN0YXRlPlxuPC9zZWN0aW9uPlxuXG5AaWYgKG9wZW5NZW51U3RhdGUoKTsgYXMgbWVudSkge1xuICA8c2RjLXRhYmxlLWFjdGlvbnMtbWVudVxuICAgIFtpdGVtc109XCJtZW51Lml0ZW1zXCJcbiAgICBbbWVudUlkXT1cIm1lbnUubWVudUlkXCJcbiAgICBbdG9wXT1cIm1lbnUudG9wXCJcbiAgICBbbGVmdF09XCJtZW51LmxlZnRcIlxuICAgIFt3aWR0aF09XCJtZW51LndpZHRoXCJcbiAgICAoY2xvc2UpPVwib25NZW51Q2xvc2UoJGV2ZW50KVwiXG4gICAgKHNlbGVjdCk9XCJvblBvcnRhbEFjdGlvbkNsaWNrKCRldmVudClcIlxuICA+PC9zZGMtdGFibGUtYWN0aW9ucy1tZW51PlxufVxuIl19
|