@mediusinc/mng-commons 5.4.0-rc.4 → 5.4.0-rc.5

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.
@@ -158,11 +158,11 @@ export class TableComponent {
158
158
  });
159
159
  this.defaultParams = computed(() => this.computeDefaultDataListParams());
160
160
  this.anyColumnVisible = computed(() => this.visibleColumns().length > 0);
161
- this.hasCustomLastColumn = computed(() => this.columnCustomLastComponent || this.columnCustomLastTemplate());
161
+ this.hasCustomLastColumn = computed(() => this.columnCustomLastComponent() || this.columnCustomLastTemplate());
162
162
  this.hasLastColumn = computed(() => this.hasCustomLastColumn() || this.areColumnsToggleable() || this.areColumnsReorderable());
163
163
  // layout prefs
164
- this.areColumnsReorderable = computed(() => this.descriptor().columns.some(value => value.isReorderable));
165
- this.areColumnsToggleable = computed(() => this.descriptor().columns.some(value => value.isToggleable));
164
+ this.areColumnsReorderable = computed(() => this.columns().some(col => col.descriptor.isReorderable));
165
+ this.areColumnsToggleable = computed(() => this.columns().some(col => col.descriptor.isToggleable));
166
166
  this.globalSearchParamFromUrl = signal(undefined);
167
167
  // other
168
168
  this.routerIsNavigationOutsideInProgress = false;
@@ -571,7 +571,7 @@ export class TableComponent {
571
571
  JSON.stringify(this.createFilterMeta(params)) === JSON.stringify(this.dataListService.filterMeta()));
572
572
  }
