@porscheinformatik/material-addons 18.0.0 → 18.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +3 -5
  2. package/esm2022/lib/alert/alert-configuration.mjs +12 -0
  3. package/esm2022/lib/alert/alert.component.mjs +20 -15
  4. package/esm2022/lib/alert/alert.mjs +3 -0
  5. package/esm2022/lib/data-table/data-table.component.mjs +3 -3
  6. package/esm2022/lib/data-table/util/data-table-sort-util.mjs +4 -3
  7. package/esm2022/lib/layout/sidebar-layout/sidebar-layout.component.mjs +3 -3
  8. package/esm2022/lib/layout/toolbar/toolbar.component.mjs +3 -3
  9. package/esm2022/lib/quick-list/quick-list-compact/quick-list-compact.component.mjs +3 -10
  10. package/esm2022/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.mjs +2 -9
  11. package/esm2022/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.mjs +3 -10
  12. package/esm2022/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.mjs +4 -4
  13. package/esm2022/public_api.mjs +2 -2
  14. package/fesm2022/porscheinformatik-material-addons.mjs +45 -50
  15. package/fesm2022/porscheinformatik-material-addons.mjs.map +1 -1
  16. package/lib/alert/alert-configuration.d.ts +9 -0
  17. package/lib/alert/alert-configuration.d.ts.map +1 -0
  18. package/lib/alert/alert.component.d.ts +3 -0
  19. package/lib/alert/alert.component.d.ts.map +1 -1
  20. package/lib/alert/alert.d.ts +3 -0
  21. package/lib/alert/alert.d.ts.map +1 -0
  22. package/lib/data-table/util/data-table-sort-util.d.ts.map +1 -1
  23. package/lib/quick-list/quick-list-compact/quick-list-compact.component.d.ts.map +1 -1
  24. package/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.d.ts.map +1 -1
  25. package/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.d.ts.map +1 -1
  26. package/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.d.ts.map +1 -1
  27. package/package.json +2 -2
  28. package/public_api.d.ts +1 -1
  29. package/public_api.d.ts.map +1 -1
  30. package/themes/carcat.scss +9 -0
  31. package/themes/common/styles.scss +1 -1
@@ -591,7 +591,7 @@ export class DataTableComponent {
591
591
  });
592
592
  }
593
593
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: DataTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MatDialog }, { token: MAD_DATA_TABLE_PERSISTENCE_SERVICE }, { token: MAD_DATA_TABLE_GLOBAL_CONFIGURATION }], target: i0.ɵɵFactoryTarget.Component }); }
594
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: DataTableComponent, isStandalone: true, selector: "mad-data-table", inputs: { id: "id", filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", showEmptyTable: "showEmptyTable", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", translateLabels: "translateLabels", useAsync: "useAsync", stateful: "stateful", persistenceConfig: "persistenceConfig", loading: "loading", tableData: "tableData", idGenerator: "idGenerator", parentIdGenerator: "parentIdGenerator", defaultSort: "defaultSort", externalFilter: "externalFilter", paginationEnabled: "paginationEnabled", page: "page", pageSizeOptions: "pageSizeOptions", actions: "actions", selectionEmitType: "selectionEmitType", showDeleteFilterAction: "showDeleteFilterAction", disableRowClick: "disableRowClick", deleteDefinitionAllowed: "deleteDefinitionAllowed", selection: "selection", filterEnabled: "filterEnabled", filterMode: "filterMode", filterValue: "filterValue", externalPaginator: "externalPaginator", defaultPageSize: "defaultPageSize", selectionEmitMode: "selectionEmitMode", forceMode: "forceMode", forceSelectionMode: "forceSelectionMode", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", columnDefinitions: "columnDefinitions", allColumns: "allColumns" }, outputs: { actionEvent: "actionEvent", selectionEvent: "selectionEvent", sortEvent: "sortEvent", filterEvent: "filterEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, providers: [DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER], queries: [{ propertyName: "expandableDef", first: true, predicate: DataTableTemplateExpandableCellDefinition, descendants: true }, { propertyName: "columnDefs", predicate: DataTableTemplateColumnDefinition }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true }, { propertyName: "filter", first: true, predicate: DataTableFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div data-cy=\"table-action-bar\" class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length || (filterMode === 'COLUMN_BASED' && showDeleteFilterAction)\">\n <mad-button-group *ngFor=\"let actionGroup of tableActions\" class=\"table-action-group\">\n <mad-outline-button\n [hidden]=\"isHidden(tableAction)\"\n [disabled]=\"isDisabled(tableAction)\"\n *ngFor=\"let tableAction of actionGroup\"\n (click)=\"onActionEvent(tableAction)\"\n >\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }}\n {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </mad-button-group>\n </div>\n <ng-container *ngIf=\"filterMode === 'COLUMN_BASED' && showDeleteFilterAction\">\n <mat-icon fontSet=\"material-icons-outlined\" class=\"delete-filter-action\" color=\"primary\" (click)=\"onDeleteFilter()\"\n >filter_alt_off</mat-icon\n >\n </ng-container>\n <mat-form-field data-cy=\"filter-input\" *ngIf=\"filterMode === 'TABLE_BASED'\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"onTableBasedFilterEvent($event)\" placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <ng-container *ngFor=\"let rowAction of rowActions\">\n <button\n data-cy=\"row-action-menu-button\"\n *ngIf=\"!isHidden(rowAction)\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\"\n [disabled]=\"isDisabled(rowAction)\"\n >\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-container>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div\n *ngIf=\"filterMode === 'COLUMN_BASED' || showEmptyTable || !!dataSource.filteredData?.length; else noData\"\n class=\"datatable\"\n [class]=\"tableClass\"\n>\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n <table\n [id]=\"id\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortingEvent($event)\"\n madFilter\n (madFilterChange)=\"onColumnBasedFilterEvent($event)\"\n [multiTemplateDataRows]=\"!!expandableDef\"\n >\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"selectionEmitMode !== 'NONE' && selectionMode === 'BATCH'\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox (change)=\"onToggleSelectAll()\" [checked]=\"allSelected\"> </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"showCheckbox(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-checkbox class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button data-cy=\"row-action-button\"\n *ngIf=\"showRowActionIcon(element) && hasVisibleRowActions(element)\"\n [matMenuTriggerData]=\"{ element: element }\"\n [matMenuTriggerFor]=\"rowActionMenu\"\n (click)=\"onSelectionEvent(element.rowId)\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- SINGLE: row radio button -->\n <div *ngIf=\"showRadioButton(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-radio-button class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-radio-button>\n </div>\n <!-- EXPANDABLE: row is expandable/collapsable -->\n <mad-icon-button *ngIf=\"showExpandableButton(element)\" (click)=\"onExpand($event, element)\">\n <mat-icon *ngIf=\"expandedElement !== element\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"expandedElement === element\">keyboard_arrow_up</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container [ngSwitch]=\"getDataTableHeaderType(column)\">\n <ng-container *ngSwitchCase=\"'SORT'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'SORT_AND_FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n </ng-container>\n\n <!-- data cell to be injected -->\n <td\n mat-cell\n *matCellDef=\"let element\"\n [class.text-right]=\"column.isRightAligned\"\n [class.mad-dt-child-cell]=\"element.parentId\"\n [ngSwitch]=\"column.transformer\"\n (click)=\"!disableRowClick && onRowEvent($event, element)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n getCustomCellTemplate(column.id) || defaultCellTemplate;\n context: { column: column, element: element, $implicit: element }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <!-- Expanded Content Column - The row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"!!expandableDef\" [matColumnDef]=\"expandableColumnDef\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"columns.length + 1\">\n <div class=\"mad-data-table-expandable-area\" [@detailExpand]=\"element === expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container\n *ngTemplateOutlet=\"\n getCustomExpandableTemplate() || defaultCellTemplate;\n context: { column: element, element: element, $implicit: element }\n \"\n ></ng-container>\n </div>\n </td>\n </ng-container>\n\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && selectionEmitMode !== 'NONE'\"\n *matRowDef=\"let row; columns: columnIds\"\n (click)=\"onExpand($event, row)\"\n ></tr>\n <ng-container *ngIf=\"!!expandableDef\">\n <tr mat-row *matRowDef=\"let element; columns: [expandableColumnDef]\" class=\"mad-data-table-expandable-row\"></tr>\n </ng-container>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell noDataText columnBasedFilter\" [attr.colspan]=\"columnIds.length\">\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </td>\n </tr>\n </table>\n</div>\n<div data-cy=\"table-bottom-area\" class=\"mad-data-table-bottom-area\">\n <div data-cy=\"definition-button-block\" class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button *ngIf=\"editableColumnDefinitions?.length === 1\" (click)=\"onColumnSettings()\">\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button *ngIf=\"(editableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\">\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button *ngIf=\"(viewableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\">\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"paginationEnabled ? 'block' : 'none'\"\n [length]=\"pageLength\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div data-cy=\"no-data-block\" class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </div>\n</ng-template>\n\n<!-- default cell template -->\n<ng-template #defaultCellTemplate let-element=\"element\" let-column=\"column\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n</ng-template>\n\n<!-- custom cell templates injected from parent -->\n<ng-content></ng-content>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{width:100%;min-height:140px;max-height:100%}.datatable table th,.datatable table td{width:auto;text-overflow:ellipsis;white-space:nowrap}.datatable table th{overflow:visible}.datatable table td{overflow:hidden}.layout-fixed table{table-layout:fixed}.layout-fixed table th{font-weight:700}.layout-fixed table td{white-space:normal;word-wrap:break-word}.text-right{text-align:right!important;padding-right:24px!important}.table-action-group{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.noDataText.columnBasedFilter{padding-top:10px}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-expandable-row{height:0;display:contents;padding:0}.mad-data-table-expandable-row td{border-top-color:transparent;border-bottom-color:transparent}.mad-data-table-expandable-area{overflow:hidden;display:flex;width:100%}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i9.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i11.OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title", "color"] }, { kind: "component", type: i12.IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MadButtonGroupComponent, selector: "mad-button-group" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i15.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: DataTableFilterHeader, selector: "th[mad-filter-header]", inputs: ["mad-filter-header", "madFilterColumnRightAligned", "madFilterOptions"] }, { kind: "directive", type: DataTableFilter, selector: "[madFilter]", outputs: ["madFilterChange"] }], animations: [
594
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: DataTableComponent, isStandalone: true, selector: "mad-data-table", inputs: { id: "id", filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", showEmptyTable: "showEmptyTable", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", translateLabels: "translateLabels", useAsync: "useAsync", stateful: "stateful", persistenceConfig: "persistenceConfig", loading: "loading", tableData: "tableData", idGenerator: "idGenerator", parentIdGenerator: "parentIdGenerator", defaultSort: "defaultSort", externalFilter: "externalFilter", paginationEnabled: "paginationEnabled", page: "page", pageSizeOptions: "pageSizeOptions", actions: "actions", selectionEmitType: "selectionEmitType", showDeleteFilterAction: "showDeleteFilterAction", disableRowClick: "disableRowClick", deleteDefinitionAllowed: "deleteDefinitionAllowed", selection: "selection", filterEnabled: "filterEnabled", filterMode: "filterMode", filterValue: "filterValue", externalPaginator: "externalPaginator", defaultPageSize: "defaultPageSize", selectionEmitMode: "selectionEmitMode", forceMode: "forceMode", forceSelectionMode: "forceSelectionMode", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", columnDefinitions: "columnDefinitions", allColumns: "allColumns" }, outputs: { actionEvent: "actionEvent", selectionEvent: "selectionEvent", sortEvent: "sortEvent", filterEvent: "filterEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, providers: [DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER], queries: [{ propertyName: "expandableDef", first: true, predicate: DataTableTemplateExpandableCellDefinition, descendants: true }, { propertyName: "columnDefs", predicate: DataTableTemplateColumnDefinition }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true }, { propertyName: "filter", first: true, predicate: DataTableFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div data-cy=\"table-action-bar\" class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length || (filterMode === 'COLUMN_BASED' && showDeleteFilterAction)\">\n <mad-button-group *ngFor=\"let actionGroup of tableActions\" class=\"table-action-group\">\n <mad-outline-button\n [hidden]=\"isHidden(tableAction)\"\n [disabled]=\"isDisabled(tableAction)\"\n *ngFor=\"let tableAction of actionGroup\"\n (click)=\"onActionEvent(tableAction)\"\n >\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }}\n {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </mad-button-group>\n </div>\n <ng-container *ngIf=\"filterMode === 'COLUMN_BASED' && showDeleteFilterAction\">\n <mat-icon fontSet=\"material-icons-outlined\" class=\"delete-filter-action\" color=\"primary\" (click)=\"onDeleteFilter()\"\n >filter_alt_off</mat-icon\n >\n </ng-container>\n <mat-form-field data-cy=\"filter-input\" *ngIf=\"filterMode === 'TABLE_BASED'\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"onTableBasedFilterEvent($event)\" placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <ng-container *ngFor=\"let rowAction of rowActions\">\n <button\n data-cy=\"row-action-menu-button\"\n *ngIf=\"!isHidden(rowAction)\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\"\n [disabled]=\"isDisabled(rowAction)\"\n >\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-container>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div\n *ngIf=\"filterMode === 'COLUMN_BASED' || showEmptyTable || !!dataSource.filteredData?.length; else noData\"\n class=\"datatable\"\n [class]=\"tableClass\"\n>\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n <table\n [id]=\"id\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortingEvent($event)\"\n madFilter\n (madFilterChange)=\"onColumnBasedFilterEvent($event)\"\n [multiTemplateDataRows]=\"!!expandableDef\"\n >\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"selectionEmitMode !== 'NONE' && selectionMode === 'BATCH'\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox (change)=\"onToggleSelectAll()\" [checked]=\"allSelected\"> </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"showCheckbox(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-checkbox class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n data-cy=\"row-action-button\"\n *ngIf=\"showRowActionIcon(element) && hasVisibleRowActions(element)\"\n [matMenuTriggerData]=\"{ element: element }\"\n [matMenuTriggerFor]=\"rowActionMenu\"\n (click)=\"onSelectionEvent(element.rowId)\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- SINGLE: row radio button -->\n <div *ngIf=\"showRadioButton(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-radio-button class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-radio-button>\n </div>\n <!-- EXPANDABLE: row is expandable/collapsable -->\n <mad-icon-button *ngIf=\"showExpandableButton(element)\" (click)=\"onExpand($event, element)\">\n <mat-icon *ngIf=\"expandedElement !== element\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"expandedElement === element\">keyboard_arrow_up</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container [ngSwitch]=\"getDataTableHeaderType(column)\">\n <ng-container *ngSwitchCase=\"'SORT'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'SORT_AND_FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n </ng-container>\n\n <!-- data cell to be injected -->\n <td\n mat-cell\n *matCellDef=\"let element\"\n [class.text-right]=\"column.isRightAligned\"\n [class.mad-dt-child-cell]=\"element.parentId\"\n [ngSwitch]=\"column.transformer\"\n (click)=\"!disableRowClick && onRowEvent($event, element)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n getCustomCellTemplate(column.id) || defaultCellTemplate;\n context: { column: column, element: element, $implicit: element }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <!-- Expanded Content Column - The row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"!!expandableDef\" [matColumnDef]=\"expandableColumnDef\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"columns.length + 1\">\n <div class=\"mad-data-table-expandable-area\" [@detailExpand]=\"element === expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container\n *ngTemplateOutlet=\"\n getCustomExpandableTemplate() || defaultCellTemplate;\n context: { column: element, element: element, $implicit: element }\n \"\n ></ng-container>\n </div>\n </td>\n </ng-container>\n\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && selectionEmitMode !== 'NONE'\"\n *matRowDef=\"let row; columns: columnIds\"\n (click)=\"onExpand($event, row)\"\n ></tr>\n <ng-container *ngIf=\"!!expandableDef\">\n <tr mat-row *matRowDef=\"let element; columns: [expandableColumnDef]\" class=\"mad-data-table-expandable-row\"></tr>\n </ng-container>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell noDataText columnBasedFilter\" [attr.colspan]=\"columnIds.length\">\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </td>\n </tr>\n </table>\n</div>\n<div data-cy=\"table-bottom-area\" class=\"mad-data-table-bottom-area\">\n <div data-cy=\"definition-button-block\" class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button *ngIf=\"editableColumnDefinitions?.length === 1\" (click)=\"onColumnSettings()\">\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button *ngIf=\"(editableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\">\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button *ngIf=\"(viewableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\">\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"paginationEnabled ? 'block' : 'none'\"\n [length]=\"pageLength\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div data-cy=\"no-data-block\" class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </div>\n</ng-template>\n\n<!-- default cell template -->\n<ng-template #defaultCellTemplate let-element=\"element\" let-column=\"column\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n</ng-template>\n\n<!-- custom cell templates injected from parent -->\n<ng-content></ng-content>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{width:100%;min-height:140px;max-height:100%}.datatable table th,.datatable table td{width:auto;text-overflow:ellipsis;white-space:nowrap}.datatable table th{overflow:visible}.datatable table td{overflow:hidden}.layout-fixed table{table-layout:fixed}.layout-fixed table th{font-weight:700}.layout-fixed table td{white-space:normal;word-wrap:break-word}.text-right{text-align:right!important;padding-right:24px!important}.table-action-group{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.noDataText.columnBasedFilter{padding-top:10px}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-expandable-row{height:0;display:contents;padding:0}.mad-data-table-expandable-row td{border-top-color:transparent;border-bottom-color:transparent}.mad-data-table-expandable-area{overflow:hidden;display:flex;width:100%}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i9.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i11.OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title", "color"] }, { kind: "component", type: i12.IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MadButtonGroupComponent, selector: "mad-button-group" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i15.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: DataTableFilterHeader, selector: "th[mad-filter-header]", inputs: ["mad-filter-header", "madFilterColumnRightAligned", "madFilterOptions"] }, { kind: "directive", type: DataTableFilter, selector: "[madFilter]", outputs: ["madFilterChange"] }], animations: [
595
595
  trigger('detailExpand', [
596
596
  state('collapsed,void', style({ height: '0px', minHeight: '0' })),
597
597
  state('expanded', style({ height: '*' })),
@@ -631,7 +631,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
631
631
  DataTableTemplateCellDefinition,
632
632
  DataTableTemplateExpandableColumnDefinition,
633
633
  DataTableTemplateExpandableCellDefinition,
634
- ], providers: [DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER], template: "<div data-cy=\"table-action-bar\" class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length || (filterMode === 'COLUMN_BASED' && showDeleteFilterAction)\">\n <mad-button-group *ngFor=\"let actionGroup of tableActions\" class=\"table-action-group\">\n <mad-outline-button\n [hidden]=\"isHidden(tableAction)\"\n [disabled]=\"isDisabled(tableAction)\"\n *ngFor=\"let tableAction of actionGroup\"\n (click)=\"onActionEvent(tableAction)\"\n >\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }}\n {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </mad-button-group>\n </div>\n <ng-container *ngIf=\"filterMode === 'COLUMN_BASED' && showDeleteFilterAction\">\n <mat-icon fontSet=\"material-icons-outlined\" class=\"delete-filter-action\" color=\"primary\" (click)=\"onDeleteFilter()\"\n >filter_alt_off</mat-icon\n >\n </ng-container>\n <mat-form-field data-cy=\"filter-input\" *ngIf=\"filterMode === 'TABLE_BASED'\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"onTableBasedFilterEvent($event)\" placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <ng-container *ngFor=\"let rowAction of rowActions\">\n <button\n data-cy=\"row-action-menu-button\"\n *ngIf=\"!isHidden(rowAction)\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\"\n [disabled]=\"isDisabled(rowAction)\"\n >\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-container>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div\n *ngIf=\"filterMode === 'COLUMN_BASED' || showEmptyTable || !!dataSource.filteredData?.length; else noData\"\n class=\"datatable\"\n [class]=\"tableClass\"\n>\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n <table\n [id]=\"id\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortingEvent($event)\"\n madFilter\n (madFilterChange)=\"onColumnBasedFilterEvent($event)\"\n [multiTemplateDataRows]=\"!!expandableDef\"\n >\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"selectionEmitMode !== 'NONE' && selectionMode === 'BATCH'\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox (change)=\"onToggleSelectAll()\" [checked]=\"allSelected\"> </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"showCheckbox(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-checkbox class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button data-cy=\"row-action-button\"\n *ngIf=\"showRowActionIcon(element) && hasVisibleRowActions(element)\"\n [matMenuTriggerData]=\"{ element: element }\"\n [matMenuTriggerFor]=\"rowActionMenu\"\n (click)=\"onSelectionEvent(element.rowId)\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- SINGLE: row radio button -->\n <div *ngIf=\"showRadioButton(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-radio-button class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-radio-button>\n </div>\n <!-- EXPANDABLE: row is expandable/collapsable -->\n <mad-icon-button *ngIf=\"showExpandableButton(element)\" (click)=\"onExpand($event, element)\">\n <mat-icon *ngIf=\"expandedElement !== element\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"expandedElement === element\">keyboard_arrow_up</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container [ngSwitch]=\"getDataTableHeaderType(column)\">\n <ng-container *ngSwitchCase=\"'SORT'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'SORT_AND_FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n </ng-container>\n\n <!-- data cell to be injected -->\n <td\n mat-cell\n *matCellDef=\"let element\"\n [class.text-right]=\"column.isRightAligned\"\n [class.mad-dt-child-cell]=\"element.parentId\"\n [ngSwitch]=\"column.transformer\"\n (click)=\"!disableRowClick && onRowEvent($event, element)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n getCustomCellTemplate(column.id) || defaultCellTemplate;\n context: { column: column, element: element, $implicit: element }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <!-- Expanded Content Column - The row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"!!expandableDef\" [matColumnDef]=\"expandableColumnDef\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"columns.length + 1\">\n <div class=\"mad-data-table-expandable-area\" [@detailExpand]=\"element === expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container\n *ngTemplateOutlet=\"\n getCustomExpandableTemplate() || defaultCellTemplate;\n context: { column: element, element: element, $implicit: element }\n \"\n ></ng-container>\n </div>\n </td>\n </ng-container>\n\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && selectionEmitMode !== 'NONE'\"\n *matRowDef=\"let row; columns: columnIds\"\n (click)=\"onExpand($event, row)\"\n ></tr>\n <ng-container *ngIf=\"!!expandableDef\">\n <tr mat-row *matRowDef=\"let element; columns: [expandableColumnDef]\" class=\"mad-data-table-expandable-row\"></tr>\n </ng-container>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell noDataText columnBasedFilter\" [attr.colspan]=\"columnIds.length\">\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </td>\n </tr>\n </table>\n</div>\n<div data-cy=\"table-bottom-area\" class=\"mad-data-table-bottom-area\">\n <div data-cy=\"definition-button-block\" class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button *ngIf=\"editableColumnDefinitions?.length === 1\" (click)=\"onColumnSettings()\">\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button *ngIf=\"(editableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\">\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button *ngIf=\"(viewableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\">\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"paginationEnabled ? 'block' : 'none'\"\n [length]=\"pageLength\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div data-cy=\"no-data-block\" class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </div>\n</ng-template>\n\n<!-- default cell template -->\n<ng-template #defaultCellTemplate let-element=\"element\" let-column=\"column\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n</ng-template>\n\n<!-- custom cell templates injected from parent -->\n<ng-content></ng-content>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{width:100%;min-height:140px;max-height:100%}.datatable table th,.datatable table td{width:auto;text-overflow:ellipsis;white-space:nowrap}.datatable table th{overflow:visible}.datatable table td{overflow:hidden}.layout-fixed table{table-layout:fixed}.layout-fixed table th{font-weight:700}.layout-fixed table td{white-space:normal;word-wrap:break-word}.text-right{text-align:right!important;padding-right:24px!important}.table-action-group{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.noDataText.columnBasedFilter{padding-top:10px}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-expandable-row{height:0;display:contents;padding:0}.mad-data-table-expandable-row td{border-top-color:transparent;border-bottom-color:transparent}.mad-data-table-expandable-area{overflow:hidden;display:flex;width:100%}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"] }]
634
+ ], providers: [DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER], template: "<div data-cy=\"table-action-bar\" class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length || (filterMode === 'COLUMN_BASED' && showDeleteFilterAction)\">\n <mad-button-group *ngFor=\"let actionGroup of tableActions\" class=\"table-action-group\">\n <mad-outline-button\n [hidden]=\"isHidden(tableAction)\"\n [disabled]=\"isDisabled(tableAction)\"\n *ngFor=\"let tableAction of actionGroup\"\n (click)=\"onActionEvent(tableAction)\"\n >\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }}\n {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </mad-button-group>\n </div>\n <ng-container *ngIf=\"filterMode === 'COLUMN_BASED' && showDeleteFilterAction\">\n <mat-icon fontSet=\"material-icons-outlined\" class=\"delete-filter-action\" color=\"primary\" (click)=\"onDeleteFilter()\"\n >filter_alt_off</mat-icon\n >\n </ng-container>\n <mat-form-field data-cy=\"filter-input\" *ngIf=\"filterMode === 'TABLE_BASED'\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"onTableBasedFilterEvent($event)\" placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <ng-container *ngFor=\"let rowAction of rowActions\">\n <button\n data-cy=\"row-action-menu-button\"\n *ngIf=\"!isHidden(rowAction)\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\"\n [disabled]=\"isDisabled(rowAction)\"\n >\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-container>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div\n *ngIf=\"filterMode === 'COLUMN_BASED' || showEmptyTable || !!dataSource.filteredData?.length; else noData\"\n class=\"datatable\"\n [class]=\"tableClass\"\n>\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n <table\n [id]=\"id\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortingEvent($event)\"\n madFilter\n (madFilterChange)=\"onColumnBasedFilterEvent($event)\"\n [multiTemplateDataRows]=\"!!expandableDef\"\n >\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"selectionEmitMode !== 'NONE' && selectionMode === 'BATCH'\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox (change)=\"onToggleSelectAll()\" [checked]=\"allSelected\"> </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"showCheckbox(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-checkbox class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n data-cy=\"row-action-button\"\n *ngIf=\"showRowActionIcon(element) && hasVisibleRowActions(element)\"\n [matMenuTriggerData]=\"{ element: element }\"\n [matMenuTriggerFor]=\"rowActionMenu\"\n (click)=\"onSelectionEvent(element.rowId)\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- SINGLE: row radio button -->\n <div *ngIf=\"showRadioButton(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-radio-button class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-radio-button>\n </div>\n <!-- EXPANDABLE: row is expandable/collapsable -->\n <mad-icon-button *ngIf=\"showExpandableButton(element)\" (click)=\"onExpand($event, element)\">\n <mat-icon *ngIf=\"expandedElement !== element\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"expandedElement === element\">keyboard_arrow_up</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container [ngSwitch]=\"getDataTableHeaderType(column)\">\n <ng-container *ngSwitchCase=\"'SORT'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'SORT_AND_FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n </ng-container>\n\n <!-- data cell to be injected -->\n <td\n mat-cell\n *matCellDef=\"let element\"\n [class.text-right]=\"column.isRightAligned\"\n [class.mad-dt-child-cell]=\"element.parentId\"\n [ngSwitch]=\"column.transformer\"\n (click)=\"!disableRowClick && onRowEvent($event, element)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n getCustomCellTemplate(column.id) || defaultCellTemplate;\n context: { column: column, element: element, $implicit: element }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <!-- Expanded Content Column - The row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"!!expandableDef\" [matColumnDef]=\"expandableColumnDef\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"columns.length + 1\">\n <div class=\"mad-data-table-expandable-area\" [@detailExpand]=\"element === expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container\n *ngTemplateOutlet=\"\n getCustomExpandableTemplate() || defaultCellTemplate;\n context: { column: element, element: element, $implicit: element }\n \"\n ></ng-container>\n </div>\n </td>\n </ng-container>\n\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && selectionEmitMode !== 'NONE'\"\n *matRowDef=\"let row; columns: columnIds\"\n (click)=\"onExpand($event, row)\"\n ></tr>\n <ng-container *ngIf=\"!!expandableDef\">\n <tr mat-row *matRowDef=\"let element; columns: [expandableColumnDef]\" class=\"mad-data-table-expandable-row\"></tr>\n </ng-container>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell noDataText columnBasedFilter\" [attr.colspan]=\"columnIds.length\">\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </td>\n </tr>\n </table>\n</div>\n<div data-cy=\"table-bottom-area\" class=\"mad-data-table-bottom-area\">\n <div data-cy=\"definition-button-block\" class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button *ngIf=\"editableColumnDefinitions?.length === 1\" (click)=\"onColumnSettings()\">\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button *ngIf=\"(editableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\">\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button *ngIf=\"(viewableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\">\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"paginationEnabled ? 'block' : 'none'\"\n [length]=\"pageLength\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div data-cy=\"no-data-block\" class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </div>\n</ng-template>\n\n<!-- default cell template -->\n<ng-template #defaultCellTemplate let-element=\"element\" let-column=\"column\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n</ng-template>\n\n<!-- custom cell templates injected from parent -->\n<ng-content></ng-content>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{width:100%;min-height:140px;max-height:100%}.datatable table th,.datatable table td{width:auto;text-overflow:ellipsis;white-space:nowrap}.datatable table th{overflow:visible}.datatable table td{overflow:hidden}.layout-fixed table{table-layout:fixed}.layout-fixed table th{font-weight:700}.layout-fixed table td{white-space:normal;word-wrap:break-word}.text-right{text-align:right!important;padding-right:24px!important}.table-action-group{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.noDataText.columnBasedFilter{padding-top:10px}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-expandable-row{height:0;display:contents;padding:0}.mad-data-table-expandable-row td{border-top-color:transparent;border-bottom-color:transparent}.mad-data-table-expandable-area{overflow:hidden;display:flex;width:100%}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"] }]
635
635
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.MatDialog }, { type: i17.DataTablePersistenceService, decorators: [{
636
636
  type: Inject,
637
637
  args: [MAD_DATA_TABLE_PERSISTENCE_SERVICE]
@@ -762,4 +762,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
762
762
  type: ContentChild,
763
763
  args: [DataTableTemplateExpandableCellDefinition]
764
764
  }] } });