573
573
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
574
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: TableComponent, isStandalone: true, selector: "mng-table", inputs: { descriptorInput: { classPropertyName: "descriptorInput", publicName: "descriptor", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, dataProvider: { classPropertyName: "dataProvider", publicName: "dataProvider", isSignal: true, isRequired: false, transformFunction: null }, useQueryParams: { classPropertyName: "useQueryParams", publicName: "useQueryParams", isSignal: true, isRequired: false, transformFunction: null }, cellClickEnabled: { classPropertyName: "cellClickEnabled", publicName: "cellClickEnabled", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, selectionEnabled: { classPropertyName: "selectionEnabled", publicName: "selectionEnabled", isSignal: true, isRequired: false, transformFunction: null }, rowReorderEnabledInput: { classPropertyName: "rowReorderEnabledInput", publicName: "rowReorderEnabled", isSignal: true, isRequired: false, transformFunction: null }, columnLastMinWidth: { classPropertyName: "columnLastMinWidth", publicName: "columnLastMinWidth", isSignal: true, isRequired: false, transformFunction: null }, captionComponent: { classPropertyName: "captionComponent", publicName: "captionComponent", isSignal: true, isRequired: false, transformFunction: null }, columnCustomLastComponent: { classPropertyName: "columnCustomLastComponent", publicName: "columnCustomLastComponent", isSignal: true, isRequired: false, transformFunction: null }, globalFilterFieldsInput: { classPropertyName: "globalFilterFieldsInput", publicName: "globalFilterFields", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tableLoad: "tableLoad", cellClick: "cellClick", selectionChange: "selectionChange", captionComponentInstance: "captionComponentInstance", columnCustomLastComponentInstance: "columnCustomLastComponentInstance", rowReorder: "rowReorder" }, providers: [DataListService], queries: [{ propertyName: "templates", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "components", predicate: (ComponentDirective), descendants: true, isSignal: true }, { propertyName: "primeTable", first: true, predicate: Table, descendants: true, isSignal: true }], ngImport: i0, template: "<div>\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (!useQueryParams() || useQueryParamsInitialized()) {\n <p-table\n [value]=\"dataListService.data()\"\n [dataKey]=\"descriptor().trackProperty\"\n [lazy]=\"isLazy()\"\n [loading]=\"dataListService.loading()\"\n [paginator]=\"isPagination()\"\n [rows]=\"dataListService.rows()\"\n [first]=\"dataListService.offset()\"\n [totalRecords]=\"dataListService.count()\"\n [rowsPerPageOptions]=\"dataListService.rowsPerPageOptions()\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"dataListService.sortMeta()\"\n [filters]=\"dataListService.filterMeta()\"\n [globalFilterFields]=\"dataListService.globalFilterFields()\"\n sortMode=\"multiple\"\n [selection]=\"[]\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled() ? selectionMode() : null\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor().hasHover\"\n [styleClass]=\"className()\"\n [resizableColumns]=\"descriptor().hasResizableColumns\"\n [columnResizeMode]=\"descriptor().columnResizeMode ?? 'expand'\"\n [reorderableColumns]=\"areColumnsReorderable()\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns()\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onRowReorder)=\"onRowReorder($event)\">\n <ng-template pTemplate=\"caption\">\n @if (isCaptionVisible()) {\n <div class=\"table-header\">\n @if (overlayWithTagFilters().length > 0 || descriptor().search) {\n <mng-filter-overlay-with-tag\n [title]=\"descriptor().title\"\n [descriptors]=\"overlayWithTagFilters()\"\n [model]=\"descriptor().model\"\n [enableSearch]=\"descriptor().search\"\n [search]=\"globalSearchParamFromUrl()\"\n [searchLimitWordMax]=\"descriptor().searchLimitMaxWords\"\n [enableCaseSensitive]=\"isLazy()\">\n @if (hasTitleDisplay()) {\n <ng-template mngTemplate=\"title\">\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n </ng-template>\n }\n </mng-filter-overlay-with-tag>\n } @else {\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n }\n <ng-template #captionTemplateOrComponentOrTitle>\n @if (captionTemplate()) {\n <ng-container *ngTemplateOutlet=\"captionTemplate()\"></ng-container>\n } @else if (captionComponent()) {\n <ng-container [mngComponent]=\"captionComponent()\" (instanceCreated)=\"captionComponentInstance.emit($event)\"></ng-container>\n } @else if (descriptor().title) {\n <h5 class=\"p-0 m-0\">{{ descriptor().title! | translate }}</h5>\n }\n </ng-template>\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"header\">\n @if (!descriptor().hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"descriptor().headerClassName\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\"></th>\n }\n }\n @if (descriptor().rowExpandable) {\n <th scope=\"col\" pFrozenColumn [frozen]=\"true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n @if (hasLastColumn()) {\n <th\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"descriptor().actionColumnFrozen ?? areColumnsToggleable()\"\n alignFrozen=\"right\"\n class=\"column-custom-last text-right\">\n @if (descriptor().hasResizableColumns) {\n <p-multiSelect\n #columnToggleMultiselect\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n dataKey=\"id\"\n tooltipPosition=\"left\"\n placeholder=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [filter]=\"false\"\n [options]=\"columns()\"\n [ngModel]=\"visibleColumns()\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\" [ngClass]=\"{'p-checkbox-disabled': !areColumnsToggleable}\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allSelected\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.onToggleAll($event)\"\n [disabled]=\"!areColumnsToggleable\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allSelected\"\n [ngClass]=\"{\n 'p-highlight': anyColumnVisible()\n }\"\n (click)=\"onColumnToggleAll()\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': anyColumnVisible()}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n </ng-template>\n </p-multiSelect>\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters()) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled()) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @if (descriptor().rowExpandable) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <th\n [class]=\"col.filter?.columnClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\"\n [style.width.px]=\"col.width\"\n [style.width.%]=\"col.width ? null : col.filter?.columnWidth ?? col.descriptor.width ?? null\"\n [style.min-width.px]=\"col.width ? null : col.filter?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n @if (col.filter) {\n <mng-table-column-filter [descriptor]=\"col.filter\"></mng-table-column-filter>\n }\n </th>\n }\n @if (hasLastColumn()) {\n <th class=\"column-custom-last\" [style.min-width.px]=\"columnLastMinWidth()\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\" let-expanded=\"expanded\">\n <tr\n [pReorderableRow]=\"idx\"\n [ngClass]=\"descriptor().rowClassName | mngClassMap: descriptor().rowClassNameMapFn : item | mngLocaleDefaultRowClass: descriptor() : item\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @if (descriptor().rowExpandable) {\n <td>\n @if (!descriptor().rowExpandableProperty || item[descriptor().rowExpandableProperty!]) {\n <button\n pButton\n type=\"button\"\n [pRowToggler]=\"item\"\n class=\"p-button-text p-button-rounded p-button-plain mng-table-row-expand-button\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"></button>\n }\n </td>\n }\n @if (rowReorderEnabled()) {\n <td>\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n }\n @for (col of visibleColumns(); track col.id) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className\n | mngClassMap: col.descriptor.classNameMapFn : item\n | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\n \"\n [class.clickable]=\"isCellClickEnabled()\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n @if (hasLastColumn()) {\n <td\n class=\"column-custom-last justify-content-end text-right\"\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"descriptor().actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n @if (columnCustomLastTemplate()) {\n <ng-container *ngTemplateOutlet=\"columnCustomLastTemplate(); context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if (columnCustomLastComponent()) {\n <div [mngComponent]=\"columnCustomLastComponent()\" (instanceCreated)=\"columnCustomLastComponentInstance.emit($event)\"></div>\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-item>\n @if (descriptor().rowExpandable) {\n <tr>\n <td></td>\n <td [colSpan]=\"descriptor().rowExpandableColSpan\">\n @if (descriptor().rowExpandableComponentType !== undefined) {\n <ng-container [mngComponent]=\"descriptor().rowExpandableComponentType\" [inputs]=\"{item}\"> </ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowExpandTemplate(); context: {rowItem: item}\"></ng-container>\n }\n </td>\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n @if (descriptor().loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor().loadingIcon\"></i>\n }\n @if (descriptor().loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor().loadingIcon}\">\n {{ descriptor().loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"loadingbody\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate()) {\n <ng-template pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"footerTemplate(); context: {data: dataListService.data(), totalCount: dataListService.count()}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n", dependencies: [{ kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }, { kind: "pipe", type: I18nPropertyPipe, name: "mngI18nProperty" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "pipe", type: ClassMapPipe, name: "mngClassMap" }, { kind: "pipe", type: LocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }, { kind: "component", type: TableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["descriptor"] }, { kind: "pipe", type: TableColumnFilterClassPipe, name: "mngTableColumnFilterClass" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i1.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i1.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i1.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i1.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i1.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i1.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i1.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i1.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i1.ReorderableRowHandle, selector: "[pReorderableRowHandle]" }, { kind: "directive", type: i1.ReorderableRow, selector: "[pReorderableRow]", inputs: ["pReorderableRow", "pReorderableRowDisabled"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i3.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "component", type: FilterOverlayWithTagComponent, selector: "mng-filter-overlay-with-tag", inputs: ["descriptors", "model", "enableSearch", "search", "searchLimitWordMax", "enableCaseSensitive"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TemplateDirective, selector: "[mngTemplate]", inputs: ["type", "mngTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
574
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: TableComponent, isStandalone: true, selector: "mng-table", inputs: { descriptorInput: { classPropertyName: "descriptorInput", publicName: "descriptor", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, dataProvider: { classPropertyName: "dataProvider", publicName: "dataProvider", isSignal: true, isRequired: false, transformFunction: null }, useQueryParams: { classPropertyName: "useQueryParams", publicName: "useQueryParams", isSignal: true, isRequired: false, transformFunction: null }, cellClickEnabled: { classPropertyName: "cellClickEnabled", publicName: "cellClickEnabled", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, selectionEnabled: { classPropertyName: "selectionEnabled", publicName: "selectionEnabled", isSignal: true, isRequired: false, transformFunction: null }, rowReorderEnabledInput: { classPropertyName: "rowReorderEnabledInput", publicName: "rowReorderEnabled", isSignal: true, isRequired: false, transformFunction: null }, columnLastMinWidth: { classPropertyName: "columnLastMinWidth", publicName: "columnLastMinWidth", isSignal: true, isRequired: false, transformFunction: null }, captionComponent: { classPropertyName: "captionComponent", publicName: "captionComponent", isSignal: true, isRequired: false, transformFunction: null }, columnCustomLastComponent: { classPropertyName: "columnCustomLastComponent", publicName: "columnCustomLastComponent", isSignal: true, isRequired: false, transformFunction: null }, globalFilterFieldsInput: { classPropertyName: "globalFilterFieldsInput", publicName: "globalFilterFields", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tableLoad: "tableLoad", cellClick: "cellClick", selectionChange: "selectionChange", captionComponentInstance: "captionComponentInstance", columnCustomLastComponentInstance: "columnCustomLastComponentInstance", rowReorder: "rowReorder" }, providers: [DataListService], queries: [{ propertyName: "templates", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "components", predicate: (ComponentDirective), descendants: true, isSignal: true }, { propertyName: "primeTable", first: true, predicate: Table, descendants: true, isSignal: true }], ngImport: i0, template: "<div>\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (!useQueryParams() || useQueryParamsInitialized()) {\n <p-table\n [value]=\"dataListService.data()\"\n [dataKey]=\"descriptor().trackProperty\"\n [lazy]=\"isLazy()\"\n [loading]=\"dataListService.loading()\"\n [paginator]=\"isPagination()\"\n [rows]=\"dataListService.rows()\"\n [first]=\"dataListService.offset()\"\n [totalRecords]=\"dataListService.count()\"\n [rowsPerPageOptions]=\"dataListService.rowsPerPageOptions()\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"dataListService.sortMeta()\"\n [filters]=\"dataListService.filterMeta()\"\n [globalFilterFields]=\"dataListService.globalFilterFields()\"\n sortMode=\"multiple\"\n [selection]=\"[]\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled() ? selectionMode() : null\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor().hasHover\"\n [styleClass]=\"className()\"\n [resizableColumns]=\"descriptor().hasResizableColumns\"\n [columnResizeMode]=\"descriptor().columnResizeMode ?? 'expand'\"\n [reorderableColumns]=\"areColumnsReorderable()\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns()\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onRowReorder)=\"onRowReorder($event)\">\n <ng-template pTemplate=\"caption\">\n @if (isCaptionVisible()) {\n <div class=\"table-header\">\n @if (overlayWithTagFilters().length > 0 || descriptor().search) {\n <mng-filter-overlay-with-tag\n [title]=\"descriptor().title\"\n [descriptors]=\"overlayWithTagFilters()\"\n [model]=\"descriptor().model\"\n [enableSearch]=\"descriptor().search\"\n [search]=\"globalSearchParamFromUrl()\"\n [searchLimitWordMax]=\"descriptor().searchLimitMaxWords\"\n [enableCaseSensitive]=\"isLazy()\">\n @if (hasTitleDisplay()) {\n <ng-template mngTemplate=\"title\">\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n </ng-template>\n }\n </mng-filter-overlay-with-tag>\n } @else {\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n }\n <ng-template #captionTemplateOrComponentOrTitle>\n @if (captionTemplate()) {\n <ng-container *ngTemplateOutlet=\"captionTemplate()\"></ng-container>\n } @else if (captionComponent()) {\n <ng-container [mngComponent]=\"captionComponent()\" (instanceCreated)=\"captionComponentInstance.emit($event)\"></ng-container>\n } @else if (descriptor().title) {\n <h5 class=\"p-0 m-0\">{{ descriptor().title! | translate }}</h5>\n }\n </ng-template>\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"header\">\n @if (!descriptor().hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"descriptor().headerClassName\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\"></th>\n }\n }\n @if (descriptor().rowExpandable) {\n <th scope=\"col\" pFrozenColumn [frozen]=\"true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n @if (hasLastColumn()) {\n <th\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"descriptor().actionColumnFrozen ?? areColumnsToggleable()\"\n alignFrozen=\"right\"\n class=\"column-custom-last text-right\">\n @if (areColumnsToggleable()) {\n <p-multiSelect\n #columnToggleMultiselect\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n dataKey=\"id\"\n tooltipPosition=\"left\"\n placeholder=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [filter]=\"false\"\n [options]=\"columns()\"\n [ngModel]=\"visibleColumns()\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allSelected\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.onToggleAll($event)\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allSelected\"\n [ngClass]=\"{\n 'p-highlight': anyColumnVisible()\n }\"\n (click)=\"onColumnToggleAll()\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': anyColumnVisible()}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n </ng-template>\n </p-multiSelect>\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters()) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled()) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @if (descriptor().rowExpandable) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <th\n [class]=\"col.filter?.columnClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\"\n [style.width.px]=\"col.width\"\n [style.width.%]=\"col.width ? null : col.filter?.columnWidth ?? col.descriptor.width ?? null\"\n [style.min-width.px]=\"col.width ? null : col.filter?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n @if (col.filter) {\n <mng-table-column-filter [descriptor]=\"col.filter\"></mng-table-column-filter>\n }\n </th>\n }\n @if (hasLastColumn()) {\n <th class=\"column-custom-last\" [style.min-width.px]=\"columnLastMinWidth()\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\" let-expanded=\"expanded\">\n <tr\n [pReorderableRow]=\"idx\"\n [ngClass]=\"descriptor().rowClassName | mngClassMap: descriptor().rowClassNameMapFn : item | mngLocaleDefaultRowClass: descriptor() : item\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @if (descriptor().rowExpandable) {\n <td>\n @if (!descriptor().rowExpandableProperty || item[descriptor().rowExpandableProperty!]) {\n <button\n pButton\n type=\"button\"\n [pRowToggler]=\"item\"\n class=\"p-button-text p-button-rounded p-button-plain mng-table-row-expand-button\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"></button>\n }\n </td>\n }\n @if (rowReorderEnabled()) {\n <td>\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n }\n @for (col of visibleColumns(); track col.id) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className\n | mngClassMap: col.descriptor.classNameMapFn : item\n | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\n \"\n [class.clickable]=\"isCellClickEnabled()\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n @if (hasLastColumn()) {\n <td\n class=\"column-custom-last justify-content-end text-right\"\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"descriptor().actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n @if (columnCustomLastTemplate()) {\n <ng-container *ngTemplateOutlet=\"columnCustomLastTemplate(); context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if (columnCustomLastComponent()) {\n <div [mngComponent]=\"columnCustomLastComponent()\" (instanceCreated)=\"columnCustomLastComponentInstance.emit($event)\"></div>\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-item>\n @if (descriptor().rowExpandable) {\n <tr>\n <td></td>\n <td [colSpan]=\"descriptor().rowExpandableColSpan\">\n @if (descriptor().rowExpandableComponentType !== undefined) {\n <ng-container [mngComponent]=\"descriptor().rowExpandableComponentType\" [inputs]=\"{item}\"> </ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowExpandTemplate(); context: {rowItem: item}\"></ng-container>\n }\n </td>\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n @if (descriptor().loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor().loadingIcon\"></i>\n }\n @if (descriptor().loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor().loadingIcon}\">\n {{ descriptor().loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"loadingbody\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate()) {\n <ng-template pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"footerTemplate(); context: {data: dataListService.data(), totalCount: dataListService.count()}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n", dependencies: [{ kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }, { kind: "pipe", type: I18nPropertyPipe, name: "mngI18nProperty" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "pipe", type: ClassMapPipe, name: "mngClassMap" }, { kind: "pipe", type: LocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }, { kind: "component", type: TableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["descriptor"] }, { kind: "pipe", type: TableColumnFilterClassPipe, name: "mngTableColumnFilterClass" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i1.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i1.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i1.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i1.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i1.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i1.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i1.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i1.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i1.ReorderableRowHandle, selector: "[pReorderableRowHandle]" }, { kind: "directive", type: i1.ReorderableRow, selector: "[pReorderableRow]", inputs: ["pReorderableRow", "pReorderableRowDisabled"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i3.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "component", type: FilterOverlayWithTagComponent, selector: "mng-filter-overlay-with-tag", inputs: ["descriptors", "model", "enableSearch", "search", "searchLimitWordMax", "enableCaseSensitive"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TemplateDirective, selector: "[mngTemplate]", inputs: ["type", "mngTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
575
575
  }
576
576
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: TableComponent, decorators: [{
577
577
  type: Component,
@@ -595,6 +595,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImpor
595
595
  FilterOverlayWithTagComponent,
596
596
  FormsModule,
597
597
  TemplateDirective
598
- ], providers: [DataListService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (!useQueryParams() || useQueryParamsInitialized()) {\n <p-table\n [value]=\"dataListService.data()\"\n [dataKey]=\"descriptor().trackProperty\"\n [lazy]=\"isLazy()\"\n [loading]=\"dataListService.loading()\"\n [paginator]=\"isPagination()\"\n [rows]=\"dataListService.rows()\"\n [first]=\"dataListService.offset()\"\n [totalRecords]=\"dataListService.count()\"\n [rowsPerPageOptions]=\"dataListService.rowsPerPageOptions()\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"dataListService.sortMeta()\"\n [filters]=\"dataListService.filterMeta()\"\n [globalFilterFields]=\"dataListService.globalFilterFields()\"\n sortMode=\"multiple\"\n [selection]=\"[]\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled() ? selectionMode() : null\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor().hasHover\"\n [styleClass]=\"className()\"\n [resizableColumns]=\"descriptor().hasResizableColumns\"\n [columnResizeMode]=\"descriptor().columnResizeMode ?? 'expand'\"\n [reorderableColumns]=\"areColumnsReorderable()\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns()\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onRowReorder)=\"onRowReorder($event)\">\n <ng-template pTemplate=\"caption\">\n @if (isCaptionVisible()) {\n <div class=\"table-header\">\n @if (overlayWithTagFilters().length > 0 || descriptor().search) {\n <mng-filter-overlay-with-tag\n [title]=\"descriptor().title\"\n [descriptors]=\"overlayWithTagFilters()\"\n [model]=\"descriptor().model\"\n [enableSearch]=\"descriptor().search\"\n [search]=\"globalSearchParamFromUrl()\"\n [searchLimitWordMax]=\"descriptor().searchLimitMaxWords\"\n [enableCaseSensitive]=\"isLazy()\">\n @if (hasTitleDisplay()) {\n <ng-template mngTemplate=\"title\">\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n </ng-template>\n }\n </mng-filter-overlay-with-tag>\n } @else {\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n }\n <ng-template #captionTemplateOrComponentOrTitle>\n @if (captionTemplate()) {\n <ng-container *ngTemplateOutlet=\"captionTemplate()\"></ng-container>\n } @else if (captionComponent()) {\n <ng-container [mngComponent]=\"captionComponent()\" (instanceCreated)=\"captionComponentInstance.emit($event)\"></ng-container>\n } @else if (descriptor().title) {\n <h5 class=\"p-0 m-0\">{{ descriptor().title! | translate }}</h5>\n }\n </ng-template>\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"header\">\n @if (!descriptor().hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"descriptor().headerClassName\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\"></th>\n }\n }\n @if (descriptor().rowExpandable) {\n <th scope=\"col\" pFrozenColumn [frozen]=\"true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n @if (hasLastColumn()) {\n <th\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"descriptor().actionColumnFrozen ?? areColumnsToggleable()\"\n alignFrozen=\"right\"\n class=\"column-custom-last text-right\">\n @if (descriptor().hasResizableColumns) {\n <p-multiSelect\n #columnToggleMultiselect\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n dataKey=\"id\"\n tooltipPosition=\"left\"\n placeholder=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [filter]=\"false\"\n [options]=\"columns()\"\n [ngModel]=\"visibleColumns()\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\" [ngClass]=\"{'p-checkbox-disabled': !areColumnsToggleable}\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allSelected\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.onToggleAll($event)\"\n [disabled]=\"!areColumnsToggleable\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allSelected\"\n [ngClass]=\"{\n 'p-highlight': anyColumnVisible()\n }\"\n (click)=\"onColumnToggleAll()\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': anyColumnVisible()}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n </ng-template>\n </p-multiSelect>\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters()) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled()) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @if (descriptor().rowExpandable) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <th\n [class]=\"col.filter?.columnClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\"\n [style.width.px]=\"col.width\"\n [style.width.%]=\"col.width ? null : col.filter?.columnWidth ?? col.descriptor.width ?? null\"\n [style.min-width.px]=\"col.width ? null : col.filter?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n @if (col.filter) {\n <mng-table-column-filter [descriptor]=\"col.filter\"></mng-table-column-filter>\n }\n </th>\n }\n @if (hasLastColumn()) {\n <th class=\"column-custom-last\" [style.min-width.px]=\"columnLastMinWidth()\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\" let-expanded=\"expanded\">\n <tr\n [pReorderableRow]=\"idx\"\n [ngClass]=\"descriptor().rowClassName | mngClassMap: descriptor().rowClassNameMapFn : item | mngLocaleDefaultRowClass: descriptor() : item\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @if (descriptor().rowExpandable) {\n <td>\n @if (!descriptor().rowExpandableProperty || item[descriptor().rowExpandableProperty!]) {\n <button\n pButton\n type=\"button\"\n [pRowToggler]=\"item\"\n class=\"p-button-text p-button-rounded p-button-plain mng-table-row-expand-button\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"></button>\n }\n </td>\n }\n @if (rowReorderEnabled()) {\n <td>\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n }\n @for (col of visibleColumns(); track col.id) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className\n | mngClassMap: col.descriptor.classNameMapFn : item\n | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\n \"\n [class.clickable]=\"isCellClickEnabled()\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n @if (hasLastColumn()) {\n <td\n class=\"column-custom-last justify-content-end text-right\"\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"descriptor().actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n @if (columnCustomLastTemplate()) {\n <ng-container *ngTemplateOutlet=\"columnCustomLastTemplate(); context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if (columnCustomLastComponent()) {\n <div [mngComponent]=\"columnCustomLastComponent()\" (instanceCreated)=\"columnCustomLastComponentInstance.emit($event)\"></div>\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-item>\n @if (descriptor().rowExpandable) {\n <tr>\n <td></td>\n <td [colSpan]=\"descriptor().rowExpandableColSpan\">\n @if (descriptor().rowExpandableComponentType !== undefined) {\n <ng-container [mngComponent]=\"descriptor().rowExpandableComponentType\" [inputs]=\"{item}\"> </ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowExpandTemplate(); context: {rowItem: item}\"></ng-container>\n }\n </td>\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n @if (descriptor().loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor().loadingIcon\"></i>\n }\n @if (descriptor().loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor().loadingIcon}\">\n {{ descriptor().loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"loadingbody\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate()) {\n <ng-template pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"footerTemplate(); context: {data: dataListService.data(), totalCount: dataListService.count()}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n" }]
598
+ ], providers: [DataListService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (!useQueryParams() || useQueryParamsInitialized()) {\n <p-table\n [value]=\"dataListService.data()\"\n [dataKey]=\"descriptor().trackProperty\"\n [lazy]=\"isLazy()\"\n [loading]=\"dataListService.loading()\"\n [paginator]=\"isPagination()\"\n [rows]=\"dataListService.rows()\"\n [first]=\"dataListService.offset()\"\n [totalRecords]=\"dataListService.count()\"\n [rowsPerPageOptions]=\"dataListService.rowsPerPageOptions()\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"dataListService.sortMeta()\"\n [filters]=\"dataListService.filterMeta()\"\n [globalFilterFields]=\"dataListService.globalFilterFields()\"\n sortMode=\"multiple\"\n [selection]=\"[]\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled() ? selectionMode() : null\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor().hasHover\"\n [styleClass]=\"className()\"\n [resizableColumns]=\"descriptor().hasResizableColumns\"\n [columnResizeMode]=\"descriptor().columnResizeMode ?? 'expand'\"\n [reorderableColumns]=\"areColumnsReorderable()\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns()\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onRowReorder)=\"onRowReorder($event)\">\n <ng-template pTemplate=\"caption\">\n @if (isCaptionVisible()) {\n <div class=\"table-header\">\n @if (overlayWithTagFilters().length > 0 || descriptor().search) {\n <mng-filter-overlay-with-tag\n [title]=\"descriptor().title\"\n [descriptors]=\"overlayWithTagFilters()\"\n [model]=\"descriptor().model\"\n [enableSearch]=\"descriptor().search\"\n [search]=\"globalSearchParamFromUrl()\"\n [searchLimitWordMax]=\"descriptor().searchLimitMaxWords\"\n [enableCaseSensitive]=\"isLazy()\">\n @if (hasTitleDisplay()) {\n <ng-template mngTemplate=\"title\">\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n </ng-template>\n }\n </mng-filter-overlay-with-tag>\n } @else {\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n }\n <ng-template #captionTemplateOrComponentOrTitle>\n @if (captionTemplate()) {\n <ng-container *ngTemplateOutlet=\"captionTemplate()\"></ng-container>\n } @else if (captionComponent()) {\n <ng-container [mngComponent]=\"captionComponent()\" (instanceCreated)=\"captionComponentInstance.emit($event)\"></ng-container>\n } @else if (descriptor().title) {\n <h5 class=\"p-0 m-0\">{{ descriptor().title! | translate }}</h5>\n }\n </ng-template>\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"header\">\n @if (!descriptor().hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"descriptor().headerClassName\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\"></th>\n }\n }\n @if (descriptor().rowExpandable) {\n <th scope=\"col\" pFrozenColumn [frozen]=\"true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n @if (hasLastColumn()) {\n <th\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"descriptor().actionColumnFrozen ?? areColumnsToggleable()\"\n alignFrozen=\"right\"\n class=\"column-custom-last text-right\">\n @if (areColumnsToggleable()) {\n <p-multiSelect\n #columnToggleMultiselect\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n dataKey=\"id\"\n tooltipPosition=\"left\"\n placeholder=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [filter]=\"false\"\n [options]=\"columns()\"\n [ngModel]=\"visibleColumns()\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allSelected\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.onToggleAll($event)\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allSelected\"\n [ngClass]=\"{\n 'p-highlight': anyColumnVisible()\n }\"\n (click)=\"onColumnToggleAll()\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': anyColumnVisible()}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | mngI18nProperty: descriptor().model) | translate }}\n </ng-template>\n </p-multiSelect>\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters()) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled()) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @if (descriptor().rowExpandable) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <th\n [class]=\"col.filter?.columnClassName | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\"\n [style.width.px]=\"col.width\"\n [style.width.%]=\"col.width ? null : col.filter?.columnWidth ?? col.descriptor.width ?? null\"\n [style.min-width.px]=\"col.width ? null : col.filter?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n @if (col.filter) {\n <mng-table-column-filter [descriptor]=\"col.filter\"></mng-table-column-filter>\n }\n </th>\n }\n @if (hasLastColumn()) {\n <th class=\"column-custom-last\" [style.min-width.px]=\"columnLastMinWidth()\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\" let-expanded=\"expanded\">\n <tr\n [pReorderableRow]=\"idx\"\n [ngClass]=\"descriptor().rowClassName | mngClassMap: descriptor().rowClassNameMapFn : item | mngLocaleDefaultRowClass: descriptor() : item\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor().selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @if (descriptor().rowExpandable) {\n <td>\n @if (!descriptor().rowExpandableProperty || item[descriptor().rowExpandableProperty!]) {\n <button\n pButton\n type=\"button\"\n [pRowToggler]=\"item\"\n class=\"p-button-text p-button-rounded p-button-plain mng-table-row-expand-button\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"></button>\n }\n </td>\n }\n @if (rowReorderEnabled()) {\n <td>\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n }\n @for (col of visibleColumns(); track col.id) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className\n | mngClassMap: col.descriptor.classNameMapFn : item\n | mngTableColumnFilterClass: col.filter : hasColumnFilters() && !col.width\n \"\n [class.clickable]=\"isCellClickEnabled()\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | mngI18nProperty: descriptor().model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n @if (hasLastColumn()) {\n <td\n class=\"column-custom-last justify-content-end text-right\"\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"descriptor().actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n @if (columnCustomLastTemplate()) {\n <ng-container *ngTemplateOutlet=\"columnCustomLastTemplate(); context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if (columnCustomLastComponent()) {\n <div [mngComponent]=\"columnCustomLastComponent()\" (instanceCreated)=\"columnCustomLastComponentInstance.emit($event)\"></div>\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-item>\n @if (descriptor().rowExpandable) {\n <tr>\n <td></td>\n <td [colSpan]=\"descriptor().rowExpandableColSpan\">\n @if (descriptor().rowExpandableComponentType !== undefined) {\n <ng-container [mngComponent]=\"descriptor().rowExpandableComponentType\" [inputs]=\"{item}\"> </ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowExpandTemplate(); context: {rowItem: item}\"></ng-container>\n }\n </td>\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n @if (descriptor().loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor().loadingIcon\"></i>\n }\n @if (descriptor().loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor().loadingIcon}\">\n {{ descriptor().loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"loadingbody\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate()) {\n <ng-template pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"footerTemplate(); context: {data: dataListService.data(), totalCount: dataListService.count()}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n" }]
599
599
  }], ctorParameters: () => [] });
600
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUUsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUtSLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLGVBQWUsRUFDZixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFVLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRWxJLE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsY0FBYyxFQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQXlCLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxFQUFDLEtBQUssRUFBK0MsV0FBVyxFQUF1QixN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QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDdEcsQ0FBQztJQUNOLENBQUM7OEdBdnBCUSxjQUFjO2tHQUFkLGNBQWMscTJFQUhaLENBQUMsZUFBZSxDQUFDLG9EQTZETyxpQkFBaUIsNEVBQ25CLENBQUEsa0JBQXVCLENBQUEsNkZBQ2pCLEtBQUssZ0VDM0toRCx3M3BCQXdVQSw0Q0QvT1Esa0JBQWtCLDRLQUNsQixnQkFBZ0Isd0RBQ2hCLE9BQU8sb0ZBQ1AsT0FBTywyRUFDUCxnQkFBZ0Isb0pBQ2hCLHlCQUF5Qiw4RkFDekIsWUFBWSwrQ0FDWix5QkFBeUIsaUVBQ3pCLDBCQUEwQix1RkFDMUIsMEJBQTBCLGlFQUMxQixXQUFXLHk0R0FDWCxpQkFBaUIsbzFDQUNqQixZQUFZLDJrQkFDWixhQUFhLHFYQUNiLGVBQWUsNEZBQ2YsNkJBQTZCLGdMQUM3QixXQUFXLCtWQUNYLGlCQUFpQjs7MkZBS1osY0FBYztrQkE1QjFCLFNBQVM7aUNBQ00sSUFBSSxZQUNOLFdBQVcsV0FFWjt3QkFDTCxTQUFTO3dCQUNULGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLE9BQU87d0JBQ1AsZ0JBQWdCO3dCQUNoQix5QkFBeUI7d0JBQ3pCLFlBQVk7d0JBQ1oseUJBQXlCO3dCQUN6QiwwQkFBMEI7d0JBQzFCLDBCQUEwQjt3QkFDMUIsV0FBVzt3QkFDWCxpQkFBaUI7d0JBQ2pCLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixlQUFlO3dCQUNmLDZCQUE2Qjt3QkFDN0IsV0FBVzt3QkFDWCxpQkFBaUI7cUJBQ3BCLGFBQ1UsQ0FBQyxlQUFlLENBQUMsbUJBQ1gsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgSW5qZWN0b3IsXG4gICAgT25EZXN0cm95LFxuICAgIFNpZ25hbCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBUeXBlLFxuICAgIGFmdGVyTmV4dFJlbmRlcixcbiAgICBib29sZWFuQXR0cmlidXRlLFxuICAgIGNvbXB1dGVkLFxuICAgIGNvbnRlbnRDaGlsZHJlbixcbiAgICBlZmZlY3QsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIG91dHB1dCxcbiAgICBzaWduYWwsXG4gICAgdmlld0NoaWxkLFxuICAgIHZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7b3V0cHV0RnJvbU9ic2VydmFibGUsIHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge0Zvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uQ2FuY2VsLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIE5hdmlnYXRpb25TdGFydCwgUGFyYW1zLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7TWVzc2FnZVNlcnZpY2UsIFNvcnRNZXRhfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHtNdWx0aVNlbGVjdENoYW5nZUV2ZW50LCBNdWx0aVNlbGVjdE1vZHVsZX0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XG5pbXBvcnQge1RhYmxlLCBUYWJsZUNvbHVtblJlb3JkZXJFdmVudCwgVGFibGVMYXp5TG9hZEV2ZW50LCBUYWJsZU1vZHVsZSwgVGFibGVSb3dSZW9yZGVyRXZlbnR9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHtUb29sdGlwTW9kdWxlfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHtORVZFUiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBvZiwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gICAgQ2xhc3NNYXBQaXBlLFxuICAgIENvbW1vbnNGaWx0ZXJNZXRhZGF0YSxcbiAgICBDb21tb25zU2VydmljZSxcbiAgICBDb21tb25zU3RvcmFnZVNlcnZpY2UsXG4gICAgQ29tcG9uZW50RGlyZWN0aXZlLFxuICAgIERhdGFMaXN0UGFyYW1zLFxuICAgIERhdGFMaXN0UmVzdWx0LFxuICAgIEZpbHRlck1hdGNoTW9kZSxcbiAgICBJMThuUHJvcGVydHlQaXBlLFxuICAgIExvZ2dlclNlcnZpY2UsXG4gICAgVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgYm9vbGVhbk9yVW5kZWZpbmVkQXR0cmlidXRlLFxuICAgIHRvT2JzZXJ2YWJsZSBhcyBjb21tb25zVG9PYnNlcnZhYmxlLFxuICAgIGRhdGFMaXN0UGFyYW1zVG9VcmxRdWVyeSxcbiAgICBmaW5kVGVtcGxhdGVCeU5hbWUsXG4gICAgZnJvbVN1YnNjcmliZUVycm9yLFxuICAgIGZyb21UYWJsZUxvYWRUb0RhdGFMaXN0UGFyYW1zLFxuICAgIGZyb21VcmxRdWVyeVRvRGF0YUxpc3RQYXJhbXMsXG4gICAgZ2V0RXJyb3JMb2dMZXZlbCxcbiAgICBtZXJnZURhdGFMaXN0UGFyYW1zV2l0aERlZmF1bHRzXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0ZpbHRlckRlc2NyaXB0b3IsIEZpbHRlckRpc3BsYXlUeXBlRW51bSwgRmlsdGVyTG9va3VwRGVzY3JpcHRvciwgRmlsdGVyVHlwZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7XG4gICAgQ29sdW1uRGVzY3JpcHRvcixcbiAgICBJVGFibGVEYXRhUHJvdmlkZXIsXG4gICAgVGFibGVDZWxsQ2xpY2tFdmVudCxcbiAgICBUYWJsZURlc2NyaXB0b3JJbnN0LFxuICAgIFRhYmxlRHluYW1pY0Rlc2NyaXB0b3JJbnN0LFxuICAgIFRhYmxlTGF5b3V0UHJlZmVyZW5jZXMsXG4gICAgVGFibGVMb2FkRXZlbnQsXG4gICAgVGFibGVQYWdpbmF0aW9uTW9kZUVudW0sXG4gICAgVGFibGVSZWxvYWRFdmVudCxcbiAgICBUYWJsZVNpemVFbnVtLFxuICAgIHRhYmxlRGVzY3JpcHRvclxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxlL2FwaSc7XG5cbmltcG9ydCB7Y3JlYXRlRmlsdGVyRGVzY3JpcHRvcnNGcm9tR2VuZXJpY30gZnJvbSAnLi4vLi4vaGVscGVycy9maWx0ZXJzJztcbmltcG9ydCB7dGFibGVOb3RpZmljYXRpb25FcnJvcn0gZnJvbSAnLi4vLi4vaGVscGVycy9ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtnZW5lcmF0ZVRhYmxlTGF5b3V0UHJlZnNLZXl9IGZyb20gJy4uLy4uL2hlbHBlcnMvdGFibGUtbGF5b3V0LXByZWZzJztcbmltcG9ydCB7Q29sdW1uV2l0aFByZWZlcmVuY2VzfSBmcm9tICcuLi8uLi9tb2RlbHMvY29sdW1uLXByZWZlcmVuY2VzLm1vZGVsJztcbmltcG9ydCB7TG9jYWxlRGVmYXVsdFJvd0NsYXNzUGlwZX0gZnJvbSAnLi4vLi4vcGlwZXMvbG9jYWxlLWRlZmF1bHQtcm93LWNsYXNzLnBpcGUnO1xuaW1wb3J0IHtUYWJsZUNvbHVtbkZpbHRlckNsYXNzUGlwZX0gZnJvbSAnLi4vLi4vcGlwZXMvdGFibGUtY29sdW1uLWZpbHRlci1jbGFzcy5waXBlJztcbmltcG9ydCB7RGF0YUxpc3RTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLWxpc3Quc2VydmljZSc7XG5pbXBvcnQge0NPTU1PTlNfVEFCTEVfRkVBVFVSRV9DT05GSUdfSVR9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RhYmxlLWZlYXR1cmUtY29uZmlnLnRva2VuJztcbmltcG9ydCB7VGFibGVDb2x1bW5GaWx0ZXJDb21wb25lbnR9IGZyb20gJy4uL2NvbHVtbi1maWx0ZXIvY29sdW1uLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHtUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50fSBmcm9tICcuLi9jb2x1bW4tdmFsdWUvY29sdW1uLXZhbHVlLmNvbXBvbmVudCc7XG5pbXBvcnQge0ZpbHRlck92ZXJsYXlXaXRoVGFnQ29tcG9uZW50fSBmcm9tICcuLi9maWx0ZXIvZmlsdGVyLW92ZXJsYXktd2l0aC10YWcvZmlsdGVyLW92ZXJsYXktd2l0aC10YWcuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy10YWJsZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgQ29tcG9uZW50RGlyZWN0aXZlLFxuICAgICAgICBJMThuUHJvcGVydHlQaXBlLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBOZ1N0eWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50LFxuICAgICAgICBDbGFzc01hcFBpcGUsXG4gICAgICAgIExvY2FsZURlZmF1bHRSb3dDbGFzc1BpcGUsXG4gICAgICAgIFRhYmxlQ29sdW1uRmlsdGVyQ29tcG9uZW50LFxuICAgICAgICBUYWJsZUNvbHVtbkZpbHRlckNsYXNzUGlwZSxcbiAgICAgICAgVGFibGVNb2R1bGUsXG4gICAgICAgIE11bHRpU2VsZWN0TW9kdWxlLFxuICAgICAgICBCdXR0b25Nb2R1bGUsXG4gICAgICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgRmlsdGVyT3ZlcmxheVdpdGhUYWdDb21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBUZW1wbGF0ZURpcmVjdGl2ZVxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbRGF0YUxpc3RTZXJ2aWNlXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxJdGVtID0gYW55LCBTZXJ2aWNlID0gdW5kZWZpbmVkLCBTb3J0cyA9IGFueSwgRmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IGFueT4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyByZWFkb25seSBjbXBUeXBlTmFtZSA9ICdUYWJsZUNvbXBvbmVudCc7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IGluamVjdChMb2dnZXJTZXJ2aWNlKS5jcmVhdGUodGhpcy5jbXBUeXBlTmFtZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0KE1lc3NhZ2VTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1vbnMgPSBpbmplY3QoQ29tbW9uc1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2UgPSBpbmplY3QoQ29tbW9uc1N0b3JhZ2VTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdChDT01NT05TX1RBQkxFX0ZFQVRVUkVfQ09ORklHX0lULCB7b3B0aW9uYWw6IHRydWV9KTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGF0YUxpc3RTZXJ2aWNlID0gaW5qZWN0KERhdGFMaXN0U2VydmljZTxJdGVtPik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRGaWx0ZXJEaXNwbGF5VHlwZTogRmlsdGVyRGlzcGxheVR5cGVFbnVtID0gdGhpcy5jb25maWc/LmZpbHRlckRpc3BsYXlUeXBlID8/IEZpbHRlckRpc3BsYXlUeXBlRW51bS5Db2x1bW47XG5cbiAgICAvLyBtZXRhZGF0YSBpbnB1dFxuICAgIHB1YmxpYyBkZXNjcmlwdG9ySW5wdXQgPSBpbnB1dC5yZXF1aXJlZDxUYWJsZURlc2NyaXB0b3JJbnN0PEl0ZW0sIFNvcnRzLCBGaWx0ZXJzPj4oe2FsaWFzOiAnZGVzY3JpcHRvcid9KTtcblxuICAgIC8vIGRhdGEgc291cmNlIGlucHV0c1xuICAgIHB1YmxpYyBpdGVtcyA9IGlucHV0PEl0ZW1bXT4oKTtcbiAgICBwdWJsaWMgcmVzdWx0ID0gaW5wdXQ8RGF0YUxpc3RSZXN1bHQ8SXRlbT4+KCk7XG4gICAgcHVibGljIGxvYWRpbmdJbnB1dCA9IGlucHV0KHVuZGVmaW5lZCwge2FsaWFzOiAnbG9hZGluZycsIHRyYW5zZm9ybTogYm9vbGVhbk9yVW5kZWZpbmVkQXR0cmlidXRlfSk7XG4gICAgcHVibGljIGRhdGFQcm92aWRlciA9IGlucHV0PElUYWJsZURhdGFQcm92aWRlcjxJdGVtLCBTZXJ2aWNlLCBTb3J0cywgRmlsdGVycz4+KCk7XG5cbiAgICAvLyBleHRyYSBmZWF0dXJlcyBpbnB1dFxuICAgIHB1YmxpYyB1c2VRdWVyeVBhcmFtcyA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIGNlbGxDbGlja0VuYWJsZWQgPSBpbnB1dCh0cnVlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIHNlbGVjdGlvbk1vZGUgPSBpbnB1dDwnc2luZ2xlJyB8ICdtdWx0aXBsZSc+KCdtdWx0aXBsZScpO1xuICAgIHB1YmxpYyBzZWxlY3Rpb25FbmFibGVkID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgcm93UmVvcmRlckVuYWJsZWRJbnB1dCA9IGlucHV0KHRydWUsIHthbGlhczogJ3Jvd1Jlb3JkZXJFbmFibGVkJywgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIHJvd1Jlb3JkZXJFbmFibGVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5yb3dSZW9yZGVyRW5hYmxlZElucHV0KCkgJiYgdGhpcy5kZXNjcmlwdG9yKCkucm93UmVvcmRlcmFibGUpO1xuXG4gICAgLy8gc3R5bGluZ1xuICAgIHB1YmxpYyBjb2x1bW5MYXN0TWluV2lkdGggPSBpbnB1dDxudW1iZXI+KCk7XG4gICAgcHVibGljIGNvbHVtbnNDb2xzcGFuID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aXNpYmxlQ29sdW1ucygpLmxlbmd0aCArICh0aGlzLmhhc0xhc3RDb2x1bW4oKSA/IDEgOiAwKSArICh0aGlzLnNlbGVjdGlvbkVuYWJsZWQoKSA/IDEgOiAwKSArICh0aGlzLnJvd1Jlb3JkZXJFbmFibGVkKCkgPyAxIDogMCkpO1xuICAgIHB1YmxpYyBoYXNUaXRsZURpc3BsYXkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNhcHRpb25UZW1wbGF0ZSgpIHx8IHRoaXMuY2FwdGlvbkNvbXBvbmVudCgpIHx8IHRoaXMuZGVzY3JpcHRvcigpLnRpdGxlKTtcbiAgICBwdWJsaWMgaXNDYXB0aW9uVmlzaWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGFzVGl0bGVEaXNwbGF5KCkgfHwgdGhpcy5vdmVybGF5V2l0aFRhZ0ZpbHRlcnMoKS5sZW5ndGggPiAwIHx8IHRoaXMuZGVzY3JpcHRvcigpLnNlYXJjaCk7XG5cbiAgICAvLyBjb21wb25lbnQgaW5wdXRzXG4gICAgcHVibGljIGNhcHRpb25Db21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4+KCk7XG4gICAgcHVibGljIGNvbHVtbkN1c3RvbUxhc3RDb21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4+KCk7XG4gICAgcHVibGljIGdsb2JhbEZpbHRlckZpZWxkc0lucHV0ID0gaW5wdXQ8c3RyaW5nW10gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwge2FsaWFzOiAnZ2xvYmFsRmlsdGVyRmllbGRzJ30pO1xuXG4gICAgLy8gY2VsbCBjbGlja1xuICAgIHByaXZhdGUgY2VsbENsaWNrU3ViamVjdCA9IG5ldyBTdWJqZWN0PFRhYmxlQ2VsbENsaWNrRXZlbnQ8SXRlbT4+KCk7XG4gICAgcHVibGljIGlzQ2VsbENsaWNrT2JzZXJ2ZWQgPSBzaWduYWwodGhpcy5jZWxsQ2xpY2tTdWJqZWN0Lm9ic2VydmVkKTtcbiAgICBwdWJsaWMgaXNDZWxsQ2xpY2tFbmFibGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jZWxsQ2xpY2tFbmFibGVkKCkgJiYgdGhpcy5pc0NlbGxDbGlja09ic2VydmVkKCkpO1xuXG4gICAgLy8gZXZlbnQgb3V0cHV0c1xuICAgIHB1YmxpYyB0YWJsZUxvYWQgPSBvdXRwdXQ8VGFibGVMb2FkRXZlbnQ+KCk7XG4gICAgcHVibGljIGNlbGxDbGljayA9IG91dHB1dEZyb21PYnNlcnZhYmxlKHRoaXMuY2VsbENsaWNrU3ViamVjdCk7XG4gICAgcHVibGljIHNlbGVjdGlvbkNoYW5nZSA9IG91dHB1dDxBcnJheTxJdGVtPj4oKTtcbiAgICBwdWJsaWMgY2FwdGlvbkNvbXBvbmVudEluc3RhbmNlID0gb3V0cHV0PGFueT4oKTtcbiAgICBwdWJsaWMgY29sdW1uQ3VzdG9tTGFzdENvbXBvbmVudEluc3RhbmNlID0gb3V0cHV0PGFueT4oKTtcbiAgICBwdWJsaWMgcm93UmVvcmRlciA9IG91dHB1dDxUYWJsZVJvd1Jlb3JkZXJFdmVudD4oKTtcblxuICAgIC8vIGNvbnRlbnQgYW5kIHZpZXcgcXVlcmllc1xuICAgIHB1YmxpYyB0ZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVEaXJlY3RpdmUpO1xuICAgIHB1YmxpYyBjb21wb25lbnRzID0gdmlld0NoaWxkcmVuKENvbXBvbmVudERpcmVjdGl2ZTxhbnk+KTtcbiAgICBwdWJsaWMgcHJpbWVUYWJsZSA9IHZpZXdDaGlsZC5yZXF1aXJlZChUYWJsZSk7XG5cbiAgICAvLyB0ZW1wbGF0ZXNcbiAgICBwdWJsaWMgY2FwdGlvblRlbXBsYXRlOiBTaWduYWw8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4gZmluZFRlbXBsYXRlQnlOYW1lKFsuLi50aGlzLnRlbXBsYXRlcygpXSwgJ2NhcHRpb24nKSk7XG4gICAgcHVibGljIGNvbHVtbkN1c3RvbUxhc3RUZW1wbGF0ZTogU2lnbmFsPFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IGZpbmRUZW1wbGF0ZUJ5TmFtZShbLi4udGhpcy50ZW1wbGF0ZXMoKV0sICdjb2x1bW5DdXN0b21MYXN0JykpO1xuICAgIHB1YmxpYyBmb290ZXJUZW1wbGF0ZTogU2lnbmFsPFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IGZpbmRUZW1wbGF0ZUJ5TmFtZShbLi4udGhpcy50ZW1wbGF0ZXMoKV0sICdmb290ZXInKSk7XG4gICAgcHVibGljIHJvd0V4cGFuZFRlbXBsYXRlOiBTaWduYWw8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4gZmluZFRlbXBsYXRlQnlOYW1lKFsuLi50aGlzLnRlbXBsYXRlcygpXSwgJ3Jvd0V4cGFuZENvbnRlbnQnKSk7XG5cbiAgICAvLyBkYXRhIHByb3ZpZGVyIGFuZCBpdGVtc1xuICAgIHB1YmxpYyBpc0xhenkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRhdGFQcm92aWRlcigpPy5pc0xhenkgPT09IHRydWUpO1xuICAgIHB1YmxpYyBpc1BhZ2luYXRpb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZ2luYXRpb25Nb2RlKCkgPT09IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLlBhZ2luYXRpb24pO1xuICAgIHB1YmxpYyB1c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIC8vIHZpc3VhbFxuICAgIHByaXZhdGUgcGFnaW5hdGlvbk1vZGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZXNjcmlwdG9yKCkucGFnaW5hdGlvbk1vZGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBkZXNjcmlwdG9yIGNob2ljZSBpcyB0aGUgc3Ryb25nZXN0IC0gaWYgZGVmaW5lZCwgdXNlIHRoaXMgdmFsdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3IoKS5wYWdpbmF0aW9uTW9kZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5kYXRhUHJvdmlkZXIoKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBwcm92aWRlciBpcyB1c2VkLCB1c2UgcGFnaW5hdGlvblxuICAgICAgICAgICAgcmV0dXJuIFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLlBhZ2luYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uTm9uZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHB1YmxpYyBjbGFzc05hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSB0aGlzLmRlc2NyaXB0b3IoKS5jbGFzc05hbWUgPz8gJyc7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kZXNjcmlwdG9yKCkuc2l6ZSkge1xuICAgICAgICAgICAgY2FzZSBUYWJsZVNpemVFbnVtLlNtYWxsOlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArPSAnIHAtZGF0YXRhYmxlLXNtJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVGFibGVTaXplRW51bS5MYXJnZTpcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1sZyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcigpLmhhc0dyaWRsaW5lcykge1xuICAgICAgICAgICAgY2xhc3NOYW1lICs9ICcgcC1kYXRhdGFibGUtZ3JpZGxpbmVzJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNDYXB0aW9uVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gJyBkYXRhdGFibGUtbm8taGVhZGVyJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3NOYW1lO1xuICAgIH0pO1xuXG4gICAgLy8gZGF0YSBwcm92aWRlclxuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU2VydmljZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gdGhpcy5kYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgcmV0dXJuIGRhdGFQcm92aWRlcj8uc2VydmljZVR5cGUgPyB0aGlzLmluamVjdG9yLmdldDxhbnk+KGRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSkgOiBudWxsO1xuICAgIH0pO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudD86IFRhYmxlTGF6eUxvYWRFdmVudDtcbiAgICBwcml2YXRlIGxhdGVzdFBhcmFtc1dpdGhEZWZhdWx0cz86IERhdGFMaXN0UGFyYW1zO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gZGVzY3JpcHRvcnNcbiAgICBwdWJsaWMgZGVzY3JpcHRvciA9IHNpZ25hbDxUYWJsZURlc2NyaXB0b3JJbnN0PGFueSwgYW55LCBhbnk+Pih0YWJsZURlc2NyaXB0b3I8c3RyaW5nLCBzdHJpbmcsIHN0cmluZz4oKSk7XG4gICAgcHJpdmF0ZSBsb2NhbHN0b3JhZ2VLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmRlc2NyaXB0b3IoKTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IubW9kZWwuaTE4bkJhc2VLZXkgPyBnZW5lcmF0ZVRhYmxlTGF5b3V0UHJlZnNLZXkoZGVzY3JpcHRvci5tb2RlbC5pMThuQmFzZUtleSwgdGhpcy5yb3V0ZXIudXJsLCBkZXNjcmlwdG9yLmlkZW50aWZpZXIpIDogbnVsbDtcbiAgICB9KTtcbiAgICBwcml2YXRlIGxheW91dFByZWZzU2F2ZUNudCA9IHNpZ25hbCgwKTtcbiAgICBwcml2YXRlIGxheW91dFByZWZlcmVuY2VzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBsc0tleSA9IHRoaXMubG9jYWxzdG9yYWdlS2V5KCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgY29uc3QgY250ID0gdGhpcy5sYXlvdXRQcmVmc1NhdmVDbnQoKTsgLy8gbmVlZGVkIHRvIGZvcmNlIHVwZGF0ZXMgb24gdXNlciBjaGFuZ2VzXG4gICAgICAgIGNvbnN0IGxheW91dFByZWZzID0gbHNLZXkgPyB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW08VGFibGVMYXlvdXRQcmVmZXJlbmNlcz4odGhpcy5jbXBUeXBlTmFtZSwgbHNLZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbGF5b3V0UHJlZnMgPz8ge2NvbHVtbldpZHRoczoge319O1xuICAgIH0pO1xuICAgIHB1YmxpYyBjb2x1bW5zID0gY29tcHV0ZWQ8Q29sdW1uV2l0aFByZWZlcmVuY2VzW10+KCgpID0+IHRoaXMuY29tcHV0ZUNvbHVtbnNXaXRoTGF5b3V0KCkpO1xuICAgIHB1YmxpYyB2aXNpYmxlQ29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29sdW1ucygpLmZpbHRlcihjb2wgPT4gY29sLmlzVmlzaWJsZSkpO1xuXG4gICAgLy8gZmlsdGVyLCBzb3J0XG4gICAgcHVibGljIGZpbHRlckRlc2NyaXB0b3JzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZXNjcmlwdG9yKCkuZmlsdGVycyk7XG4gICAgcHVibGljIGdlbmVyaWNGaWx0ZXJEZXNjcmlwdG9yID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZXNjcmlwdG9yKCkuZ2VuZXJpY0ZpbHRlcik7XG4gICAgcHJpdmF0ZSBmaWx0ZXJEZXNjcmlwdG9yc0Zyb21HZW5lcmljID0gc2lnbmFsPEZpbHRlckRlc2NyaXB0b3I8YW55LCBhbnk+W10+KFtdKTtcbiAgICBwdWJsaWMgaGFzQ29sdW1uRmlsdGVycyA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgKHRoaXMuZGVmYXVsdEZpbHRlckRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uT3ZlcmxheVdpdGhUYWcgJiYgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycygpLnNvbWUoZCA9PiBkLmRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uQ29sdW1uKSkgfHxcbiAgICAgICAgICAgICh0aGlzLmRlZmF1bHRGaWx0ZXJEaXNwbGF5VHlwZSA9PT0gRmlsdGVyRGlzcGxheVR5cGVFbnVtLkNvbHVtbiAmJiB0aGlzLmZpbHRlckRlc2NyaXB0b3JzKCkuc29tZShkID0+IGQuZGlzcGxheVR5cGUgPT0gbnVsbCkpXG4gICAgKTtcbiAgICBwdWJsaWMgb3ZlcmxheVdpdGhUYWdGaWx0ZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJEZXNjcmlwdG9ycygpLmZpbHRlcihcbiAgICAgICAgICAgIGQgPT4gKGQuZGlzcGxheVR5cGUgPT0gbnVsbCAmJiB0aGlzLmRlZmF1bHRGaWx0ZXJEaXNwbGF5VHlwZSA9PT0gRmlsdGVyRGlzcGxheVR5cGVFbnVtLk92ZXJsYXlXaXRoVGFnKSB8fCBkLmRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uT3ZlcmxheVdpdGhUYWdcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVycy5jb25jYXQodGhpcy5maWx0ZXJEZXNjcmlwdG9yc0Zyb21HZW5lcmljKCkpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBkZWZhdWx0UGFyYW1zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlRGVmYXVsdERhdGFMaXN0UGFyYW1zKCkpO1xuXG4gICAgcHVibGljIGFueUNvbHVtblZpc2libGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpc2libGVDb2x1bW5zKCkubGVuZ3RoID4gMCk7XG4gICAgcHVibGljIGhhc0N1c3RvbUxhc3RDb2x1bW4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbkN1c3RvbUxhc3RDb21wb25lbnQgfHwgdGhpcy5jb2x1bW5DdXN0b21MYXN0VGVtcGxhdGUoKSk7XG4gICAgcHVibGljIGhhc0xhc3RDb2x1bW4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmhhc0N1c3RvbUxhc3RDb2x1bW4oKSB8fCB0aGlzLmFyZUNvbHVtbnNUb2dnbGVhYmxlKCkgfHwgdGhpcy5hcmVDb2x1bW5zUmVvcmRlcmFibGUoKSk7XG5cbiAgICAvLyBsYXlvdXQgcHJlZnNcbiAgICBwdWJsaWMgYXJlQ29sdW1uc1Jlb3JkZXJhYmxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZXNjcmlwdG9yKCkuY29sdW1ucy5zb21lKHZhbHVlID0+IHZhbHVlLmlzUmVvcmRlcmFibGUpKTtcbiAgICBwdWJsaWMgYXJlQ29sdW1uc1RvZ2dsZWFibGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRlc2NyaXB0b3IoKS5jb2x1bW5zLnNvbWUodmFsdWUgPT4gdmFsdWUuaXNUb2dnbGVhYmxlKSk7XG5cbiAgICBwdWJsaWMgZ2xvYmFsU2VhcmNoUGFyYW1Gcm9tVXJsID0gc2lnbmFsPHt2YWx1ZTogc3RyaW5nOyBjYXNlU2Vuc2l0aXZlOiBib29sZWFufSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8vIG90aGVyXG4gICAgcHJpdmF0ZSByb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVzY3JpcHRvci5yb3dzUGVyUGFnZU9wdGlvbnMpICYmIGRlc2NyaXB0b3Iucm93c1BlclBhZ2VPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2Uucm93c1BlclBhZ2VPcHRpb25zLnNldChkZXNjcmlwdG9yLnJvd3NQZXJQYWdlT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmRlZmF1bHROdW1Sb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnJvd3Muc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2Uucm93c1BlclBhZ2VPcHRpb25zKCkuaW5jbHVkZXMoZGVzY3JpcHRvci5kZWZhdWx0TnVtUm93cykgPyBkZXNjcmlwdG9yLmRlZmF1bHROdW1Sb3dzIDogdGhpcy5kYXRhTGlzdFNlcnZpY2Uucm93c1BlclBhZ2VPcHRpb25zKClbMF1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge2FsbG93U2lnbmFsV3JpdGVzOiB0cnVlfVxuICAgICAgICApO1xuXG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5sb2FkaW5nSW5wdXQoKTtcbiAgICAgICAgICAgICAgICBpZiAobG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmxvYWRpbmcuc2V0KGxvYWRpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnNldERhdGEocmVzdWx0LmRhdGEsIHJlc3VsdC50b3RhbENvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZGluZ0lucHV0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkaW5nID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBzZXQgaWYgaW5wdXQgaXMgbm90IGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSB1bmRlZmluZWQgJiYgaXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5zZXREYXRhKGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZGluZ0lucHV0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkaW5nID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBzZXQgaWYgaW5wdXQgaXMgbm90IGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmRlc2NyaXB0b3IoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5nbG9iYWxGaWx0ZXJGaWVsZHMuc2V0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkc0lucHV0KCkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmRlc2NyaXB0b3IoKS5zZWFyY2ggJiYgZGVzY3JpcHRvci5zZWFyY2hGaWVsZHMgPyBkZXNjcmlwdG9yLnNlYXJjaEZpZWxkcyA6IHRoaXMuY29sdW1ucygpLm1hcChjID0+IGMuZGVzY3JpcHRvci5wcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNDZWxsQ2xpY2tPYnNlcnZlZC5zZXQodGhpcy5jZWxsQ2xpY2tTdWJqZWN0Lm9ic2VydmVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuZGF0YVByb3ZpZGVyKVxuICAgICAgICAgICAgLnBpcGUoc3dpdGNoTWFwKGRwID0+IGRwPy50YWJsZVJlbG9hZCQgPz8gb2Yoe30pKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0b09ic2VydmFibGUodGhpcy5kZXNjcmlwdG9ySW5wdXQpLCB0b09ic2VydmFibGUodGhpcy5kYXRhUHJvdmlkZXIpLCB0b09ic2VydmFibGUodGhpcy51c2VRdWVyeVBhcmFtcyldKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gZGF0YVByb3ZpZGVyIGlzIG5lZWRlZCB0byBlbnN1cmUgY29ycmVjdCBvcmRlciBvZiBleGVjdXRpb24gYW5kIHJlbG9hZFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKFtkZXNjcmlwdG9ySW5wdXQsIGRhdGFQcm92aWRlciwgdXNlUXVlcnlQYXJhbXNdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9ySW5wdXQgIT09IHRoaXMuZGVzY3JpcHRvcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3Iuc2V0KGRlc2NyaXB0b3JJbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHRhYmxlIGxvYWRzIGZyb20gcm91dGUgdXBkYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGUucXVlcnlQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShxcCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHFwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgZGF0YSBpbW1lZGlhdGVseSBieSBjcmVhdGluZyBkZWZhdWx0IHNvcnRzIGFuZCBmaWx0ZXJzIChwcmltZW5nIHdpbGwgdHJpZ2dlciBvbkxhenlMb2FkIGV2ZW50IG9uIHNvcnQmZmlsdGVyIG1ldGFkYXRhIGNoYW5nZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFNvcnQgPSB0aGlzLmNyZWF0ZVNvcnRNZXRhKHRoaXMuZGVmYXVsdFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWZhdWx0U29ydCB8fCBkZWZhdWx0U29ydC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5zb3J0TWV0YS5zZXQoZGVmYXVsdFNvcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2UuZmlsdGVyTWV0YS5zZXQoZGVmYXVsdEZpbHRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKHt9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRUYWJsZUZyb21Sb3V0ZVVwZGF0ZShxcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMudXNlUXVlcnlQYXJhbXMpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAodXNlUXAgPT4gKHVzZVFwID8gdGhpcy5yb3V0ZXIuZXZlbnRzIDogTkVWRVIpKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIGUgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0ICYmIGUudXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSAhPT0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvclxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcyA9IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0b09ic2VydmFibGUodGhpcy5nZW5lcmljRmlsdGVyRGVzY3JpcHRvcilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChnZW5lcmljRmlsdGVyRGVzY3JpcHRvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmljRmlsdGVyRGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gdGhpcy5nZW5lcmljRmlsdGVyRGVzY3JpcHRvcigpPy5wcm9wZXJ0eUxvb2t1cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdlbmVyaWNGaWx0ZXJTZXJ2aWNlID0gZGF0YVByb3ZpZGVyPy5zZXJ2aWNlVHlwZSA/IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4oZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZldGNoIGZpbHRlcmFibGUgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1vbnNUb09ic2VydmFibGUoZ2VuZXJpY0ZpbHRlckRlc2NyaXB0b3IucHJvcGVydHlMb29rdXAubG9va3VwKHt9LCBnZW5lcmljRmlsdGVyU2VydmljZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IGdlbmVyaWNGaWx0ZXJzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRlc2NyaXB0b3JzIGZyb20gZ2VuZXJpYyBmaWx0ZXIgZGF0YVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckRlc2NyaXB0b3JzRnJvbUdlbmVyaWMuc2V0KGNyZWF0ZUZpbHRlckRlc2NyaXB0b3JzRnJvbUdlbmVyaWMoZ2VuZXJpY0ZpbHRlcnMsIHRoaXMuZ2VuZXJpY0ZpbHRlckRlc2NyaXB0b3IoKT8udmFsdWVMb29rdXApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxvYWQoKTogdm9pZDtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugd2l0aCBgVGFibGVSZWxvYWRFdmVudGAgb2JqZWN0IHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsb2FkKGVtaXRFdmVudDogYm9vbGVhbik6IHZvaWQ7XG4gICAgcHVibGljIHJlbG9hZChlbWl0RXZlbnQ/OiBUYWJsZVJlbG9hZEV2ZW50PFNvcnRzLCBGaWx0ZXJzPik6IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHdpdGggYFRhYmxlUmVsb2FkRXZlbnRgIG9iamVjdCBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgcHVibGljIHJlbG9hZChlbWl0RXZlbnQ6IGJvb2xlYW4sIHJlc2V0UGFyYW1zOiBib29sZWFuKTogdm9pZDtcbiAgICBwdWJsaWMgcmVsb2FkKGVtaXRFdmVudE9yRXZlbnQ6IGJvb2xlYW4gfCBUYWJsZVJlbG9hZEV2ZW50PFNvcnRzLCBGaWx0ZXJzPiA9IGZhbHNlLCByZXNldFBhcmFtc1BhcmFtID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZW1pdEV2ZW50ID0gdHlwZW9mIGVtaXRFdmVudE9yRXZlbnQgPT09ICdib29sZWFuJyA/IGVtaXRFdmVudE9yRXZlbnQgOiBlbWl0RXZlbnRPckV2ZW50Py5lbWl0RXZlbnQgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc2V0UGFyYW1zID0gdHlwZW9mIGVtaXRFdmVudE9yRXZlbnQgPT09ICdvYmplY3QnID8gZW1pdEV2ZW50T3JFdmVudD8ucmVzZXRQYXJhbXMgOiByZXNldFBhcmFtc1BhcmFtO1xuICAgICAgICBjb25zdCBwYXJhbXMgPVxuICAgICAgICAgICAgdHlwZW9mIGVtaXRFdmVudE9yRXZlbnQgPT09ICdvYmplY3QnICYmIGVtaXRFdmVudE9yRXZlbnQ/LnBhcmFtc1xuICAgICAgICAgICAgICAgID8gKGVtaXRFdmVudE9yRXZlbnQ/LnBhcmFtcyBhcyBEYXRhTGlzdFBhcmFtcylcbiAgICAgICAgICAgICAgICA6IHJlc2V0UGFyYW1zXG4gICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgOiB0aGlzLmxhdGVzdFBhcmFtc1dpdGhEZWZhdWx0cztcbiAgICAgICAgY29uc3QgcmVsb2FkUGFyYW1zID0gbWVyZ2VEYXRhTGlzdFBhcmFtc1dpdGhEZWZhdWx0cyhwYXJhbXMgPz8ge30sIHRoaXMuZGVmYXVsdFBhcmFtcygpKTtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKHJlbG9hZFBhcmFtcywgZW1pdEV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UYWJsZUxhenlMb2FkKGV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGZyb21UYWJsZUxvYWRUb0RhdGFMaXN0UGFyYW1zKGV2ZW50KTtcblxuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcygpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucm91dGVySXNOYXZpZ2F0aW9uT3V0c2lkZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIG5lY2Vzc2FyeTogZnJvbSBzb21lIHJlYXNvbiwgcHJpbWVORyBjb21taXRzIG9uZSBsYXN0IGxhenkgbG9hZCBldmVudCB3aGVuZXZlciBhbnkgYW5ndWxhciByb3V0ZXIgbmF2aWdhdGlvbiBvY2N1cnNcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogZGF0YUxpc3RQYXJhbXNUb1VybFF1ZXJ5KHBhcmFtcywgdGhpcy5kZWZhdWx0UGFyYW1zKCkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbXNXaXRoRGVmYXVsdHMgPSBtZXJnZURhdGFMaXN0UGFyYW1zV2l0aERlZmF1bHRzKHBhcmFtcywgdGhpcy5kZWZhdWx0UGFyYW1zKCkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29tcGFyZVdpdGhDdXJyZW50UGFyYW1zKHBhcmFtc1dpdGhEZWZhdWx0cykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVByaW1lU29ydEFuZEZpbHRlcihwYXJhbXNXaXRoRGVmYXVsdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKHBhcmFtc1dpdGhEZWZhdWx0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25DZWxsQ2xpY2soZXZlbnQ6IEV2ZW50LCBjb2w6IENvbHVtbkRlc2NyaXB0b3I8YW55LCBJdGVtPiwgaXRlbTogSXRlbSwgaWR4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ2VsbENsaWNrRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVFdmVudDogVGFibGVDZWxsQ2xpY2tFdmVudDxJdGVtPiA9IHtcbiAgICAgICAgICAgIGNvbHVtbjogY29sLFxuICAgICAgICAgICAgcm93SXRlbTogaXRlbSxcbiAgICAgICAgICAgIHJvd0luZGV4OiBpZHgsXG4gICAgICAgICAgICBldmVudDogZXZlbnRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jZWxsQ2xpY2tTdWJqZWN0Lm5leHQodGFibGVFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBBcnJheTxJdGVtPikge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Sb3dSZW9yZGVyKGV2ZW50OiBUYWJsZVJvd1Jlb3JkZXJFdmVudCkge1xuICAgICAgICB0aGlzLnJvd1Jlb3JkZXIuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGlzIGNhbGxlZCBvbiBjb2x1bW4gcmVzaXplXG4gICAgICogQHBhcmFtIGVsZW1lbnQgZXZlbnQncyBlbGVtZW50XG4gICAgICovXG4gICAgcHVibGljIG9uVGFibGVDb2x1bW5SZXNpemUoe2VsZW1lbnR9OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmllbGRJZDogc3RyaW5nID0gZWxlbWVudC5pZDtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0UHJlZnMgPSB0aGlzLmxheW91dFByZWZlcmVuY2VzKCk7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sdW1ucygpLmZpbmQoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSA9PT0gZmllbGRJZCk7XG4gICAgICAgIGlmIChjb2wpIGNvbC53aWR0aCA9IHdpZHRoO1xuICAgICAgICBpZiAoIWxheW91dFByZWZzLmNvbHVtbldpZHRocykgbGF5b3V0UHJlZnMuY29sdW1uV2lkdGhzID0ge307XG5cbiAgICAgICAgbGF5b3V0UHJlZnMuY29sdW1uV2lkdGhzW2ZpZWxkSWRdID0gd2lkdGg7XG4gICAgICAgIHRoaXMuc2F2ZUxheW91dFByZWZlcmVuY2VzKGxheW91dFByZWZzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocGFyYW1zV2l0aERlZmF1bHRzOiBEYXRhTGlzdFBhcmFtcywgZW1pdEV2ZW50ID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcigpO1xuICAgICAgICBpZiAoIWRhdGFQcm92aWRlciB8fCBwYXJhbXNXaXRoRGVmYXVsdHMubGltaXQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5sYXRlc3RQYXJhbXNXaXRoRGVmYXVsdHMgPSBwYXJhbXNXaXRoRGVmYXVsdHM7XG5cbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24gPSBjb21tb25zVG9PYnNlcnZhYmxlKFxuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLmdldEFsbChcbiAgICAgICAgICAgICAgICBwYXJhbXNXaXRoRGVmYXVsdHMgYXMgRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+LFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLmlzTG9jYWxpemVkID8gdGhpcy5jb21tb25zLmFwcERhdGFMb2NhbGUoKSA/PyB1bmRlZmluZWQgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIClcbiAgICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9ySW5wdXQgPSB0aGlzLmRlc2NyaXB0b3JJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9ySW5wdXQgaW5zdGFuY2VvZiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3Iuc2V0KGRlc2NyaXB0b3JJbnB1dC50b1RhYmxlRGVzY3JpcHRvckZyb21EYXRhKHJlcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5zZXREYXRhKHJlcz8uZGF0YSA/PyBbXSwgcmVzPy50b3RhbENvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGFibGVOb3RpZmljYXRpb25FcnJvcih0aGlzLnRyYW5zbGF0ZSwgdGhpcy5kZXNjcmlwdG9yKCksIGVyciwgdGhpcy5tZXNzYWdlU2VydmljZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2Uuc2V0RGF0YShbXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2UubG9hZGluZy5zZXQoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBmcm9tU3Vic2NyaWJlRXJyb3IoZXJyLCAnVGFibGVDb21wb25lbnRFcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbTogcGFyYW1zV2l0aERlZmF1bHRzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKGVycm9yLCBnZXRFcnJvckxvZ0xldmVsKGVycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlRXZlbnQ6IFRhYmxlTG9hZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtc1dpdGhEZWZhdWx0c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMudGFibGVMb2FkLmVtaXQodGFibGVFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRUYWJsZUZyb21Sb3V0ZVVwZGF0ZSh1cmxQYXJhbXM6IFBhcmFtcykge1xuICAgICAgICBjb25zdCBwYXJhbXNXaXRoRGVmYXVsdHMgPSBtZXJnZURhdGFMaXN0UGFyYW1zV2l0aERlZmF1bHRzKGZyb21VcmxRdWVyeVRvRGF0YUxpc3RQYXJhbXModXJsUGFyYW1zLCB0cnVlKSwgdGhpcy5kZWZhdWx0UGFyYW1zKCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVByaW1lU29ydEFuZEZpbHRlcihwYXJhbXNXaXRoRGVmYXVsdHMpO1xuICAgICAgICBpZiAoIXRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZCgpICYmIHBhcmFtc1dpdGhEZWZhdWx0cz8uc2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbFNlYXJjaFBhcmFtRnJvbVVybC5zZXQoe3ZhbHVlOiBwYXJhbXNXaXRoRGVmYXVsdHM/LnNlYXJjaCwgY2FzZVNlbnNpdGl2ZTogcGFyYW1zV2l0aERlZmF1bHRzLmZpbHRlcnM/LlsnZ2xvYmFsJ10/LmNhc2VTZW5zaXRpdmUgPz8gZmFsc2V9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocGFyYW1zV2l0aERlZmF1bHRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVByaW1lU29ydEFuZEZpbHRlcihwYXJhbXNXaXRoRGVmYXVsdHM6IERhdGFMaXN0UGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnNvcnRNZXRhLnNldCh0aGlzLmNyZWF0ZVNvcnRNZXRhKHBhcmFtc1dpdGhEZWZhdWx0cykpO1xuICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5maWx0ZXJNZXRhLnNldCh0aGlzLmNyZWF0ZUZpbHRlck1ldGEocGFyYW1zV2l0aERlZmF1bHRzKSk7XG4gICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnJvd3Muc2V0KHBhcmFtc1dpdGhEZWZhdWx0cz8ubGltaXQgPz8gdGhpcy5kYXRhTGlzdFNlcnZpY2Uucm93cygpKTtcbiAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2Uub2Zmc2V0LnNldChwYXJhbXNXaXRoRGVmYXVsdHM/Lm9mZnNldCA/PyAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUZpbHRlck1ldGEocGFyYW1zV2l0aERlZmF1bHRzPzogRGF0YUxpc3RQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcHJpbWVGaWx0ZXJNZXRhOiB7W3M6IHN0cmluZ106IENvbW1vbnNGaWx0ZXJNZXRhZGF0YX0gPSB7fTtcbiAgICAgICAgLy8gaWYgYW55IGZpbHRlciBpcyBwcmVzZW50LCBubyBkZWZhdWx0IGZpbHRlcnMgc2hvdWxkIGJlIGFwcGxpZWQhXG4gICAgICAgIGlmIChwYXJhbXNXaXRoRGVmYXVsdHM/LmZpbHRlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtc1dpdGhEZWZhdWx0cy5maWx0ZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBwcmltZUZpbHRlck1ldGFba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlPy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlOiB2YWx1ZT8ubWF0Y2hNb2RlLFxuICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiB2YWx1ZT8uY2FzZVNlbnNpdGl2ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJpbWVGaWx0ZXJNZXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU29ydE1ldGEocGFyYW1zV2l0aERlZmF1bHRzPzogRGF0YUxpc3RQYXJhbXMpOiBTb3J0TWV0YVtdIHwgbnVsbCB7XG4gICAgICAgIGlmIChwYXJhbXNXaXRoRGVmYXVsdHM/LnNvcnQgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KHBhcmFtc1dpdGhEZWZhdWx0cz8uc29ydCkgJiYgcGFyYW1zV2l0aERlZmF1bHRzPy5zb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXNXaXRoRGVmYXVsdHM/LnNvcnQubWFwKFxuICAgICAgICAgICAgICAgIHMgPT5cbiAgICAgICAgICAgICAgICAgICAgPFNvcnRNZXRhPntcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzLnByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXI6IHMuYXNjZW5kaW5nID8gMSA6IC0xXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Db2x1bW5Ub2dnbGUoZXZlbnQ6IE11bHRpU2VsZWN0Q2hhbmdlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0UHJlZnMgPSB0aGlzLmxheW91dFByZWZlcmVuY2VzKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IChldmVudC52YWx1ZSBhcyBDb2x1bW5XaXRoUHJlZmVyZW5jZXNbXSkubWFwKHYgPT4gdi5kZXNjcmlwdG9yLnByb3BlcnR5KTtcbiAgICAgICAgbGF5b3V0UHJlZnMuY29sdW1uSGlkZGVuID0gdGhpcy5jb2x1bW5zKClcbiAgICAgICAgICAgIC5maWx0ZXIoYyA9PiBzZWxlY3RlZENvbHVtbnMuaW5kZXhPZihjLmRlc2NyaXB0b3IucHJvcGVydHkpIDwgMClcbiAgICAgICAgICAgIC5tYXAoYyA9PiBjLmRlc2NyaXB0b3IucHJvcGVydHkpO1xuICAgICAgICB0aGlzLnNhdmVMYXlvdXRQcmVmZXJlbmNlcyhsYXlvdXRQcmVmcyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29sdW1uVG9nZ2xlQWxsKCkge1xuICAgICAgICBjb25zdCBsYXlvdXRQcmVmcyA9IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IFsuLi50aGlzLmNvbHVtbnMoKV07XG4gICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9ICF0aGlzLmNvbHVtbnMoKS5zb21lKGMgPT4gYy5pc1Zpc2libGUpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoaXNWaXNpYmxlICE9PSBjb2wuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgY29sLmlzVmlzaWJsZSA9IGlzVmlzaWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsYXlvdXRQcmVmcy5jb2x1bW5IaWRkZW4gPSBjb2x1bW5zLmZpbHRlcihjID0+ICFjLmlzVmlzaWJsZSkubWFwKGMgPT4gYy5kZXNjcmlwdG9yLnByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5zYXZlTGF5b3V0UHJlZmVyZW5jZXMobGF5b3V0UHJlZnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbHVtblJlb3JkZXIoZXZlbnQ6IFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kcm9wSW5kZXggIT09IHVuZGVmaW5lZCAmJiBldmVudC5kcm9wSW5kZXggPj0gMCAmJiBldmVudC5kcmFnSW5kZXggIT09IHVuZGVmaW5lZCAmJiBldmVudC5kcmFnSW5kZXggPj0gMCAmJiBldmVudC5kcm9wSW5kZXggIT09IGV2ZW50LmRyYWdJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREcm9wSW5kZXggPSBldmVudC5kcm9wSW5kZXg7XG4gICAgICAgICAgICBjb25zdCBldmVudERyYWdJbmRleCA9IGV2ZW50LmRyYWdJbmRleDtcbiAgICAgICAgICAgIGNvbnN0IHByZXZWaXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucygpLmZpbHRlcihjID0+IGMuaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbEF0RHJvcCA9IHByZXZWaXNpYmxlQ29sdW1uc1tldmVudERyb3BJbmRleF07XG4gICAgICAgICAgICBjb25zdCBjb2xBdERyYWcgPSBwcmV2VmlzaWJsZUNvbHVtbnNbZXZlbnREcmFnSW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgY29sQXREcm9wSW5kZXggPSB0aGlzLmNvbHVtbnMoKS5maW5kSW5kZXgoZWwgPT4gZWwuaWQgPT09IGNvbEF0RHJvcC5pZCk7XG4gICAgICAgICAgICBjb25zdCBjb2xBdERyYWdJbmRleCA9IHRoaXMuY29sdW1ucygpLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gY29sQXREcmFnLmlkKTtcblxuICAgICAgICAgICAgaWYgKGNvbEF0RHJvcEluZGV4ID4gLTEgJiYgY29sQXREcmFnSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5zID0gWy4uLnRoaXMuY29sdW1ucygpXTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnNwbGljZShjb2xBdERyYWdJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJvcEluZGV4ID0gY29sdW1ucy5maW5kSW5kZXgoZWwgPT4gZWwuaWQgPT09IGNvbEF0RHJvcC5pZCkgKyAoZXZlbnREcm9wSW5kZXggPiBldmVudERyYWdJbmRleCA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zID0gWy4uLmNvbHVtbnMuc2xpY2UoMCwgZHJvcEluZGV4KSwgY29sQXREcmFnLCAuLi5jb2x1bW5zLnNsaWNlKGRyb3BJbmRleCldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dFByZWZzID0gdGhpcy5sYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgICAgICAgICAgICAgIGxheW91dFByZWZzLmNvbHVtbk9yZGVyID0gY29sdW1ucy5tYXAoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlTGF5b3V0UHJlZmVyZW5jZXMobGF5b3V0UHJlZnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlTGF5b3V0UHJlZmVyZW5jZXMobGF5b3V0UHJlZnM6IFRhYmxlTGF5b3V0UHJlZmVyZW5jZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sb2NhbHN0b3JhZ2VLZXkoKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRJdGVtKHRoaXMuY21wVHlwZU5hbWUsIGtleSwgbGF5b3V0UHJlZnMpO1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmc1NhdmVDbnQudXBkYXRlKHYgPT4gdiArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlRGVmYXVsdERhdGFMaXN0UGFyYW1zKCkge1xuICAgICAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge1xuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnJvd3NQZXJQYWdlT3B0aW9ucygpWzBdLFxuICAgICAgICAgICAgc29ydDogdGhpcy5kZXNjcmlwdG9yKClcbiAgICAgICAgICAgICAgICAuc29ydHMuZmlsdGVyKHMgPT4gcy5kZWZhdWx0SXNFbmFibGVkKVxuICAgICAgICAgICAgICAgIC5zb3J0KChzMSwgczIpID0+IChzMS5kZWZhdWx0T3JkZXIgPz8gMTAwMCkgLSAoczIuZGVmYXVsdE9yZGVyID8/IDEwMDApKVxuICAgICAgICAgICAgICAgIC5tYXAocyA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcy5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgYXNjZW5kaW5nOiBzLmRlZmF1bHRJc0FzY2VuZGluZ1xuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIGZpbHRlcnM6IHt9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycygpXG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4gZC5oYXNEZWZhdWx0VmFsdWUpXG4gICAgICAgICAgICAuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBmLmRlZmF1bHRNYXRjaE1vZGU7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaE1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmLmZpbHRlclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmlsdGVyVHlwZUVudW0uU3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5Db250YWlucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmlsdGVyVHlwZUVudW0uTG9va3VwOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9va3VwRmlsdGVyID0gZiBhcyBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPGFueSwgSXRlbT47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2t1cEZpbHRlci5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuSW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuRXF1YWxzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmLm1hdGNoTW9kZXMgJiYgIWYubWF0Y2hNb2Rlcz8uaW5jbHVkZXMobWF0Y2hNb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBmLm1hdGNoTW9kZXNbMF07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlOiBhbnkgfCBhbnlbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbLi4udmFsdWVdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZi5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBmLnByb3BlcnR5O1xuICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJzIVtwcm9wZXJ0eV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlOiBtYXRjaE1vZGVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVDb2x1bW5zV2l0aExheW91dCgpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZGVzY3JpcHRvcigpO1xuICAgICAgICBjb25zdCBsYXlvdXRQcmVmcyA9IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMoKTtcblxuICAgICAgICAvLyBpbml0aWFsaXplIGNvbHVtbnMgd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IENvbHVtbldpdGhQcmVmZXJlbmNlc1tdID0gZGVzY3JpcHRvci5jb2x1bW5zLm1hcChjb2wgPT4gKHtcbiAgICAgICAgICAgIGlkOiBgJHtjb2wucHJvcGVydHl9LSR7dGltZXN0YW1wfWAsXG4gICAgICAgICAgICBkZXNjcmlwdG9yOiBjb2wsXG4gICAgICAgICAgICBmaWx0ZXI6IGRlc2NyaXB0b3IuZmlsdGVycy5maW5kKFxuICAgICAgICAgICAgICAgIGYgPT5cbiAgICAgICAgICAgICAgICAgICAgZi5zaG93T25Db2x1bW4gPT09IGNvbC5wcm9wZXJ0eSAmJlxuICAgICAgICAgICAgICAgICAgICAoKGYuZGlzcGxheVR5cGUgPT0gbnVsbCAmJiB0aGlzLmRlZmF1bHRGaWx0ZXJEaXNwbGF5VHlwZSA9PT0gRmlsdGVyRGlzcGxheVR5cGVFbnVtLkNvbHVtbikgfHwgZi5kaXNwbGF5VHlwZSA9PT0gRmlsdGVyRGlzcGxheVR5cGVFbnVtLkNvbHVtbilcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzb3J0OiBkZXNjcmlwdG9yLnNvcnRzLmZpbmQoZiA9PiBmLnNob3dPbkNvbHVtbiA9PT0gY29sLnByb3BlcnR5KSxcbiAgICAgICAgICAgIGRpc2FibGVkOiAhY29sLmlzVG9nZ2xlYWJsZSxcbiAgICAgICAgICAgIGlzVmlzaWJsZTogbGF5b3V0UHJlZnMuY29sdW1uSGlkZGVuID8gIWxheW91dFByZWZzLmNvbHVtbkhpZGRlbi5pbmNsdWRlcyhjb2wucHJvcGVydHkpIDogY29sLmlzVmlzaWJsZSxcbiAgICAgICAgICAgIHdpZHRoOiBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHM/Lltjb2wucHJvcGVydHldXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAobGF5b3V0UHJlZnMuY29sdW1uT3JkZXIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0UHJlZnMuY29sdW1uT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xOYW1lID0gbGF5b3V0UHJlZnMuY29sdW1uT3JkZXJbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgY29sV2l0aFByZWZzID0gY29sdW1ucy5maW5kKGVsID0+IGVsLmRlc2NyaXB0b3IucHJvcGVydHkgPT09IGNvbE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjb2xXaXRoUHJlZnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sV2l0aFByZWZzLm9yZGVySWR4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5vcmRlcklkeCAhPT0gdW5kZWZpbmVkICYmIGIub3JkZXJJZHggIT09IHVuZGVmaW5lZCA/IGEub3JkZXJJZHggLSBiLm9yZGVySWR4IDogMCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IGNvbHVtbiBvcmRlciBhbmQgY29sdW1uIHZpc2liaWxpdHkgdG8gZGVmYXVsdCBzZXR0aW5nc1xuICAgICAqL1xuICAgIHB1YmxpYyByZXNldERlZmF1bHRMYXlvdXQoKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxzdG9yYWdlS2V5KCk7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSh0aGlzLmNtcFR5cGVOYW1lLCBrZXkpO1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmc1NhdmVDbnQudXBkYXRlKHYgPT4gdiArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSB0aGUgZ2l2ZW4gcGFyYW1zIHdpdGggdGhlIHN0b3JlZCBwYXJhbXMgaW4gdGhlIERhdGFMaXN0U2VydmljZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbXMgdG8gY29tcGFyZSB3aXRoIHRoZSBzdG9yZWQgcGFyYW1zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSBUcnVlIGlmIHRoZSBnaXZlbiBwYXJhbXMgbWF0Y2ggdGhlIHN0b3JlZCBwYXJhbXMsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbXBhcmVXaXRoQ3VycmVudFBhcmFtcyhwYXJhbXM6IERhdGFMaXN0UGFyYW1zKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwYXJhbXMub2Zmc2V0ID09PSB0aGlzLmRhdGFMaXN0U2VydmljZS5vZmZzZXQoKSAmJlxuICAgICAgICAgICAgcGFyYW1zLmxpbWl0ID09PSB0aGlzLmRhdGFMaXN0U2VydmljZS5yb3dzKCkgJiZcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuY3JlYXRlU29ydE1ldGEocGFyYW1zKSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnNvcnRNZXRhKCkpICYmXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmNyZWF0ZUZpbHRlck1ldGEocGFyYW1zKSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmZpbHRlck1ldGEoKSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCI8ZGl2PlxuICAgIDwhLS0gTVVTVCBOT1QgdXNlIG9ic2VydmFibGUgZm9yIHZhbHVlIHdoZW4gdXNpbmcgdmlydHVhbCBzY3JvbGwgLSBkb2VzIG5vdCB3b3JrIGZvciBzb21lIHJlYXNvbiAtLT5cbiAgICBAaWYgKCF1c2VRdWVyeVBhcmFtcygpIHx8IHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgICA8cC10YWJsZVxuICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGFMaXN0U2VydmljZS5kYXRhKClcIlxuICAgICAgICAgICAgW2RhdGFLZXldPVwiZGVzY3JpcHRvcigpLnRyYWNrUHJvcGVydHlcIlxuICAgICAgICAgICAgW2xhenldPVwiaXNMYXp5KClcIlxuICAgICAgICAgICAgW2xvYWRpbmddPVwiZGF0YUxpc3RTZXJ2aWNlLmxvYWRpbmcoKVwiXG4gICAgICAgICAgICBbcGFnaW5hdG9yXT1cImlzUGFnaW5hdGlvbigpXCJcbiAgICAgICAgICAgIFtyb3dzXT1cImRhdGFMaXN0U2VydmljZS5yb3dzKClcIlxuICAgICAgICAgICAgW2ZpcnN0XT1cImRhdGFMaXN0U2VydmljZS5vZmZzZXQoKVwiXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImRhdGFMaXN0U2VydmljZS5jb3VudCgpXCJcbiAgICAgICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiZGF0YUxpc3RTZXJ2aWNlLnJvd3NQZXJQYWdlT3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZV09XCInbW5nVGFibGUucGFnaW5hdGlvbk1zZycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW211bHRpU29ydE1ldGFdPVwiZGF0YUxpc3RTZXJ2aWNlLnNvcnRNZXRhKClcIlxuICAgICAgICAgICAgW2ZpbHRlcnNdPVwiZGF0YUxpc3RTZXJ2aWNlLmZpbHRlck1ldGEoKVwiXG4gICAgICAgICAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImRhdGFMaXN0U2VydmljZS5nbG9iYWxGaWx0ZXJGaWVsZHMoKVwiXG4gICAgICAgICAgICBzb3J0TW9kZT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgIFtzZWxlY3Rpb25dPVwiW11cIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbkVuYWJsZWQoKSA/IHNlbGVjdGlvbk1vZGUoKSA6IG51bGxcIlxuICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBzY3JvbGxIZWlnaHQ9XCJmbGV4XCJcbiAgICAgICAgICAgIFtyb3dIb3Zlcl09XCJkZXNjcmlwdG9yKCkuaGFzSG92ZXJcIlxuICAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY2xhc3NOYW1lKClcIlxuICAgICAgICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwiZGVzY3JpcHRvcigpLmhhc1Jlc2l6YWJsZUNvbHVtbnNcIlxuICAgICAgICAgICAgW2NvbHVtblJlc2l6ZU1vZGVdPVwiZGVzY3JpcHRvcigpLmNvbHVtblJlc2l6ZU1vZGUgPz8gJ2V4cGFuZCdcIlxuICAgICAgICAgICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJhcmVDb2x1bW5zUmVvcmRlcmFibGUoKVwiXG4gICAgICAgICAgICBwYWdpbmF0b3JEcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1ucygpXCJcbiAgICAgICAgICAgIChvbkNvbFJlc2l6ZSk9XCJvblRhYmxlQ29sdW1uUmVzaXplKCRldmVudClcIlxuICAgICAgICAgICAgKG9uQ29sUmVvcmRlcik9XCJvbkNvbHVtblJlb3JkZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25MYXp5TG9hZCk9XCJvblRhYmxlTGF6eUxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dSZW9yZGVyKT1cIm9uUm93UmVvcmRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIEBpZiAoaXNDYXB0aW9uVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3ZlcmxheVdpdGhUYWdGaWx0ZXJzKCkubGVuZ3RoID4gMCB8fCBkZXNjcmlwdG9yKCkuc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1maWx0ZXItb3ZlcmxheS13aXRoLXRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZGVzY3JpcHRvcigpLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rlc2NyaXB0b3JzXT1cIm92ZXJsYXlXaXRoVGFnRmlsdGVycygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVsXT1cImRlc2NyaXB0b3IoKS5tb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVTZWFyY2hdPVwiZGVzY3JpcHRvcigpLnNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwiZ2xvYmFsU2VhcmNoUGFyYW1Gcm9tVXJsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoTGltaXRXb3JkTWF4XT1cImRlc2NyaXB0b3IoKS5zZWFyY2hMaW1pdE1heFdvcmRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZUNhc2VTZW5zaXRpdmVdPVwiaXNMYXp5KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNUaXRsZURpc3BsYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1uZ1RlbXBsYXRlPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FwdGlvblRlbXBsYXRlT3JDb21wb25lbnRPclRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctZmlsdGVyLW92ZXJsYXktd2l0aC10YWc+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FwdGlvblRlbXBsYXRlT3JDb21wb25lbnRPclRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcHRpb25UZW1wbGF0ZU9yQ29tcG9uZW50T3JUaXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNhcHRpb25UZW1wbGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGUoKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNhcHRpb25Db21wb25lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFttbmdDb21wb25lbnRdPVwiY2FwdGlvbkNvbXBvbmVudCgpXCIgKGluc3RhbmNlQ3JlYXRlZCk9XCJjYXB0aW9uQ29tcG9uZW50SW5zdGFuY2UuZW1pdCgkZXZlbnQpXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZGVzY3JpcHRvcigpLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInAtMCBtLTBcIj57eyBkZXNjcmlwdG9yKCkudGl0bGUhIHwgdHJhbnNsYXRlIH19PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgIEBpZiAoIWRlc2NyaXB0b3IoKS5oaWRlSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIm1uZy10YWJsZS1oZWFkZXJcIiBbY2xhc3NdPVwiZGVzY3JpcHRvcigpLmhlYWRlckNsYXNzTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGlvbk1vZGUoKSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcigpLnNlbGVjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIG5lZWQgdGhlIGxpbmUgYmVsb3csIGJlY2F1c2Ugb3RoZXJ3aXNlIHAtdGFibGVSYWRpb0J1dHRvbiBzaGlmdHMgdGhlIHJlc3Qgb2YgdGhlIGNvbHVtbnMgaW4gdGFibGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJkZXNjcmlwdG9yKCkuc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwidHJ1ZVwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvd1Jlb3JkZXJFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIHZpc2libGVDb2x1bW5zKCk7IHRyYWNrIGNvbC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc29ydGFibGVDb2x1bW5USFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbC5kZXNjcmlwdG9yLnRpdGxlID8/IChjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eSB8IG1uZ0kxOG5Qcm9wZXJ0eTogZGVzY3JpcHRvcigpLm1vZGVsKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtc29ydEljb24gW2ZpZWxkXT1cImNvbC5kZXNjcmlwdG9yLnByb3BlcnR5XCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9uU29ydGFibGVDb2x1bW5USFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2wuZGVzY3JpcHRvci50aXRsZSA/PyAoY29sLmRlc2NyaXB0b3IucHJvcGVydHkgfCBtbmdJMThuUHJvcGVydHk6IGRlc2NyaXB0b3IoKS5tb2RlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmRlc2NyaXB0b3IuaXNSZW9yZGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW9yZGVyYWJsZUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImNvbC5kZXNjcmlwdG9yLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnNvcnQ/LnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCIhY29sLnNvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/IGNvbC53aWR0aCArICdweCcgOiBjb2wuZGVzY3JpcHRvci53aWR0aCArICclJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC53aWR0aCA/IG51bGwgOiBjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC53aWR0aCA/PyBjb2wuZGVzY3JpcHRvci5tYXhXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLmRlc2NyaXB0b3IuaGVhZGVyQ2xhc3NOYW1lIHwgbW5nVGFibGVDb2x1bW5GaWx0ZXJDbGFzczogY29sLmZpbHRlciA6IGhhc0NvbHVtbkZpbHRlcnMoKSAmJiAhY29sLndpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sLnNvcnQgPyBzb3J0YWJsZUNvbHVtblRIVGVtcGxhdGUgOiBub25Tb3J0YWJsZUNvbHVtblRIVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVzaXphYmxlQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wuc29ydD8ucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cIiFjb2wuc29ydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoID8gY29sLndpZHRoICsgJ3B4JyA6IGNvbC5kZXNjcmlwdG9yLndpZHRoICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLndpZHRoID8gbnVsbCA6IGNvbC5kZXNjcmlwdG9yLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sLndpZHRoID8/IGNvbC5kZXNjcmlwdG9yLm1heFdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wuZGVzY3JpcHRvci5oZWFkZXJDbGFzc05hbWUgfCBtbmdUYWJsZUNvbHVtbkZpbHRlckNsYXNzOiBjb2wuZmlsdGVyIDogaGFzQ29sdW1uRmlsdGVycygpICYmICFjb2wud2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2wuc29ydCA/IHNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZSA6IG5vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGFzTGFzdENvbHVtbigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sdW1uTGFzdE1pbldpZHRoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiZGVzY3JpcHRvcigpLmFjdGlvbkNvbHVtbkZyb3plbiA/PyBhcmVDb2x1bW5zVG9nZ2xlYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25Gcm96ZW49XCJyaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLWN1c3RvbS1sYXN0IHRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yKCkuaGFzUmVzaXphYmxlQ29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBtbmctdGFibGUtY29sdW1ucy1tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhS2V5PVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkljb249XCJwaSBwaS1zbGlkZXJzLWhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwidmlzaWJsZUNvbHVtbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidtbmdUYWJsZS5hZGp1c3RUYWJsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5U2VsZWN0ZWRMYWJlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ29sdW1uVG9nZ2xlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNoZWNrYm94IHAtY29tcG9uZW50IG1sLTFcIiBbbmdDbGFzc109XCJ7J3AtY2hlY2tib3gtZGlzYWJsZWQnOiAhYXJlQ29sdW1uc1RvZ2dsZWFibGV9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1oaWRkZW4tYWNjZXNzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3Qub25IZWFkZXJDaGVja2JveEZvY3VzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5vbkhlYWRlckNoZWNrYm94Qmx1cigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3Qub25Ub2dnbGVBbGwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhYXJlQ29sdW1uc1RvZ2dsZWFibGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWNoZWNrYm94LWJveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AtaGlnaGxpZ2h0JzogYW55Q29sdW1uVmlzaWJsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29sdW1uVG9nZ2xlQWxsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY2hlY2tib3gtaWNvblwiIFtuZ0NsYXNzXT1cInsncGkgcGktY2hlY2snOiBhbnlDb2x1bW5WaXNpYmxlKCl9XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1yZXBsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ21uZ1RhYmxlLnJlc2V0TGF5b3V0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldERlZmF1bHRMYXlvdXQoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmRlc2NyaXB0b3IudGl0bGUgPz8gKGl0ZW0uZGVzY3JpcHRvci5wcm9wZXJ0eSB8IG1uZ0kxOG5Qcm9wZXJ0eTogZGVzY3JpcHRvcigpLm1vZGVsKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKGhhc0NvbHVtbkZpbHRlcnMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJtbmctY29sdW1uLWZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0aW9uRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3IoKS5zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvd1Jlb3JkZXJFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgdmlzaWJsZUNvbHVtbnMoKTsgdHJhY2sgY29sLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wuZmlsdGVyPy5jb2x1bW5DbGFzc05hbWUgfCBtbmdUYWJsZUNvbHVtbkZpbHRlckNsYXNzOiBjb2wuZmlsdGVyIDogaGFzQ29sdW1uRmlsdGVycygpICYmICFjb2wud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29sLndpZHRoID8gbnVsbCA6IGNvbC5maWx0ZXI/LmNvbHVtbldpZHRoID8/IGNvbC5kZXNjcmlwdG9yLndpZHRoID8/IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC53aWR0aCA/IG51bGwgOiBjb2wuZmlsdGVyPy5jb2x1bW5NaW5XaWR0aCA/PyBjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sLndpZHRoID8/IGNvbC5kZXNjcmlwdG9yLm1heFdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyIFtkZXNjcmlwdG9yXT1cImNvbC5maWx0ZXJcIj48L21uZy10YWJsZS1jb2x1bW4tZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGFzTGFzdENvbHVtbigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY29sdW1uLWN1c3RvbS1sYXN0XCIgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5MYXN0TWluV2lkdGgoKVwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWlkeD1cInJvd0luZGV4XCIgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgW3BSZW9yZGVyYWJsZVJvd109XCJpZHhcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJkZXNjcmlwdG9yKCkucm93Q2xhc3NOYW1lIHwgbW5nQ2xhc3NNYXA6IGRlc2NyaXB0b3IoKS5yb3dDbGFzc05hbWVNYXBGbiA6IGl0ZW0gfCBtbmdMb2NhbGVEZWZhdWx0Um93Q2xhc3M6IGRlc2NyaXB0b3IoKSA6IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3IoKS5zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJkZXNjcmlwdG9yKCkuc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVSYWRpb0J1dHRvbiBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZVJhZGlvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWRlc2NyaXB0b3IoKS5yb3dFeHBhbmRhYmxlUHJvcGVydHkgfHwgaXRlbVtkZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZVByb3BlcnR5IV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFJvd1RvZ2dsZXJdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1wbGFpbiBtbmctdGFibGUtcm93LWV4cGFuZC1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiZXhwYW5kZWQgPyAncGkgcGktY2hldnJvbi1kb3duJyA6ICdwaSBwaS1jaGV2cm9uLXJpZ2h0J1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChyb3dSZW9yZGVyRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaSBwaS1iYXJzXCIgcFJlb3JkZXJhYmxlUm93SGFuZGxlPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIHZpc2libGVDb2x1bW5zKCk7IHRyYWNrIGNvbC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKCRldmVudCwgY29sLmRlc2NyaXB0b3IsIGl0ZW0sIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlc2NyaXB0b3IuY2xhc3NOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1uZ0NsYXNzTWFwOiBjb2wuZGVzY3JpcHRvci5jbGFzc05hbWVNYXBGbiA6IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW5nVGFibGVDb2x1bW5GaWx0ZXJDbGFzczogY29sLmZpbHRlciA6IGhhc0NvbHVtbkZpbHRlcnMoKSAmJiAhY29sLndpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpY2thYmxlXT1cImlzQ2VsbENsaWNrRW5hYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoID8gY29sLndpZHRoICsgJ3B4JyA6IGNvbC5kZXNjcmlwdG9yLndpZHRoICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC53aWR0aCA/IG51bGwgOiBjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmRlc2NyaXB0b3IudGl0bGUgPz8gKGNvbC5kZXNjcmlwdG9yLnByb3BlcnR5IHwgbW5nSTE4blByb3BlcnR5OiBkZXNjcmlwdG9yKCkubW9kZWwpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLXZhbHVlIFtkZXNjcmlwdG9yXT1cImNvbC5kZXNjcmlwdG9yXCIgW2l0ZW1dPVwiaXRlbVwiPjwvbW5nLXRhYmxlLWNvbHVtbi12YWx1ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNMYXN0Q29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLWN1c3RvbS1sYXN0IGp1c3RpZnktY29udGVudC1lbmQgdGV4dC1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5MYXN0TWluV2lkdGgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiZGVzY3JpcHRvcigpLmFjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkZyb3plbj1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2x1bW5DdXN0b21MYXN0VGVtcGxhdGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uQ3VzdG9tTGFzdFRlbXBsYXRlKCk7IGNvbnRleHQ6IHtyb3dJdGVtOiBpdGVtLCByb3dJbmRleDogaWR4fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbHVtbkN1c3RvbUxhc3RDb21wb25lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFttbmdDb21wb25lbnRdPVwiY29sdW1uQ3VzdG9tTGFzdENvbXBvbmVudCgpXCIgKGluc3RhbmNlQ3JlYXRlZCk9XCJjb2x1bW5DdXN0b21MYXN0Q29tcG9uZW50SW5zdGFuY2UuZW1pdCgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInJvd2V4cGFuc2lvblwiIGxldC1pdGVtPlxuICAgICAgICAgICAgICAgIEBpZiAoZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgW2NvbFNwYW5dPVwiZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGVDb2xTcGFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFttbmdDb21wb25lbnRdPVwiZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGVDb21wb25lbnRUeXBlXCIgW2lucHV0c109XCJ7aXRlbX1cIj4gPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dFeHBhbmRUZW1wbGF0ZSgpOyBjb250ZXh0OiB7cm93SXRlbTogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2ljb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yKCkubG9hZGluZ0ljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCIndGV4dC13aGl0ZSB0ZXh0LTR4bCBwaS1zcGluICcgKyBkZXNjcmlwdG9yKCkubG9hZGluZ0ljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yKCkubG9hZGluZ1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IHRleHQtd2hpdGUgdGV4dC1sZyBmb250LXNlbWlib2xkXCIgW25nQ2xhc3NdPVwieydtdC0zJzogZGVzY3JpcHRvcigpLmxvYWRpbmdJY29ufVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlc2NyaXB0b3IoKS5sb2FkaW5nVGV4dCA/PyAnJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2JvZHlcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnNDb2xzcGFuKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIFtuZ1N0eWxlXT1cInt3aWR0aDogJzEwMCUnfVwiPjwvcC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnNDb2xzcGFuKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdtbmdUYWJsZS5ub0l0ZW1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgQGlmIChmb290ZXJUZW1wbGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlclRlbXBsYXRlKCk7IGNvbnRleHQ6IHtkYXRhOiBkYXRhTGlzdFNlcnZpY2UuZGF0YSgpLCB0b3RhbENvdW50OiBkYXRhTGlzdFNlcnZpY2UuY291bnQoKX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L3AtdGFibGU+XG4gICAgfVxuPC9kaXY+XG4iXX0=
600
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUUsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUtSLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLGVBQWUsRUFDZixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFVLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRWxJLE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsY0FBYyxFQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQXlCLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxFQUFDLEtBQUssRUFBK0MsV0FBVyxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQWdCLGFBQWEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0gsWUFBWSxFQUVaLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBR2xCLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQiwyQkFBMkIsRUFDM0IsWUFBWSxJQUFJLG1CQUFtQixFQUNuQyx3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQiw2QkFBNkIsRUFDN0IsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQiwrQkFBK0IsRUFDbEMsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQW1CLHFCQUFxQixFQUEwQixjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM5SCxPQUFPLEVBS0gsMEJBQTBCLEVBRzFCLHVCQUF1QixFQUV2QixhQUFhLEVBQ2IsZUFBZSxFQUNsQixNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sRUFBQyxrQ0FBa0MsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xFLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTdFLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3BGLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRixPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxxRUFBcUUsQ0FBQzs7Ozs7Ozs7O0FBOEJsSCxNQUFNLE9BQU8sY0FBYztJQWtLdkI7UUFqS2dCLGdCQUFXLEdBQUcsZ0JBQWdCLENBQUM7UUFFOUIsV0FBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixVQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9CLGNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyQyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxZQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsV0FBTSxHQUFHLE1BQU0sQ0FBQywrQkFBK0IsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ3BFLG9CQUFlLEdBQUcsTUFBTSxDQUFDLENBQUEsZUFBcUIsQ0FBQSxDQUFDLENBQUM7UUFFL0MsNkJBQXdCLEdBQTBCLElBQUksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLElBQUkscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBRWxJLGlCQUFpQjtRQUNWLG9CQUFlLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBNEMsRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQztRQUUxRyxxQkFBcUI7UUFDZCxVQUFLLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFDeEIsV0FBTSxHQUFHLEtBQUssRUFBd0IsQ0FBQztRQUN2QyxpQkFBWSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSwyQkFBMkIsRUFBQyxDQUFDLENBQUM7UUFDNUYsaUJBQVksR0FBRyxLQUFLLEVBQXFELENBQUM7UUFFakYsdUJBQXVCO1FBQ2hCLG1CQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7UUFDN0QscUJBQWdCLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7UUFDOUQsa0JBQWEsR0FBRyxLQUFLLENBQXdCLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELHFCQUFnQixHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDO1FBQy9ELDJCQUFzQixHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQztRQUNoRyxzQkFBaUIsR0FBRyxRQUFRLENBQVUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXRILFVBQVU7UUFDSCx1QkFBa0IsR0FBRyxLQUFLLEVBQVUsQ0FBQztRQUNyQyxtQkFBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hLLG9CQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0cscUJBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV4SSxtQkFBbUI7UUFDWixxQkFBZ0IsR0FBRyxLQUFLLEVBQWEsQ0FBQztRQUN0Qyw4QkFBeUIsR0FBRyxLQUFLLEVBQWEsQ0FBQztRQUMvQyw0QkFBdUIsR0FBRyxLQUFLLENBQXVCLFNBQVMsRUFBRSxFQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBQyxDQUFDLENBQUM7UUFFdkcsYUFBYTtRQUNMLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUE2QixDQUFDO1FBQzdELHdCQUFtQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsdUJBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFFbEcsZ0JBQWdCO1FBQ1QsY0FBUyxHQUFHLE1BQU0sRUFBa0IsQ0FBQztRQUNyQyxjQUFTLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEQsb0JBQWUsR0FBRyxNQUFNLEVBQWUsQ0FBQztRQUN4Qyw2QkFBd0IsR0FBRyxNQUFNLEVBQU8sQ0FBQztRQUN6QyxzQ0FBaUMsR0FBRyxNQUFNLEVBQU8sQ0FBQztRQUNsRCxlQUFVLEdBQUcsTUFBTSxFQUF3QixDQUFDO1FBRW5ELDJCQUEyQjtRQUNwQixjQUFTLEdBQUcsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsZUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFBLGtCQUF1QixDQUFBLENBQUMsQ0FBQztRQUNuRCxlQUFVLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5QyxZQUFZO1FBQ0wsb0JBQWUsR0FBb0MsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hILDZCQUF3QixHQUFvQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUMxSSxtQkFBYyxHQUFvQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdEgsc0JBQWlCLEdBQW9DLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBRTFJLDBCQUEwQjtRQUNuQixXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDOUQsaUJBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVGLDhCQUF5QixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRCxTQUFTO1FBQ0QsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ25DLElBQUksT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsY0FBYyxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMxRCxrRUFBa0U7Z0JBQ2xFLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUM1QyxDQUFDO2lCQUFNLElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ3BELDZDQUE2QztnQkFDN0MsT0FBTyx1QkFBdUIsQ0FBQyxVQUFVLENBQUM7WUFDOUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDO1lBQ3hDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNJLGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzdCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1lBQ2xELFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM3QixLQUFLLGFBQWEsQ0FBQyxLQUFLO29CQUNwQixTQUFTLElBQUksaUJBQWlCLENBQUM7b0JBQy9CLE1BQU07Z0JBQ1YsS0FBSyxhQUFhLENBQUMsS0FBSztvQkFDcEIsU0FBUyxJQUFJLGlCQUFpQixDQUFDO29CQUMvQixNQUFNO1lBQ2QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNqQyxTQUFTLElBQUksd0JBQXdCLENBQUM7WUFDMUMsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixTQUFTLElBQUksc0JBQXNCLENBQUM7WUFDeEMsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0JBQWdCO1FBQ1Isd0JBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekMsT0FBTyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBTSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQztRQUtILGNBQWM7UUFDUCxlQUFVLEdBQUcsTUFBTSxDQUFxQyxlQUFlLEVBQTBCLENBQUMsQ0FBQztRQUNsRyxvQkFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25KLENBQUMsQ0FBQyxDQUFDO1FBQ0ssdUJBQWtCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLHNCQUFpQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JDLDZEQUE2RDtZQUM3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLDBDQUEwQztZQUNqRixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUF5QixJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDckgsT0FBTyxXQUFXLElBQUksRUFBQyxZQUFZLEVBQUUsRUFBRSxFQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSSxZQUFPLEdBQUcsUUFBUSxDQUEwQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLG1CQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVwRixlQUFlO1FBQ1Isc0JBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCw0QkFBdUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pFLGlDQUE0QixHQUFHLE1BQU0sQ0FBK0IsRUFBRSxDQUFDLENBQUM7UUFDekUscUJBQWdCLEdBQUcsUUFBUSxDQUM5QixHQUFHLEVBQUUsQ0FDRCxDQUFDLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxxQkFBcUIsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5SixDQUFDLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUNwSSxDQUFDO1FBQ0ssMEJBQXFCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQzNDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUsscUJBQXFCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsS0FBSyxxQkFBcUIsQ0FBQyxjQUFjLENBQ25LLENBQUM7WUFFRixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztRQUVLLGtCQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUM7UUFFckUscUJBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsd0JBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFDMUcsa0JBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUVqSSxlQUFlO1FBQ1IsMEJBQXFCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDakcseUJBQW9CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFL0YsNkJBQXdCLEdBQUcsTUFBTSxDQUFzRCxTQUFTLENBQUMsQ0FBQztRQUV6RyxRQUFRO1FBQ0Esd0NBQW1DLEdBQUcsS0FBSyxDQUFDO1FBR2hELE1BQU0sQ0FDRixHQUFHLEVBQUU7WUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNGLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQy9FLENBQUM7WUFDRCxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUMzSixDQUFDO1lBQ04sQ0FBQztRQUNMLENBQUMsRUFDRCxFQUFDLGlCQUFpQixFQUFFLElBQUksRUFBQyxDQUM1QixDQUFDO1FBRUYsTUFBTSxDQUNGLEdBQUcsRUFBRTtZQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDTCxDQUFDLEVBQ0QsRUFBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUMsQ0FDNUIsQ0FBQztRQUVGLE1BQU0sQ0FDRixHQUFHLEVBQUU7WUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUN2QixtQ0FBbUM7b0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLEVBQ0QsRUFBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUMsQ0FDNUIsQ0FBQztRQUVGLE1BQU0sQ0FDRixHQUFHLEVBQUU7WUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLElBQUksTUFBTSxJQUFJLFNBQVMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUN2QixtQ0FBbUM7b0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLEVBQ0QsRUFBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUMsQ0FDNUIsQ0FBQztRQUVGLE1BQU0sQ0FDRixHQUFHLEVBQUU7WUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtnQkFDMUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3ZJLENBQUM7UUFDTixDQUFDLEVBQ0QsRUFBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUMsQ0FDNUIsQ0FBQztRQUVGLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFFSCxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNqRCxTQUFTLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDO1NBQ0osQ0FBQyxDQUFDO1FBRVAsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzthQUNsSCxJQUFJO1FBQ0QseUVBQXlFO1FBQ3pFLDZEQUE2RDtRQUM3RCxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRTtZQUMxRCxJQUFJLGVBQWUsS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUNELElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLHlDQUF5QztnQkFDekMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUNsQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUNMO2FBQ0EsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ1osSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2QscUlBQXFJO2dCQUNySSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztnQkFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO2dCQUNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVQLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO2FBQzVCLElBQUksQ0FDRCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ3hELE1BQU0sQ0FDRixDQUFDLENBQUMsRUFBRSxDQUNBLENBQUMsQ0FBQyxZQUFZLGVBQWUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuSCxDQUFDLFlBQVksYUFBYTtZQUMxQixDQUFDLFlBQVksZ0JBQWdCO1lBQzdCLENBQUMsWUFBWSxlQUFlLENBQ25DLENBQ0o7YUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDWCxJQUFJLENBQUMsbUNBQW1DLEdBQUcsQ0FBQyxZQUFZLGVBQWUsQ0FBQztRQUM1RSxDQUFDLENBQUMsQ0FBQztRQUVQLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUM7YUFDckMsSUFBSSxDQUNELFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO1lBQ2hDLElBQUksdUJBQXVCLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsY0FBYyxDQUFDO2dCQUNwRSxNQUFNLG9CQUFvQixHQUFHLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUVqSCw4QkFBOEI7Z0JBQzlCLE9BQU8sbUJBQW1CLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLENBQUM7WUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFDRixrQkFBa0IsRUFBRSxDQUN2QjthQUNBLFNBQVMsQ0FBQztZQUNQLElBQUksRUFBRSxjQUFjLENBQUMsRUFBRTtnQkFDbkIsMkNBQTJDO2dCQUMzQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzNJLENBQUM7U0FDSixDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBWU0sTUFBTSxDQUFDLG1CQUErRCxLQUFLLEVBQUUsZ0JBQWdCLEdBQUcsS0FBSztRQUN4RyxNQUFNLFNBQVMsR0FBRyxPQUFPLGdCQUFnQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFDbEgsTUFBTSxXQUFXLEdBQUcsT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7UUFDNUcsTUFBTSxNQUFNLEdBQ1IsT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLElBQUksZ0JBQWdCLEVBQUUsTUFBTTtZQUM1RCxDQUFDLENBQUUsZ0JBQWdCLEVBQUUsTUFBeUI7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7Z0JBQ1gsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUMxQyxNQUFNLFlBQVksR0FBRywrQkFBK0IsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLGVBQWUsQ0FBQyxLQUF5QjtRQUM1QyxJQUFJLENBQUMsK0JBQStCLEdBQUcsS0FBSyxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO2dCQUM1QyxvSUFBb0k7Z0JBQ3BJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtvQkFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLO29CQUN0QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsV0FBVyxFQUFFLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQ3RFLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sa0JBQWtCLEdBQUcsK0JBQStCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBRXpGLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXLENBQUMsS0FBWSxFQUFFLEdBQWdDLEVBQUUsSUFBVSxFQUFFLEdBQVc7UUFDdEYsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBOEI7WUFDMUMsTUFBTSxFQUFFLEdBQUc7WUFDWCxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxHQUFHO1lBQ2IsS0FBSyxFQUFFLEtBQUs7U0FDZixDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0saUJBQWlCLENBQUMsS0FBa0I7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUEyQjtRQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksbUJBQW1CLENBQUMsRUFBQyxPQUFPLEVBQU07UUFDckMsTUFBTSxPQUFPLEdBQVcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBVyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBRTFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQztRQUMxRSxJQUFJLEdBQUc7WUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7WUFBRSxXQUFXLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUU3RCxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMxQyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVPLHlCQUF5QixDQUFDLGtCQUFrQyxFQUFFLFNBQVMsR0FBRyxJQUFJO1FBQ2xGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsWUFBWSxJQUFJLGtCQUFrQixDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLGtCQUFrQixDQUFDO1FBRW5ELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FDL0MsWUFBWSxDQUFDLE1BQU0sQ0FDZixrQkFBb0QsRUFDcEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQzFCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ3hGLENBQ0osQ0FBQyxTQUFTLENBQUM7WUFDUixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLGVBQWUsWUFBWSwwQkFBMEIsRUFBRSxDQUFDO29CQUN4RCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsQ0FBQztnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNULHNCQUFzQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXhDLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRTtvQkFDekQsVUFBVSxFQUFFLGtCQUFrQjtpQkFDakMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUM7U0FDSixDQUFDLENBQUM7UUFFSCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ1osTUFBTSxVQUFVLEdBQW1CO2dCQUMvQixhQUFhLEVBQUUsSUFBSSxDQUFDLCtCQUErQjtnQkFDbkQsTUFBTSxFQUFFLGtCQUFrQjthQUM3QixDQUFDO1lBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxTQUFpQjtRQUM5QyxNQUFNLGtCQUFrQixHQUFHLCtCQUErQixDQUFDLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNoSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLElBQUksa0JBQWtCLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxFQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQWEsSUFBSSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzFKLENBQUM7UUFDRCxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxrQkFBa0M7UUFDL0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLGtCQUFtQztRQUN4RCxNQUFNLGVBQWUsR0FBeUMsRUFBRSxDQUFDO1FBQ2pFLGtFQUFrRTtRQUNsRSxJQUFJLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDaEUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHO29CQUNuQixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7b0JBQ25CLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUztvQkFDM0IsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhO2lCQUN0QyxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQztJQUVPLGNBQWMsQ0FBQyxrQkFBbUM7UUFDdEQsSUFBSSxrQkFBa0IsRUFBRSxJQUFJLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLElBQUksa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzSCxPQUFPLGtCQUFrQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQy9CLENBQUMsQ0FBQyxFQUFFLENBQ0EsQ0FBVTtnQkFDTixLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVE7Z0JBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5QixDQUFBLENBQ1IsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQTZCO1FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sZUFBZSxHQUFJLEtBQUssQ0FBQyxLQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakcsV0FBVyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO2FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDL0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7WUFDeEIsSUFBSSxTQUFTLEtBQUssR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM5QixHQUFHLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUM5QixDQUFDO1FBQ0wsQ0FBQztRQUNELFdBQVcsQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxlQUFlLENBQUMsS0FBOEI7UUFDakQsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4SixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDdkMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFOUUsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlHLE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDN0MsV0FBVyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFdBQW1DO1FBQzdELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDRCQUE0QjtRQUNoQyxNQUFNLE1BQU0sR0FBbUI7WUFDM0IsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtpQkFDbEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDckMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQztpQkFDdkUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDUCxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7Z0JBQ3BCLFNBQVMsRUFBRSxDQUFDLENBQUMsa0JBQWtCO2FBQ2xDLENBQUMsQ0FBQztZQUNQLE9BQU8sRUFBRSxFQUFFO1NBQ2QsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsRUFBRTthQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO2FBQzlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNULElBQUksU0FBUyxHQUF1QixDQUFDLENBQUMsZ0JBQWdCLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNiLFFBQVEsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNuQixLQUFLLGNBQWMsQ0FBQyxNQUFNO3dCQUN0QixTQUFTLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQzt3QkFDckMsTUFBTTtvQkFDVixLQUFLLGNBQWMsQ0FBQyxNQUFNLENBQUM7b0JBQzNCLEtBQUssY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7d0JBQzdCLE1BQU0sWUFBWSxHQUFHLENBQXNDLENBQUM7d0JBQzVELElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUMzQixTQUFTLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQzt3QkFDbkMsQ0FBQzt3QkFDRCxNQUFNO29CQUNWLENBQUM7b0JBQ0Q7d0JBQ0ksTUFBTTtnQkFDZCxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDYixTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUN2QyxDQUFDO1lBRUQsSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDckQsU0FBUyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUVELElBQUksS0FBSyxHQUE0QixTQUFTLENBQUM7WUFDL0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQzNCLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxPQUFRLENBQUMsUUFBUSxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxLQUFLO2dCQUNaLFNBQVMsRUFBRSxTQUFTO2FBQ3ZCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVQLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTyx3QkFBd0I7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRTdDLGdEQUFnRDtRQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUE0QixVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsSUFBSSxTQUFTLEVBQUU7WUFDbEMsVUFBVSxFQUFFLEdBQUc7WUFDZixNQUFNLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQ0EsQ0FBQyxDQUFDLFlBQVksS0FBSyxHQUFHLENBQUMsUUFBUTtnQkFDL0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxLQUFLLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUNwSjtZQUNELElBQUksRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNqRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWTtZQUMzQixTQUFTLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTO1lBQ3RHLEtBQUssRUFBRSxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztTQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUM7Z0JBQzVFLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2YsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4SCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0I7UUFDckIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25DLElBQUksR0FBRyxFQUFFLENBQUM7WUFDTixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyx3QkFBd0IsQ0FBQyxNQUFzQjtRQUNuRCxPQUFPLENBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRTtZQUMvQyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUN0RyxDQUFDO0lBQ04sQ0FBQzs4R0F2cEJRLGNBQWM7a0dBQWQsY0FBYyxxMkVBSFosQ0FBQyxlQUFlLENBQUMsb0RBNkRPLGlCQUFpQiw0RUFDbkIsQ0FBQSxrQkFBdUIsQ0FBQSw2RkFDakIsS0FBSyxnRUMzS2hELG10cEJBdVVBLDRDRDlPUSxrQkFBa0IsNEtBQ2xCLGdCQUFnQix3REFDaEIsT0FBTyxvRkFDUCxPQUFPLDJFQUNQLGdCQUFnQixvSkFDaEIseUJBQXlCLDhGQUN6QixZQUFZLCtDQUNaLHlCQUF5QixpRUFDekIsMEJBQTBCLHVGQUMxQiwwQkFBMEIsaUVBQzFCLFdBQVcseTRHQUNYLGlCQUFpQixvMUNBQ2pCLFlBQVksMmtCQUNaLGFBQWEscVhBQ2IsZUFBZSw0RkFDZiw2QkFBNkIsZ0xBQzdCLFdBQVcsK1ZBQ1gsaUJBQWlCOzsyRkFLWixjQUFjO2tCQTVCMUIsU0FBUztpQ0FDTSxJQUFJLFlBQ04sV0FBVyxXQUVaO3dCQUNMLFNBQVM7d0JBQ1Qsa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxnQkFBZ0I7d0JBQ2hCLHlCQUF5Qjt3QkFDekIsWUFBWTt3QkFDWix5QkFBeUI7d0JBQ3pCLDBCQUEwQjt3QkFDMUIsMEJBQTBCO3dCQUMxQixXQUFXO3dCQUNYLGlCQUFpQjt3QkFDakIsWUFBWTt3QkFDWixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsNkJBQTZCO3dCQUM3QixXQUFXO3dCQUNYLGlCQUFpQjtxQkFDcEIsYUFDVSxDQUFDLGVBQWUsQ0FBQyxtQkFDWCx1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGUsIE5nQ2xhc3MsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBJbmplY3RvcixcbiAgICBPbkRlc3Ryb3ksXG4gICAgU2lnbmFsLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFR5cGUsXG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgY29tcHV0ZWQsXG4gICAgY29udGVudENoaWxkcmVuLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgdmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtvdXRwdXRGcm9tT2JzZXJ2YWJsZSwgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25DYW5jZWwsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgTmF2aWdhdGlvblN0YXJ0LCBQYXJhbXMsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtNZXNzYWdlU2VydmljZSwgU29ydE1ldGF9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7QnV0dG9uTW9kdWxlfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQge011bHRpU2VsZWN0Q2hhbmdlRXZlbnQsIE11bHRpU2VsZWN0TW9kdWxlfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0JztcbmltcG9ydCB7VGFibGUsIFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50LCBUYWJsZUxhenlMb2FkRXZlbnQsIFRhYmxlTW9kdWxlLCBUYWJsZVJvd1Jlb3JkZXJFdmVudH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQge1Rvb2x0aXBNb2R1bGV9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5pbXBvcnQge05FVkVSLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIG9mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgICBDbGFzc01hcFBpcGUsXG4gICAgQ29tbW9uc0ZpbHRlck1ldGFkYXRhLFxuICAgIENvbW1vbnNTZXJ2aWNlLFxuICAgIENvbW1vbnNTdG9yYWdlU2VydmljZSxcbiAgICBDb21wb25lbnREaXJlY3RpdmUsXG4gICAgRGF0YUxpc3RQYXJhbXMsXG4gICAgRGF0YUxpc3RSZXN1bHQsXG4gICAgRmlsdGVyTWF0Y2hNb2RlLFxuICAgIEkxOG5Qcm9wZXJ0eVBpcGUsXG4gICAgTG9nZ2VyU2VydmljZSxcbiAgICBUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBib29sZWFuT3JVbmRlZmluZWRBdHRyaWJ1dGUsXG4gICAgdG9PYnNlcnZhYmxlIGFzIGNvbW1vbnNUb09ic2VydmFibGUsXG4gICAgZGF0YUxpc3RQYXJhbXNUb1VybFF1ZXJ5LFxuICAgIGZpbmRUZW1wbGF0ZUJ5TmFtZSxcbiAgICBmcm9tU3Vic2NyaWJlRXJyb3IsXG4gICAgZnJvbVRhYmxlTG9hZFRvRGF0YUxpc3RQYXJhbXMsXG4gICAgZnJvbVVybFF1ZXJ5VG9EYXRhTGlzdFBhcmFtcyxcbiAgICBnZXRFcnJvckxvZ0xldmVsLFxuICAgIG1lcmdlRGF0YUxpc3RQYXJhbXNXaXRoRGVmYXVsdHNcbn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcbmltcG9ydCB7RmlsdGVyRGVzY3JpcHRvciwgRmlsdGVyRGlzcGxheVR5cGVFbnVtLCBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLCBGaWx0ZXJUeXBlRW51bX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9maWx0ZXInO1xuaW1wb3J0IHtcbiAgICBDb2x1bW5EZXNjcmlwdG9yLFxuICAgIElUYWJsZURhdGFQcm92aWRlcixcbiAgICBUYWJsZUNlbGxDbGlja0V2ZW50LFxuICAgIFRhYmxlRGVzY3JpcHRvckluc3QsXG4gICAgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QsXG4gICAgVGFibGVMYXlvdXRQcmVmZXJlbmNlcyxcbiAgICBUYWJsZUxvYWRFdmVudCxcbiAgICBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSxcbiAgICBUYWJsZVJlbG9hZEV2ZW50LFxuICAgIFRhYmxlU2l6ZUVudW0sXG4gICAgdGFibGVEZXNjcmlwdG9yXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGUvYXBpJztcblxuaW1wb3J0IHtjcmVhdGVGaWx0ZXJEZXNjcmlwdG9yc0Zyb21HZW5lcmljfSBmcm9tICcuLi8uLi9oZWxwZXJzL2ZpbHRlcnMnO1xuaW1wb3J0IHt0YWJsZU5vdGlmaWNhdGlvbkVycm9yfSBmcm9tICcuLi8uLi9oZWxwZXJzL25vdGlmaWNhdGlvbic7XG5pbXBvcnQge2dlbmVyYXRlVGFibGVMYXlvdXRQcmVmc0tleX0gZnJvbSAnLi4vLi4vaGVscGVycy90YWJsZS1sYXlvdXQtcHJlZnMnO1xuaW1wb3J0IHtDb2x1bW5XaXRoUHJlZmVyZW5jZXN9IGZyb20gJy4uLy4uL21vZGVscy9jb2x1bW4tcHJlZmVyZW5jZXMubW9kZWwnO1xuaW1wb3J0IHtMb2NhbGVEZWZhdWx0Um93Q2xhc3NQaXBlfSBmcm9tICcuLi8uLi9waXBlcy9sb2NhbGUtZGVmYXVsdC1yb3ctY2xhc3MucGlwZSc7XG5pbXBvcnQge1RhYmxlQ29sdW1uRmlsdGVyQ2xhc3NQaXBlfSBmcm9tICcuLi8uLi9waXBlcy90YWJsZS1jb2x1bW4tZmlsdGVyLWNsYXNzLnBpcGUnO1xuaW1wb3J0IHtEYXRhTGlzdFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtbGlzdC5zZXJ2aWNlJztcbmltcG9ydCB7Q09NTU9OU19UQUJMRV9GRUFUVVJFX0NPTkZJR19JVH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFibGUtZmVhdHVyZS1jb25maWcudG9rZW4nO1xuaW1wb3J0IHtUYWJsZUNvbHVtbkZpbHRlckNvbXBvbmVudH0gZnJvbSAnLi4vY29sdW1uLWZpbHRlci9jb2x1bW4tZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQge1RhYmxlQ29sdW1uVmFsdWVDb21wb25lbnR9IGZyb20gJy4uL2NvbHVtbi12YWx1ZS9jb2x1bW4tdmFsdWUuY29tcG9uZW50JztcbmltcG9ydCB7RmlsdGVyT3ZlcmxheVdpdGhUYWdDb21wb25lbnR9IGZyb20gJy4uL2ZpbHRlci9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLXRhYmxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBDb21wb25lbnREaXJlY3RpdmUsXG4gICAgICAgIEkxOG5Qcm9wZXJ0eVBpcGUsXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIE5nU3R5bGUsXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIFRhYmxlQ29sdW1uVmFsdWVDb21wb25lbnQsXG4gICAgICAgIENsYXNzTWFwUGlwZSxcbiAgICAgICAgTG9jYWxlRGVmYXVsdFJvd0NsYXNzUGlwZSxcbiAgICAgICAgVGFibGVDb2x1bW5GaWx0ZXJDb21wb25lbnQsXG4gICAgICAgIFRhYmxlQ29sdW1uRmlsdGVyQ2xhc3NQaXBlLFxuICAgICAgICBUYWJsZU1vZHVsZSxcbiAgICAgICAgTXVsdGlTZWxlY3RNb2R1bGUsXG4gICAgICAgIEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgVG9vbHRpcE1vZHVsZSxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBGaWx0ZXJPdmVybGF5V2l0aFRhZ0NvbXBvbmVudCxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFRlbXBsYXRlRGlyZWN0aXZlXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtEYXRhTGlzdFNlcnZpY2VdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PEl0ZW0gPSBhbnksIFNlcnZpY2UgPSB1bmRlZmluZWQsIFNvcnRzID0gYW55LCBGaWx0ZXJzIGV4dGVuZHMga2V5b2YgYW55ID0gYW55PiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGNtcFR5cGVOYW1lID0gJ1RhYmxlQ29tcG9uZW50JztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KExvZ2dlclNlcnZpY2UpLmNyZWF0ZSh0aGlzLmNtcFR5cGVOYW1lKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2UgPSBpbmplY3QoTWVzc2FnZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbW9ucyA9IGluamVjdChDb21tb25zU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZSA9IGluamVjdChDb21tb25zU3RvcmFnZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KENPTU1PTlNfVEFCTEVfRkVBVFVSRV9DT05GSUdfSVQsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHB1YmxpYyByZWFkb25seSBkYXRhTGlzdFNlcnZpY2UgPSBpbmplY3QoRGF0YUxpc3RTZXJ2aWNlPEl0ZW0+KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEZpbHRlckRpc3BsYXlUeXBlOiBGaWx0ZXJEaXNwbGF5VHlwZUVudW0gPSB0aGlzLmNvbmZpZz8uZmlsdGVyRGlzcGxheVR5cGUgPz8gRmlsdGVyRGlzcGxheVR5cGVFbnVtLkNvbHVtbjtcblxuICAgIC8vIG1ldGFkYXRhIGlucHV0XG4gICAgcHVibGljIGRlc2NyaXB0b3JJbnB1dCA9IGlucHV0LnJlcXVpcmVkPFRhYmxlRGVzY3JpcHRvckluc3Q8SXRlbSwgU29ydHMsIEZpbHRlcnM+Pih7YWxpYXM6ICdkZXNjcmlwdG9yJ30pO1xuXG4gICAgLy8gZGF0YSBzb3VyY2UgaW5wdXRzXG4gICAgcHVibGljIGl0ZW1zID0gaW5wdXQ8SXRlbVtdPigpO1xuICAgIHB1YmxpYyByZXN1bHQgPSBpbnB1dDxEYXRhTGlzdFJlc3VsdDxJdGVtPj4oKTtcbiAgICBwdWJsaWMgbG9hZGluZ0lucHV0ID0gaW5wdXQodW5kZWZpbmVkLCB7YWxpYXM6ICdsb2FkaW5nJywgdHJhbnNmb3JtOiBib29sZWFuT3JVbmRlZmluZWRBdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgZGF0YVByb3ZpZGVyID0gaW5wdXQ8SVRhYmxlRGF0YVByb3ZpZGVyPEl0ZW0sIFNlcnZpY2UsIFNvcnRzLCBGaWx0ZXJzPj4oKTtcblxuICAgIC8vIGV4dHJhIGZlYXR1cmVzIGlucHV0XG4gICAgcHVibGljIHVzZVF1ZXJ5UGFyYW1zID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgY2VsbENsaWNrRW5hYmxlZCA9IGlucHV0KHRydWUsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgc2VsZWN0aW9uTW9kZSA9IGlucHV0PCdzaW5nbGUnIHwgJ211bHRpcGxlJz4oJ211bHRpcGxlJyk7XG4gICAgcHVibGljIHNlbGVjdGlvbkVuYWJsZWQgPSBpbnB1dChmYWxzZSwge3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pO1xuICAgIHB1YmxpYyByb3dSZW9yZGVyRW5hYmxlZElucHV0ID0gaW5wdXQodHJ1ZSwge2FsaWFzOiAncm93UmVvcmRlckVuYWJsZWQnLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgcm93UmVvcmRlckVuYWJsZWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLnJvd1Jlb3JkZXJFbmFibGVkSW5wdXQoKSAmJiB0aGlzLmRlc2NyaXB0b3IoKS5yb3dSZW9yZGVyYWJsZSk7XG5cbiAgICAvLyBzdHlsaW5nXG4gICAgcHVibGljIGNvbHVtbkxhc3RNaW5XaWR0aCA9IGlucHV0PG51bWJlcj4oKTtcbiAgICBwdWJsaWMgY29sdW1uc0NvbHNwYW4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpc2libGVDb2x1bW5zKCkubGVuZ3RoICsgKHRoaXMuaGFzTGFzdENvbHVtbigpID8gMSA6IDApICsgKHRoaXMuc2VsZWN0aW9uRW5hYmxlZCgpID8gMSA6IDApICsgKHRoaXMucm93UmVvcmRlckVuYWJsZWQoKSA/IDEgOiAwKSk7XG4gICAgcHVibGljIGhhc1RpdGxlRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY2FwdGlvblRlbXBsYXRlKCkgfHwgdGhpcy5jYXB0aW9uQ29tcG9uZW50KCkgfHwgdGhpcy5kZXNjcmlwdG9yKCkudGl0bGUpO1xuICAgIHB1YmxpYyBpc0NhcHRpb25WaXNpYmxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oYXNUaXRsZURpc3BsYXkoKSB8fCB0aGlzLm92ZXJsYXlXaXRoVGFnRmlsdGVycygpLmxlbmd0aCA+IDAgfHwgdGhpcy5kZXNjcmlwdG9yKCkuc2VhcmNoKTtcblxuICAgIC8vIGNvbXBvbmVudCBpbnB1dHNcbiAgICBwdWJsaWMgY2FwdGlvbkNvbXBvbmVudCA9IGlucHV0PFR5cGU8YW55Pj4oKTtcbiAgICBwdWJsaWMgY29sdW1uQ3VzdG9tTGFzdENvbXBvbmVudCA9IGlucHV0PFR5cGU8YW55Pj4oKTtcbiAgICBwdWJsaWMgZ2xvYmFsRmlsdGVyRmllbGRzSW5wdXQgPSBpbnB1dDxzdHJpbmdbXSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7YWxpYXM6ICdnbG9iYWxGaWx0ZXJGaWVsZHMnfSk7XG5cbiAgICAvLyBjZWxsIGNsaWNrXG4gICAgcHJpdmF0ZSBjZWxsQ2xpY2tTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VGFibGVDZWxsQ2xpY2tFdmVudDxJdGVtPj4oKTtcbiAgICBwdWJsaWMgaXNDZWxsQ2xpY2tPYnNlcnZlZCA9IHNpZ25hbCh0aGlzLmNlbGxDbGlja1N1YmplY3Qub2JzZXJ2ZWQpO1xuICAgIHB1YmxpYyBpc0NlbGxDbGlja0VuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNlbGxDbGlja0VuYWJsZWQoKSAmJiB0aGlzLmlzQ2VsbENsaWNrT2JzZXJ2ZWQoKSk7XG5cbiAgICAvLyBldmVudCBvdXRwdXRzXG4gICAgcHVibGljIHRhYmxlTG9hZCA9IG91dHB1dDxUYWJsZUxvYWRFdmVudD4oKTtcbiAgICBwdWJsaWMgY2VsbENsaWNrID0gb3V0cHV0RnJvbU9ic2VydmFibGUodGhpcy5jZWxsQ2xpY2tTdWJqZWN0KTtcbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PEFycmF5PEl0ZW0+PigpO1xuICAgIHB1YmxpYyBjYXB0aW9uQ29tcG9uZW50SW5zdGFuY2UgPSBvdXRwdXQ8YW55PigpO1xuICAgIHB1YmxpYyBjb2x1bW5DdXN0b21MYXN0Q29tcG9uZW50SW5zdGFuY2UgPSBvdXRwdXQ8YW55PigpO1xuICAgIHB1YmxpYyByb3dSZW9yZGVyID0gb3V0cHV0PFRhYmxlUm93UmVvcmRlckV2ZW50PigpO1xuXG4gICAgLy8gY29udGVudCBhbmQgdmlldyBxdWVyaWVzXG4gICAgcHVibGljIHRlbXBsYXRlcyA9IGNvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gICAgcHVibGljIGNvbXBvbmVudHMgPSB2aWV3Q2hpbGRyZW4oQ29tcG9uZW50RGlyZWN0aXZlPGFueT4pO1xuICAgIHB1YmxpYyBwcmltZVRhYmxlID0gdmlld0NoaWxkLnJlcXVpcmVkKFRhYmxlKTtcblxuICAgIC8vIHRlbXBsYXRlc1xuICAgIHB1YmxpYyBjYXB0aW9uVGVtcGxhdGU6IFNpZ25hbDxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiBmaW5kVGVtcGxhdGVCeU5hbWUoWy4uLnRoaXMudGVtcGxhdGVzKCldLCAnY2FwdGlvbicpKTtcbiAgICBwdWJsaWMgY29sdW1uQ3VzdG9tTGFzdFRlbXBsYXRlOiBTaWduYWw8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4gZmluZFRlbXBsYXRlQnlOYW1lKFsuLi50aGlzLnRlbXBsYXRlcygpXSwgJ2NvbHVtbkN1c3RvbUxhc3QnKSk7XG4gICAgcHVibGljIGZvb3RlclRlbXBsYXRlOiBTaWduYWw8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4gZmluZFRlbXBsYXRlQnlOYW1lKFsuLi50aGlzLnRlbXBsYXRlcygpXSwgJ2Zvb3RlcicpKTtcbiAgICBwdWJsaWMgcm93RXhwYW5kVGVtcGxhdGU6IFNpZ25hbDxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiBmaW5kVGVtcGxhdGVCeU5hbWUoWy4uLnRoaXMudGVtcGxhdGVzKCldLCAncm93RXhwYW5kQ29udGVudCcpKTtcblxuICAgIC8vIGRhdGEgcHJvdmlkZXIgYW5kIGl0ZW1zXG4gICAgcHVibGljIGlzTGF6eSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGF0YVByb3ZpZGVyKCk/LmlzTGF6eSA9PT0gdHJ1ZSk7XG4gICAgcHVibGljIGlzUGFnaW5hdGlvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFnaW5hdGlvbk1vZGUoKSA9PT0gVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uUGFnaW5hdGlvbik7XG4gICAgcHVibGljIHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLy8gdmlzdWFsXG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uTW9kZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlc2NyaXB0b3IoKS5wYWdpbmF0aW9uTW9kZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IgY2hvaWNlIGlzIHRoZSBzdHJvbmdlc3QgLSBpZiBkZWZpbmVkLCB1c2UgdGhpcyB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvcigpLnBhZ2luYXRpb25Nb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmRhdGFQcm92aWRlcigpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gd2hlbiBkYXRhIHByb3ZpZGVyIGlzIHVzZWQsIHVzZSBwYWdpbmF0aW9uXG4gICAgICAgICAgICByZXR1cm4gVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uUGFnaW5hdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5Ob25lO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcHVibGljIGNsYXNzTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHRoaXMuZGVzY3JpcHRvcigpLmNsYXNzTmFtZSA/PyAnJztcbiAgICAgICAgc3dpdGNoICh0aGlzLmRlc2NyaXB0b3IoKS5zaXplKSB7XG4gICAgICAgICAgICBjYXNlIFRhYmxlU2l6ZUVudW0uU21hbGw6XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lICs9ICcgcC1kYXRhdGFibGUtc20nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUYWJsZVNpemVFbnVtLkxhcmdlOlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArPSAnIHAtZGF0YXRhYmxlLWxnJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yKCkuaGFzR3JpZGxpbmVzKSB7XG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1ncmlkbGluZXMnO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc0NhcHRpb25WaXNpYmxlKCkpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSAnIGRhdGF0YWJsZS1uby1oZWFkZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgfSk7XG5cbiAgICAvLyBkYXRhIHByb3ZpZGVyXG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcigpO1xuICAgICAgICByZXR1cm4gZGF0YVByb3ZpZGVyPy5zZXJ2aWNlVHlwZSA/IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4oZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKSA6IG51bGw7XG4gICAgfSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50PzogVGFibGVMYXp5TG9hZEV2ZW50O1xuICAgIHByaXZhdGUgbGF0ZXN0UGFyYW1zV2l0aERlZmF1bHRzPzogRGF0YUxpc3RQYXJhbXM7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgICAvLyBkZXNjcmlwdG9yc1xuICAgIHB1YmxpYyBkZXNjcmlwdG9yID0gc2lnbmFsPFRhYmxlRGVzY3JpcHRvckluc3Q8YW55LCBhbnksIGFueT4+KHRhYmxlRGVzY3JpcHRvcjxzdHJpbmcsIHN0cmluZywgc3RyaW5nPigpKTtcbiAgICBwcml2YXRlIGxvY2Fsc3RvcmFnZUtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZGVzY3JpcHRvcigpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5tb2RlbC5pMThuQmFzZUtleSA/IGdlbmVyYXRlVGFibGVMYXlvdXRQcmVmc0tleShkZXNjcmlwdG9yLm1vZGVsLmkxOG5CYXNlS2V5LCB0aGlzLnJvdXRlci51cmwsIGRlc2NyaXB0b3IuaWRlbnRpZmllcikgOiBudWxsO1xuICAgIH0pO1xuICAgIHByaXZhdGUgbGF5b3V0UHJlZnNTYXZlQ250ID0gc2lnbmFsKDApO1xuICAgIHByaXZhdGUgbGF5b3V0UHJlZmVyZW5jZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxzS2V5ID0gdGhpcy5sb2NhbHN0b3JhZ2VLZXkoKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCBjbnQgPSB0aGlzLmxheW91dFByZWZzU2F2ZUNudCgpOyAvLyBuZWVkZWQgdG8gZm9yY2UgdXBkYXRlcyBvbiB1c2VyIGNoYW5nZXNcbiAgICAgICAgY29uc3QgbGF5b3V0UHJlZnMgPSBsc0tleSA/IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0SXRlbTxUYWJsZUxheW91dFByZWZlcmVuY2VzPih0aGlzLmNtcFR5cGVOYW1lLCBsc0tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBsYXlvdXRQcmVmcyA/PyB7Y29sdW1uV2lkdGhzOiB7fX07XG4gICAgfSk7XG4gICAgcHVibGljIGNvbHVtbnMgPSBjb21wdXRlZDxDb2x1bW5XaXRoUHJlZmVyZW5jZXNbXT4oKCkgPT4gdGhpcy5jb21wdXRlQ29sdW1uc1dpdGhMYXlvdXQoKSk7XG4gICAgcHVibGljIHZpc2libGVDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb2x1bW5zKCkuZmlsdGVyKGNvbCA9PiBjb2wuaXNWaXNpYmxlKSk7XG5cbiAgICAvLyBmaWx0ZXIsIHNvcnRcbiAgICBwdWJsaWMgZmlsdGVyRGVzY3JpcHRvcnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRlc2NyaXB0b3IoKS5maWx0ZXJzKTtcbiAgICBwdWJsaWMgZ2VuZXJpY0ZpbHRlckRlc2NyaXB0b3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRlc2NyaXB0b3IoKS5nZW5lcmljRmlsdGVyKTtcbiAgICBwcml2YXRlIGZpbHRlckRlc2NyaXB0b3JzRnJvbUdlbmVyaWMgPSBzaWduYWw8RmlsdGVyRGVzY3JpcHRvcjxhbnksIGFueT5bXT4oW10pO1xuICAgIHB1YmxpYyBoYXNDb2x1bW5GaWx0ZXJzID0gY29tcHV0ZWQoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgICAodGhpcy5kZWZhdWx0RmlsdGVyRGlzcGxheVR5cGUgPT09IEZpbHRlckRpc3BsYXlUeXBlRW51bS5PdmVybGF5V2l0aFRhZyAmJiB0aGlzLmZpbHRlckRlc2NyaXB0b3JzKCkuc29tZShkID0+IGQuZGlzcGxheVR5cGUgPT09IEZpbHRlckRpc3BsYXlUeXBlRW51bS5Db2x1bW4pKSB8fFxuICAgICAgICAgICAgKHRoaXMuZGVmYXVsdEZpbHRlckRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uQ29sdW1uICYmIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMoKS5zb21lKGQgPT4gZC5kaXNwbGF5VHlwZSA9PSBudWxsKSlcbiAgICApO1xuICAgIHB1YmxpYyBvdmVybGF5V2l0aFRhZ0ZpbHRlcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmZpbHRlckRlc2NyaXB0b3JzKCkuZmlsdGVyKFxuICAgICAgICAgICAgZCA9PiAoZC5kaXNwbGF5VHlwZSA9PSBudWxsICYmIHRoaXMuZGVmYXVsdEZpbHRlckRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uT3ZlcmxheVdpdGhUYWcpIHx8IGQuZGlzcGxheVR5cGUgPT09IEZpbHRlckRpc3BsYXlUeXBlRW51bS5PdmVybGF5V2l0aFRhZ1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXJzLmNvbmNhdCh0aGlzLmZpbHRlckRlc2NyaXB0b3JzRnJvbUdlbmVyaWMoKSk7XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGRlZmF1bHRQYXJhbXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVEZWZhdWx0RGF0YUxpc3RQYXJhbXMoKSk7XG5cbiAgICBwdWJsaWMgYW55Q29sdW1uVmlzaWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlzaWJsZUNvbHVtbnMoKS5sZW5ndGggPiAwKTtcbiAgICBwdWJsaWMgaGFzQ3VzdG9tTGFzdENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29sdW1uQ3VzdG9tTGFzdENvbXBvbmVudCgpIHx8IHRoaXMuY29sdW1uQ3VzdG9tTGFzdFRlbXBsYXRlKCkpO1xuICAgIHB1YmxpYyBoYXNMYXN0Q29sdW1uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oYXNDdXN0b21MYXN0Q29sdW1uKCkgfHwgdGhpcy5hcmVDb2x1bW5zVG9nZ2xlYWJsZSgpIHx8IHRoaXMuYXJlQ29sdW1uc1Jlb3JkZXJhYmxlKCkpO1xuXG4gICAgLy8gbGF5b3V0IHByZWZzXG4gICAgcHVibGljIGFyZUNvbHVtbnNSZW9yZGVyYWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29sdW1ucygpLnNvbWUoY29sID0+IGNvbC5kZXNjcmlwdG9yLmlzUmVvcmRlcmFibGUpKTtcbiAgICBwdWJsaWMgYXJlQ29sdW1uc1RvZ2dsZWFibGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbnMoKS5zb21lKGNvbCA9PiBjb2wuZGVzY3JpcHRvci5pc1RvZ2dsZWFibGUpKTtcblxuICAgIHB1YmxpYyBnbG9iYWxTZWFyY2hQYXJhbUZyb21VcmwgPSBzaWduYWw8e3ZhbHVlOiBzdHJpbmc7IGNhc2VTZW5zaXRpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLy8gb3RoZXJcbiAgICBwcml2YXRlIHJvdXRlcklzTmF2aWdhdGlvbk91dHNpZGVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmRlc2NyaXB0b3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkZXNjcmlwdG9yLnJvd3NQZXJQYWdlT3B0aW9ucykgJiYgZGVzY3JpcHRvci5yb3dzUGVyUGFnZU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5yb3dzUGVyUGFnZU9wdGlvbnMuc2V0KGRlc2NyaXB0b3Iucm93c1BlclBhZ2VPcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZGVmYXVsdE51bVJvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2Uucm93cy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5yb3dzUGVyUGFnZU9wdGlvbnMoKS5pbmNsdWRlcyhkZXNjcmlwdG9yLmRlZmF1bHROdW1Sb3dzKSA/IGRlc2NyaXB0b3IuZGVmYXVsdE51bVJvd3MgOiB0aGlzLmRhdGFMaXN0U2VydmljZS5yb3dzUGVyUGFnZU9wdGlvbnMoKVswXVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLmxvYWRpbmdJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2UubG9hZGluZy5zZXQobG9hZGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHthbGxvd1NpZ25hbFdyaXRlczogdHJ1ZX1cbiAgICAgICAgKTtcblxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2Uuc2V0RGF0YShyZXN1bHQuZGF0YSwgcmVzdWx0LnRvdGFsQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5sb2FkaW5nSW5wdXQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRpbmcgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCBpZiBpbnB1dCBpcyBub3QgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2UubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHthbGxvd1NpZ25hbFdyaXRlczogdHJ1ZX1cbiAgICAgICAgKTtcblxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXMoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IHVuZGVmaW5lZCAmJiBpdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnNldERhdGEoaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5sb2FkaW5nSW5wdXQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRpbmcgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCBpZiBpbnB1dCBpcyBub3QgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2UubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHthbGxvd1NpZ25hbFdyaXRlczogdHJ1ZX1cbiAgICAgICAgKTtcblxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZGVzY3JpcHRvcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmdsb2JhbEZpbHRlckZpZWxkcy5zZXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzSW5wdXQoKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGVzY3JpcHRvcigpLnNlYXJjaCAmJiBkZXNjcmlwdG9yLnNlYXJjaEZpZWxkcyA/IGRlc2NyaXB0b3Iuc2VhcmNoRmllbGRzIDogdGhpcy5jb2x1bW5zKCkubWFwKGMgPT4gYy5kZXNjcmlwdG9yLnByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHthbGxvd1NpZ25hbFdyaXRlczogdHJ1ZX1cbiAgICAgICAgKTtcblxuICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0NlbGxDbGlja09ic2VydmVkLnNldCh0aGlzLmNlbGxDbGlja1N1YmplY3Qub2JzZXJ2ZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0b09ic2VydmFibGUodGhpcy5kYXRhUHJvdmlkZXIpXG4gICAgICAgICAgICAucGlwZShzd2l0Y2hNYXAoZHAgPT4gZHA/LnRhYmxlUmVsb2FkJCA/PyBvZih7fSkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3RvT2JzZXJ2YWJsZSh0aGlzLmRlc2NyaXB0b3JJbnB1dCksIHRvT2JzZXJ2YWJsZSh0aGlzLmRhdGFQcm92aWRlciksIHRvT2JzZXJ2YWJsZSh0aGlzLnVzZVF1ZXJ5UGFyYW1zKV0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAvLyBkYXRhUHJvdmlkZXIgaXMgbmVlZGVkIHRvIGVuc3VyZSBjb3JyZWN0IG9yZGVyIG9mIGV4ZWN1dGlvbiBhbmQgcmVsb2FkXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoW2Rlc2NyaXB0b3JJbnB1dCwgZGF0YVByb3ZpZGVyLCB1c2VRdWVyeVBhcmFtc10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JJbnB1dCAhPT0gdGhpcy5kZXNjcmlwdG9yKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvci5zZXQoZGVzY3JpcHRvcklucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodXNlUXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGFibGUgbG9hZHMgZnJvbSByb3V0ZSB1cGRhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHFwID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBkYXRhIGltbWVkaWF0ZWx5IGJ5IGNyZWF0aW5nIGRlZmF1bHQgc29ydHMgYW5kIGZpbHRlcnMgKHByaW1lbmcgd2lsbCB0cmlnZ2VyIG9uTGF6eUxvYWQgZXZlbnQgb24gc29ydCZmaWx0ZXIgbWV0YWRhdGEgY2hhbmdlKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U29ydCA9IHRoaXMuY3JlYXRlU29ydE1ldGEodGhpcy5kZWZhdWx0UGFyYW1zKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmF1bHRTb3J0IHx8IGRlZmF1bHRTb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnNvcnRNZXRhLnNldChkZWZhdWx0U29ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gdGhpcy5jcmVhdGVGaWx0ZXJNZXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5maWx0ZXJNZXRhLnNldChkZWZhdWx0RmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIoe30pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFRhYmxlRnJvbVJvdXRlVXBkYXRlKHFwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0b09ic2VydmFibGUodGhpcy51c2VRdWVyeVBhcmFtcylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCh1c2VRcCA9PiAodXNlUXAgPyB0aGlzLnJvdXRlci5ldmVudHMgOiBORVZFUikpLFxuICAgICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgZSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgJiYgZS51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdICE9PSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uQ2FuY2VsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVycm9yXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlcklzTmF2aWdhdGlvbk91dHNpZGVJblByb2dyZXNzID0gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRvT2JzZXJ2YWJsZSh0aGlzLmdlbmVyaWNGaWx0ZXJEZXNjcmlwdG9yKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKGdlbmVyaWNGaWx0ZXJEZXNjcmlwdG9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyaWNGaWx0ZXJEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSB0aGlzLmdlbmVyaWNGaWx0ZXJEZXNjcmlwdG9yKCk/LnByb3BlcnR5TG9va3VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJpY0ZpbHRlclNlcnZpY2UgPSBkYXRhUHJvdmlkZXI/LnNlcnZpY2VUeXBlID8gdGhpcy5pbmplY3Rvci5nZXQ8YW55PihkYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmV0Y2ggZmlsdGVyYWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbW9uc1RvT2JzZXJ2YWJsZShnZW5lcmljRmlsdGVyRGVzY3JpcHRvci5wcm9wZXJ0eUxvb2t1cC5sb29rdXAoe30sIGdlbmVyaWNGaWx0ZXJTZXJ2aWNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogZ2VuZXJpY0ZpbHRlcnMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZGVzY3JpcHRvcnMgZnJvbSBnZW5lcmljIGZpbHRlciBkYXRhXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnNGcm9tR2VuZXJpYy5zZXQoY3JlYXRlRmlsdGVyRGVzY3JpcHRvcnNGcm9tR2VuZXJpYyhnZW5lcmljRmlsdGVycywgdGhpcy5nZW5lcmljRmlsdGVyRGVzY3JpcHRvcigpPy52YWx1ZUxvb2t1cCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZCgpOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB3aXRoIGBUYWJsZVJlbG9hZEV2ZW50YCBvYmplY3QgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxvYWQoZW1pdEV2ZW50OiBib29sZWFuKTogdm9pZDtcbiAgICBwdWJsaWMgcmVsb2FkKGVtaXRFdmVudD86IFRhYmxlUmVsb2FkRXZlbnQ8U29ydHMsIEZpbHRlcnM+KTogdm9pZDtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugd2l0aCBgVGFibGVSZWxvYWRFdmVudGAgb2JqZWN0IHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsb2FkKGVtaXRFdmVudDogYm9vbGVhbiwgcmVzZXRQYXJhbXM6IGJvb2xlYW4pOiB2b2lkO1xuICAgIHB1YmxpYyByZWxvYWQoZW1pdEV2ZW50T3JFdmVudDogYm9vbGVhbiB8IFRhYmxlUmVsb2FkRXZlbnQ8U29ydHMsIEZpbHRlcnM+ID0gZmFsc2UsIHJlc2V0UGFyYW1zUGFyYW0gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBlbWl0RXZlbnQgPSB0eXBlb2YgZW1pdEV2ZW50T3JFdmVudCA9PT0gJ2Jvb2xlYW4nID8gZW1pdEV2ZW50T3JFdmVudCA6IGVtaXRFdmVudE9yRXZlbnQ/LmVtaXRFdmVudCA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzZXRQYXJhbXMgPSB0eXBlb2YgZW1pdEV2ZW50T3JFdmVudCA9PT0gJ29iamVjdCcgPyBlbWl0RXZlbnRPckV2ZW50Py5yZXNldFBhcmFtcyA6IHJlc2V0UGFyYW1zUGFyYW07XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9XG4gICAgICAgICAgICB0eXBlb2YgZW1pdEV2ZW50T3JFdmVudCA9PT0gJ29iamVjdCcgJiYgZW1pdEV2ZW50T3JFdmVudD8ucGFyYW1zXG4gICAgICAgICAgICAgICAgPyAoZW1pdEV2ZW50T3JFdmVudD8ucGFyYW1zIGFzIERhdGFMaXN0UGFyYW1zKVxuICAgICAgICAgICAgICAgIDogcmVzZXRQYXJhbXNcbiAgICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICA6IHRoaXMubGF0ZXN0UGFyYW1zV2l0aERlZmF1bHRzO1xuICAgICAgICBjb25zdCByZWxvYWRQYXJhbXMgPSBtZXJnZURhdGFMaXN0UGFyYW1zV2l0aERlZmF1bHRzKHBhcmFtcyA/PyB7fSwgdGhpcy5kZWZhdWx0UGFyYW1zKCkpO1xuICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocmVsb2FkUGFyYW1zLCBlbWl0RXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlTGF6eUxvYWQoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCkge1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnQgPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gZnJvbVRhYmxlTG9hZFRvRGF0YUxpc3RQYXJhbXMoZXZlbnQpO1xuXG4gICAgICAgIGlmICh0aGlzLnVzZVF1ZXJ5UGFyYW1zKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgaXMgbmVjZXNzYXJ5OiBmcm9tIHNvbWUgcmVhc29uLCBwcmltZU5HIGNvbW1pdHMgb25lIGxhc3QgbGF6eSBsb2FkIGV2ZW50IHdoZW5ldmVyIGFueSBhbmd1bGFyIHJvdXRlciBuYXZpZ2F0aW9uIG9jY3Vyc1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBkYXRhTGlzdFBhcmFtc1RvVXJsUXVlcnkocGFyYW1zLCB0aGlzLmRlZmF1bHRQYXJhbXMoKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtc1dpdGhEZWZhdWx0cyA9IG1lcmdlRGF0YUxpc3RQYXJhbXNXaXRoRGVmYXVsdHMocGFyYW1zLCB0aGlzLmRlZmF1bHRQYXJhbXMoKSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5jb21wYXJlV2l0aEN1cnJlbnRQYXJhbXMocGFyYW1zV2l0aERlZmF1bHRzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKHBhcmFtc1dpdGhEZWZhdWx0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocGFyYW1zV2l0aERlZmF1bHRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkNlbGxDbGljayhldmVudDogRXZlbnQsIGNvbDogQ29sdW1uRGVzY3JpcHRvcjxhbnksIEl0ZW0+LCBpdGVtOiBJdGVtLCBpZHg6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuaXNDZWxsQ2xpY2tFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZUV2ZW50OiBUYWJsZUNlbGxDbGlja0V2ZW50PEl0ZW0+ID0ge1xuICAgICAgICAgICAgY29sdW1uOiBjb2wsXG4gICAgICAgICAgICByb3dJdGVtOiBpdGVtLFxuICAgICAgICAgICAgcm93SW5kZXg6IGlkeCxcbiAgICAgICAgICAgIGV2ZW50OiBldmVudFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNlbGxDbGlja1N1YmplY3QubmV4dCh0YWJsZUV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IEFycmF5PEl0ZW0+KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJvd1Jlb3JkZXIoZXZlbnQ6IFRhYmxlUm93UmVvcmRlckV2ZW50KSB7XG4gICAgICAgIHRoaXMucm93UmVvcmRlci5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgaXMgY2FsbGVkIG9uIGNvbHVtbiByZXNpemVcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBldmVudCdzIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgb25UYWJsZUNvbHVtblJlc2l6ZSh7ZWxlbWVudH06IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZElkOiBzdHJpbmcgPSBlbGVtZW50LmlkO1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcblxuICAgICAgICBjb25zdCBsYXlvdXRQcmVmcyA9IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2x1bW5zKCkuZmluZChlbCA9PiBlbC5kZXNjcmlwdG9yLnByb3BlcnR5ID09PSBmaWVsZElkKTtcbiAgICAgICAgaWYgKGNvbCkgY29sLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGlmICghbGF5b3V0UHJlZnMuY29sdW1uV2lkdGhzKSBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHMgPSB7fTtcblxuICAgICAgICBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHNbZmllbGRJZF0gPSB3aWR0aDtcbiAgICAgICAgdGhpcy5zYXZlTGF5b3V0UHJlZmVyZW5jZXMobGF5b3V0UHJlZnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihwYXJhbXNXaXRoRGVmYXVsdHM6IERhdGFMaXN0UGFyYW1zLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IHRoaXMuZGF0YVByb3ZpZGVyKCk7XG4gICAgICAgIGlmICghZGF0YVByb3ZpZGVyIHx8IHBhcmFtc1dpdGhEZWZhdWx0cy5saW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmxhdGVzdFBhcmFtc1dpdGhEZWZhdWx0cyA9IHBhcmFtc1dpdGhEZWZhdWx0cztcblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlclN1YnNjcmlwdGlvbiA9IGNvbW1vbnNUb09ic2VydmFibGUoXG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIuZ2V0QWxsKFxuICAgICAgICAgICAgICAgIHBhcmFtc1dpdGhEZWZhdWx0cyBhcyBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4sXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlKCksXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yKCkuaXNMb2NhbGl6ZWQgPyB0aGlzLmNvbW1vbnMuYXBwRGF0YUxvY2FsZSgpID8/IHVuZGVmaW5lZCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgKVxuICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3JJbnB1dCA9IHRoaXMuZGVzY3JpcHRvcklucHV0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JJbnB1dCBpbnN0YW5jZW9mIFRhYmxlRHluYW1pY0Rlc2NyaXB0b3JJbnN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvci5zZXQoZGVzY3JpcHRvcklucHV0LnRvVGFibGVEZXNjcmlwdG9yRnJvbURhdGEocmVzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnNldERhdGEocmVzPy5kYXRhID8/IFtdLCByZXM/LnRvdGFsQ291bnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0YWJsZU5vdGlmaWNhdGlvbkVycm9yKHRoaXMudHJhbnNsYXRlLCB0aGlzLmRlc2NyaXB0b3IoKSwgZXJyLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5zZXREYXRhKFtdKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5sb2FkaW5nLnNldChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGZyb21TdWJzY3JpYmVFcnJvcihlcnIsICdUYWJsZUNvbXBvbmVudEVycm9yJywge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtOiBwYXJhbXNXaXRoRGVmYXVsdHNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coZXJyb3IsIGdldEVycm9yTG9nTGV2ZWwoZXJyb3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgdGFibGVFdmVudDogVGFibGVMb2FkRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50LFxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zV2l0aERlZmF1bHRzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy50YWJsZUxvYWQuZW1pdCh0YWJsZUV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlRnJvbVJvdXRlVXBkYXRlKHVybFBhcmFtczogUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtc1dpdGhEZWZhdWx0cyA9IG1lcmdlRGF0YUxpc3RQYXJhbXNXaXRoRGVmYXVsdHMoZnJvbVVybFF1ZXJ5VG9EYXRhTGlzdFBhcmFtcyh1cmxQYXJhbXMsIHRydWUpLCB0aGlzLmRlZmF1bHRQYXJhbXMoKSk7XG4gICAgICAgIHRoaXMudXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKHBhcmFtc1dpdGhEZWZhdWx0cyk7XG4gICAgICAgIGlmICghdGhpcy51c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkKCkgJiYgcGFyYW1zV2l0aERlZmF1bHRzPy5zZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsU2VhcmNoUGFyYW1Gcm9tVXJsLnNldCh7dmFsdWU6IHBhcmFtc1dpdGhEZWZhdWx0cz8uc2VhcmNoLCBjYXNlU2Vuc2l0aXZlOiBwYXJhbXNXaXRoRGVmYXVsdHMuZmlsdGVycz8uWydnbG9iYWwnXT8uY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZX0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihwYXJhbXNXaXRoRGVmYXVsdHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKHBhcmFtc1dpdGhEZWZhdWx0czogRGF0YUxpc3RQYXJhbXMpIHtcbiAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2Uuc29ydE1ldGEuc2V0KHRoaXMuY3JlYXRlU29ydE1ldGEocGFyYW1zV2l0aERlZmF1bHRzKSk7XG4gICAgICAgIHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmZpbHRlck1ldGEuc2V0KHRoaXMuY3JlYXRlRmlsdGVyTWV0YShwYXJhbXNXaXRoRGVmYXVsdHMpKTtcbiAgICAgICAgdGhpcy5kYXRhTGlzdFNlcnZpY2Uucm93cy5zZXQocGFyYW1zV2l0aERlZmF1bHRzPy5saW1pdCA/PyB0aGlzLmRhdGFMaXN0U2VydmljZS5yb3dzKCkpO1xuICAgICAgICB0aGlzLmRhdGFMaXN0U2VydmljZS5vZmZzZXQuc2V0KHBhcmFtc1dpdGhEZWZhdWx0cz8ub2Zmc2V0ID8/IDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRmlsdGVyTWV0YShwYXJhbXNXaXRoRGVmYXVsdHM/OiBEYXRhTGlzdFBhcmFtcykge1xuICAgICAgICBjb25zdCBwcmltZUZpbHRlck1ldGE6IHtbczogc3RyaW5nXTogQ29tbW9uc0ZpbHRlck1ldGFkYXRhfSA9IHt9O1xuICAgICAgICAvLyBpZiBhbnkgZmlsdGVyIGlzIHByZXNlbnQsIG5vIGRlZmF1bHQgZmlsdGVycyBzaG91bGQgYmUgYXBwbGllZCFcbiAgICAgICAgaWYgKHBhcmFtc1dpdGhEZWZhdWx0cz8uZmlsdGVycykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocGFyYW1zV2l0aERlZmF1bHRzLmZpbHRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtrZXldID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWU/LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IHZhbHVlPy5tYXRjaE1vZGUsXG4gICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IHZhbHVlPy5jYXNlU2Vuc2l0aXZlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmltZUZpbHRlck1ldGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTb3J0TWV0YShwYXJhbXNXaXRoRGVmYXVsdHM/OiBEYXRhTGlzdFBhcmFtcyk6IFNvcnRNZXRhW10gfCBudWxsIHtcbiAgICAgICAgaWYgKHBhcmFtc1dpdGhEZWZhdWx0cz8uc29ydCAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkocGFyYW1zV2l0aERlZmF1bHRzPy5zb3J0KSAmJiBwYXJhbXNXaXRoRGVmYXVsdHM/LnNvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtc1dpdGhEZWZhdWx0cz8uc29ydC5tYXAoXG4gICAgICAgICAgICAgICAgcyA9PlxuICAgICAgICAgICAgICAgICAgICA8U29ydE1ldGE+e1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlcjogcy5hc2NlbmRpbmcgPyAxIDogLTFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbHVtblRvZ2dsZShldmVudDogTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCkge1xuICAgICAgICBjb25zdCBsYXlvdXRQcmVmcyA9IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gKGV2ZW50LnZhbHVlIGFzIENvbHVtbldpdGhQcmVmZXJlbmNlc1tdKS5tYXAodiA9PiB2LmRlc2NyaXB0b3IucHJvcGVydHkpO1xuICAgICAgICBsYXlvdXRQcmVmcy5jb2x1bW5IaWRkZW4gPSB0aGlzLmNvbHVtbnMoKVxuICAgICAgICAgICAgLmZpbHRlcihjID0+IHNlbGVjdGVkQ29sdW1ucy5pbmRleE9mKGMuZGVzY3JpcHRvci5wcm9wZXJ0eSkgPCAwKVxuICAgICAgICAgICAgLm1hcChjID0+IGMuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuc2F2ZUxheW91dFByZWZlcmVuY2VzKGxheW91dFByZWZzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Db2x1bW5Ub2dnbGVBbGwoKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFByZWZzID0gdGhpcy5sYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gWy4uLnRoaXMuY29sdW1ucygpXTtcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gIXRoaXMuY29sdW1ucygpLnNvbWUoYyA9PiBjLmlzVmlzaWJsZSk7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgICAgIGlmIChpc1Zpc2libGUgIT09IGNvbC5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICBjb2wuaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxheW91dFByZWZzLmNvbHVtbkhpZGRlbiA9IGNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaXNWaXNpYmxlKS5tYXAoYyA9PiBjLmRlc2NyaXB0b3IucHJvcGVydHkpO1xuICAgICAgICB0aGlzLnNhdmVMYXlvdXRQcmVmZXJlbmNlcyhsYXlvdXRQcmVmcyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29sdW1uUmVvcmRlcihldmVudDogVGFibGVDb2x1bW5SZW9yZGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRyb3BJbmRleCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmRyb3BJbmRleCA+PSAwICYmIGV2ZW50LmRyYWdJbmRleCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmRyYWdJbmRleCA+PSAwICYmIGV2ZW50LmRyb3BJbmRleCAhPT0gZXZlbnQuZHJhZ0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERyb3BJbmRleCA9IGV2ZW50LmRyb3BJbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RHJhZ0luZGV4ID0gZXZlbnQuZHJhZ0luZGV4O1xuICAgICAgICAgICAgY29uc3QgcHJldlZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zKCkuZmlsdGVyKGMgPT4gYy5pc1Zpc2libGUpO1xuICAgICAgICAgICAgY29uc3QgY29sQXREcm9wID0gcHJldlZpc2libGVDb2x1bW5zW2V2ZW50RHJvcEluZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGNvbEF0RHJhZyA9IHByZXZWaXNpYmxlQ29sdW1uc1tldmVudERyYWdJbmRleF07XG4gICAgICAgICAgICBjb25zdCBjb2xBdERyb3BJbmRleCA9IHRoaXMuY29sdW1ucygpLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gY29sQXREcm9wLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbEF0RHJhZ0luZGV4ID0gdGhpcy5jb2x1bW5zKCkuZmluZEluZGV4KGVsID0+IGVsLmlkID09PSBjb2xBdERyYWcuaWQpO1xuXG4gICAgICAgICAgICBpZiAoY29sQXREcm9wSW5kZXggPiAtMSAmJiBjb2xBdERyYWdJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zKCldO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMuc3BsaWNlKGNvbEF0RHJhZ0luZGV4LCAxKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkcm9wSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gY29sQXREcm9wLmlkKSArIChldmVudERyb3BJbmRleCA+IGV2ZW50RHJhZ0luZGV4ID8gMSA6IDApO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBbLi4uY29sdW1ucy5zbGljZSgwLCBkcm9wSW5kZXgpLCBjb2xBdERyYWcsIC4uLmNvbHVtbnMuc2xpY2UoZHJvcEluZGV4KV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0UHJlZnMgPSB0aGlzLmxheW91dFByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgICAgICAgbGF5b3V0UHJlZnMuY29sdW1uT3JkZXIgPSBjb2x1bW5zLm1hcChlbCA9PiBlbC5kZXNjcmlwdG9yLnByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVMYXlvdXRQcmVmZXJlbmNlcyhsYXlvdXRQcmVmcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNhdmVMYXlvdXRQcmVmZXJlbmNlcyhsYXlvdXRQcmVmczogVGFibGVMYXlvdXRQcmVmZXJlbmNlcykge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmxvY2Fsc3RvcmFnZUtleSgpO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0odGhpcy5jbXBUeXBlTmFtZSwga2V5LCBsYXlvdXRQcmVmcyk7XG4gICAgICAgICAgICB0aGlzLmxheW91dFByZWZzU2F2ZUNudC51cGRhdGUodiA9PiB2ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVEZWZhdWx0RGF0YUxpc3RQYXJhbXMoKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtczogRGF0YUxpc3RQYXJhbXMgPSB7XG4gICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICBsaW1pdDogdGhpcy5kYXRhTGlzdFNlcnZpY2Uucm93c1BlclBhZ2VPcHRpb25zKClbMF0sXG4gICAgICAgICAgICBzb3J0OiB0aGlzLmRlc2NyaXB0b3IoKVxuICAgICAgICAgICAgICAgIC5zb3J0cy5maWx0ZXIocyA9PiBzLmRlZmF1bHRJc0VuYWJsZWQpXG4gICAgICAgICAgICAgICAgLnNvcnQoKHMxLCBzMikgPT4gKHMxLmRlZmF1bHRPcmRlciA/PyAxMDAwKSAtIChzMi5kZWZhdWx0T3JkZXIgPz8gMTAwMCkpXG4gICAgICAgICAgICAgICAgLm1hcChzID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBzLnByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICBhc2NlbmRpbmc6IHMuZGVmYXVsdElzQXNjZW5kaW5nXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgZmlsdGVyczoge31cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmZpbHRlckRlc2NyaXB0b3JzKClcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkLmhhc0RlZmF1bHRWYWx1ZSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaE1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGYuZGVmYXVsdE1hdGNoTW9kZTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGYuZmlsdGVyVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlLkNvbnRhaW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5Mb29rdXA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb29rdXBGaWx0ZXIgPSBmIGFzIEZpbHRlckxvb2t1cERlc2NyaXB0b3I8YW55LCBJdGVtPjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9va3VwRmlsdGVyLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5JbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5FcXVhbHM7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGYubWF0Y2hNb2RlcyAmJiAhZi5tYXRjaE1vZGVzPy5pbmNsdWRlcyhtYXRjaE1vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IGYubWF0Y2hNb2Rlc1swXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWU6IGFueSB8IGFueVtdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFsuLi52YWx1ZV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IGYucHJvcGVydHk7XG4gICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMhW3Byb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IG1hdGNoTW9kZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29tcHV0ZUNvbHVtbnNXaXRoTGF5b3V0KCkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yKCk7XG4gICAgICAgIGNvbnN0IGxheW91dFByZWZzID0gdGhpcy5sYXlvdXRQcmVmZXJlbmNlcygpO1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgY29sdW1ucyB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgY29sdW1uczogQ29sdW1uV2l0aFByZWZlcmVuY2VzW10gPSBkZXNjcmlwdG9yLmNvbHVtbnMubWFwKGNvbCA9PiAoe1xuICAgICAgICAgICAgaWQ6IGAke2NvbC5wcm9wZXJ0eX0tJHt0aW1lc3RhbXB9YCxcbiAgICAgICAgICAgIGRlc2NyaXB0b3I6IGNvbCxcbiAgICAgICAgICAgIGZpbHRlcjogZGVzY3JpcHRvci5maWx0ZXJzLmZpbmQoXG4gICAgICAgICAgICAgICAgZiA9PlxuICAgICAgICAgICAgICAgICAgICBmLnNob3dPbkNvbHVtbiA9PT0gY29sLnByb3BlcnR5ICYmXG4gICAgICAgICAgICAgICAgICAgICgoZi5kaXNwbGF5VHlwZSA9PSBudWxsICYmIHRoaXMuZGVmYXVsdEZpbHRlckRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uQ29sdW1uKSB8fCBmLmRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uQ29sdW1uKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHNvcnQ6IGRlc2NyaXB0b3Iuc29ydHMuZmluZChmID0+IGYuc2hvd09uQ29sdW1uID09PSBjb2wucHJvcGVydHkpLFxuICAgICAgICAgICAgZGlzYWJsZWQ6ICFjb2wuaXNUb2dnbGVhYmxlLFxuICAgICAgICAgICAgaXNWaXNpYmxlOiBsYXlvdXRQcmVmcy5jb2x1bW5IaWRkZW4gPyAhbGF5b3V0UHJlZnMuY29sdW1uSGlkZGVuLmluY2x1ZGVzKGNvbC5wcm9wZXJ0eSkgOiBjb2wuaXNWaXNpYmxlLFxuICAgICAgICAgICAgd2lkdGg6IGxheW91dFByZWZzLmNvbHVtbldpZHRocz8uW2NvbC5wcm9wZXJ0eV1cbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChsYXlvdXRQcmVmcy5jb2x1bW5PcmRlcikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXlvdXRQcmVmcy5jb2x1bW5PcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbE5hbWUgPSBsYXlvdXRQcmVmcy5jb2x1bW5PcmRlcltpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xXaXRoUHJlZnMgPSBjb2x1bW5zLmZpbmQoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSA9PT0gY29sTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbFdpdGhQcmVmcykge1xuICAgICAgICAgICAgICAgICAgICBjb2xXaXRoUHJlZnMub3JkZXJJZHggPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLm9yZGVySWR4ICE9PSB1bmRlZmluZWQgJiYgYi5vcmRlcklkeCAhPT0gdW5kZWZpbmVkID8gYS5vcmRlcklkeCAtIGIub3JkZXJJZHggOiAwKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgY29sdW1uIG9yZGVyIGFuZCBjb2x1bW4gdmlzaWJpbGl0eSB0byBkZWZhdWx0IHNldHRpbmdzXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0RGVmYXVsdExheW91dCgpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sb2NhbHN0b3JhZ2VLZXkoKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMuY21wVHlwZU5hbWUsIGtleSk7XG4gICAgICAgICAgICB0aGlzLmxheW91dFByZWZzU2F2ZUNudC51cGRhdGUodiA9PiB2ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIHRoZSBnaXZlbiBwYXJhbXMgd2l0aCB0aGUgc3RvcmVkIHBhcmFtcyBpbiB0aGUgRGF0YUxpc3RTZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc30gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBjb21wYXJlIHdpdGggdGhlIHN0b3JlZCBwYXJhbXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtIFRydWUgaWYgdGhlIGdpdmVuIHBhcmFtcyBtYXRjaCB0aGUgc3RvcmVkIHBhcmFtcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29tcGFyZVdpdGhDdXJyZW50UGFyYW1zKHBhcmFtczogRGF0YUxpc3RQYXJhbXMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBhcmFtcy5vZmZzZXQgPT09IHRoaXMuZGF0YUxpc3RTZXJ2aWNlLm9mZnNldCgpICYmXG4gICAgICAgICAgICBwYXJhbXMubGltaXQgPT09IHRoaXMuZGF0YUxpc3RTZXJ2aWNlLnJvd3MoKSAmJlxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5jcmVhdGVTb3J0TWV0YShwYXJhbXMpKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhTGlzdFNlcnZpY2Uuc29ydE1ldGEoKSkgJiZcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuY3JlYXRlRmlsdGVyTWV0YShwYXJhbXMpKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhTGlzdFNlcnZpY2UuZmlsdGVyTWV0YSgpKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxkaXY+XG4gICAgPCEtLSBNVVNUIE5PVCB1c2Ugb2JzZXJ2YWJsZSBmb3IgdmFsdWUgd2hlbiB1c2luZyB2aXJ0dWFsIHNjcm9sbCAtIGRvZXMgbm90IHdvcmsgZm9yIHNvbWUgcmVhc29uIC0tPlxuICAgIEBpZiAoIXVzZVF1ZXJ5UGFyYW1zKCkgfHwgdXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZCgpKSB7XG4gICAgICAgIDxwLXRhYmxlXG4gICAgICAgICAgICBbdmFsdWVdPVwiZGF0YUxpc3RTZXJ2aWNlLmRhdGEoKVwiXG4gICAgICAgICAgICBbZGF0YUtleV09XCJkZXNjcmlwdG9yKCkudHJhY2tQcm9wZXJ0eVwiXG4gICAgICAgICAgICBbbGF6eV09XCJpc0xhenkoKVwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCJkYXRhTGlzdFNlcnZpY2UubG9hZGluZygpXCJcbiAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwiaXNQYWdpbmF0aW9uKClcIlxuICAgICAgICAgICAgW3Jvd3NdPVwiZGF0YUxpc3RTZXJ2aWNlLnJvd3MoKVwiXG4gICAgICAgICAgICBbZmlyc3RdPVwiZGF0YUxpc3RTZXJ2aWNlLm9mZnNldCgpXCJcbiAgICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiZGF0YUxpc3RTZXJ2aWNlLmNvdW50KClcIlxuICAgICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJkYXRhTGlzdFNlcnZpY2Uucm93c1BlclBhZ2VPcHRpb25zKClcIlxuICAgICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlXT1cIidtbmdUYWJsZS5wYWdpbmF0aW9uTXNnJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbbXVsdGlTb3J0TWV0YV09XCJkYXRhTGlzdFNlcnZpY2Uuc29ydE1ldGEoKVwiXG4gICAgICAgICAgICBbZmlsdGVyc109XCJkYXRhTGlzdFNlcnZpY2UuZmlsdGVyTWV0YSgpXCJcbiAgICAgICAgICAgIFtnbG9iYWxGaWx0ZXJGaWVsZHNdPVwiZGF0YUxpc3RTZXJ2aWNlLmdsb2JhbEZpbHRlckZpZWxkcygpXCJcbiAgICAgICAgICAgIHNvcnRNb2RlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJbXVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uRW5hYmxlZCgpID8gc2VsZWN0aW9uTW9kZSgpIDogbnVsbFwiXG4gICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICAgICAgW3Jvd0hvdmVyXT1cImRlc2NyaXB0b3IoKS5oYXNIb3ZlclwiXG4gICAgICAgICAgICBbc3R5bGVDbGFzc109XCJjbGFzc05hbWUoKVwiXG4gICAgICAgICAgICBbcmVzaXphYmxlQ29sdW1uc109XCJkZXNjcmlwdG9yKCkuaGFzUmVzaXphYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICBbY29sdW1uUmVzaXplTW9kZV09XCJkZXNjcmlwdG9yKCkuY29sdW1uUmVzaXplTW9kZSA/PyAnZXhwYW5kJ1wiXG4gICAgICAgICAgICBbcmVvcmRlcmFibGVDb2x1bW5zXT1cImFyZUNvbHVtbnNSZW9yZGVyYWJsZSgpXCJcbiAgICAgICAgICAgIHBhZ2luYXRvckRyb3Bkb3duQXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5zKClcIlxuICAgICAgICAgICAgKG9uQ29sUmVzaXplKT1cIm9uVGFibGVDb2x1bW5SZXNpemUoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Db2xSZW9yZGVyKT1cIm9uQ29sdW1uUmVvcmRlcigkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkxhenlMb2FkKT1cIm9uVGFibGVMYXp5TG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd1Jlb3JkZXIpPVwib25Sb3dSZW9yZGVyKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgQGlmIChpc0NhcHRpb25WaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChvdmVybGF5V2l0aFRhZ0ZpbHRlcnMoKS5sZW5ndGggPiAwIHx8IGRlc2NyaXB0b3IoKS5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWZpbHRlci1vdmVybGF5LXdpdGgtdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJkZXNjcmlwdG9yKCkudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVzY3JpcHRvcnNdPVwib3ZlcmxheVdpdGhUYWdGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZWxdPVwiZGVzY3JpcHRvcigpLm1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZVNlYXJjaF09XCJkZXNjcmlwdG9yKCkuc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaF09XCJnbG9iYWxTZWFyY2hQYXJhbUZyb21VcmwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hMaW1pdFdvcmRNYXhdPVwiZGVzY3JpcHRvcigpLnNlYXJjaExpbWl0TWF4V29yZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlQ2FzZVNlbnNpdGl2ZV09XCJpc0xhenkoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc1RpdGxlRGlzcGxheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbW5nVGVtcGxhdGU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGVPckNvbXBvbmVudE9yVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21uZy1maWx0ZXItb3ZlcmxheS13aXRoLXRhZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGVPckNvbXBvbmVudE9yVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2FwdGlvblRlbXBsYXRlT3JDb21wb25lbnRPclRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2FwdGlvblRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcHRpb25UZW1wbGF0ZSgpXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY2FwdGlvbkNvbXBvbmVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW21uZ0NvbXBvbmVudF09XCJjYXB0aW9uQ29tcG9uZW50KClcIiAoaW5zdGFuY2VDcmVhdGVkKT1cImNhcHRpb25Db21wb25lbnRJbnN0YW5jZS5lbWl0KCRldmVudClcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChkZXNjcmlwdG9yKCkudGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwicC0wIG0tMFwiPnt7IGRlc2NyaXB0b3IoKS50aXRsZSEgfCB0cmFuc2xhdGUgfX08L2g1PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgQGlmICghZGVzY3JpcHRvcigpLmhpZGVIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwibW5nLXRhYmxlLWhlYWRlclwiIFtjbGFzc109XCJkZXNjcmlwdG9yKCkuaGVhZGVyQ2xhc3NOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJkZXNjcmlwdG9yKCkuc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3IoKS5zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJ0cnVlXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm93UmVvcmRlckVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgdmlzaWJsZUNvbHVtbnMoKTsgdHJhY2sgY29sLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzb3J0YWJsZUNvbHVtblRIVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLmRlc2NyaXB0b3IudGl0bGUgPz8gKGNvbC5kZXNjcmlwdG9yLnByb3BlcnR5IHwgbW5nSTE4blByb3BlcnR5OiBkZXNjcmlwdG9yKCkubW9kZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub25Tb3J0YWJsZUNvbHVtblRIVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbC5kZXNjcmlwdG9yLnRpdGxlID8/IChjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eSB8IG1uZ0kxOG5Qcm9wZXJ0eTogZGVzY3JpcHRvcigpLm1vZGVsKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuZGVzY3JpcHRvci5pc1Jlb3JkZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlc2l6YWJsZUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlb3JkZXJhYmxlQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wuc29ydD8ucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cIiFjb2wuc29ydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoID8gY29sLndpZHRoICsgJ3B4JyA6IGNvbC5kZXNjcmlwdG9yLndpZHRoICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLndpZHRoID8gbnVsbCA6IGNvbC5kZXNjcmlwdG9yLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sLndpZHRoID8/IGNvbC5kZXNjcmlwdG9yLm1heFdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wuZGVzY3JpcHRvci5oZWFkZXJDbGFzc05hbWUgfCBtbmdUYWJsZUNvbHVtbkZpbHRlckNsYXNzOiBjb2wuZmlsdGVyIDogaGFzQ29sdW1uRmlsdGVycygpICYmICFjb2wud2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2wuc29ydCA/IHNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZSA6IG5vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5zb3J0Py5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiIWNvbC5zb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggPyBjb2wud2lkdGggKyAncHgnIDogY29sLmRlc2NyaXB0b3Iud2lkdGggKyAnJSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wud2lkdGggPyBudWxsIDogY29sLmRlc2NyaXB0b3IubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5kZXNjcmlwdG9yLmhlYWRlckNsYXNzTmFtZSB8IG1uZ1RhYmxlQ29sdW1uRmlsdGVyQ2xhc3M6IGNvbC5maWx0ZXIgOiBoYXNDb2x1bW5GaWx0ZXJzKCkgJiYgIWNvbC53aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbC5zb3J0ID8gc29ydGFibGVDb2x1bW5USFRlbXBsYXRlIDogbm9uU29ydGFibGVDb2x1bW5USFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNMYXN0Q29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5MYXN0TWluV2lkdGgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJkZXNjcmlwdG9yKCkuYWN0aW9uQ29sdW1uRnJvemVuID8/IGFyZUNvbHVtbnNUb2dnbGVhYmxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkZyb3plbj1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2x1bW4tY3VzdG9tLWxhc3QgdGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGFyZUNvbHVtbnNUb2dnbGVhYmxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbHVtblRvZ2dsZU11bHRpc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXByaW1hcnkgbW5nLXRhYmxlLWNvbHVtbnMtbXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25JY29uPVwicGkgcGktc2xpZGVycy1oXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW5zKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInZpc2libGVDb2x1bW5zKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCInbW5nVGFibGUuYWRqdXN0VGFibGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVNlbGVjdGVkTGFiZWxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNvbHVtblRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jaGVja2JveCBwLWNvbXBvbmVudCBtbC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1oaWRkZW4tYWNjZXNzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3Qub25IZWFkZXJDaGVja2JveEZvY3VzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5vbkhlYWRlckNoZWNrYm94Qmx1cigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3Qub25Ub2dnbGVBbGwoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtY2hlY2tib3gtYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5hbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncC1oaWdobGlnaHQnOiBhbnlDb2x1bW5WaXNpYmxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Db2x1bW5Ub2dnbGVBbGwoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jaGVja2JveC1pY29uXCIgW25nQ2xhc3NdPVwieydwaSBwaS1jaGVjayc6IGFueUNvbHVtblZpc2libGUoKX1cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXJlcGxheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCInbW5nVGFibGUucmVzZXRMYXlvdXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RGVmYXVsdExheW91dCgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGVzY3JpcHRvci50aXRsZSA/PyAoaXRlbS5kZXNjcmlwdG9yLnByb3BlcnR5IHwgbW5nSTE4blByb3BlcnR5OiBkZXNjcmlwdG9yKCkubW9kZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoaGFzQ29sdW1uRmlsdGVycygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSBuZWVkIHRoZSBsaW5lIGJlbG93LCBiZWNhdXNlIG90aGVyd2lzZSBwLXRhYmxlUmFkaW9CdXR0b24gc2hpZnRzIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zIGluIHRhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcigpLnNlbGVjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm93UmVvcmRlckVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGRlc2NyaXB0b3IoKS5yb3dFeHBhbmRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiB2aXNpYmxlQ29sdW1ucygpOyB0cmFjayBjb2wuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5maWx0ZXI/LmNvbHVtbkNsYXNzTmFtZSB8IG1uZ1RhYmxlQ29sdW1uRmlsdGVyQ2xhc3M6IGNvbC5maWx0ZXIgOiBoYXNDb2x1bW5GaWx0ZXJzKCkgJiYgIWNvbC53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2wud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJjb2wud2lkdGggPyBudWxsIDogY29sLmZpbHRlcj8uY29sdW1uV2lkdGggPz8gY29sLmRlc2NyaXB0b3Iud2lkdGggPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLndpZHRoID8gbnVsbCA6IGNvbC5maWx0ZXI/LmNvbHVtbk1pbldpZHRoID8/IGNvbC5kZXNjcmlwdG9yLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLXRhYmxlLWNvbHVtbi1maWx0ZXIgW2Rlc2NyaXB0b3JdPVwiY29sLmZpbHRlclwiPjwvbW5nLXRhYmxlLWNvbHVtbi1maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNMYXN0Q29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjb2x1bW4tY3VzdG9tLWxhc3RcIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkxhc3RNaW5XaWR0aCgpXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtaXRlbSBsZXQtaWR4PVwicm93SW5kZXhcIiBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICBbcFJlb3JkZXJhYmxlUm93XT1cImlkeFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRlc2NyaXB0b3IoKS5yb3dDbGFzc05hbWUgfCBtbmdDbGFzc01hcDogZGVzY3JpcHRvcigpLnJvd0NsYXNzTmFtZU1hcEZuIDogaXRlbSB8IG1uZ0xvY2FsZURlZmF1bHRSb3dDbGFzczogZGVzY3JpcHRvcigpIDogaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25Nb2RlKCkgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcigpLnNlbGVjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVDaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3IoKS5zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC10YWJsZVJhZGlvQnV0dG9uIFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlUmFkaW9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGRlc2NyaXB0b3IoKS5yb3dFeHBhbmRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGVQcm9wZXJ0eSB8fCBpdGVtW2Rlc2NyaXB0b3IoKS5yb3dFeHBhbmRhYmxlUHJvcGVydHkhXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwUm93VG9nZ2xlcl09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXBsYWluIG1uZy10YWJsZS1yb3ctZXhwYW5kLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJleHBhbmRlZCA/ICdwaSBwaS1jaGV2cm9uLWRvd24nIDogJ3BpIHBpLWNoZXZyb24tcmlnaHQnXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKHJvd1Jlb3JkZXJFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpIHBpLWJhcnNcIiBwUmVvcmRlcmFibGVSb3dIYW5kbGU+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgdmlzaWJsZUNvbHVtbnMoKTsgdHJhY2sgY29sLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DZWxsQ2xpY2soJGV2ZW50LCBjb2wuZGVzY3JpcHRvciwgaXRlbSwgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuZGVzY3JpcHRvci5jbGFzc05hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW5nQ2xhc3NNYXA6IGNvbC5kZXNjcmlwdG9yLmNsYXNzTmFtZU1hcEZuIDogaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbmdUYWJsZUNvbHVtbkZpbHRlckNsYXNzOiBjb2wuZmlsdGVyIDogaGFzQ29sdW1uRmlsdGVycygpICYmICFjb2wud2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jbGlja2FibGVdPVwiaXNDZWxsQ2xpY2tFbmFibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggPyBjb2wud2lkdGggKyAncHgnIDogY29sLmRlc2NyaXB0b3Iud2lkdGggKyAnJSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLndpZHRoID8gbnVsbCA6IGNvbC5kZXNjcmlwdG9yLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC53aWR0aCA/PyBjb2wuZGVzY3JpcHRvci5tYXhXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wuZGVzY3JpcHRvci50aXRsZSA/PyAoY29sLmRlc2NyaXB0b3IucHJvcGVydHkgfCBtbmdJMThuUHJvcGVydHk6IGRlc2NyaXB0b3IoKS5tb2RlbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tdmFsdWUgW2Rlc2NyaXB0b3JdPVwiY29sLmRlc2NyaXB0b3JcIiBbaXRlbV09XCJpdGVtXCI+PC9tbmctdGFibGUtY29sdW1uLXZhbHVlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc0xhc3RDb2x1bW4oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2x1bW4tY3VzdG9tLWxhc3QganVzdGlmeS1jb250ZW50LWVuZCB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkxhc3RNaW5XaWR0aCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJkZXNjcmlwdG9yKCkuYWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduRnJvemVuPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbHVtbkN1c3RvbUxhc3RUZW1wbGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW5DdXN0b21MYXN0VGVtcGxhdGUoKTsgY29udGV4dDoge3Jvd0l0ZW06IGl0ZW0sIHJvd0luZGV4OiBpZHh9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sdW1uQ3VzdG9tTGFzdENvbXBvbmVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW21uZ0NvbXBvbmVudF09XCJjb2x1bW5DdXN0b21MYXN0Q29tcG9uZW50KClcIiAoaW5zdGFuY2VDcmVhdGVkKT1cImNvbHVtbkN1c3RvbUxhc3RDb21wb25lbnRJbnN0YW5jZS5lbWl0KCRldmVudClcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicm93ZXhwYW5zaW9uXCIgbGV0LWl0ZW0+XG4gICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBbY29sU3Bhbl09XCJkZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZUNvbFNwYW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGRlc2NyaXB0b3IoKS5yb3dFeHBhbmRhYmxlQ29tcG9uZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW21uZ0NvbXBvbmVudF09XCJkZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGVcIiBbaW5wdXRzXT1cIntpdGVtfVwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0V4cGFuZFRlbXBsYXRlKCk7IGNvbnRleHQ6IHtyb3dJdGVtOiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJsb2FkaW5naWNvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGRlc2NyaXB0b3IoKS5sb2FkaW5nSWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIid0ZXh0LXdoaXRlIHRleHQtNHhsIHBpLXNwaW4gJyArIGRlc2NyaXB0b3IoKS5sb2FkaW5nSWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGRlc2NyaXB0b3IoKS5sb2FkaW5nVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgdGV4dC13aGl0ZSB0ZXh0LWxnIGZvbnQtc2VtaWJvbGRcIiBbbmdDbGFzc109XCJ7J210LTMnOiBkZXNjcmlwdG9yKCkubG9hZGluZ0ljb259XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGVzY3JpcHRvcigpLmxvYWRpbmdUZXh0ID8/ICcnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJsb2FkaW5nYm9keVwiPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiY29sdW1uc0NvbHNwYW4oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctdGV4dFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gW25nU3R5bGVdPVwie3dpZHRoOiAnMTAwJSd9XCI+PC9wLXNrZWxldG9uPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiY29sdW1uc0NvbHNwYW4oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ21uZ1RhYmxlLm5vSXRlbXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICBAaWYgKGZvb3RlclRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic3VtbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyVGVtcGxhdGUoKTsgY29udGV4dDoge2RhdGE6IGRhdGFMaXN0U2VydmljZS5kYXRhKCksIHRvdGFsQ291bnQ6IGRhdGFMaXN0U2VydmljZS5jb3VudCgpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICB9XG48L2Rpdj5cbiJdfQ==