765
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUdMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFJTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQVUvRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFJbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FB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LE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csMkJBQTJCO3NCQUFwQyxNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFFa0IsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUVDLE9BQU87c0JBQTlCLFNBQVM7dUJBQUMsT0FBTztnQkFJVSxNQUFNO3NCQUFqQyxTQUFTO3VCQUFDLGVBQWU7Z0JBR3RCLFVBQVU7c0JBRGIsZUFBZTt1QkFBQyxpQ0FBaUM7Z0JBVzlDLGFBQWE7c0JBRGhCLFlBQVk7dUJBQUMseUNBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZSwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRNb2R1bGUsIFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1hY3Rpb24nO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbnNNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW5zLW1vZGFsL2RhdGEtdGFibGUtY29sdW1ucy1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbixcbiAgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZSxcbiAgRGF0YVRhYmxlRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtY29sdW1uLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgRGF0YVRhYmxlUm93IH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtcm93JztcbmltcG9ydCB7IERhdGFUYWJsZUhlYWRlclR5cGUgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1oZWFkZXItdHlwZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJNb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtZmlsdGVyLW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci1vYmplY3QnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1zZWxlY3Rpb24tZW1pdC10eXBlJztcbmltcG9ydCB7IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLWVtaXQtbW9kZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVTZWxlY3Rpb25Nb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU29ydFV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1zb3J0LXV0aWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQWN0aW9uVXRpbCB9IGZyb20gJy4vdXRpbC9kYXRhLXRhYmxlLWFjdGlvbi11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZURhdGFVdGlsIH0gZnJvbSAnLi91dGlsL2RhdGEtdGFibGUtZGF0YS11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZUZpbHRlclV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1maWx0ZXItdXRpbCc7XG5pbXBvcnQge1xuICBEQVRBX1RBQkxFX1BFUlNJU1RFTkNFX1NFUlZJQ0VfUFJPVklERVIsXG4gIERhdGFUYWJsZVBlcnNpc3RlbmNlU2VydmljZSxcbiAgTUFEX0RBVEFfVEFCTEVfUEVSU0lTVEVOQ0VfU0VSVklDRSxcbn0gZnJvbSAnLi9kYXRhLXRhYmxlLXBlcnNpc3RlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTUFEX0RBVEFfVEFCTEVfR0xPQkFMX0NPTkZJR1VSQVRJT04sXG4gIERhdGFUYWJsZUdsb2JhbENvbmZpZ3VyYXRpb24sXG4gIE1BRF9EQVRBX1RBQkxfR0xPQkFMX0NPTkZJR1VSQVRJT05fUFJPVklERVIsXG59IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWdsb2JhbC1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLm1vZHVsZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJIZWFkZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtZmlsdGVyL2RhdGEtdGFibGUtZmlsdGVyLWhlYWRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtY29sdW1uLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlQ2VsbERlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUvZGF0YS10YWJsZS10ZW1wbGF0ZS1jZWxsLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtZXhwYW5kYWJsZS1jZWxsLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNvbHVtbkRlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUvZGF0YS10YWJsZS10ZW1wbGF0ZS1leHBhbmRhYmxlLWNvbHVtbi1kZWZpbml0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVQZXJzaXN0ZW5jZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1wZXJzaXN0ZW5jZS1jb25maWd1cmF0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWFkLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQsdm9pZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcbiAgICBNYXRTb3J0TW9kdWxlLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdEJhZGdlTW9kdWxlLFxuICAgIERyYWdEcm9wTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIERhdGFUYWJsZUZpbHRlckhlYWRlcixcbiAgICBEYXRhVGFibGVGaWx0ZXIsXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uLFxuICAgIERhdGFUYWJsZVRlbXBsYXRlQ2VsbERlZmluaXRpb24sXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ29sdW1uRGVmaW5pdGlvbixcbiAgICBEYXRhVGFibGVUZW1wbGF0ZUV4cGFuZGFibGVDZWxsRGVmaW5pdGlvbixcbiAgXSxcbiAgcHJvdmlkZXJzOiBbREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFX1BST1ZJREVSLCBNQURfREFUQV9UQUJMX0dMT0JBTF9DT05GSUdVUkFUSU9OX1BST1ZJREVSXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcblxuICAvLyBUcmFuc2xhdGlvbnNcbiAgQElucHV0KCkgZmlsdGVyTGFiZWwgPSAnY29tbW9uLmZpbHRlcic7XG4gIEBJbnB1dCgpIGZpbHRlclBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNMYWJlbCA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIgPSAnRmlsdGVyIGF2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgc2hvd0VtcHR5VGFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbm9EYXRhVGV4dCA9ICdObyBtYXRjaGluZyBkYXRhIGZvdW5kJztcbiAgQElucHV0KCkgY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwgPSAnQ29sdW1uIHNldHRpbmdzJztcbiAgQElucHV0KCkgc2VsZWN0ZWRMYWJlbCA9ICdTZWxlY3RlZCBjb2x1bW5zJztcbiAgQElucHV0KCkgYXZhaWxhYmxlTGFiZWwgPSAnQXZhaWxhYmxlIGNvbHVtbnMnO1xuICBASW5wdXQoKSBzYXZlTGFiZWwgPSAnU2F2ZSc7XG4gIEBJbnB1dCgpIGRlbGV0ZUxhYmVsID0gJ0RlbGV0ZSc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIGluZm9UZXh0TGFiZWwgPSAnRHJhZyBhbmQgZHJvcCBhIGNvbHVtbiB0byBzZWxlY3Qgb3IgcmVvcmRlciBpdC4nO1xuICBASW5wdXQoKSB0YWJsZUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgdHJhbnNsYXRlTGFiZWxzID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzZXQgdXNlQXN5bmModXNlQXN5bmM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91c2VBc3luYyA9IHVzZUFzeW5jO1xuICAgIHRoaXMuYXBwbHlTb3J0RGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIFBsZWFzZSB1c2UgdGhlIG1vcmUgc3BlY2lmaWMgcGVyc2lzdGVuY2VDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IHN0YXRlZnVsKHN0YXRlZnVsOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZUNvbmZpZyA9IHtcbiAgICAgIHBlcnNpc3RTb3J0OiBzdGF0ZWZ1bCxcbiAgICAgIHBlcnNpc3RGaWx0ZXI6IHN0YXRlZnVsLFxuICAgICAgcGVyc2lzdFBhZ2VTaXplOiBzdGF0ZWZ1bCxcbiAgICB9O1xuICB9XG5cbiAgQElucHV0KCkgcGVyc2lzdGVuY2VDb25maWc6IERhdGFUYWJsZVBlcnNpc3RlbmNlQ29uZmlndXJhdGlvbiA9IHtcbiAgICBwZXJzaXN0U29ydDogZmFsc2UsXG4gICAgcGVyc2lzdEZpbHRlcjogZmFsc2UsXG4gICAgcGVyc2lzdFBhZ2VTaXplOiBmYWxzZSxcbiAgfTtcblxuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdGFibGVEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGlkR2VuZXJhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIHBhcmVudElkR2VuZXJhdG9yOiBhbnk7XG5cbiAgQElucHV0KCkgZGVmYXVsdFNvcnQ6IFNvcnQ7XG4gIEBJbnB1dCgpIGV4dGVybmFsRmlsdGVyOiBhbnk7XG4gIEBJbnB1dCgpIHBhZ2luYXRpb25FbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhZ2U6IFBhZ2VFdmVudCA9IHsgcGFnZUluZGV4OiAwLCBwYWdlU2l6ZTogNTAsIGxlbmd0aDogMCB9O1xuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnMgPSBbNSwgMTAsIDE1XTtcblxuICBASW5wdXQoKSBhY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3Rpb25FbWl0VHlwZTogRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUgPSAnSUQnO1xuICBASW5wdXQoKSBzaG93RGVsZXRlRmlsdGVyQWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZGlzYWJsZVJvd0NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uKHNlbGVjdGlvbjogc3RyaW5nW10gfCBhbnlbXSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbk1vZGVsKHNlbGVjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogUGxlYXNlIHVzZSBcImZpbHRlck1vZGVcIiBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZmlsdGVyRW5hYmxlZChpc0ZpbHRlckVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9maWx0ZXJNb2RlID0gaXNGaWx0ZXJFbmFibGVkID8gJ1RBQkxFX0JBU0VEJyA6ICdOT05FJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyUHJlZGljYXRlKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZmlsdGVyTW9kZShmaWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlKSB7XG4gICAgdGhpcy5fZmlsdGVyTW9kZSA9IGZpbHRlck1vZGU7XG4gICAgdGhpcy5hcHBseUZpbHRlclByZWRpY2F0ZSgpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlclZhbHVlKGZpbHRlclZhbHVlOiBzdHJpbmcgfCBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9maWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXJWYWx1ZSh0aGlzLl9maWx0ZXJWYWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZXh0ZXJuYWxQYWdpbmF0b3IocGFnaW5hdG9yOiBhbnkpIHtcbiAgICB0aGlzLmV4dFBhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkZWZhdWx0UGFnZVNpemUoZGVmYXVsdFNpemU6IG51bWJlcikge1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIC4uLnRoaXMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiBkZWZhdWx0U2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbkVtaXRNb2RlKHNlbGVjdGlvbkVtaXRNb2RlOiBEYXRhVGFibGVTZWxlY3Rpb25FbWl0TW9kZSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlID0gc2VsZWN0aW9uRW1pdE1vZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogVGhpcyBmdW5jdGlvbiBtaXhlcyB1cCAyIHJlc3BvbnNpYmlsaXRpZXM6XG4gICAqICAtIGRldGVybWluaW5nIGlmIGFjdGlvbnMgc2hvdWxkIGJlIGRpc3BsYXllZCAvIGhhbmRsZWRcbiAgICogIC0gZGV0ZXJtaW5pbmcgd2hldGhlciBhY3Rpb25zIGFyZSByb3cgYmFzZWQgKHNpbmdsZSkgb3IgdGFibGUgYmFzZWQgKGJhdGNoKVxuICAgKiBQbGVhc2UgdXNlIGEgY29tYmluYXRpb24gb2YgXCJzZWxlY3Rpb25FbWl0TW9kZVwiIGFuZCBcInNlbGVjdGlvbk1vZGVcIiBpbnN0ZWFkOlxuICAgKiAgLSBzZWxlY3Rpb25FbWl0TW9kZSBkZXRlcm1pbmVzIGhvdyBzZWxlY3RlZCBpdGVtcyBhcmUgaGFuZGxlZCAoYXMgcGFydCBvZiBhY3Rpb25zLCBhcyBzZWxlY3Rpb25zIG9yIG5vdCBhdCBhbGwpXG4gICAqICAtIHNlbGVjdGlvbk1vZGUgZGV0ZXJtaW5lcyBpZiBzZWxlY3RlZCBpdGVtcyBhcmUgdHJlYXRlZCBzZXBhcmF0ZWx5IChzaW5nbGUpIG9yIHRvZ2V0aGVyIChiYXRjaClcbiAgICovXG4gIEBJbnB1dCgpIHNldCBmb3JjZU1vZGUoc2VsZWN0aW9uTW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdTSU5HTEUnIHx8IHNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCcpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlID0gJ09OX0FDVElPTic7XG4gICAgICB0aGlzLl9mb3JjZVNlbGVjdGlvbk1vZGUgPSA8RGF0YVRhYmxlU2VsZWN0aW9uTW9kZT5zZWxlY3Rpb25Nb2RlO1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZm9yY2VTZWxlY3Rpb25Nb2RlKHNlbGVjdGlvbk1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUpIHtcbiAgICB0aGlzLl9mb3JjZVNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzcGxheWVkQ29sdW1ucyhjb2xzOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIGlmICghdGhpcy5kaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2xzID8gWy4uLmNvbHNdIDogW107XG4gICAgICB0aGlzLmNvbHVtbklkcyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmlkKTtcbiAgICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKGRlZjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbikge1xuICAgIHRoaXMuY29sdW1ucyA9IGRlZi5kaXNwbGF5ZWRDb2x1bW5zO1xuICAgIHRoaXMuY29sdW1uSWRzID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uaWQpO1xuICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiA9IGRlZjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5EZWZpbml0aW9ucyhkZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdKSB7XG4gICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy52aWV3YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy5fYWxsQ29sdW1uRGVmaW5pdGlvbnMgPSBbLi4uZGVmaW5pdGlvbnNdO1xuICAgIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiBkZWZpbml0aW9ucykge1xuICAgICAgaWYgKGRlZmluaXRpb24uZWRpdGFibGUpIHtcbiAgICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zLnB1c2goZGVmaW5pdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5pdGlvbi5kaXNwbGF5ZWRDb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2FibGVDb2x1bW5EZWZpbml0aW9ucy5wdXNoKGRlZmluaXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBhbGxDb2x1bW5zKGFsbENvbHVtbnM6IERhdGFUYWJsZUNvbHVtbltdKSB7XG4gICAgdGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnM7XG4gICAgaWYgKGFsbENvbHVtbnMgJiYgdGhpcy5fc2hvd0NvbHVtbk1vZGFsKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG4gIEBPdXRwdXQoKSBmaWx0ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkPigpO1xuICBAT3V0cHV0KCkgcGFnZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpIGFsbENvbHVtbnNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZT4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZWZpbml0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24+KCk7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICAvLyB3ZSBuZWVkIHRvIGhhdmUgdGhpcyBhcyBhIHNldHRlciBkdWUgdG8gdGhlICpuZ0lmIGl0IGlzIGluXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc2V0IG1hdFNvcnQobWF0U29ydDogTWF0U29ydCkge1xuICAgIHRoaXMuX3NvcnQgPSBtYXRTb3J0O1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5fc29ydDtcbiAgfVxuICBAVmlld0NoaWxkKERhdGFUYWJsZUZpbHRlcikgZmlsdGVyOiBEYXRhVGFibGVGaWx0ZXI7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihEYXRhVGFibGVUZW1wbGF0ZUNvbHVtbkRlZmluaXRpb24pXG4gIHNldCBjb2x1bW5EZWZzKGNvbHVtbkRlZnM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVUZW1wbGF0ZUNvbHVtbkRlZmluaXRpb24+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29sdW1uRGVmcyA9IGNvbHVtbkRlZnM7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgY29sdW1uRGVmcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmcztcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ2VsbERlZmluaXRpb24pXG4gIHNldCBleHBhbmRhYmxlRGVmKGV4cGFuZGFibGVEZWY6IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZXhwYW5kYWJsZURlZiA9IGV4cGFuZGFibGVEZWY7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgZXhwYW5kYWJsZURlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZjtcbiAgfVxuXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnlbXT47XG4gIGFsbFNlbGVjdGVkID0gZmFsc2U7XG5cbiAgZXh0UGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgcmVhZG9ubHkgQUNUSU9OX0NPTFVNTl9OQU1FID0gJ19fYWN0aW9uX18nO1xuICB0YWJsZUFjdGlvbnM6IERhdGFUYWJsZUFjdGlvbltdW10gPSBbXTtcbiAgcm93QWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcblxuICBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICBjb2x1bW5JZHM6IHN0cmluZ1tdO1xuXG4gIGV4cGFuZGVkRWxlbWVudDogRGF0YVRhYmxlQ29sdW1uIHwgbnVsbDtcblxuICBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW107XG4gIHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcblxuICBwcml2YXRlIF91c2VBc3luYzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3Jvd01hcCA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhVGFibGVSb3c+KCk7XG4gIHByaXZhdGUgX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPHN0cmluZz4odHJ1ZSk7XG4gIHByaXZhdGUgX3NlbGVjdGlvbjogc3RyaW5nW10gfCBhbnlbXTtcblxuICBwcml2YXRlIF9zb3J0OiBNYXRTb3J0O1xuXG4gIHByaXZhdGUgX2ZvcmNlU2VsZWN0aW9uTW9kZTogRGF0YVRhYmxlU2VsZWN0aW9uTW9kZTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uRW1pdE1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJWYWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2FsbENvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWxsQXZhaWxhYmxlQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uW107XG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfc2hvd0NvbHVtbk1vZGFsID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY29sdW1uRGVmczogUXVlcnlMaXN0PERhdGFUYWJsZVRlbXBsYXRlQ29sdW1uRGVmaW5pdGlvbj4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2V4cGFuZGFibGVEZWY6IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXG4gICAgQEluamVjdChNQURfREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFKSBwcml2YXRlIHBlcnNpc3RlbmNlU2VydmljZTogRGF0YVRhYmxlUGVyc2lzdGVuY2VTZXJ2aWNlLFxuICAgIEBJbmplY3QoTUFEX0RBVEFfVEFCTEVfR0xPQkFMX0NPTkZJR1VSQVRJT04pIHByaXZhdGUgZGF0YVRhYmxlR2xvYmFsQ29uZmlnOiBEYXRhVGFibGVHbG9iYWxDb25maWd1cmF0aW9uLFxuICApIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuX3NvcnQ7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlTb3J0RGF0YSgpO1xuICAgIHRoaXMuaW5pdFN0YXRlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCd0YWJsZURhdGEnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVRhYmxlRGF0YSgpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlbCh0aGlzLmdldFNlbGVjdGlvbignSUQnKS5sZW5ndGggPyB0aGlzLmdldFNlbGVjdGlvbignSUQnKSA6IHRoaXMuX3NlbGVjdGlvbik7XG4gICAgICBpZiAodGhpcy5zaG93QWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnaWRHZW5lcmF0b3InIGluIGNoYW5nZXMgfHwgJ2Rpc3BsYXllZENvbHVtbnMnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVRhYmxlRGF0YSgpO1xuICAgIH1cblxuICAgIC8vIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHNhbWUgYmVoYXZpb3VyIGNvdWxkIGJlIGFjaGl2ZWQgaW4gZ2V0dGVycylcbiAgICBpZiAoJ2ZvcmNlTW9kZScgaW4gY2hhbmdlcyB8fCAnZm9yY2VTZWxlY3Rpb25Nb2RlJyBpbiBjaGFuZ2VzIHx8ICdhY3Rpb25zJyBpbiBjaGFuZ2VzKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gRGF0YVRhYmxlQWN0aW9uVXRpbC5nZXREaXNwbGF5QWN0aW9ucyh0aGlzLmFjdGlvbnMsIHRoaXMuc2VsZWN0aW9uTW9kZSk7XG4gICAgICB0aGlzLnJvd0FjdGlvbnMgPSBhY3Rpb25zLnJvd0FjdGlvbnM7XG4gICAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IGFjdGlvbnMuZ3JvdXBlZFRhYmxlQWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvKiogVEFCTEUgRElTUExBWSBIQU5ETElORyAqL1xuXG4gIHB1YmxpYyBnZXREYXRhVGFibGVIZWFkZXJUeXBlKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKTogRGF0YVRhYmxlSGVhZGVyVHlwZSB7XG4gICAgaWYgKGNvbHVtbi5pc1NvcnRhYmxlICYmICFjb2x1bW4uaXNGaWx0ZXJhYmxlKSB7XG4gICAgICByZXR1cm4gJ1NPUlQnO1xuICAgIH1cbiAgICBpZiAoIWNvbHVtbi5pc1NvcnRhYmxlICYmIGNvbHVtbi5pc0ZpbHRlcmFibGUpIHtcbiAgICAgIHJldHVybiAnRklMVEVSJztcbiAgICB9XG4gICAgaWYgKGNvbHVtbi5pc1NvcnRhYmxlICYmIGNvbHVtbi5pc0ZpbHRlcmFibGUpIHtcbiAgICAgIHJldHVybiAnU09SVF9BTkRfRklMVEVSJztcbiAgICB9XG4gICAgcmV0dXJuICdQTEFJTic7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tQ2VsbFRlbXBsYXRlKGNvbHVtbklkOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1uRGVmID0gdGhpcy5fY29sdW1uRGVmcz8uZmluZCgoaXQpID0+IGl0Lm1hZENvbHVtbkRlZiA9PT0gY29sdW1uSWQpO1xuICAgIHJldHVybiBjb2x1bW5EZWYgJiYgY29sdW1uRGVmLmNlbGxEZWYgPyBjb2x1bW5EZWYuY2VsbERlZi5nZXRDZWxsVGVtcGxhdGUoKSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tRXhwYW5kYWJsZVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZj8uZ2V0Q2VsbFRlbXBsYXRlKCkgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwYW5kYWJsZUNvbHVtbkRlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZj8uY29sdW1uRGVmLm1hZEV4cGFuZGFibGVDb2x1bW5EZWYgfHwgJyc7XG4gIH1cblxuICBwdWJsaWMgb25FeHBhbmQoZXZlbnQ6IE1vdXNlRXZlbnQsIGVsZW1lbnQ6IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuZXhwYW5kZWRFbGVtZW50ID0gdGhpcy5leHBhbmRlZEVsZW1lbnQgPT09IGVsZW1lbnQgPyBudWxsIDogZWxlbWVudDtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gQlVUVE9OIERJU1BMQVkgSEFORExJTkcgKi9cblxuICBwdWJsaWMgaGFzVmlzaWJsZVJvd0FjdGlvbnMoZGlzcGxheWVkRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJvd0FjdGlvbnMuZXZlcnkoKGFjdGlvbikgPT4gdGhpcy5pc0hpZGRlbkZvckRhdGEoYWN0aW9uLCBbdGhpcy5fcm93TWFwLmdldChkaXNwbGF5ZWREYXRhLnJvd0lkKT8uYWN0dWFsRGF0YV0pKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0hpZGRlbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSGlkZGVuRm9yRGF0YShhY3Rpb24sIHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0hpZGRlbkZvckRhdGEoYWN0aW9uOiBEYXRhVGFibGVBY3Rpb24sIGRhdGE6IGFueVtdKSB7XG4gICAgcmV0dXJuICEhYWN0aW9uLmlzSGlkZGVuICYmIGFjdGlvbi5pc0hpZGRlbihkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGFjdGlvbjogRGF0YVRhYmxlQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uLnR5cGUpIHx8ICghIWFjdGlvbi5pc0Rpc2FibGVkICYmIGFjdGlvbi5pc0Rpc2FibGVkKHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlICdTSU5HTEUnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50ICE9PSAxO1xuICAgICAgY2FzZSAnQkFUQ0gnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50IDwgMTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSAnQkFUQ0gnIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCAoJHtjb3VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWw/LnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKiBUQUJMRSBEQVRBIENIQU5HRSBIQU5ETElORyAqL1xuXG4gIHByaXZhdGUgdXBkYXRlRGF0YVRhYmxlRGF0YSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGltbXV0YWJsZSAtIHdlIGRlc3BhcmF0ZWx5IG5lZWQgdGhlIHJlZmVyZW5jZSBvZiByb3dNYXAgdG8gc3RheSB0aGUgc2FtZVxuICAgIERhdGFUYWJsZURhdGFVdGlsLnVwZGF0ZVJvd01hcCh0aGlzLl9yb3dNYXAsIHRoaXMudGFibGVEYXRhLCB0aGlzLmNvbHVtbnMsIHRoaXMuaWRHZW5lcmF0b3IsIHRoaXMucGFyZW50SWRHZW5lcmF0b3IpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gQXJyYXkuZnJvbSh0aGlzLl9yb3dNYXAudmFsdWVzKCkpLm1hcCgoaXQpID0+IGl0LmRpc3BsYXllZERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb25Nb2RlbChzZWxlY3Rpb246IHN0cmluZ1tdIHwgYW55W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgIHNlbGVjdGlvbj8uZm9yRWFjaCgoaXQpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9yb3dNYXAuZ2V0KGl0KSB8fCBbLi4udGhpcy5fcm93TWFwLnZhbHVlcygpXS5maW5kKChyb3cpID0+IHJvdy5hY3R1YWxEYXRhID09PSBpdCk7XG4gICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25FdmVudChpdGVtLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gJiBTRUxFQ1RJT04gSEFORExJTkcgKi9cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkVtaXRNb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdOT05FJyAmJiAhIXRoaXMuYWN0aW9ucy5sZW5ndGggPyAnT05fQUNUSU9OJyA6IHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUge1xuICAgIHJldHVybiAhIXRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA/IHRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA6IHRoaXMuYWN0aW9ucy5maW5kKChpdCkgPT4gaXQudHlwZSA9PT0gJ0JBVENIJykgPyAnQkFUQ0gnIDogJ1NJTkdMRSc7XG4gIH1cblxuICAvLyBnZXQgZmlsdGVyZWQgJiBzb3J0ZWQgZGF0YSBvZiB0aGUgY3VycmVudCBwYWdlXG4gIHB1YmxpYyBnZXQgZGlzcGxheWVkRGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uX3BhZ2VEYXRhKHRoaXMuZGF0YVNvdXJjZT8uc29ydERhdGEodGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YSwgdGhpcy5kYXRhU291cmNlLnNvcnQpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd0FjdGlvbkNvbHVtbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnTk9ORScgfHwgdGhpcy5oaWRlQWN0aW9uQ29sdW1uKSB8fCAhIXRoaXMuX2V4cGFuZGFibGVEZWY7XG4gIH1cblxuICBwdWJsaWMgc2hvd0NoZWNrYm94KGRpc3BsYXllZERhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGlzcGxheWVkRGF0YS5wYXJlbnRJZCAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCcgJiYgIXRoaXMuaGlkZUFjdGlvbkNvbHVtbjtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Um93QWN0aW9uSWNvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX0FDVElPTicgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJyAmJiAhdGhpcy5oaWRlQWN0aW9uQ29sdW1uO1xuICB9XG5cbiAgcHVibGljIHNob3dSYWRpb0J1dHRvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX1NFTEVDVElPTicgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJztcbiAgfVxuXG4gIHB1YmxpYyBzaG93RXhwYW5kYWJsZUJ1dHRvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgISF0aGlzLl9leHBhbmRhYmxlRGVmO1xuICB9XG5cbiAgcHVibGljIGlzU2VsZWN0ZWQocm93SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvd0lkKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICAvLyBjbGVhciBhbGwgc2VsZWN0aW9uIGZpcnN0XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAvLyB0b2dnbGUgYWxsIGNoZWNrYm94XG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9ICF0aGlzLmFsbFNlbGVjdGVkO1xuICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKSB7XG4gICAgICAvLyBzZWxlY3QgYWxsIHJvd3Mgb2YgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBpZiAoIXJvdy5wYXJlbnRJZCkge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChyb3cucm93SWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgb25BY3Rpb25FdmVudChhY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGVtaXRBY3Rpb24gPSB7IC4uLmFjdGlvbiB9O1xuICAgIGlmICghIWVtaXRBY3Rpb24gJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSAhPT0gJ05PTkUnKSB7XG4gICAgICBlbWl0QWN0aW9uLnNlbGVjdGVkID0gdGhpcy5nZXRTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb25FbWl0VHlwZSk7XG4gICAgICB0aGlzLmFjdGlvbkV2ZW50LmVtaXQoZW1pdEFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU2VsZWN0aW9uRXZlbnQoaWQ6IGFueSk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5zZWxlY3Rpb25Nb2RlKSB7XG4gICAgICBjYXNlICdCQVRDSCc6XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnRvZ2dsZShpZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU0lOR0xFJzpcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlKGlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUm93RXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ05PTkUnIHx8IHJvdz8ucGFyZW50SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uU2VsZWN0aW9uRXZlbnQocm93LnJvd0lkKTtcbiAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb24oZXZlbnQsIGFjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZWZhdWx0QWN0aW9uKCk6IERhdGFUYWJsZUFjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJyA/IHRoaXMucm93QWN0aW9uc1swXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGhpZGVBY3Rpb25Db2x1bW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9BQ1RJT04nICYmIHRoaXMuYWN0aW9ucy5ldmVyeSgoaXQpID0+IGl0LnR5cGUgPT09ICdOT05FJyk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NTZWxlY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQsIGFjdGlvbj86IERhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9BQ1RJT04nICYmXG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdTSU5HTEUnICYmXG4gICAgICAhIWFjdGlvbiAmJlxuICAgICAgIURhdGFUYWJsZUNvbXBvbmVudC5pc0NsaWNrT25Sb3dNZW51SWNvbihldmVudClcbiAgICApIHtcbiAgICAgIHRoaXMub25BY3Rpb25FdmVudChhY3Rpb24pO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnT05fU0VMRUNUSU9OJykge1xuICAgICAgdGhpcy5zZWxlY3Rpb25FdmVudC5lbWl0KHRoaXMuZ2V0U2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uRW1pdFR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGlvbihzZWxlY3Rpb25FbWl0VHlwZTogRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUpOiBhbnlbXSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmZvckVhY2goKGl0KSA9PlxuICAgICAgLy8gaWYgSUQtZ2VuZXJhdG9yIGlzIHByb3ZpZGVkLCByZXR1cm4gdGhlIElELCBlbHNlIHJldHVybiB0aGUgQUNUVUFMIGRhdGFcbiAgICAgIHNlbGVjdGlvbi5wdXNoKHRoaXMuaWRHZW5lcmF0b3IgJiYgc2VsZWN0aW9uRW1pdFR5cGUgPT09ICdJRCcgPyBpdCA6IHRoaXMuX3Jvd01hcC5nZXQoaXQpPy5hY3R1YWxEYXRhKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzQ2xpY2tPblJvd01lbnVJY29uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChldmVudD8udGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXQtaWNvbicpO1xuICB9XG5cbiAgLyoqIFNPUlQgSEFORExJTkcgKi9cblxuICBvblNvcnRpbmdFdmVudChzb3J0OiBTb3J0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RTb3J0KSB7XG4gICAgICB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5zYXZlU29ydCh0aGlzLmlkLCBzb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U29ydERhdGEoKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnREYXRhID0gdGhpcy5fdXNlQXN5bmNcbiAgICAgID8gRGF0YVRhYmxlU29ydFV0aWwuc29ydE5vdGhpbmcoKVxuICAgICAgOiBEYXRhVGFibGVTb3J0VXRpbC5zb3J0RGF0YShbLi4udGhpcy5kYXRhVGFibGVHbG9iYWxDb25maWcuZGF0ZVRpbWVGb3JtYXRdLCB0aGlzLmRhdGFUYWJsZUdsb2JhbENvbmZpZy5udW1iZXJGb3JtYXQpO1xuICB9XG5cbiAgLyoqIEZJTFRFUiBIQU5ETElORyAqL1xuXG4gIHB1YmxpYyBnZXQgZmlsdGVyTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlQXN5bmMgJiYgdGhpcy5fZmlsdGVyTW9kZSA9PT0gJ1RBQkxFX0JBU0VEJyA/ICdOT05FJyA6IHRoaXMuX2ZpbHRlck1vZGU7XG4gIH1cblxuICBwdWJsaWMgb25UYWJsZUJhc2VkRmlsdGVyRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vbkZpbHRlcmluZ0V2ZW50KChldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIG9uQ29sdW1uQmFzZWRGaWx0ZXJFdmVudChmaWx0ZXI6IERhdGFUYWJsZUZpbHRlck9iamVjdCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudChmaWx0ZXIpO1xuICB9XG5cbiAgcHVibGljIG9uRGVsZXRlRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudCh1bmRlZmluZWQpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZUZpbHRlcmFibGVzKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIG9uRmlsdGVyaW5nRXZlbnQoZmlsdGVyOiBzdHJpbmcgfCBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMuZmlsdGVyRXZlbnQuZW1pdChmaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgdGhpcy5hcHBseUZpbHRlclZhbHVlKGZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdEZpbHRlcikge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZUZpbHRlcih0aGlzLmlkLCBmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJQcmVkaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9XG4gICAgICB0aGlzLmZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnXG4gICAgICAgID8gRGF0YVRhYmxlRmlsdGVyVXRpbC5jb2x1bW5CYXNlZEZpbHRlclByZWRpY2F0ZSh0aGlzLl9yb3dNYXApXG4gICAgICAgIDogRGF0YVRhYmxlRmlsdGVyVXRpbC50YWJsZUJhc2VkRmlsdGVyUHJlZGljYXRlKCk7XG4gICAgdGhpcy5hcHBseUZpbHRlclZhbHVlKHRoaXMuX2ZpbHRlclZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgdGhpcy5fZmlsdGVyVmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAhIXZhbHVlID8gKGlzU3RyaW5nID8gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIDogJyc7XG4gIH1cblxuICAvKiogUEFHSU5BVElPTiBIQU5ETElORyAqL1xuXG4gIG9uUGFnZUV2ZW50KGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMucGFnZUV2ZW50LmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RQYWdlU2l6ZSkge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZVBhZ2VTaXplKHRoaXMuaWQsIGV2ZW50LnBhZ2VTaXplKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IDAgOiB0aGlzLnBhZ2UucGFnZUluZGV4O1xuICB9XG5cbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IHRoaXMuZGF0YUxlbmd0aCA6IHRoaXMucGFnZS5wYWdlU2l6ZTtcbiAgfVxuXG4gIGdldCBwYWdlTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IHRoaXMuZGF0YUxlbmd0aCA6IHRoaXMucGFnZS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRvcigpIHtcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UuZW1pdCh0aGlzLnBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRhdGFMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmRhdGE/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc2hvd0FsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3VzZUFzeW5jICYmICF0aGlzLnBhZ2luYXRpb25FbmFibGVkO1xuICB9XG5cbiAgLyoqIElOSVQgU1RBVEUgKi9cblxuICBwcml2YXRlIGluaXRTdGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBvbmx5IHNldCBkZWZhdWx0IHNvcnQgaWYgdGhlcmUgaXMgbm8gb3RoZXIgc29ydCBwZXJzaXN0ZWRcbiAgICBpZiAoISF0aGlzLmRlZmF1bHRTb3J0ICYmICF0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkU29ydCh0aGlzLmlkKT8uZGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNldFNvcnQodGhpcy5kZWZhdWx0U29ydCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdFNvcnQpIHtcbiAgICAgIHRoaXMuaW5pdFNvcnRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0RmlsdGVyKSB7XG4gICAgICB0aGlzLmluaXRGaWx0ZXJTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0UGFnZVNpemUpIHtcbiAgICAgIHRoaXMuaW5pdFBhZ2luYXRvclN0YXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTb3J0U3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLmxvYWRTb3J0KHRoaXMuaWQpO1xuICAgIGlmICghIXNvcnQpIHtcbiAgICAgIHRoaXMuc2V0U29ydChzb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNvcnQoc29ydDogU29ydCk6IHZvaWQge1xuICAgIHRoaXMuX3NvcnQuYWN0aXZlID0gc29ydC5hY3RpdmU7XG4gICAgdGhpcy5fc29ydC5kaXJlY3Rpb24gPSBzb3J0LmRpcmVjdGlvbjtcbiAgICB0aGlzLl9zb3J0LnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZpbHRlclN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLmxvYWRGaWx0ZXIodGhpcy5pZCk7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlRmlsdGVyYWJsZXMoZmlsdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBhZ2luYXRvclN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkUGFnZVNpemUodGhpcy5pZCkgfHwgdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGxlbmd0aDogMCxcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVQYWdpbmF0b3IoKTtcbiAgfVxuXG4gIC8qKiBDT0xVTU4gSEFORExJTkcgKi9cblxuICBwdWJsaWMgb25WaWV3RGVmaW5pdGlvbihkZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5EZWZpbml0aW9uID0gZGVmaW5pdGlvbjtcbiAgICB0aGlzLnZpZXdEZWZpbml0aW9uQ2hhbmdlRXZlbnQuZW1pdChkZWZpbml0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbHVtblNldHRpbmdzKGRlZmluaXRpb24/OiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24gPSBkZWZpbml0aW9uID8gZGVmaW5pdGlvbiA6IHRoaXMuX2FsbENvbHVtbkRlZmluaXRpb25zWzBdO1xuICAgIGlmICh0aGlzLl9hbGxBdmFpbGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBubyBjb21wbGV0ZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbG9hZGVkIHlldCBzZW5kIGFuIGV2ZW50IHNvIHRoZSBhcHAgY2FuIGxvYWQgaXRcbiAgICAgIHRoaXMuYWxsQ29sdW1uc0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiAmJiB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24uaWQgPT09IGRlZmluaXRpb24uaWQ7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Db2x1bW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dEYXRhOiBEYXRhVGFibGVEaWFsb2dEYXRhID0ge1xuICAgICAgYWxsQ29sdW1uczogdGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIGRlZmluaXRpb246IHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbixcbiAgICAgIGRlbGV0ZURlZmluaXRpb25BbGxvd2VkOiB0aGlzLmRlbGV0ZURlZmluaXRpb25BbGxvd2VkLFxuICAgICAgZmlsdGVyQ29sdW1uc0xhYmVsOiB0aGlzLmZpbHRlckNvbHVtbnNMYWJlbCxcbiAgICAgIGZpbHRlckNvbHVtbnNQbGFjZUhvbGRlcjogdGhpcy5maWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIsXG4gICAgICBub0RhdGFUZXh0OiB0aGlzLm5vRGF0YVRleHQsXG4gICAgICB0aXRsZUxhYmVsOiB0aGlzLmNvbHVtblNldHRpbmdzTW9kYWxUaXRsZUxhYmVsLFxuICAgICAgc2VsZWN0ZWRMYWJlbDogdGhpcy5zZWxlY3RlZExhYmVsLFxuICAgICAgYXZhaWxhYmxlTGFiZWw6IHRoaXMuYXZhaWxhYmxlTGFiZWwsXG4gICAgICBzYXZlTGFiZWw6IHRoaXMuc2F2ZUxhYmVsLFxuICAgICAgZGVsZXRlTGFiZWw6IHRoaXMuZGVsZXRlTGFiZWwsXG4gICAgICBjYW5jZWxMYWJlbDogdGhpcy5jYW5jZWxMYWJlbCxcbiAgICAgIGluZm9UZXh0TGFiZWw6IHRoaXMuaW5mb1RleHRMYWJlbCxcbiAgICB9O1xuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMubWF0RGlhbG9nLm9wZW4oRGF0YVRhYmxlQ29sdW1uc01vZGFsQ29tcG9uZW50LCB7IGRhdGE6IGRpYWxvZ0RhdGEgfSk7XG4gICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIC8vIG5vIGV2ZW50IG9uIENBTkNFTFxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudC5lbWl0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgZGF0YS1jeT1cInRhYmxlLWFjdGlvbi1iYXJcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtYWN0aW9uLWJhclwiPlxuICA8IS0tIFRhYmxlIGFjdGlvbnM6IGRpc3BsYXllZCBiZWZvcmUgdGhlIHRhYmxlIC0tPlxuICA8ZGl2ICpuZ0lmPVwidGFibGVBY3Rpb25zPy5sZW5ndGggfHwgKGZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnICYmIHNob3dEZWxldGVGaWx0ZXJBY3Rpb24pXCI+XG4gICAgPG1hZC1idXR0b24tZ3JvdXAgKm5nRm9yPVwibGV0IGFjdGlvbkdyb3VwIG9mIHRhYmxlQWN0aW9uc1wiIGNsYXNzPVwidGFibGUtYWN0aW9uLWdyb3VwXCI+XG4gICAgICA8bWFkLW91dGxpbmUtYnV0dG9uXG4gICAgICAgIFtoaWRkZW5dPVwiaXNIaWRkZW4odGFibGVBY3Rpb24pXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQodGFibGVBY3Rpb24pXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHRhYmxlQWN0aW9uIG9mIGFjdGlvbkdyb3VwXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQWN0aW9uRXZlbnQodGFibGVBY3Rpb24pXCJcbiAgICAgID5cbiAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKHRhYmxlQWN0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IHRhYmxlQWN0aW9uLmxhYmVsIH19XG4gICAgICAgIHt7IGdldFNlbGVjdGVkQ291bnQodGFibGVBY3Rpb24udHlwZSkgfX1cbiAgICAgIDwvbWFkLW91dGxpbmUtYnV0dG9uPlxuICAgIDwvbWFkLWJ1dHRvbi1ncm91cD5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJNb2RlID09PSAnQ09MVU1OX0JBU0VEJyAmJiBzaG93RGVsZXRlRmlsdGVyQWN0aW9uXCI+XG4gICAgPG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiIGNsYXNzPVwiZGVsZXRlLWZpbHRlci1hY3Rpb25cIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25EZWxldGVGaWx0ZXIoKVwiXG4gICAgICA+ZmlsdGVyX2FsdF9vZmY8L21hdC1pY29uXG4gICAgPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG1hdC1mb3JtLWZpZWxkIGRhdGEtY3k9XCJmaWx0ZXItaW5wdXRcIiAqbmdJZj1cImZpbHRlck1vZGUgPT09ICdUQUJMRV9CQVNFRCdcIj5cbiAgICA8bWF0LWxhYmVsPnt7IHRyYW5zbGF0ZUxhYmVscyA/IChmaWx0ZXJMYWJlbCB8IHRyYW5zbGF0ZSkgOiBmaWx0ZXJMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCBtYXRJbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiAoa2V5dXApPVwib25UYWJsZUJhc2VkRmlsdGVyRXZlbnQoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwie3sgZmlsdGVyUGxhY2Vob2xkZXIgfX1cIiAvPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG5cbjwhLS0gUm93IGFjdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICNyb3dBY3Rpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQgbGV0LWVsZW1lbnQ9XCJlbGVtZW50XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93QWN0aW9uIG9mIHJvd0FjdGlvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgZGF0YS1jeT1cInJvdy1hY3Rpb24tbWVudS1idXR0b25cIlxuICAgICAgICAqbmdJZj1cIiFpc0hpZGRlbihyb3dBY3Rpb24pXCJcbiAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgICAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQsIHJvd0FjdGlvbilcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChyb3dBY3Rpb24pXCJcbiAgICAgID5cbiAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKHJvd0FjdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiByb3dBY3Rpb24ubGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBlZGl0YWJsZSBkZWZpbml0aW9uIG1lbnUgLS0+XG48bWF0LW1lbnUgI2VkaXRhYmxlRGVmaW5pdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zXCJcbiAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgIGNsYXNzPVwicm93LWFjdGlvblwiXG4gICAgICAoY2xpY2spPVwib25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uKVwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdhY3RpdmUtY29sdW1uLWRlZmluaXRpb24nOiBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb24pIH1cIlxuICAgID5cbiAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChkZWZpbml0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGRlZmluaXRpb24ubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gdmlld2FibGUgZGVmaW5pdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICN2aWV3YWJsZURlZmluaXRpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IGRlZmluaXRpb24gb2Ygdmlld2FibGVDb2x1bW5EZWZpbml0aW9uc1wiXG4gICAgICBtYXQtbWVudS1pdGVtXG4gICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgKGNsaWNrKT1cIm9uVmlld0RlZmluaXRpb24oZGVmaW5pdGlvbilcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLWNvbHVtbi1kZWZpbml0aW9uJzogaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uKSB9XCJcbiAgICA+XG4gICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoZGVmaW5pdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBkZWZpbml0aW9uLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48IS0tIFRhYmxlIC0tPlxuPGRpdlxuICAqbmdJZj1cImZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnIHx8IHNob3dFbXB0eVRhYmxlIHx8ICEhZGF0YVNvdXJjZS5maWx0ZXJlZERhdGE/Lmxlbmd0aDsgZWxzZSBub0RhdGFcIlxuICBjbGFzcz1cImRhdGF0YWJsZVwiXG4gIFtjbGFzc109XCJ0YWJsZUNsYXNzXCJcbj5cbiAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtc3Bpbm5lci13cmFwcGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG4gIDx0YWJsZVxuICAgIFtpZF09XCJpZFwiXG4gICAgbWF0LXRhYmxlXG4gICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgbWF0U29ydFxuICAgIChtYXRTb3J0Q2hhbmdlKT1cIm9uU29ydGluZ0V2ZW50KCRldmVudClcIlxuICAgIG1hZEZpbHRlclxuICAgIChtYWRGaWx0ZXJDaGFuZ2UpPVwib25Db2x1bW5CYXNlZEZpbHRlckV2ZW50KCRldmVudClcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwiISFleHBhbmRhYmxlRGVmXCJcbiAgPlxuICAgIDwhLS0gUm93IGFjdGlvbnMgY29sdW1uLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIkFDVElPTl9DT0xVTU5fTkFNRVwiPlxuICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtuZ0NsYXNzXT1cInNob3dBY3Rpb25Db2x1bW4gPyAncm93LWFjdGlvbi1jZWxsJyA6ICduby1hY3Rpb24tY2VsbCdcIj5cbiAgICAgICAgPCEtLSBCQVRDSDogbWFzdGVyIGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJyAmJiBzZWxlY3Rpb25Nb2RlID09PSAnQkFUQ0gnXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCJvblRvZ2dsZVNlbGVjdEFsbCgpXCIgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIj4gPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNJTkdMRSAvIE5PTkU6IG5vdGhpbmcgaW4gaGVhZGVyIHJvdyAtLT5cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFtuZ0NsYXNzXT1cInNob3dBY3Rpb25Db2x1bW4gPyAncm93LWFjdGlvbi1jZWxsJyA6ICduby1hY3Rpb24tY2VsbCdcIj5cbiAgICAgICAgPCEtLSBCQVRDSDogcm93IGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NoZWNrYm94KGVsZW1lbnQpXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIChjbGljayk9XCJvblJvd0V2ZW50KCRldmVudCwgZWxlbWVudClcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibm8tcG9pbnRlci1ldmVudHNcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGVsZW1lbnQucm93SWQpXCI+IDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTSU5HTEU6IHJvdyBhY3Rpb24gbWVudSBpY29uIC0tPlxuICAgICAgICA8bWFkLWljb24tYnV0dG9uIGRhdGEtY3k9XCJyb3ctYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgKm5nSWY9XCJzaG93Um93QWN0aW9uSWNvbihlbGVtZW50KSAmJiBoYXNWaXNpYmxlUm93QWN0aW9ucyhlbGVtZW50KVwiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7IGVsZW1lbnQ6IGVsZW1lbnQgfVwiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInJvd0FjdGlvbk1lbnVcIlxuICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdGlvbkV2ZW50KGVsZW1lbnQucm93SWQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICAgICAgPCEtLSBTSU5HTEU6IHJvdyByYWRpbyBidXR0b24gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93UmFkaW9CdXR0b24oZWxlbWVudClcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCIgKGNsaWNrKT1cIm9uUm93RXZlbnQoJGV2ZW50LCBlbGVtZW50KVwiPlxuICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVwibm8tcG9pbnRlci1ldmVudHNcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGVsZW1lbnQucm93SWQpXCI+IDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRVhQQU5EQUJMRTogcm93IGlzIGV4cGFuZGFibGUvY29sbGFwc2FibGUgLS0+XG4gICAgICAgIDxtYWQtaWNvbi1idXR0b24gKm5nSWY9XCJzaG93RXhwYW5kYWJsZUJ1dHRvbihlbGVtZW50KVwiIChjbGljayk9XCJvbkV4cGFuZCgkZXZlbnQsIGVsZW1lbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZXhwYW5kZWRFbGVtZW50ICE9PSBlbGVtZW50XCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZXhwYW5kZWRFbGVtZW50ID09PSBlbGVtZW50XCI+a2V5Ym9hcmRfYXJyb3dfdXA8L21hdC1pY29uPlxuICAgICAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICAgICAgPCEtLSBOT05FOiBub3RoaW5nIC0tPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIENlbGwgZGVmaW5pdGlvbnMgYW5kIHJvd3Mgd2l0aCBpbmplY3RlZCBjZWxscyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLmlkXCI+XG4gICAgICA8IS0tIGhlYWRlciBjZWxsIHRvIGJlIGluamVjdGVkIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZ2V0RGF0YVRhYmxlSGVhZGVyVHlwZShjb2x1bW4pXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidTT1JUJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgICAgIG1hdC1zb3J0LWhlYWRlcj1cInt7IGNvbHVtbi5vcmRlckJ5TmFtZSA/IGNvbHVtbi5vcmRlckJ5TmFtZSA6IGNvbHVtbi5kYXRhUHJvcGVydHlOYW1lIH19XCJcbiAgICAgICAgICAgIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZCA/ICdiZWZvcmUnIDogJ2FmdGVyJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0ZJTFRFUidcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgICAgICBtYWQtZmlsdGVyLWhlYWRlcj1cInt7IGNvbHVtbi5kYXRhUHJvcGVydHlOYW1lIH19XCJcbiAgICAgICAgICAgIFttYWRGaWx0ZXJDb2x1bW5SaWdodEFsaWduZWRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgICAgIFttYWRGaWx0ZXJPcHRpb25zXT1cImNvbHVtbi5maWx0ZXJQYXJhbXM/LmZpbHRlck9wdGlvbnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChjb2x1bW4ubGFiZWwgfCB0cmFuc2xhdGUpIDogY29sdW1uLmxhYmVsIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidTT1JUX0FORF9GSUxURVInXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgbWF0LXNvcnQtaGVhZGVyPVwie3sgY29sdW1uLm9yZGVyQnlOYW1lID8gY29sdW1uLm9yZGVyQnlOYW1lIDogY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkID8gJ2JlZm9yZScgOiAnYWZ0ZXInXCJcbiAgICAgICAgICAgIG1hZC1maWx0ZXItaGVhZGVyPVwie3sgY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW21hZEZpbHRlckNvbHVtblJpZ2h0QWxpZ25lZF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgW21hZEZpbHRlck9wdGlvbnNdPVwiY29sdW1uLmZpbHRlclBhcmFtcz8uZmlsdGVyT3B0aW9uc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIj5cbiAgICAgICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChjb2x1bW4ubGFiZWwgfCB0cmFuc2xhdGUpIDogY29sdW1uLmxhYmVsIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBkYXRhIGNlbGwgdG8gYmUgaW5qZWN0ZWQgLS0+XG4gICAgICA8dGRcbiAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiXG4gICAgICAgIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgIFtjbGFzcy5tYWQtZHQtY2hpbGQtY2VsbF09XCJlbGVtZW50LnBhcmVudElkXCJcbiAgICAgICAgW25nU3dpdGNoXT1cImNvbHVtbi50cmFuc2Zvcm1lclwiXG4gICAgICAgIChjbGljayk9XCIhZGlzYWJsZVJvd0NsaWNrICYmIG9uUm93RXZlbnQoJGV2ZW50LCBlbGVtZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgZ2V0Q3VzdG9tQ2VsbFRlbXBsYXRlKGNvbHVtbi5pZCkgfHwgZGVmYXVsdENlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4sIGVsZW1lbnQ6IGVsZW1lbnQsICRpbXBsaWNpdDogZWxlbWVudCB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgcm93IGlzIG1hZGUgdXAgb2YgdGhpcyBvbmUgY29sdW1uIHRoYXQgc3BhbnMgYWNyb3NzIGFsbCBjb2x1bW5zIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWV4cGFuZGFibGVEZWZcIiBbbWF0Q29sdW1uRGVmXT1cImV4cGFuZGFibGVDb2x1bW5EZWZcIj5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5zLmxlbmd0aCArIDFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhLXRhYmxlLWV4cGFuZGFibGUtYXJlYVwiIFtAZGV0YWlsRXhwYW5kXT1cImVsZW1lbnQgPT09IGV4cGFuZGVkRWxlbWVudCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIGdldEN1c3RvbUV4cGFuZGFibGVUZW1wbGF0ZSgpIHx8IGRlZmF1bHRDZWxsVGVtcGxhdGU7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgY29sdW1uOiBlbGVtZW50LCBlbGVtZW50OiBlbGVtZW50LCAkaW1wbGljaXQ6IGVsZW1lbnQgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gaGVhZGVyIHJvdyB3aGVyZSBjZWxscyB3aWxsIGJlIGluamVjdGVkIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzXCI+PC90cj5cbiAgICA8IS0tIGRhdGEgcm93IHdoZXJlIGNlbGxzIHdpbGwgYmUgaW5qZWN0ZWQgLS0+XG4gICAgPHRyXG4gICAgICBtYXQtcm93XG4gICAgICBbY2xhc3MuY2xpY2thYmxlLXRhYmxlLXJvd109XCIhcm93LnBhcmVudElkICYmIHNlbGVjdGlvbkVtaXRNb2RlICE9PSAnTk9ORSdcIlxuICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbklkc1wiXG4gICAgICAoY2xpY2spPVwib25FeHBhbmQoJGV2ZW50LCByb3cpXCJcbiAgICA+PC90cj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISFleHBhbmRhYmxlRGVmXCI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IFtleHBhbmRhYmxlQ29sdW1uRGVmXVwiIGNsYXNzPVwibWFkLWRhdGEtdGFibGUtZXhwYW5kYWJsZS1yb3dcIj48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbWF0Tm9EYXRhUm93PlxuICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGwgbm9EYXRhVGV4dCBjb2x1bW5CYXNlZEZpbHRlclwiIFthdHRyLmNvbHNwYW5dPVwiY29sdW1uSWRzLmxlbmd0aFwiPlxuICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAobm9EYXRhVGV4dCB8IHRyYW5zbGF0ZSkgOiBub0RhdGFUZXh0IH19XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGFibGU+XG48L2Rpdj5cbjxkaXYgZGF0YS1jeT1cInRhYmxlLWJvdHRvbS1hcmVhXCIgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1ib3R0b20tYXJlYVwiPlxuICA8ZGl2IGRhdGEtY3k9XCJkZWZpbml0aW9uLWJ1dHRvbi1ibG9ja1wiIGNsYXNzPVwibWFkLWRhdGEtdGFibGUtYm90dG9tLWluZm8tYXJlYVwiPlxuICAgIDwhLS0gY29sdW1uIHNldHRpbmdzOiAxIGRlZmluaXRpb24gLS0+XG4gICAgPG1hZC1pY29uLWJ1dHRvbiAqbmdJZj1cImVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCA9PT0gMVwiIChjbGljayk9XCJvbkNvbHVtblNldHRpbmdzKClcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgIDwhLS0gY29sdW1uIHNldHRpbmdzOiBtdWx0aXBsZSBkZWZpbml0aW9ucyAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uICpuZ0lmPVwiKGVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCB8fCAwKSA+IDBcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZWRpdGFibGVEZWZpbml0aW9uTWVudVwiPlxuICAgICAgPG1hdC1pY29uPnZpZXdfY29sdW1uPC9tYXQtaWNvbj5cbiAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICA8IS0tIGNvbHVtbiB2aWV3OiBtdWx0aXBsZSBkZWZpbml0aW9ucyAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uICpuZ0lmPVwiKHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCB8fCAwKSA+IDBcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidmlld2FibGVEZWZpbml0aW9uTWVudVwiPlxuICAgICAgPG1hdC1pY29uPnByZXZpZXc8L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gIDxtYXQtcGFnaW5hdG9yXG4gICAgW3N0eWxlLmRpc3BsYXldPVwicGFnaW5hdGlvbkVuYWJsZWQgPyAnYmxvY2snIDogJ25vbmUnXCJcbiAgICBbbGVuZ3RoXT1cInBhZ2VMZW5ndGhcIlxuICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAocGFnZSk9XCJvblBhZ2VFdmVudCgkZXZlbnQpXCJcbiAgICBzaG93Rmlyc3RMYXN0QnV0dG9uc1xuICA+XG4gIDwvbWF0LXBhZ2luYXRvcj5cbjwvZGl2PlxuXG48IS0tIE5vIGRhdGEgYWxlcnQgLS0+XG48bmctdGVtcGxhdGUgI25vRGF0YT5cbiAgPGRpdiBkYXRhLWN5PVwibm8tZGF0YS1ibG9ja1wiIGNsYXNzPVwibm9EYXRhVGV4dFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLXNwaW5uZXItd3JhcHBlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAobm9EYXRhVGV4dCB8IHRyYW5zbGF0ZSkgOiBub0RhdGFUZXh0IH19XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBkZWZhdWx0IGNlbGwgdGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRDZWxsVGVtcGxhdGUgbGV0LWVsZW1lbnQ9XCJlbGVtZW50XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8c3Bhbj5cbiAgICB7eyBlbGVtZW50W2NvbHVtbi5kYXRhUHJvcGVydHlOYW1lXSB9fVxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIGN1c3RvbSBjZWxsIHRlbXBsYXRlcyBpbmplY3RlZCBmcm9tIHBhcmVudCAtLT5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==
765
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUdMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFJTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQVUvRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFJbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FB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LE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csMkJBQTJCO3NCQUFwQyxNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFFa0IsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUVDLE9BQU87c0JBQTlCLFNBQVM7dUJBQUMsT0FBTztnQkFJVSxNQUFNO3NCQUFqQyxTQUFTO3VCQUFDLGVBQWU7Z0JBR3RCLFVBQVU7c0JBRGIsZUFBZTt1QkFBQyxpQ0FBaUM7Z0JBVzlDLGFBQWE7c0JBRGhCLFlBQVk7dUJBQUMseUNBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZSwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRNb2R1bGUsIFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1hY3Rpb24nO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbnNNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW5zLW1vZGFsL2RhdGEtdGFibGUtY29sdW1ucy1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbixcbiAgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZSxcbiAgRGF0YVRhYmxlRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtY29sdW1uLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgRGF0YVRhYmxlUm93IH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtcm93JztcbmltcG9ydCB7IERhdGFUYWJsZUhlYWRlclR5cGUgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1oZWFkZXItdHlwZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJNb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtZmlsdGVyLW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci1vYmplY3QnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1zZWxlY3Rpb24tZW1pdC10eXBlJztcbmltcG9ydCB7IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLWVtaXQtbW9kZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVTZWxlY3Rpb25Nb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU29ydFV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1zb3J0LXV0aWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQWN0aW9uVXRpbCB9IGZyb20gJy4vdXRpbC9kYXRhLXRhYmxlLWFjdGlvbi11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZURhdGFVdGlsIH0gZnJvbSAnLi91dGlsL2RhdGEtdGFibGUtZGF0YS11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZUZpbHRlclV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1maWx0ZXItdXRpbCc7XG5pbXBvcnQge1xuICBEQVRBX1RBQkxFX1BFUlNJU1RFTkNFX1NFUlZJQ0VfUFJPVklERVIsXG4gIERhdGFUYWJsZVBlcnNpc3RlbmNlU2VydmljZSxcbiAgTUFEX0RBVEFfVEFCTEVfUEVSU0lTVEVOQ0VfU0VSVklDRSxcbn0gZnJvbSAnLi9kYXRhLXRhYmxlLXBlcnNpc3RlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTUFEX0RBVEFfVEFCTEVfR0xPQkFMX0NPTkZJR1VSQVRJT04sXG4gIERhdGFUYWJsZUdsb2JhbENvbmZpZ3VyYXRpb24sXG4gIE1BRF9EQVRBX1RBQkxfR0xPQkFMX0NPTkZJR1VSQVRJT05fUFJPVklERVIsXG59IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWdsb2JhbC1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLm1vZHVsZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJIZWFkZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtZmlsdGVyL2RhdGEtdGFibGUtZmlsdGVyLWhlYWRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtY29sdW1uLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlQ2VsbERlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUvZGF0YS10YWJsZS10ZW1wbGF0ZS1jZWxsLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtZXhwYW5kYWJsZS1jZWxsLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNvbHVtbkRlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUvZGF0YS10YWJsZS10ZW1wbGF0ZS1leHBhbmRhYmxlLWNvbHVtbi1kZWZpbml0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVQZXJzaXN0ZW5jZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1wZXJzaXN0ZW5jZS1jb25maWd1cmF0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWFkLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQsdm9pZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcbiAgICBNYXRTb3J0TW9kdWxlLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdEJhZGdlTW9kdWxlLFxuICAgIERyYWdEcm9wTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIERhdGFUYWJsZUZpbHRlckhlYWRlcixcbiAgICBEYXRhVGFibGVGaWx0ZXIsXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uLFxuICAgIERhdGFUYWJsZVRlbXBsYXRlQ2VsbERlZmluaXRpb24sXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ29sdW1uRGVmaW5pdGlvbixcbiAgICBEYXRhVGFibGVUZW1wbGF0ZUV4cGFuZGFibGVDZWxsRGVmaW5pdGlvbixcbiAgXSxcbiAgcHJvdmlkZXJzOiBbREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFX1BST1ZJREVSLCBNQURfREFUQV9UQUJMX0dMT0JBTF9DT05GSUdVUkFUSU9OX1BST1ZJREVSXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcblxuICAvLyBUcmFuc2xhdGlvbnNcbiAgQElucHV0KCkgZmlsdGVyTGFiZWwgPSAnY29tbW9uLmZpbHRlcic7XG4gIEBJbnB1dCgpIGZpbHRlclBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNMYWJlbCA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIgPSAnRmlsdGVyIGF2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgc2hvd0VtcHR5VGFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbm9EYXRhVGV4dCA9ICdObyBtYXRjaGluZyBkYXRhIGZvdW5kJztcbiAgQElucHV0KCkgY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwgPSAnQ29sdW1uIHNldHRpbmdzJztcbiAgQElucHV0KCkgc2VsZWN0ZWRMYWJlbCA9ICdTZWxlY3RlZCBjb2x1bW5zJztcbiAgQElucHV0KCkgYXZhaWxhYmxlTGFiZWwgPSAnQXZhaWxhYmxlIGNvbHVtbnMnO1xuICBASW5wdXQoKSBzYXZlTGFiZWwgPSAnU2F2ZSc7XG4gIEBJbnB1dCgpIGRlbGV0ZUxhYmVsID0gJ0RlbGV0ZSc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIGluZm9UZXh0TGFiZWwgPSAnRHJhZyBhbmQgZHJvcCBhIGNvbHVtbiB0byBzZWxlY3Qgb3IgcmVvcmRlciBpdC4nO1xuICBASW5wdXQoKSB0YWJsZUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgdHJhbnNsYXRlTGFiZWxzID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzZXQgdXNlQXN5bmModXNlQXN5bmM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91c2VBc3luYyA9IHVzZUFzeW5jO1xuICAgIHRoaXMuYXBwbHlTb3J0RGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIFBsZWFzZSB1c2UgdGhlIG1vcmUgc3BlY2lmaWMgcGVyc2lzdGVuY2VDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IHN0YXRlZnVsKHN0YXRlZnVsOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZUNvbmZpZyA9IHtcbiAgICAgIHBlcnNpc3RTb3J0OiBzdGF0ZWZ1bCxcbiAgICAgIHBlcnNpc3RGaWx0ZXI6IHN0YXRlZnVsLFxuICAgICAgcGVyc2lzdFBhZ2VTaXplOiBzdGF0ZWZ1bCxcbiAgICB9O1xuICB9XG5cbiAgQElucHV0KCkgcGVyc2lzdGVuY2VDb25maWc6IERhdGFUYWJsZVBlcnNpc3RlbmNlQ29uZmlndXJhdGlvbiA9IHtcbiAgICBwZXJzaXN0U29ydDogZmFsc2UsXG4gICAgcGVyc2lzdEZpbHRlcjogZmFsc2UsXG4gICAgcGVyc2lzdFBhZ2VTaXplOiBmYWxzZSxcbiAgfTtcblxuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdGFibGVEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGlkR2VuZXJhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIHBhcmVudElkR2VuZXJhdG9yOiBhbnk7XG5cbiAgQElucHV0KCkgZGVmYXVsdFNvcnQ6IFNvcnQ7XG4gIEBJbnB1dCgpIGV4dGVybmFsRmlsdGVyOiBhbnk7XG4gIEBJbnB1dCgpIHBhZ2luYXRpb25FbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhZ2U6IFBhZ2VFdmVudCA9IHsgcGFnZUluZGV4OiAwLCBwYWdlU2l6ZTogNTAsIGxlbmd0aDogMCB9O1xuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnMgPSBbNSwgMTAsIDE1XTtcblxuICBASW5wdXQoKSBhY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3Rpb25FbWl0VHlwZTogRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUgPSAnSUQnO1xuICBASW5wdXQoKSBzaG93RGVsZXRlRmlsdGVyQWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZGlzYWJsZVJvd0NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uKHNlbGVjdGlvbjogc3RyaW5nW10gfCBhbnlbXSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbk1vZGVsKHNlbGVjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogUGxlYXNlIHVzZSBcImZpbHRlck1vZGVcIiBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZmlsdGVyRW5hYmxlZChpc0ZpbHRlckVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9maWx0ZXJNb2RlID0gaXNGaWx0ZXJFbmFibGVkID8gJ1RBQkxFX0JBU0VEJyA6ICdOT05FJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyUHJlZGljYXRlKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZmlsdGVyTW9kZShmaWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlKSB7XG4gICAgdGhpcy5fZmlsdGVyTW9kZSA9IGZpbHRlck1vZGU7XG4gICAgdGhpcy5hcHBseUZpbHRlclByZWRpY2F0ZSgpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlclZhbHVlKGZpbHRlclZhbHVlOiBzdHJpbmcgfCBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9maWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXJWYWx1ZSh0aGlzLl9maWx0ZXJWYWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZXh0ZXJuYWxQYWdpbmF0b3IocGFnaW5hdG9yOiBhbnkpIHtcbiAgICB0aGlzLmV4dFBhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkZWZhdWx0UGFnZVNpemUoZGVmYXVsdFNpemU6IG51bWJlcikge1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIC4uLnRoaXMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiBkZWZhdWx0U2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbkVtaXRNb2RlKHNlbGVjdGlvbkVtaXRNb2RlOiBEYXRhVGFibGVTZWxlY3Rpb25FbWl0TW9kZSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlID0gc2VsZWN0aW9uRW1pdE1vZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogVGhpcyBmdW5jdGlvbiBtaXhlcyB1cCAyIHJlc3BvbnNpYmlsaXRpZXM6XG4gICAqICAtIGRldGVybWluaW5nIGlmIGFjdGlvbnMgc2hvdWxkIGJlIGRpc3BsYXllZCAvIGhhbmRsZWRcbiAgICogIC0gZGV0ZXJtaW5pbmcgd2hldGhlciBhY3Rpb25zIGFyZSByb3cgYmFzZWQgKHNpbmdsZSkgb3IgdGFibGUgYmFzZWQgKGJhdGNoKVxuICAgKiBQbGVhc2UgdXNlIGEgY29tYmluYXRpb24gb2YgXCJzZWxlY3Rpb25FbWl0TW9kZVwiIGFuZCBcInNlbGVjdGlvbk1vZGVcIiBpbnN0ZWFkOlxuICAgKiAgLSBzZWxlY3Rpb25FbWl0TW9kZSBkZXRlcm1pbmVzIGhvdyBzZWxlY3RlZCBpdGVtcyBhcmUgaGFuZGxlZCAoYXMgcGFydCBvZiBhY3Rpb25zLCBhcyBzZWxlY3Rpb25zIG9yIG5vdCBhdCBhbGwpXG4gICAqICAtIHNlbGVjdGlvbk1vZGUgZGV0ZXJtaW5lcyBpZiBzZWxlY3RlZCBpdGVtcyBhcmUgdHJlYXRlZCBzZXBhcmF0ZWx5IChzaW5nbGUpIG9yIHRvZ2V0aGVyIChiYXRjaClcbiAgICovXG4gIEBJbnB1dCgpIHNldCBmb3JjZU1vZGUoc2VsZWN0aW9uTW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdTSU5HTEUnIHx8IHNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCcpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlID0gJ09OX0FDVElPTic7XG4gICAgICB0aGlzLl9mb3JjZVNlbGVjdGlvbk1vZGUgPSA8RGF0YVRhYmxlU2VsZWN0aW9uTW9kZT5zZWxlY3Rpb25Nb2RlO1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZm9yY2VTZWxlY3Rpb25Nb2RlKHNlbGVjdGlvbk1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUpIHtcbiAgICB0aGlzLl9mb3JjZVNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzcGxheWVkQ29sdW1ucyhjb2xzOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIGlmICghdGhpcy5kaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2xzID8gWy4uLmNvbHNdIDogW107XG4gICAgICB0aGlzLmNvbHVtbklkcyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmlkKTtcbiAgICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKGRlZjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbikge1xuICAgIHRoaXMuY29sdW1ucyA9IGRlZi5kaXNwbGF5ZWRDb2x1bW5zO1xuICAgIHRoaXMuY29sdW1uSWRzID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uaWQpO1xuICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiA9IGRlZjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5EZWZpbml0aW9ucyhkZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdKSB7XG4gICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy52aWV3YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy5fYWxsQ29sdW1uRGVmaW5pdGlvbnMgPSBbLi4uZGVmaW5pdGlvbnNdO1xuICAgIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiBkZWZpbml0aW9ucykge1xuICAgICAgaWYgKGRlZmluaXRpb24uZWRpdGFibGUpIHtcbiAgICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zLnB1c2goZGVmaW5pdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5pdGlvbi5kaXNwbGF5ZWRDb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2FibGVDb2x1bW5EZWZpbml0aW9ucy5wdXNoKGRlZmluaXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBhbGxDb2x1bW5zKGFsbENvbHVtbnM6IERhdGFUYWJsZUNvbHVtbltdKSB7XG4gICAgdGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnM7XG4gICAgaWYgKGFsbENvbHVtbnMgJiYgdGhpcy5fc2hvd0NvbHVtbk1vZGFsKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG4gIEBPdXRwdXQoKSBmaWx0ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkPigpO1xuICBAT3V0cHV0KCkgcGFnZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpIGFsbENvbHVtbnNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZT4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZWZpbml0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24+KCk7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICAvLyB3ZSBuZWVkIHRvIGhhdmUgdGhpcyBhcyBhIHNldHRlciBkdWUgdG8gdGhlICpuZ0lmIGl0IGlzIGluXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc2V0IG1hdFNvcnQobWF0U29ydDogTWF0U29ydCkge1xuICAgIHRoaXMuX3NvcnQgPSBtYXRTb3J0O1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5fc29ydDtcbiAgfVxuICBAVmlld0NoaWxkKERhdGFUYWJsZUZpbHRlcikgZmlsdGVyOiBEYXRhVGFibGVGaWx0ZXI7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihEYXRhVGFibGVUZW1wbGF0ZUNvbHVtbkRlZmluaXRpb24pXG4gIHNldCBjb2x1bW5EZWZzKGNvbHVtbkRlZnM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVUZW1wbGF0ZUNvbHVtbkRlZmluaXRpb24+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29sdW1uRGVmcyA9IGNvbHVtbkRlZnM7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgY29sdW1uRGVmcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmcztcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ2VsbERlZmluaXRpb24pXG4gIHNldCBleHBhbmRhYmxlRGVmKGV4cGFuZGFibGVEZWY6IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZXhwYW5kYWJsZURlZiA9IGV4cGFuZGFibGVEZWY7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgZXhwYW5kYWJsZURlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZjtcbiAgfVxuXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnlbXT47XG4gIGFsbFNlbGVjdGVkID0gZmFsc2U7XG5cbiAgZXh0UGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgcmVhZG9ubHkgQUNUSU9OX0NPTFVNTl9OQU1FID0gJ19fYWN0aW9uX18nO1xuICB0YWJsZUFjdGlvbnM6IERhdGFUYWJsZUFjdGlvbltdW10gPSBbXTtcbiAgcm93QWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcblxuICBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICBjb2x1bW5JZHM6IHN0cmluZ1tdO1xuXG4gIGV4cGFuZGVkRWxlbWVudDogRGF0YVRhYmxlQ29sdW1uIHwgbnVsbDtcblxuICBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW107XG4gIHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcblxuICBwcml2YXRlIF91c2VBc3luYzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3Jvd01hcCA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhVGFibGVSb3c+KCk7XG4gIHByaXZhdGUgX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPHN0cmluZz4odHJ1ZSk7XG4gIHByaXZhdGUgX3NlbGVjdGlvbjogc3RyaW5nW10gfCBhbnlbXTtcblxuICBwcml2YXRlIF9zb3J0OiBNYXRTb3J0O1xuXG4gIHByaXZhdGUgX2ZvcmNlU2VsZWN0aW9uTW9kZTogRGF0YVRhYmxlU2VsZWN0aW9uTW9kZTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uRW1pdE1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJWYWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2FsbENvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWxsQXZhaWxhYmxlQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uW107XG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfc2hvd0NvbHVtbk1vZGFsID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY29sdW1uRGVmczogUXVlcnlMaXN0PERhdGFUYWJsZVRlbXBsYXRlQ29sdW1uRGVmaW5pdGlvbj4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2V4cGFuZGFibGVEZWY6IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXG4gICAgQEluamVjdChNQURfREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFKSBwcml2YXRlIHBlcnNpc3RlbmNlU2VydmljZTogRGF0YVRhYmxlUGVyc2lzdGVuY2VTZXJ2aWNlLFxuICAgIEBJbmplY3QoTUFEX0RBVEFfVEFCTEVfR0xPQkFMX0NPTkZJR1VSQVRJT04pIHByaXZhdGUgZGF0YVRhYmxlR2xvYmFsQ29uZmlnOiBEYXRhVGFibGVHbG9iYWxDb25maWd1cmF0aW9uLFxuICApIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuX3NvcnQ7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlTb3J0RGF0YSgpO1xuICAgIHRoaXMuaW5pdFN0YXRlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCd0YWJsZURhdGEnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVRhYmxlRGF0YSgpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlbCh0aGlzLmdldFNlbGVjdGlvbignSUQnKS5sZW5ndGggPyB0aGlzLmdldFNlbGVjdGlvbignSUQnKSA6IHRoaXMuX3NlbGVjdGlvbik7XG4gICAgICBpZiAodGhpcy5zaG93QWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnaWRHZW5lcmF0b3InIGluIGNoYW5nZXMgfHwgJ2Rpc3BsYXllZENvbHVtbnMnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVRhYmxlRGF0YSgpO1xuICAgIH1cblxuICAgIC8vIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHNhbWUgYmVoYXZpb3VyIGNvdWxkIGJlIGFjaGl2ZWQgaW4gZ2V0dGVycylcbiAgICBpZiAoJ2ZvcmNlTW9kZScgaW4gY2hhbmdlcyB8fCAnZm9yY2VTZWxlY3Rpb25Nb2RlJyBpbiBjaGFuZ2VzIHx8ICdhY3Rpb25zJyBpbiBjaGFuZ2VzKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gRGF0YVRhYmxlQWN0aW9uVXRpbC5nZXREaXNwbGF5QWN0aW9ucyh0aGlzLmFjdGlvbnMsIHRoaXMuc2VsZWN0aW9uTW9kZSk7XG4gICAgICB0aGlzLnJvd0FjdGlvbnMgPSBhY3Rpb25zLnJvd0FjdGlvbnM7XG4gICAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IGFjdGlvbnMuZ3JvdXBlZFRhYmxlQWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvKiogVEFCTEUgRElTUExBWSBIQU5ETElORyAqL1xuXG4gIHB1YmxpYyBnZXREYXRhVGFibGVIZWFkZXJUeXBlKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKTogRGF0YVRhYmxlSGVhZGVyVHlwZSB7XG4gICAgaWYgKGNvbHVtbi5pc1NvcnRhYmxlICYmICFjb2x1bW4uaXNGaWx0ZXJhYmxlKSB7XG4gICAgICByZXR1cm4gJ1NPUlQnO1xuICAgIH1cbiAgICBpZiAoIWNvbHVtbi5pc1NvcnRhYmxlICYmIGNvbHVtbi5pc0ZpbHRlcmFibGUpIHtcbiAgICAgIHJldHVybiAnRklMVEVSJztcbiAgICB9XG4gICAgaWYgKGNvbHVtbi5pc1NvcnRhYmxlICYmIGNvbHVtbi5pc0ZpbHRlcmFibGUpIHtcbiAgICAgIHJldHVybiAnU09SVF9BTkRfRklMVEVSJztcbiAgICB9XG4gICAgcmV0dXJuICdQTEFJTic7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tQ2VsbFRlbXBsYXRlKGNvbHVtbklkOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1uRGVmID0gdGhpcy5fY29sdW1uRGVmcz8uZmluZCgoaXQpID0+IGl0Lm1hZENvbHVtbkRlZiA9PT0gY29sdW1uSWQpO1xuICAgIHJldHVybiBjb2x1bW5EZWYgJiYgY29sdW1uRGVmLmNlbGxEZWYgPyBjb2x1bW5EZWYuY2VsbERlZi5nZXRDZWxsVGVtcGxhdGUoKSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tRXhwYW5kYWJsZVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZj8uZ2V0Q2VsbFRlbXBsYXRlKCkgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwYW5kYWJsZUNvbHVtbkRlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZj8uY29sdW1uRGVmLm1hZEV4cGFuZGFibGVDb2x1bW5EZWYgfHwgJyc7XG4gIH1cblxuICBwdWJsaWMgb25FeHBhbmQoZXZlbnQ6IE1vdXNlRXZlbnQsIGVsZW1lbnQ6IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuZXhwYW5kZWRFbGVtZW50ID0gdGhpcy5leHBhbmRlZEVsZW1lbnQgPT09IGVsZW1lbnQgPyBudWxsIDogZWxlbWVudDtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gQlVUVE9OIERJU1BMQVkgSEFORExJTkcgKi9cblxuICBwdWJsaWMgaGFzVmlzaWJsZVJvd0FjdGlvbnMoZGlzcGxheWVkRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJvd0FjdGlvbnMuZXZlcnkoKGFjdGlvbikgPT4gdGhpcy5pc0hpZGRlbkZvckRhdGEoYWN0aW9uLCBbdGhpcy5fcm93TWFwLmdldChkaXNwbGF5ZWREYXRhLnJvd0lkKT8uYWN0dWFsRGF0YV0pKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0hpZGRlbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSGlkZGVuRm9yRGF0YShhY3Rpb24sIHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0hpZGRlbkZvckRhdGEoYWN0aW9uOiBEYXRhVGFibGVBY3Rpb24sIGRhdGE6IGFueVtdKSB7XG4gICAgcmV0dXJuICEhYWN0aW9uLmlzSGlkZGVuICYmIGFjdGlvbi5pc0hpZGRlbihkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGFjdGlvbjogRGF0YVRhYmxlQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uLnR5cGUpIHx8ICghIWFjdGlvbi5pc0Rpc2FibGVkICYmIGFjdGlvbi5pc0Rpc2FibGVkKHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlICdTSU5HTEUnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50ICE9PSAxO1xuICAgICAgY2FzZSAnQkFUQ0gnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50IDwgMTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSAnQkFUQ0gnIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCAoJHtjb3VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWw/LnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKiBUQUJMRSBEQVRBIENIQU5HRSBIQU5ETElORyAqL1xuXG4gIHByaXZhdGUgdXBkYXRlRGF0YVRhYmxlRGF0YSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGltbXV0YWJsZSAtIHdlIGRlc3BhcmF0ZWx5IG5lZWQgdGhlIHJlZmVyZW5jZSBvZiByb3dNYXAgdG8gc3RheSB0aGUgc2FtZVxuICAgIERhdGFUYWJsZURhdGFVdGlsLnVwZGF0ZVJvd01hcCh0aGlzLl9yb3dNYXAsIHRoaXMudGFibGVEYXRhLCB0aGlzLmNvbHVtbnMsIHRoaXMuaWRHZW5lcmF0b3IsIHRoaXMucGFyZW50SWRHZW5lcmF0b3IpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gQXJyYXkuZnJvbSh0aGlzLl9yb3dNYXAudmFsdWVzKCkpLm1hcCgoaXQpID0+IGl0LmRpc3BsYXllZERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb25Nb2RlbChzZWxlY3Rpb246IHN0cmluZ1tdIHwgYW55W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgIHNlbGVjdGlvbj8uZm9yRWFjaCgoaXQpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9yb3dNYXAuZ2V0KGl0KSB8fCBbLi4udGhpcy5fcm93TWFwLnZhbHVlcygpXS5maW5kKChyb3cpID0+IHJvdy5hY3R1YWxEYXRhID09PSBpdCk7XG4gICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25FdmVudChpdGVtLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gJiBTRUxFQ1RJT04gSEFORExJTkcgKi9cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkVtaXRNb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdOT05FJyAmJiAhIXRoaXMuYWN0aW9ucy5sZW5ndGggPyAnT05fQUNUSU9OJyA6IHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUge1xuICAgIHJldHVybiAhIXRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA/IHRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA6IHRoaXMuYWN0aW9ucy5maW5kKChpdCkgPT4gaXQudHlwZSA9PT0gJ0JBVENIJykgPyAnQkFUQ0gnIDogJ1NJTkdMRSc7XG4gIH1cblxuICAvLyBnZXQgZmlsdGVyZWQgJiBzb3J0ZWQgZGF0YSBvZiB0aGUgY3VycmVudCBwYWdlXG4gIHB1YmxpYyBnZXQgZGlzcGxheWVkRGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uX3BhZ2VEYXRhKHRoaXMuZGF0YVNvdXJjZT8uc29ydERhdGEodGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YSwgdGhpcy5kYXRhU291cmNlLnNvcnQpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd0FjdGlvbkNvbHVtbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnTk9ORScgfHwgdGhpcy5oaWRlQWN0aW9uQ29sdW1uKSB8fCAhIXRoaXMuX2V4cGFuZGFibGVEZWY7XG4gIH1cblxuICBwdWJsaWMgc2hvd0NoZWNrYm94KGRpc3BsYXllZERhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGlzcGxheWVkRGF0YS5wYXJlbnRJZCAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCcgJiYgIXRoaXMuaGlkZUFjdGlvbkNvbHVtbjtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Um93QWN0aW9uSWNvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX0FDVElPTicgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJyAmJiAhdGhpcy5oaWRlQWN0aW9uQ29sdW1uO1xuICB9XG5cbiAgcHVibGljIHNob3dSYWRpb0J1dHRvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX1NFTEVDVElPTicgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJztcbiAgfVxuXG4gIHB1YmxpYyBzaG93RXhwYW5kYWJsZUJ1dHRvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgISF0aGlzLl9leHBhbmRhYmxlRGVmO1xuICB9XG5cbiAgcHVibGljIGlzU2VsZWN0ZWQocm93SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvd0lkKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICAvLyBjbGVhciBhbGwgc2VsZWN0aW9uIGZpcnN0XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAvLyB0b2dnbGUgYWxsIGNoZWNrYm94XG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9ICF0aGlzLmFsbFNlbGVjdGVkO1xuICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKSB7XG4gICAgICAvLyBzZWxlY3QgYWxsIHJvd3Mgb2YgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBpZiAoIXJvdy5wYXJlbnRJZCkge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChyb3cucm93SWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgb25BY3Rpb25FdmVudChhY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGVtaXRBY3Rpb24gPSB7IC4uLmFjdGlvbiB9O1xuICAgIGlmICghIWVtaXRBY3Rpb24gJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSAhPT0gJ05PTkUnKSB7XG4gICAgICBlbWl0QWN0aW9uLnNlbGVjdGVkID0gdGhpcy5nZXRTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb25FbWl0VHlwZSk7XG4gICAgICB0aGlzLmFjdGlvbkV2ZW50LmVtaXQoZW1pdEFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU2VsZWN0aW9uRXZlbnQoaWQ6IGFueSk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5zZWxlY3Rpb25Nb2RlKSB7XG4gICAgICBjYXNlICdCQVRDSCc6XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnRvZ2dsZShpZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU0lOR0xFJzpcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlKGlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUm93RXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ05PTkUnIHx8IHJvdz8ucGFyZW50SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uU2VsZWN0aW9uRXZlbnQocm93LnJvd0lkKTtcbiAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb24oZXZlbnQsIGFjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZWZhdWx0QWN0aW9uKCk6IERhdGFUYWJsZUFjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJyA/IHRoaXMucm93QWN0aW9uc1swXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGhpZGVBY3Rpb25Db2x1bW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9BQ1RJT04nICYmIHRoaXMuYWN0aW9ucy5ldmVyeSgoaXQpID0+IGl0LnR5cGUgPT09ICdOT05FJyk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NTZWxlY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQsIGFjdGlvbj86IERhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9BQ1RJT04nICYmXG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdTSU5HTEUnICYmXG4gICAgICAhIWFjdGlvbiAmJlxuICAgICAgIURhdGFUYWJsZUNvbXBvbmVudC5pc0NsaWNrT25Sb3dNZW51SWNvbihldmVudClcbiAgICApIHtcbiAgICAgIHRoaXMub25BY3Rpb25FdmVudChhY3Rpb24pO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnT05fU0VMRUNUSU9OJykge1xuICAgICAgdGhpcy5zZWxlY3Rpb25FdmVudC5lbWl0KHRoaXMuZ2V0U2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uRW1pdFR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGlvbihzZWxlY3Rpb25FbWl0VHlwZTogRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUpOiBhbnlbXSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmZvckVhY2goKGl0KSA9PlxuICAgICAgLy8gaWYgSUQtZ2VuZXJhdG9yIGlzIHByb3ZpZGVkLCByZXR1cm4gdGhlIElELCBlbHNlIHJldHVybiB0aGUgQUNUVUFMIGRhdGFcbiAgICAgIHNlbGVjdGlvbi5wdXNoKHRoaXMuaWRHZW5lcmF0b3IgJiYgc2VsZWN0aW9uRW1pdFR5cGUgPT09ICdJRCcgPyBpdCA6IHRoaXMuX3Jvd01hcC5nZXQoaXQpPy5hY3R1YWxEYXRhKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzQ2xpY2tPblJvd01lbnVJY29uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChldmVudD8udGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXQtaWNvbicpO1xuICB9XG5cbiAgLyoqIFNPUlQgSEFORExJTkcgKi9cblxuICBvblNvcnRpbmdFdmVudChzb3J0OiBTb3J0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RTb3J0KSB7XG4gICAgICB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5zYXZlU29ydCh0aGlzLmlkLCBzb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U29ydERhdGEoKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnREYXRhID0gdGhpcy5fdXNlQXN5bmNcbiAgICAgID8gRGF0YVRhYmxlU29ydFV0aWwuc29ydE5vdGhpbmcoKVxuICAgICAgOiBEYXRhVGFibGVTb3J0VXRpbC5zb3J0RGF0YShbLi4udGhpcy5kYXRhVGFibGVHbG9iYWxDb25maWcuZGF0ZVRpbWVGb3JtYXRdLCB0aGlzLmRhdGFUYWJsZUdsb2JhbENvbmZpZy5udW1iZXJGb3JtYXQpO1xuICB9XG5cbiAgLyoqIEZJTFRFUiBIQU5ETElORyAqL1xuXG4gIHB1YmxpYyBnZXQgZmlsdGVyTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlQXN5bmMgJiYgdGhpcy5fZmlsdGVyTW9kZSA9PT0gJ1RBQkxFX0JBU0VEJyA/ICdOT05FJyA6IHRoaXMuX2ZpbHRlck1vZGU7XG4gIH1cblxuICBwdWJsaWMgb25UYWJsZUJhc2VkRmlsdGVyRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vbkZpbHRlcmluZ0V2ZW50KChldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIG9uQ29sdW1uQmFzZWRGaWx0ZXJFdmVudChmaWx0ZXI6IERhdGFUYWJsZUZpbHRlck9iamVjdCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudChmaWx0ZXIpO1xuICB9XG5cbiAgcHVibGljIG9uRGVsZXRlRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudCh1bmRlZmluZWQpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZUZpbHRlcmFibGVzKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIG9uRmlsdGVyaW5nRXZlbnQoZmlsdGVyOiBzdHJpbmcgfCBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMuZmlsdGVyRXZlbnQuZW1pdChmaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgdGhpcy5hcHBseUZpbHRlclZhbHVlKGZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdEZpbHRlcikge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZUZpbHRlcih0aGlzLmlkLCBmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJQcmVkaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9XG4gICAgICB0aGlzLmZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnXG4gICAgICAgID8gRGF0YVRhYmxlRmlsdGVyVXRpbC5jb2x1bW5CYXNlZEZpbHRlclByZWRpY2F0ZSh0aGlzLl9yb3dNYXApXG4gICAgICAgIDogRGF0YVRhYmxlRmlsdGVyVXRpbC50YWJsZUJhc2VkRmlsdGVyUHJlZGljYXRlKCk7XG4gICAgdGhpcy5hcHBseUZpbHRlclZhbHVlKHRoaXMuX2ZpbHRlclZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgdGhpcy5fZmlsdGVyVmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAhIXZhbHVlID8gKGlzU3RyaW5nID8gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIDogJyc7XG4gIH1cblxuICAvKiogUEFHSU5BVElPTiBIQU5ETElORyAqL1xuXG4gIG9uUGFnZUV2ZW50KGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMucGFnZUV2ZW50LmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RQYWdlU2l6ZSkge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZVBhZ2VTaXplKHRoaXMuaWQsIGV2ZW50LnBhZ2VTaXplKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IDAgOiB0aGlzLnBhZ2UucGFnZUluZGV4O1xuICB9XG5cbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IHRoaXMuZGF0YUxlbmd0aCA6IHRoaXMucGFnZS5wYWdlU2l6ZTtcbiAgfVxuXG4gIGdldCBwYWdlTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IHRoaXMuZGF0YUxlbmd0aCA6IHRoaXMucGFnZS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRvcigpIHtcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UuZW1pdCh0aGlzLnBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRhdGFMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmRhdGE/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc2hvd0FsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3VzZUFzeW5jICYmICF0aGlzLnBhZ2luYXRpb25FbmFibGVkO1xuICB9XG5cbiAgLyoqIElOSVQgU1RBVEUgKi9cblxuICBwcml2YXRlIGluaXRTdGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBvbmx5IHNldCBkZWZhdWx0IHNvcnQgaWYgdGhlcmUgaXMgbm8gb3RoZXIgc29ydCBwZXJzaXN0ZWRcbiAgICBpZiAoISF0aGlzLmRlZmF1bHRTb3J0ICYmICF0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkU29ydCh0aGlzLmlkKT8uZGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNldFNvcnQodGhpcy5kZWZhdWx0U29ydCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdFNvcnQpIHtcbiAgICAgIHRoaXMuaW5pdFNvcnRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0RmlsdGVyKSB7XG4gICAgICB0aGlzLmluaXRGaWx0ZXJTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0UGFnZVNpemUpIHtcbiAgICAgIHRoaXMuaW5pdFBhZ2luYXRvclN0YXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTb3J0U3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLmxvYWRTb3J0KHRoaXMuaWQpO1xuICAgIGlmICghIXNvcnQpIHtcbiAgICAgIHRoaXMuc2V0U29ydChzb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNvcnQoc29ydDogU29ydCk6IHZvaWQge1xuICAgIHRoaXMuX3NvcnQuYWN0aXZlID0gc29ydC5hY3RpdmU7XG4gICAgdGhpcy5fc29ydC5kaXJlY3Rpb24gPSBzb3J0LmRpcmVjdGlvbjtcbiAgICB0aGlzLl9zb3J0LnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZpbHRlclN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLmxvYWRGaWx0ZXIodGhpcy5pZCk7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlRmlsdGVyYWJsZXMoZmlsdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBhZ2luYXRvclN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkUGFnZVNpemUodGhpcy5pZCkgfHwgdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGxlbmd0aDogMCxcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVQYWdpbmF0b3IoKTtcbiAgfVxuXG4gIC8qKiBDT0xVTU4gSEFORExJTkcgKi9cblxuICBwdWJsaWMgb25WaWV3RGVmaW5pdGlvbihkZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5EZWZpbml0aW9uID0gZGVmaW5pdGlvbjtcbiAgICB0aGlzLnZpZXdEZWZpbml0aW9uQ2hhbmdlRXZlbnQuZW1pdChkZWZpbml0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbHVtblNldHRpbmdzKGRlZmluaXRpb24/OiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24gPSBkZWZpbml0aW9uID8gZGVmaW5pdGlvbiA6IHRoaXMuX2FsbENvbHVtbkRlZmluaXRpb25zWzBdO1xuICAgIGlmICh0aGlzLl9hbGxBdmFpbGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBubyBjb21wbGV0ZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbG9hZGVkIHlldCBzZW5kIGFuIGV2ZW50IHNvIHRoZSBhcHAgY2FuIGxvYWQgaXRcbiAgICAgIHRoaXMuYWxsQ29sdW1uc0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiAmJiB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24uaWQgPT09IGRlZmluaXRpb24uaWQ7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Db2x1bW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dEYXRhOiBEYXRhVGFibGVEaWFsb2dEYXRhID0ge1xuICAgICAgYWxsQ29sdW1uczogdGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIGRlZmluaXRpb246IHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbixcbiAgICAgIGRlbGV0ZURlZmluaXRpb25BbGxvd2VkOiB0aGlzLmRlbGV0ZURlZmluaXRpb25BbGxvd2VkLFxuICAgICAgZmlsdGVyQ29sdW1uc0xhYmVsOiB0aGlzLmZpbHRlckNvbHVtbnNMYWJlbCxcbiAgICAgIGZpbHRlckNvbHVtbnNQbGFjZUhvbGRlcjogdGhpcy5maWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIsXG4gICAgICBub0RhdGFUZXh0OiB0aGlzLm5vRGF0YVRleHQsXG4gICAgICB0aXRsZUxhYmVsOiB0aGlzLmNvbHVtblNldHRpbmdzTW9kYWxUaXRsZUxhYmVsLFxuICAgICAgc2VsZWN0ZWRMYWJlbDogdGhpcy5zZWxlY3RlZExhYmVsLFxuICAgICAgYXZhaWxhYmxlTGFiZWw6IHRoaXMuYXZhaWxhYmxlTGFiZWwsXG4gICAgICBzYXZlTGFiZWw6IHRoaXMuc2F2ZUxhYmVsLFxuICAgICAgZGVsZXRlTGFiZWw6IHRoaXMuZGVsZXRlTGFiZWwsXG4gICAgICBjYW5jZWxMYWJlbDogdGhpcy5jYW5jZWxMYWJlbCxcbiAgICAgIGluZm9UZXh0TGFiZWw6IHRoaXMuaW5mb1RleHRMYWJlbCxcbiAgICB9O1xuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMubWF0RGlhbG9nLm9wZW4oRGF0YVRhYmxlQ29sdW1uc01vZGFsQ29tcG9uZW50LCB7IGRhdGE6IGRpYWxvZ0RhdGEgfSk7XG4gICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIC8vIG5vIGV2ZW50IG9uIENBTkNFTFxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudC5lbWl0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgZGF0YS1jeT1cInRhYmxlLWFjdGlvbi1iYXJcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtYWN0aW9uLWJhclwiPlxuICA8IS0tIFRhYmxlIGFjdGlvbnM6IGRpc3BsYXllZCBiZWZvcmUgdGhlIHRhYmxlIC0tPlxuICA8ZGl2ICpuZ0lmPVwidGFibGVBY3Rpb25zPy5sZW5ndGggfHwgKGZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnICYmIHNob3dEZWxldGVGaWx0ZXJBY3Rpb24pXCI+XG4gICAgPG1hZC1idXR0b24tZ3JvdXAgKm5nRm9yPVwibGV0IGFjdGlvbkdyb3VwIG9mIHRhYmxlQWN0aW9uc1wiIGNsYXNzPVwidGFibGUtYWN0aW9uLWdyb3VwXCI+XG4gICAgICA8bWFkLW91dGxpbmUtYnV0dG9uXG4gICAgICAgIFtoaWRkZW5dPVwiaXNIaWRkZW4odGFibGVBY3Rpb24pXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQodGFibGVBY3Rpb24pXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHRhYmxlQWN0aW9uIG9mIGFjdGlvbkdyb3VwXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQWN0aW9uRXZlbnQodGFibGVBY3Rpb24pXCJcbiAgICAgID5cbiAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKHRhYmxlQWN0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IHRhYmxlQWN0aW9uLmxhYmVsIH19XG4gICAgICAgIHt7IGdldFNlbGVjdGVkQ291bnQodGFibGVBY3Rpb24udHlwZSkgfX1cbiAgICAgIDwvbWFkLW91dGxpbmUtYnV0dG9uPlxuICAgIDwvbWFkLWJ1dHRvbi1ncm91cD5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJNb2RlID09PSAnQ09MVU1OX0JBU0VEJyAmJiBzaG93RGVsZXRlRmlsdGVyQWN0aW9uXCI+XG4gICAgPG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiIGNsYXNzPVwiZGVsZXRlLWZpbHRlci1hY3Rpb25cIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25EZWxldGVGaWx0ZXIoKVwiXG4gICAgICA+ZmlsdGVyX2FsdF9vZmY8L21hdC1pY29uXG4gICAgPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG1hdC1mb3JtLWZpZWxkIGRhdGEtY3k9XCJmaWx0ZXItaW5wdXRcIiAqbmdJZj1cImZpbHRlck1vZGUgPT09ICdUQUJMRV9CQVNFRCdcIj5cbiAgICA8bWF0LWxhYmVsPnt7IHRyYW5zbGF0ZUxhYmVscyA/IChmaWx0ZXJMYWJlbCB8IHRyYW5zbGF0ZSkgOiBmaWx0ZXJMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCBtYXRJbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiAoa2V5dXApPVwib25UYWJsZUJhc2VkRmlsdGVyRXZlbnQoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwie3sgZmlsdGVyUGxhY2Vob2xkZXIgfX1cIiAvPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG5cbjwhLS0gUm93IGFjdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICNyb3dBY3Rpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQgbGV0LWVsZW1lbnQ9XCJlbGVtZW50XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93QWN0aW9uIG9mIHJvd0FjdGlvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgZGF0YS1jeT1cInJvdy1hY3Rpb24tbWVudS1idXR0b25cIlxuICAgICAgICAqbmdJZj1cIiFpc0hpZGRlbihyb3dBY3Rpb24pXCJcbiAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgICAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQsIHJvd0FjdGlvbilcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChyb3dBY3Rpb24pXCJcbiAgICAgID5cbiAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKHJvd0FjdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiByb3dBY3Rpb24ubGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBlZGl0YWJsZSBkZWZpbml0aW9uIG1lbnUgLS0+XG48bWF0LW1lbnUgI2VkaXRhYmxlRGVmaW5pdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zXCJcbiAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgIGNsYXNzPVwicm93LWFjdGlvblwiXG4gICAgICAoY2xpY2spPVwib25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uKVwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdhY3RpdmUtY29sdW1uLWRlZmluaXRpb24nOiBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb24pIH1cIlxuICAgID5cbiAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChkZWZpbml0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGRlZmluaXRpb24ubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gdmlld2FibGUgZGVmaW5pdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICN2aWV3YWJsZURlZmluaXRpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IGRlZmluaXRpb24gb2Ygdmlld2FibGVDb2x1bW5EZWZpbml0aW9uc1wiXG4gICAgICBtYXQtbWVudS1pdGVtXG4gICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgKGNsaWNrKT1cIm9uVmlld0RlZmluaXRpb24oZGVmaW5pdGlvbilcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLWNvbHVtbi1kZWZpbml0aW9uJzogaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uKSB9XCJcbiAgICA+XG4gICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoZGVmaW5pdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBkZWZpbml0aW9uLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48IS0tIFRhYmxlIC0tPlxuPGRpdlxuICAqbmdJZj1cImZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnIHx8IHNob3dFbXB0eVRhYmxlIHx8ICEhZGF0YVNvdXJjZS5maWx0ZXJlZERhdGE/Lmxlbmd0aDsgZWxzZSBub0RhdGFcIlxuICBjbGFzcz1cImRhdGF0YWJsZVwiXG4gIFtjbGFzc109XCJ0YWJsZUNsYXNzXCJcbj5cbiAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtc3Bpbm5lci13cmFwcGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG4gIDx0YWJsZVxuICAgIFtpZF09XCJpZFwiXG4gICAgbWF0LXRhYmxlXG4gICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgbWF0U29ydFxuICAgIChtYXRTb3J0Q2hhbmdlKT1cIm9uU29ydGluZ0V2ZW50KCRldmVudClcIlxuICAgIG1hZEZpbHRlclxuICAgIChtYWRGaWx0ZXJDaGFuZ2UpPVwib25Db2x1bW5CYXNlZEZpbHRlckV2ZW50KCRldmVudClcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwiISFleHBhbmRhYmxlRGVmXCJcbiAgPlxuICAgIDwhLS0gUm93IGFjdGlvbnMgY29sdW1uLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIkFDVElPTl9DT0xVTU5fTkFNRVwiPlxuICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtuZ0NsYXNzXT1cInNob3dBY3Rpb25Db2x1bW4gPyAncm93LWFjdGlvbi1jZWxsJyA6ICduby1hY3Rpb24tY2VsbCdcIj5cbiAgICAgICAgPCEtLSBCQVRDSDogbWFzdGVyIGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJyAmJiBzZWxlY3Rpb25Nb2RlID09PSAnQkFUQ0gnXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCJvblRvZ2dsZVNlbGVjdEFsbCgpXCIgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIj4gPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNJTkdMRSAvIE5PTkU6IG5vdGhpbmcgaW4gaGVhZGVyIHJvdyAtLT5cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFtuZ0NsYXNzXT1cInNob3dBY3Rpb25Db2x1bW4gPyAncm93LWFjdGlvbi1jZWxsJyA6ICduby1hY3Rpb24tY2VsbCdcIj5cbiAgICAgICAgPCEtLSBCQVRDSDogcm93IGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NoZWNrYm94KGVsZW1lbnQpXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIChjbGljayk9XCJvblJvd0V2ZW50KCRldmVudCwgZWxlbWVudClcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibm8tcG9pbnRlci1ldmVudHNcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGVsZW1lbnQucm93SWQpXCI+IDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTSU5HTEU6IHJvdyBhY3Rpb24gbWVudSBpY29uIC0tPlxuICAgICAgICA8bWFkLWljb24tYnV0dG9uXG4gICAgICAgICAgZGF0YS1jeT1cInJvdy1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAqbmdJZj1cInNob3dSb3dBY3Rpb25JY29uKGVsZW1lbnQpICYmIGhhc1Zpc2libGVSb3dBY3Rpb25zKGVsZW1lbnQpXCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJEYXRhXT1cInsgZWxlbWVudDogZWxlbWVudCB9XCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwicm93QWN0aW9uTWVudVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0aW9uRXZlbnQoZWxlbWVudC5yb3dJZClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgICAgICA8IS0tIFNJTkdMRTogcm93IHJhZGlvIGJ1dHRvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dSYWRpb0J1dHRvbihlbGVtZW50KVwiIGNsYXNzPVwibWFkLWRhdGF0YWJsZS1jaGVja2JveC1jb250YWluZXJcIiAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQpXCI+XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJuby1wb2ludGVyLWV2ZW50c1wiIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQoZWxlbWVudC5yb3dJZClcIj4gPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBFWFBBTkRBQkxFOiByb3cgaXMgZXhwYW5kYWJsZS9jb2xsYXBzYWJsZSAtLT5cbiAgICAgICAgPG1hZC1pY29uLWJ1dHRvbiAqbmdJZj1cInNob3dFeHBhbmRhYmxlQnV0dG9uKGVsZW1lbnQpXCIgKGNsaWNrKT1cIm9uRXhwYW5kKCRldmVudCwgZWxlbWVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJleHBhbmRlZEVsZW1lbnQgIT09IGVsZW1lbnRcIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJleHBhbmRlZEVsZW1lbnQgPT09IGVsZW1lbnRcIj5rZXlib2FyZF9hcnJvd191cDwvbWF0LWljb24+XG4gICAgICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgICAgICA8IS0tIE5PTkU6IG5vdGhpbmcgLS0+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gQ2VsbCBkZWZpbml0aW9ucyBhbmQgcm93cyB3aXRoIGluamVjdGVkIGNlbGxzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4uaWRcIj5cbiAgICAgIDwhLS0gaGVhZGVyIGNlbGwgdG8gYmUgaW5qZWN0ZWQgLS0+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJnZXREYXRhVGFibGVIZWFkZXJUeXBlKGNvbHVtbilcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1NPUlQnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgbWF0LXNvcnQtaGVhZGVyPVwie3sgY29sdW1uLm9yZGVyQnlOYW1lID8gY29sdW1uLm9yZGVyQnlOYW1lIDogY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkID8gJ2JlZm9yZScgOiAnYWZ0ZXInXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInRklMVEVSJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgICAgIG1hZC1maWx0ZXItaGVhZGVyPVwie3sgY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW21hZEZpbHRlckNvbHVtblJpZ2h0QWxpZ25lZF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgW21hZEZpbHRlck9wdGlvbnNdPVwiY29sdW1uLmZpbHRlclBhcmFtcz8uZmlsdGVyT3B0aW9uc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1NPUlRfQU5EX0ZJTFRFUidcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgICAgICBtYXQtc29ydC1oZWFkZXI9XCJ7eyBjb2x1bW4ub3JkZXJCeU5hbWUgPyBjb2x1bW4ub3JkZXJCeU5hbWUgOiBjb2x1bW4uZGF0YVByb3BlcnR5TmFtZSB9fVwiXG4gICAgICAgICAgICBbYXJyb3dQb3NpdGlvbl09XCJjb2x1bW4uaXNSaWdodEFsaWduZWQgPyAnYmVmb3JlJyA6ICdhZnRlcidcIlxuICAgICAgICAgICAgbWFkLWZpbHRlci1oZWFkZXI9XCJ7eyBjb2x1bW4uZGF0YVByb3BlcnR5TmFtZSB9fVwiXG4gICAgICAgICAgICBbbWFkRmlsdGVyQ29sdW1uUmlnaHRBbGlnbmVkXT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgICAgICBbbWFkRmlsdGVyT3B0aW9uc109XCJjb2x1bW4uZmlsdGVyUGFyYW1zPy5maWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGRhdGEgY2VsbCB0byBiZSBpbmplY3RlZCAtLT5cbiAgICAgIDx0ZFxuICAgICAgICBtYXQtY2VsbFxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCJcbiAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgW2NsYXNzLm1hZC1kdC1jaGlsZC1jZWxsXT1cImVsZW1lbnQucGFyZW50SWRcIlxuICAgICAgICBbbmdTd2l0Y2hdPVwiY29sdW1uLnRyYW5zZm9ybWVyXCJcbiAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlUm93Q2xpY2sgJiYgb25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBnZXRDdXN0b21DZWxsVGVtcGxhdGUoY29sdW1uLmlkKSB8fCBkZWZhdWx0Q2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGNvbHVtbiwgZWxlbWVudDogZWxlbWVudCwgJGltcGxpY2l0OiBlbGVtZW50IH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFeHBhbmRlZCBDb250ZW50IENvbHVtbiAtIFRoZSByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhZXhwYW5kYWJsZURlZlwiIFttYXRDb2x1bW5EZWZdPVwiZXhwYW5kYWJsZUNvbHVtbkRlZlwiPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFkLWRhdGEtdGFibGUtZXhwYW5kYWJsZS1hcmVhXCIgW0BkZXRhaWxFeHBhbmRdPVwiZWxlbWVudCA9PT0gZXhwYW5kZWRFbGVtZW50ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgZ2V0Q3VzdG9tRXhwYW5kYWJsZVRlbXBsYXRlKCkgfHwgZGVmYXVsdENlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGVsZW1lbnQsIGVsZW1lbnQ6IGVsZW1lbnQsICRpbXBsaWNpdDogZWxlbWVudCB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBoZWFkZXIgcm93IHdoZXJlIGNlbGxzIHdpbGwgYmUgaW5qZWN0ZWQgLS0+XG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5JZHNcIj48L3RyPlxuICAgIDwhLS0gZGF0YSByb3cgd2hlcmUgY2VsbHMgd2lsbCBiZSBpbmplY3RlZCAtLT5cbiAgICA8dHJcbiAgICAgIG1hdC1yb3dcbiAgICAgIFtjbGFzcy5jbGlja2FibGUtdGFibGUtcm93XT1cIiFyb3cucGFyZW50SWQgJiYgc2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJ1wiXG4gICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzXCJcbiAgICAgIChjbGljayk9XCJvbkV4cGFuZCgkZXZlbnQsIHJvdylcIlxuICAgID48L3RyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWV4cGFuZGFibGVEZWZcIj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgZWxlbWVudDsgY29sdW1uczogW2V4cGFuZGFibGVDb2x1bW5EZWZdXCIgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1leHBhbmRhYmxlLXJvd1wiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPHRyIGNsYXNzPVwibWF0LXJvd1wiICptYXROb0RhdGFSb3c+XG4gICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbCBub0RhdGFUZXh0IGNvbHVtbkJhc2VkRmlsdGVyXCIgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5JZHMubGVuZ3RoXCI+XG4gICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChub0RhdGFUZXh0IHwgdHJhbnNsYXRlKSA6IG5vRGF0YVRleHQgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90YWJsZT5cbjwvZGl2PlxuPGRpdiBkYXRhLWN5PVwidGFibGUtYm90dG9tLWFyZWFcIiBjbGFzcz1cIm1hZC1kYXRhLXRhYmxlLWJvdHRvbS1hcmVhXCI+XG4gIDxkaXYgZGF0YS1jeT1cImRlZmluaXRpb24tYnV0dG9uLWJsb2NrXCIgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1ib3R0b20taW5mby1hcmVhXCI+XG4gICAgPCEtLSBjb2x1bW4gc2V0dGluZ3M6IDEgZGVmaW5pdGlvbiAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uICpuZ0lmPVwiZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoID09PSAxXCIgKGNsaWNrKT1cIm9uQ29sdW1uU2V0dGluZ3MoKVwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj52aWV3X2NvbHVtbjwvbWF0LWljb24+XG4gICAgPC9tYWQtaWNvbi1idXR0b24+XG4gICAgPCEtLSBjb2x1bW4gc2V0dGluZ3M6IG11bHRpcGxlIGRlZmluaXRpb25zIC0tPlxuICAgIDxtYWQtaWNvbi1idXR0b24gKm5nSWY9XCIoZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoIHx8IDApID4gMFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJlZGl0YWJsZURlZmluaXRpb25NZW51XCI+XG4gICAgICA8bWF0LWljb24+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgIDwhLS0gY29sdW1uIHZpZXc6IG11bHRpcGxlIGRlZmluaXRpb25zIC0tPlxuICAgIDxtYWQtaWNvbi1idXR0b24gKm5nSWY9XCIodmlld2FibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoIHx8IDApID4gMFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ2aWV3YWJsZURlZmluaXRpb25NZW51XCI+XG4gICAgICA8bWF0LWljb24+cHJldmlldzwvbWF0LWljb24+XG4gICAgPC9tYWQtaWNvbi1idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgPG1hdC1wYWdpbmF0b3JcbiAgICBbc3R5bGUuZGlzcGxheV09XCJwYWdpbmF0aW9uRW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgIFtsZW5ndGhdPVwicGFnZUxlbmd0aFwiXG4gICAgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIlxuICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgIChwYWdlKT1cIm9uUGFnZUV2ZW50KCRldmVudClcIlxuICAgIHNob3dGaXJzdExhc3RCdXR0b25zXG4gID5cbiAgPC9tYXQtcGFnaW5hdG9yPlxuPC9kaXY+XG5cbjwhLS0gTm8gZGF0YSBhbGVydCAtLT5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICA8ZGl2IGRhdGEtY3k9XCJuby1kYXRhLWJsb2NrXCIgY2xhc3M9XCJub0RhdGFUZXh0XCI+XG4gICAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtc3Bpbm5lci13cmFwcGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICAgIDwvZGl2PlxuICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChub0RhdGFUZXh0IHwgdHJhbnNsYXRlKSA6IG5vRGF0YVRleHQgfX1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIGRlZmF1bHQgY2VsbCB0ZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUZW1wbGF0ZSBsZXQtZWxlbWVudD1cImVsZW1lbnRcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxzcGFuPlxuICAgIHt7IGVsZW1lbnRbY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWVdIH19XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gY3VzdG9tIGNlbGwgdGVtcGxhdGVzIGluamVjdGVkIGZyb20gcGFyZW50IC0tPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19