@c8y/ngx-components 1021.75.2 → 1021.75.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/common/ApplicationOptions.d.ts +1 -1
- package/core/plugins/plugins.model.d.ts +1 -1
- package/datapoint-explorer/datapoint-explorer.module.d.ts.map +1 -1
- package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts.map +1 -1
- package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts +4 -3
- package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts.map +1 -1
- package/device-protocols/device-protocols.module.d.ts.map +1 -1
- package/ecosystem/packages/package-details/package-details.component.d.ts +2 -2
- package/ecosystem/shared/application-card.component.d.ts +2 -2
- package/ecosystem/shared/ecosystem.constants.d.ts +2 -2
- package/esm2022/core/common/ApplicationOptions.mjs +1 -1
- package/esm2022/core/data-grid/data-grid.component.mjs +3 -3
- package/esm2022/core/plugins/plugins.model.mjs +2 -2
- package/esm2022/datapoint-explorer/datapoint-explorer.module.mjs +62 -6
- package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.component.mjs +2 -1
- package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.service.mjs +13 -16
- package/esm2022/device-protocols/device-protocols.module.mjs +2 -3
- package/esm2022/ecosystem/shared/ecosystem.constants.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +13 -15
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +59 -36
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocols.mjs +1 -2
- package/fesm2022/c8y-ngx-components-device-protocols.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +2 -2
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +3 -3
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +4 -4
- package/locales/es.po +4 -4
- package/locales/fr.po +4 -4
- package/locales/ja_JP.po +4 -4
- package/locales/ko.po +5 -5
- package/locales/locales.pot +2 -119
- package/locales/nl.po +4 -4
- package/locales/pl.po +5 -5
- package/locales/pt_BR.po +4 -4
- package/locales/zh_CN.po +5 -5
- package/locales/zh_TW.po +5 -5
- package/package.json +1 -1
- package/datapoint-explorer/datapoint-explorer-route-factory.d.ts +0 -10
- package/datapoint-explorer/datapoint-explorer-route-factory.d.ts.map +0 -1
- package/esm2022/datapoint-explorer/datapoint-explorer-route-factory.mjs +0 -37
|
@@ -1103,7 +1103,7 @@ export class DataGridComponent {
|
|
|
1103
1103
|
provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
|
|
1104
1104
|
useExisting: forwardRef(() => DataGridComponent)
|
|
1105
1105
|
}
|
|
1106
|
-
], queries: [{ propertyName: "expandableRow", first: true, predicate: ExpandableRowDirective, descendants: true }, { propertyName: "emptyState", first: true, predicate: EmptyStateContextDirective, descendants: true }, { propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "tableRef", first: true, predicate: CdkTable, descendants: true }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"p-relative p-l-4 p-r-16\">\n <span class=\"badge badge-system p-absolute\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i8.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i8.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i8.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i9.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i9.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i9.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i9.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i9.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i9.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i9.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i9.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i9.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i9.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i9.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i9.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i9.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i9.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i10.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i11.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i11.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i11.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i13.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i14.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i15.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i16.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i16.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i16.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i17.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i18.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i19.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i20.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i21.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i22.CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: i23.FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.SlicePipe, name: "slice" }, { kind: "pipe", type: i24.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i25.MapFunctionPipe, name: "map" }, { kind: "pipe", type: i26.FilterMapperPipe, name: "mapToFilterChips" }, { kind: "pipe", type: i27.GroupedFilterChips, name: "groupedFilterChips" }, { kind: "pipe", type: i28.VisibleControlsPipe, name: "visibleControls" }] }); }
|
|
1106
|
+
], queries: [{ propertyName: "expandableRow", first: true, predicate: ExpandableRowDirective, descendants: true }, { propertyName: "emptyState", first: true, predicate: EmptyStateContextDirective, descendants: true }, { propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "tableRef", first: true, predicate: CdkTable, descendants: true }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i8.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i8.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i8.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i9.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i9.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i9.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i9.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i9.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i9.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i9.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i9.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i9.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i9.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i9.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i9.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i9.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i9.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i10.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i11.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i11.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i11.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i13.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i14.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i15.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i16.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i16.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i16.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i17.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i18.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i19.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i20.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i21.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i22.CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: i23.FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.SlicePipe, name: "slice" }, { kind: "pipe", type: i24.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i25.MapFunctionPipe, name: "map" }, { kind: "pipe", type: i26.FilterMapperPipe, name: "mapToFilterChips" }, { kind: "pipe", type: i27.GroupedFilterChips, name: "groupedFilterChips" }, { kind: "pipe", type: i28.VisibleControlsPipe, name: "visibleControls" }] }); }
|
|
1107
1107
|
}
|
|
1108
1108
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, decorators: [{
|
|
1109
1109
|
type: Component,
|
|
@@ -1112,7 +1112,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1112
1112
|
provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
|
|
1113
1113
|
useExisting: forwardRef(() => DataGridComponent)
|
|
1114
1114
|
}
|
|
1115
|
-
], template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"p-relative p-l-4 p-r-16\">\n <span class=\"badge badge-system p-absolute\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
|
|
1115
|
+
], template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
|
|
1116
1116
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
1117
1117
|
type: Optional
|
|
1118
1118
|
}, {
|
|
@@ -1230,4 +1230,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1230
1230
|
type: ViewChild,
|
|
1231
1231
|
args: [CdkTable, { static: false }]
|
|
1232
1232
|
}] } });
|
|
1233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxRQUFRLElBQUksU0FBUyxFQUNyQixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE9BQU8sRUFDUixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNM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TUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBR2hDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxzQkFBc0I7Z0JBR0csZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHckMsVUFBVTtzQkFBbkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBc0VtQixNQUFNO3NCQUFoRSxZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWpELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrSGVhZGVyQ2VsbCwgQ2RrVGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJUmVzdWx0TGlzdCwgUGFnaW5nIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgcGFyc2VJbnQgYXMgX3BhcnNlSW50LFxuICBjYXN0QXJyYXksXG4gIGZsb3csXG4gIGdldCxcbiAgaW5kZXhPZixcbiAgaXNFbXB0eSxcbiAgaXNOaWwsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFVuYXJ5RnVuY3Rpb24sXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZvcmtKb2luLFxuICBpc09ic2VydmFibGUsXG4gIG1lcmdlLFxuICBvZixcbiAgcGlwZVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3RXaXRoLFxuICBjb25jYXRNYXAsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbW1vbi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1jb250ZXh0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IExvYWRNb3JlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9hZE1vcmVNb2RlIH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5tb2RlbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IFBvcG92ZXJDb25maXJtQnV0dG9ucywgUG9wb3ZlckNvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC9wb3BvdmVyLWNvbmZpcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZVxufSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvcHJvZHVjdC1leHBlcmllbmNlLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vYWN0aW9uLWNvbnRyb2xzLWV4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxSZW5kZXJlclNwZWMgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uL2NvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vY3VzdG9tLmNvbHVtbic7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93Q29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vZXhwYW5kYWJsZS1yb3ctY29sdW1uL2V4cGFuZGFibGUuZGF0YS1ncmlkLWNvbHVtbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjLCBGaWx0ZXJpbmdNb2RpZmllciB9IGZyb20gJy4vY29sdW1uL2ZpbHRlcmluZy1mb3JtLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4nO1xuaW1wb3J0IHtcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIERhdGFHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5LFxuICBHcmlkQ29uZmlnQ29udGV4dCxcbiAgR3JpZENvbmZpZ1BhcnQsXG4gIEdyaWRFdmVudFR5cGVcbn0gZnJvbSAnLi9kYXRhLWdyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQge1xuICBBY3Rpb25Db250cm9sLFxuICBBY3Rpb25Db250cm9sSG9vayxcbiAgQnVpbHRJbkFjdGlvblR5cGUsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29sdW1uRGF0YVR5cGUsXG4gIEN1c3RvbUNvbHVtbkNvbmZpZyxcbiAgRGF0YUdyaWQsXG4gIERhdGFTb3VyY2VTdGF0cyxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIEZpbHRlcixcbiAgRmlsdGVyQ2hpcCxcbiAgRmlsdGVyaW5nQWN0aW9uVHlwZSxcbiAgR3JpZENvbmZpZyxcbiAgSGVhZGVyQWN0aW9uQ29udHJvbCxcbiAgUGFnaW5hdGlvbixcbiAgUm93LFxuICBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICBTb3J0T3JkZXIsXG4gIFNwZWNpYWxDb2x1bW5OYW1lLFxuICBtaW5Db2x1bW5HcmlkVHJhY2tTaXplLFxuICByYXRpb3NCeUNvbHVtblR5cGVzXG59IGZyb20gJy4vZGF0YS1ncmlkLm1vZGVsJztcbmltcG9ydCB7IERhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vZGF0YS1ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vZXhwYW5kYWJsZS1yb3cuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWREYXRhU291cmNlIH0gZnJvbSAnLi9ncmlkLWRhdGEtc291cmNlJztcbmltcG9ydCB7IFBYX0FDVElPTlMsIFBYX0VWRU5UX05BTUUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5jb25zdGFudHMnO1xuXG5lbnVtIFNvcnRpbmdPcmRlciB7XG4gIEFTQyA9ICdhc2MnLFxuICBERVNDID0gJ2Rlc2MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhR3JpZENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBEYXRhR3JpZCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG57XG4gIC8qKiBUaGUgdGl0bGUgZm9yIHRoZSBkYXRhIGdyaWQsIGl0J3MgZGlzcGxheWVkIGluIHRoZSBncmlkJ3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnSXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkIG1vcmUgaXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGl0ZW1z4oCmJyk7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGV4dCBzZWFyY2ggaW5wdXQgaXMgc2hvd24gaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gW107XG4gIC8qKiBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC4gKi9cbiAgQElucHV0KCdjb2x1bW5zJylcbiAgX2NvbHVtbnM6IENvbHVtbltdO1xuXG4gIGRhdGFTb3VyY2UgPSBuZXcgR3JpZERhdGFTb3VyY2UoKTtcbiAgcm93czogUm93W107XG4gIC8qKiBUaGUgbGlzdCBvZiByb3dzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZCAodXNlZCBmb3IgY2xpZW50IHNpZGUgZGF0YSkuICovXG4gIEBJbnB1dCgncm93cycpXG4gIHNldCBfcm93cyhyb3dzOiBSb3dbXSkge1xuICAgIHRoaXMucm93cyA9IHJvd3MgfHwgW107XG4gIH1cblxuICBmaWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgZmlsdGVyZWRJdGVtc0NvdW50OiAwLFxuICAgIGFsbEl0ZW1zQ291bnQ6IDBcbiAgfTtcblxuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uO1xuICBwYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgcGFnZUZpcnN0SXRlbUlkeDogMCxcbiAgICBwYWdlTGFzdEl0ZW1JZHg6IDAsXG4gICAgaXRlbXNUb3RhbDogMFxuICB9O1xuICBsYXN0Q2xpY2tlZFJvdzogUm93O1xuICByZWFkb25seSBwb3NzaWJsZVBhZ2VTaXplczogbnVtYmVyW10gPSBbMjUsIDUwLCAxMDBdO1xuICByZWFkb25seSBtaW5Qb3NzaWJsZVBhZ2VTaXplID0gTWF0aC5taW4oLi4udGhpcy5wb3NzaWJsZVBhZ2VTaXplcyk7XG4gIC8qKiBQYWdpbmF0aW9uIHNldHRpbmdzLCBlLmcuIGFsbG93cyBmb3Igc2V0dGluZyBjdXJyZW50IHBhZ2Ugb3IgcGFnZSBzaXplLiAqL1xuICBASW5wdXQoJ3BhZ2luYXRpb24nKVxuICBzZXQgX3BhZ2luYXRpb24ocGFnaW5hdGlvbjogUGFnaW5hdGlvbikge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHBhZ2luYXRpb247XG4gIH1cblxuICBpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlO1xuICAvKiogU2V0cyBsb2FkIG1vcmUgbW9kZS4gKi9cbiAgQElucHV0KCdpbmZpbml0ZVNjcm9sbCcpXG4gIHNldCBfaW5maW5pdGVTY3JvbGwoaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZSkge1xuICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSBpbmZpbml0ZVNjcm9sbDtcbiAgfVxuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIC8qKlxuICAgKiBTZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGRhdGEgbmVlZHMgdG8gYmUgbG9hZGVkIGZyb20gc2VydmVyLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgW1tEYXRhU291cmNlTW9kaWZpZXJdXSBhbmQgcmV0dXJuIFtbU2VydmVyU2lkZURhdGFSZXN1bHRdXS5cbiAgICovXG4gIEBJbnB1dCgnc2VydmVyU2lkZURhdGFDYWxsYmFjaycpXG4gIHNldCBfc2VydmVyU2lkZURhdGFDYWxsYmFjayhzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKSB7XG4gICAgdGhpcy5zZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrID0gc2VydmVyU2lkZURhdGFDYWxsYmFjaztcbiAgfVxuXG4gIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgYSBjaGVja2JveCBpbiB0aGUgZmlyc3QgY29sdW1uLiAqL1xuICBASW5wdXQoJ3NlbGVjdGFibGUnKVxuICBzZXQgX3NlbGVjdGFibGUoc2VsZWN0YWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gIH1cblxuICBzaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqIFJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcm93IG9ubHkuIFNlbGVjdGlvbiBjb2x1bW4gZGlzcGxheXMgcmFkaW8gYnV0dG9uIGluc3RlYWQgb2YgY2hlY2tib3hlcyAqL1xuICBASW5wdXQoJ3NpbmdsZVNlbGVjdGlvbicpXG4gIHNldCBfc2luZ2xlU2VsZWN0aW9uKHNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uID0gc2luZ2xlU2VsZWN0aW9uO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleSA9ICdpZCc7XG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGl0ZW0ncyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2VsZWN0aW9uIHN0YXR1cy4gKi9cbiAgQElucHV0KCdzZWxlY3Rpb25QcmltYXJ5S2V5JylcbiAgc2V0IF9zZWxlY3Rpb25QcmltYXJ5S2V5KHNlbGVjdGlvblByaW1hcnlLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0aW9uUHJpbWFyeUtleSA9IHNlbGVjdGlvblByaW1hcnlLZXk7XG4gIH1cblxuICBkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMgPSB7XG4gICAgc3RyaXBlZDogdHJ1ZSxcbiAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgZ3JpZEhlYWRlcjogdHJ1ZSxcbiAgICBmaWx0ZXI6IHRydWUsXG4gICAgaG92ZXI6IHRydWVcbiAgfTtcbiAgLyoqIFNldHMgZGlzcGxheSBvcHRpb25zLiAqL1xuICBASW5wdXQoJ2Rpc3BsYXlPcHRpb25zJylcbiAgc2V0IF9kaXNwbGF5T3B0aW9ucyhkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMpIHtcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0geyAuLi50aGlzLmRpc3BsYXlPcHRpb25zLCAuLi5kaXNwbGF5T3B0aW9ucyB9O1xuICB9XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQubmV4dChhY3Rpb25Db250cm9scyk7XG4gIH1cblxuICBidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGJ1bGsgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaXRlbXMgc2VsZWN0ZWQgYnkgdXNlcikuICovXG4gIEBJbnB1dCgnYnVsa0FjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9idWxrQWN0aW9uQ29udHJvbHMoYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5idWxrQWN0aW9uQ29udHJvbHMgPSBidWxrQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICBoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBoZWFkZXIgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmcm9tIGRhdGEgZ3JpZCBoZWFkZXIpLiAqL1xuICBASW5wdXQoJ2hlYWRlckFjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9oZWFkZXJBY3Rpb25Db250cm9scyhoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5oZWFkZXJBY3Rpb25Db250cm9scyA9IGhlYWRlckFjdGlvbkNvbnRyb2xzIHx8IFtdO1xuICB9XG5cbiAgLyoqIFNldHMgaW5pdGlhbCBzZWFyY2ggdGV4dC4gKi9cbiAgQElucHV0KClcbiAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIGN1c3RvbSBjb2x1bW5zIGJ1dHRvbiB3aWxsIGJlIGVuYWJsZWQuICovXG4gIEBJbnB1dCgpXG4gIGNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkID0gdHJ1ZTtcblxuICAvKiogU2hvd3MgdGhlIHdhcm5pbmcgZm9yIHRoZSBzdWItYXNzZXRzIGNvdW50ZXIgKi9cbiAgQElucHV0KClcbiAgc2hvd0NvdW50ZXJXYXJuaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIHJvd3MgKGxhc3QgY2xpY2tlZCkuXG4gICAqIFNldCBlbXB0eSBzdHJpbmcgdG8gZGlzYWJsZSBhcHBlbmRpbmcgYWN0aXZlIGNsYXNzIHRvIGdyaWQgcm93cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUNsYXNzTmFtZSA9ICdhY3RpdmUnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSByb3dzIG9mIHRoZSBkYXRhIGdyaWQgd2lsbCBiZSBleHBhbmRhYmxlLlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqIC0gYE5PTkVgIC0gbm8gZXhwYW5kYWJsZSByb3dzIChkZWZhdWx0IHZhbHVlKVxuICAgKiAtIGBTWU5DYCAtIGFkZGl0aW9uYWwgY29sdW1uIHdpdGggZXhwYW5kIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIGV4cGFuZGFibGUgcm93cyBhcmUgZXhwYW5kaW5nIHN5bmNocm9ub3VzbHkgd2hlbiBidXR0b24gaXMgY2xpY2tlZFxuICAgKiAtIGBBU1lOQ2AgLSBhZGRpdGlvbmFsIGNvbHVtbiB3aXRoIGV4cGFuZCBidXR0b24gaXMgZGlzcGxheWVkIGFuZCBleHBhbmRhYmxlIHJvd3MgYXJlIGV4cGFuZGluZyBhc3luY2hyb25vdXNseSB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlUm93czogJ05PTkUnIHwgJ1NZTkMnIHwgJ0FTWU5DJyA9ICdOT05FJztcblxuICAvKiogRGV0ZXJtaW5lcyBpZiB0aGUgUmVsb2FkIGJ1dHRvbiB3aWxsIGJlIGhpZGRlbi4gKi9cbiAgQElucHV0KCkgaGlkZVJlbG9hZCA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIG1vdXNlIGlzIG92ZXIgYSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dNb3VzZU92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gbW91c2UgbGVhdmVzIGEgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93TW91c2VMZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIHJvdyBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gZ3JpZCdzIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4gKi9cbiAgQE91dHB1dCgpIG9uQ29uZmlnQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSBmaWx0ZXIgaXMgYXBwbGllZC4gKi9cbiAgQE91dHB1dCgpIG9uQmVmb3JlRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBiZWZvcmUgdGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQuICovXG4gIEBPdXRwdXQoKSBvbkJlZm9yZVNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkIGluIGEgY29sdW1uLiAqL1xuICBAT3V0cHV0KCkgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBjb2x1bW5OYW1lPzogc3RyaW5nO1xuICAgIGRyb3Bkb3duPzogQnNEcm9wZG93bkRpcmVjdGl2ZTtcbiAgICBmaWx0ZXJpbmdNb2RpZmllcj86IEZpbHRlcjtcbiAgfT4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gaXRlbXMgc2VsZWN0aW9uIGNoYW5nZXMuIFRoZSBhcnJheSBjb250YWlucyBrZXlzIG9mIHNlbGVjdGVkIGl0ZW1zIChrZXkgcHJvcGVydHkgaXMgZGVmaW5lZCBieSBgc2VsZWN0aW9uUHJpbWFyeUtleWApLiAqL1xuICBAT3V0cHV0KCkgaXRlbXNTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiByZWxvYWQgYnV0dG9uIGlzIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBvblJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBjdXN0b20gY29sdW1uIGlzIGFkZGVkICovXG4gIEBPdXRwdXQoKSBvbkFkZEN1c3RvbUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tQ29sdW1uQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGN1c3RvbSBjb2x1bW4gaXMgcmVtb3ZlZCAqL1xuICBAT3V0cHV0KCkgb25SZW1vdmVDdXN0b21Db2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbj4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IGFmdGVyIHRoZSBjb2x1bW4gZmlsdGVyIGhhcyBiZWVuIHJlc2V0ICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtbkZpbHRlclJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW4+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBzb3J0aW5nIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gcGFnZSBzaXplIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uUGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBvcmRlciBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtblJlb3JkZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIG9yZGVyIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKENvbHVtbkRpcmVjdGl2ZSkgY29sdW1uUmVuZGVyZXJzOiBRdWVyeUxpc3Q8Q29sdW1uRGlyZWN0aXZlPjtcblxuICBAQ29udGVudENoaWxkKEV4cGFuZGFibGVSb3dEaXJlY3RpdmUpXG4gIGV4cGFuZGFibGVSb3c6IEV4cGFuZGFibGVSb3dEaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZCgnc2Nyb2xsJywgeyBzdGF0aWM6IHRydWUgfSkgc2Nyb2xsQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2luZmluaXRlU2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGluZmluaXRlU2Nyb2xsQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoRW1wdHlTdGF0ZUNvbnRleHREaXJlY3RpdmUpIGVtcHR5U3RhdGU6IEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlO1xuXG4gIGxvYWRNb3JlQ29tcG9uZW50OiBMb2FkTW9yZUNvbXBvbmVudDtcblxuICBjb2x1bW5OYW1lcyA9IFtdO1xuXG4gIHN0eWxlcyA9IHtcbiAgICB0YWJsZUN1cnNvcjogJ2F1dG8nLFxuICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IHVuZGVmaW5lZCxcbiAgICBncmlkSW5maW5pdGVTY3JvbGxDb2x1bW46IHVuZGVmaW5lZFxuICB9O1xuXG4gIHNlYXJjaFRleHQkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIGZpbHRlcmluZ0FwcGxpZWQgPSBmYWxzZTtcbiAgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZDogQ29sdW1uW10gPSBbXTtcblxuICB0b3RhbFBhZ2VzQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KEluZmluaXR5KTtcbiAgaGlkZVBhZ2luYXRpb24kID0gdGhpcy50b3RhbFBhZ2VzQ291bnQkLnBpcGUoXG4gICAgbWFwKHRvdGFsUGFnZXNDb3VudCA9PiB0b3RhbFBhZ2VzQ291bnQgPD0gMSksXG4gICAgZGVsYXkoMCkgLy8gcHJldmVudHMgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclxuICApO1xuXG4gIHNlbGVjdGVkSXRlbUlkczogc3RyaW5nW10gPSBbXTtcbiAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZSA9IHtcbiAgICBhbGxTZWxlY3RlZDogZmFsc2UsXG4gICAgYWxsRGVzZWxlY3RlZDogdHJ1ZVxuICB9O1xuXG4gIGJ1aWx0SW5BY3Rpb25UeXBlID0ge1xuICAgIEVkaXQ6IEJ1aWx0SW5BY3Rpb25UeXBlLkVkaXQsXG4gICAgRGVsZXRlOiBCdWlsdEluQWN0aW9uVHlwZS5EZWxldGUsXG4gICAgRXhwb3J0OiBCdWlsdEluQWN0aW9uVHlwZS5FeHBvcnRcbiAgfTtcblxuICBjb25maXJtUmVtb3ZlQ29sdW1uQnV0dG9uczogUG9wb3ZlckNvbmZpcm1CdXR0b25zW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0NhbmNlbCcpLFxuICAgICAgYWN0aW9uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnUmVtb3ZlYGNvbHVtbix2ZXJiYCcpLFxuICAgICAgc3RhdHVzOiAnZGFuZ2VyJyxcbiAgICAgIGFjdGlvbjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgfVxuICBdO1xuXG4gIGlzQ29uZmlnQ29udGV4dEtub3duID0gZmFsc2U7XG4gIGVtcHR5U3RhdGVDb250ZXh0JDogT2JzZXJ2YWJsZTxEYXRhU291cmNlU3RhdHM+O1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiByb3dzIHdoaWNoIGhhdmUgYmVlbiBleHBhbmRlZC5cbiAgICovXG4gIGV4cGFuZGVkUm93czogTWFwPFJvdywgeyB2aXNpYmxlJDogU3ViamVjdDxib29sZWFuPiB8IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB9PiA9IG5ldyBNYXAoKTtcblxuICAvKiogUHJvZHVjdCBleHBlcmllbmNlIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgKi9cbiAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudDogUHJvZHVjdEV4cGVyaWVuY2VFdmVudCA9IHsgZXZlbnROYW1lOiBQWF9FVkVOVF9OQU1FIH07XG4gIFBYX0FDVElPTlMgPSBQWF9BQ1RJT05TO1xuXG4gIHJlYWRvbmx5IHNvcnRDb2x1bW5UaXRsZSA9IGdldHRleHQoJ1NvcnQgY29sdW1uIFwie3sgbmFtZSB9fVwiJyk7XG5cbiAgcmVzaXplSGFuZGxlTW91c2VEb3duJCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgdGFyZ2V0Q29sdW1uTmFtZTogc3RyaW5nIH0+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gIGZpbHRlcnNIZWxwUG9wb3Zlckh0bWw6IHN0cmluZyA9IGdldHRleHQoJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicpO1xuXG4gIHByaXZhdGUgaGVhZGVyQmVpbmdSZXNpemVkOiB7XG4gICAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAgIGVsOiBIVE1MRWxlbWVudDtcbiAgfTtcbiAgQFZpZXdDaGlsZHJlbihDZGtIZWFkZXJDZWxsLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSB0aFJlZnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgcHJpdmF0ZSB0aEVsczogSFRNTEVsZW1lbnRbXTtcblxuICBAVmlld0NoaWxkKENka1RhYmxlLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVSZWY6IENka1RhYmxlPGFueT47XG5cbiAgcHJpdmF0ZSByZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50OiBib29sZWFuO1xuXG4gIHByaXZhdGUgY29sdW1uc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Q29sdW1uczogQ29sdW1uW10gPSBbXTtcblxuICBwcml2YXRlIHJlbG9hZENvbmZpZ3VyYXRpb24kOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIGFjdGlvbkNvbnRyb2xzSW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBY3Rpb25Db250cm9sW10+KFtdKTtcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBtYW51YWxTZWFyY2gkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgbGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBTRUFSQ0hfREVCT1VOQ0VfVElNRSA9IDUwMDtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlciwgdGFraW5nIGJvb2xlYW4gdmFsdWVzIHVzZWQgZm9yIGxvYWRpbmcgZGF0YSBncmlkIGRhdGEgd2l0aCBkZWJvdW5jZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuIFNldCB0byB0cnVlIGlmIGRhdGEgZ3JpZCBpcyB1c2luZyBpbmZpbml0ZSBzY3JvbGwgYW5kIHBhZ2Ugc2hvdWxkIGJlIHJlbG9hZGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIG11bHRpcGxlIHRoaXMubG9hZERhdGEoKSBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlckxvYWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSlcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvblN0cmF0ZWd5OiBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIGRhdGFHcmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25Db250cm9sc1NlcnZpY2U6IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxuICApIHtcbiAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5waXBlKGRlYm91bmNlVGltZSgxKSwgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKHJlbG9hZCA9PiB7XG4gICAgICB0aGlzLmxvYWREYXRhKHJlbG9hZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb25maWckKCkgPz8gb2YobnVsbCkpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbnMoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLnNldFBhZ2VTaXplKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdCghIXRoaXMuaW5maW5pdGVTY3JvbGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGF0YVNvdXJjZS5zdGF0cyQpLFxuICAgICAgICB0YXAoc3RhdHMgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0cyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uV2hlbk5vRGV2aWNlc0xhc3RQYWdlKHN0YXRzKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNDb25maWdDb250ZXh0S25vd24gPSAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5pc0NvbnRleHRLbm93bigpO1xuXG4gICAgdGhpcy5zZXR1cFNlYXJjaE9ic2VydmFibGVzKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuZGF0YVNvdXJjZS5kYXRhJCwgdGhpcy5pdGVtc1NlbGVjdC5hc09ic2VydmFibGUoKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VFbXB0eSA9IGRhdGEubGVuZ3RoID09PSAwO1xuXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgICAgICAgYWxsU2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyBmYWxzZSA6IGRhdGEuZXZlcnkoaXRlbSA9PiB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSxcbiAgICAgICAgICAgIGFsbERlc2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyB0cnVlIDogZGF0YS5ldmVyeShpdGVtID0+ICF0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuXG4gICAgdGhpcy5hY3Rpb25Db250cm9sc1NlcnZpY2UuaXRlbXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgc3dpdGNoTWFwKChob29rczogQWN0aW9uQ29udHJvbEhvb2tbXSkgPT5cbiAgICAgICAgICBmb3JrSm9pbihcbiAgICAgICAgICAgIGhvb2tzLm1hcChob29rID0+XG4gICAgICAgICAgICAgIHRvT2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICBob29rPy5tYXRjaGVzR3JpZFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgICAgICAgICAgICAgICAgICAgaG9vay5tYXRjaGVzR3JpZCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb250ZXh0KClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBmYWxzZVxuICAgICAgICAgICAgICApLnBpcGUobWFwKG1hdGNoZXMgPT4gKHsgaG9vaywgbWF0Y2hlcyB9KSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKS5waXBlKHN0YXJ0V2l0aChbXSkpXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFycmF5PHsgaG9vazogQWN0aW9uQ29udHJvbEhvb2s7IG1hdGNoZXM6IGJvb2xlYW4gfT4pID0+XG4gICAgICAgICAgaG9va3MuZmlsdGVyKGhvb2sgPT4gaG9vay5tYXRjaGVzKS5tYXAoaG9vayA9PiBob29rLmhvb2spXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFjdGlvbkNvbnRyb2xIb29rW10pID0+XG4gICAgICAgICAgaG9va3MucmVkdWNlKChhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdLCBjdXJyZW50SG9vazogQWN0aW9uQ29udHJvbEhvb2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWN0aW9uQ29udHJvbHMsIC4uLmNhc3RBcnJheShjdXJyZW50SG9vay5hY3Rpb25Db250cm9scyldO1xuICAgICAgICAgIH0sIFtdKVxuICAgICAgICApLFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmFjdGlvbkNvbnRyb2xzSW5wdXQkKSxcbiAgICAgICAgdGFwKFxuICAgICAgICAgIChbaG9va0NvbnRyb2xzLCBpbnB1dENvbnRyb2xzXSkgPT5cbiAgICAgICAgICAgICh0aGlzLmFjdGlvbkNvbnRyb2xzID0gWy4uLmlucHV0Q29udHJvbHMsIC4uLmhvb2tDb250cm9sc10pXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmICh0aGlzLnJlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVmcmVzaC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG5cbiAgICAvLyBSZXNldHRpbmcgdGhlIHN0YXRzIHNpemUgdG8gMCB3aGVuIG1hbmFnZWQgb2JqZWN0cyBhcmUgZGVsZXRlZCBidXQgc2l6aW5nIG5vdCB5ZXQgdXBkYXRlZFxuICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIE1UTS02MDIyNiBpcyByZXNvbHZlZFxuICAgIHRoaXMuZW1wdHlTdGF0ZUNvbnRleHQkID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXRhU291cmNlLnN0YXRzJCwgdGhpcy5kYXRhU291cmNlLmRhdGEkXSkucGlwZShcbiAgICAgIG1hcCgoW3N0YXRzLCBkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHMuZmlsdGVyZWRTaXplID09PSAxICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdHMsIHNpemU6IDAsIGZpbHRlcmVkU2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0cztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldEV4cGFuZGFibGVSb3dWaXNpYmxlKHJvdzogUm93LCBzdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgICB0aGlzLnRhYmxlUmVmLnJlbmRlclJvd3MoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhldmVudCkge1xuICAgIGlmIChcbiAgICAgICgoIWV2ZW50Ll9hY3Rpb25Db250cm9scyAmJiAhZXZlbnQuc2VhcmNoVGV4dCkgfHwgZXZlbnQuX2FjdGlvbkNvbnRyb2xzPy5maXJzdENoYW5nZSkgJiZcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkXG4gICAgKSB7XG4gICAgICBjb25zdCByZWxvYWQgPSAhIWV2ZW50Ll9pbmZpbml0ZVNjcm9sbD8uY3VycmVudFZhbHVlICYmICFldmVudC5faW5maW5pdGVTY3JvbGw/LmZpcnN0Q2hhbmdlO1xuICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdChyZWxvYWQpO1xuICAgIH1cbiAgICBpZiAoISFldmVudC5fY29sdW1ucyAmJiAhZXZlbnQuX2NvbHVtbnMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnNldHVwUmVzaXplSGFuZGxlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGV4cGFuZChyb3c6IFJvdykge1xuICAgIGNvbnN0IGlzU3luY0V4cGFuZCA9IHRoaXMuZXhwYW5kYWJsZVJvd3MgPT09ICdTWU5DJztcbiAgICBsZXQgdmlzaWJsZVN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gfCBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgaWYgKGlzU3luY0V4cGFuZCkge1xuICAgICAgdmlzaWJsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aXNpYmxlU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuZXhwYW5kZWRSb3dzLnNldChyb3csIHsgdmlzaWJsZSQ6IHZpc2libGVTdWJqZWN0IH0pO1xuICAgIHRoaXMudGFibGVSZWYucmVuZGVyUm93cygpO1xuICAgIHJldHVybiB2aXNpYmxlU3ViamVjdDtcbiAgfVxuXG4gIGNvbGxhcHNlKHJvdzogUm93KTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgdGhpcy50YWJsZVJlZi5yZW5kZXJSb3dzKCk7XG4gIH1cblxuICBpc1Jvd0V4cGFuZGVkID0gKF8sIHJvdzogUm93KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdyk7XG4gIH07XG5cbiAgc2V0Q29sdW1ucyhjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneSAmJiAhaXNFbXB0eSh0aGlzLl9jb2x1bW5zKSkge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kYXRhR3JpZFNlcnZpY2UuYXBwbHlDb25maWdUb0NvbHVtbnMoY29uZmlnLCB0aGlzLl9jb2x1bW5zKTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgfHwgISF0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHRoaXMuZGVmYXVsdENvbHVtbnMgPSB0aGlzLmNvbHVtbnMgfHwgW107XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gIH1cblxuICBzZXRQYWdlU2l6ZShjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISFjb25maWc/LnBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24ucGFnZVNpemVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSBnZXQodGhpcy5wYWdpbmF0aW9uLCAncGFnZVNpemUnKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICF0aGlzLnBvc3NpYmxlUGFnZVNpemVzLmZpbmQocG9zc2libGVQYWdlU2l6ZSA9PiBwb3NzaWJsZVBhZ2VTaXplID09PSBwYWdlU2l6ZSlcbiAgICApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5taW5Qb3NzaWJsZVBhZ2VTaXplIH07XG4gICAgfVxuICB9XG5cbiAgb3BlbkN1c3RvbUNvbHVtbk1vZGFsKCk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5ic01vZGFsU2VydmljZS5zaG93KENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdtb2RhbC1ib2R5JyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnbW9kYWwtdGl0bGUnLFxuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgIGluaXRpYWxTdGF0ZToge1xuICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnNcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1vZGFsUmVmLmNvbnRlbnQub25BZGRDdXN0b21Db2x1bW5cbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGN1c3RvbUNvbHVtbkNvbmZpZzogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlyc3RGaXhlZENvbHVtUG9zaXRpb24gPSB0aGlzLmNvbHVtbnMuaW5kZXhPZihcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4ucG9zaXRpb25GaXhlZClcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoXG4gICAgICAgICAgICBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA+IC0xID8gZmlyc3RGaXhlZENvbHVtUG9zaXRpb24gOiB0aGlzLmNvbHVtbnMubGVuZ3RoLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIG5ldyBDdXN0b21Db2x1bW4oY3VzdG9tQ29sdW1uQ29uZmlnKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkFERF9DVVNUT01fQ09MVU1OLFxuICAgICAgICAgICAgY29sdW1uOiBjdXN0b21Db2x1bW5Db25maWcuaGVhZGVyIHx8IGN1c3RvbUNvbHVtbkNvbmZpZy5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwobW9kYWxSZWYub25IaWRkZW4pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMub25BZGRDdXN0b21Db2x1bW4uZW1pdChldmVudCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlQ3VzdG9tQ29sdW1uKFxuICAgIHBvQ29uZmlybTogUG9wb3ZlckNvbmZpcm1Db21wb25lbnQsXG4gICAgY29sdW1uOiBDb2x1bW4sXG4gICAgZGRDb25maWd1cmVDb2x1bW5zOiBCc0Ryb3Bkb3duRGlyZWN0aXZlXG4gICkge1xuICAgIGRkQ29uZmlndXJlQ29sdW1ucy5hdXRvQ2xvc2UgPSBmYWxzZTtcbiAgICBwb0NvbmZpcm0ubWVzc2FnZSA9IGdldHRleHQoJ0RvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGNvbHVtbj8nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVtb3ZlOiBib29sZWFuID0gYXdhaXQgcG9Db25maXJtLnNob3codGhpcy5jb25maXJtUmVtb3ZlQ29sdW1uQnV0dG9ucyk7XG4gICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbD8ubmFtZSAhPT0gY29sdW1uPy5uYW1lKTtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMub25SZW1vdmVDdXN0b21Db2x1bW4uZW1pdChjb2x1bW4pO1xuICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTU9WRV9DVVNUT01fQ09MVU1OLFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uLmhlYWRlciB8fCBjb2x1bW4ubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGUpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4gKGRkQ29uZmlndXJlQ29sdW1ucy5hdXRvQ2xvc2UgPSB0cnVlKSwgMCk7XG4gIH1cblxuICBhc3luYyByZW1vdmVGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPEZpbHRlckNoaXA+KSB7XG4gICAgY29uc3QgZmlsdGVyaW5nTW9kaWZpZXIgPSBmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeVxuICAgICAgPyB7IGV4dGVybmFsRmlsdGVyUXVlcnk6IGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5IH1cbiAgICAgIDogeyBmaWx0ZXJQcmVkaWNhdGU6IGZpbHRlci5maWx0ZXJQcmVkaWNhdGUgfTtcbiAgICB0aGlzLm9uQmVmb3JlRmlsdGVyLmVtaXQoe1xuICAgICAgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbk5hbWUsXG4gICAgICBkcm9wZG93bjogdW5kZWZpbmVkLFxuICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAoZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnkgJiYgIXRoaXMuY2hlY2tJZkFueVZhbHVlc0V4aXN0KGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5KSkgfHxcbiAgICAgIGZpbHRlci5maWx0ZXJQcmVkaWNhdGVcbiAgICApIHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtmaWx0ZXIuY29sdW1uTmFtZV0sIHtcbiAgICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlclxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW5OYW1lIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbZmlsdGVyLmNvbHVtbk5hbWVdLCB7XG4gICAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICAgIHBheWxvYWQ6IHsgZmlsdGVyaW5nTW9kaWZpZXIgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe1xuICAgICAgICBjb2x1bW5OYW1lOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgICAgZHJvcGRvd246IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU1PVkVfRklMVEVSLFxuICAgICAgY29sdW1uOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgfSk7XG4gIH1cblxuICB0cmFja0J5TmFtZShpbmRleCwgaXRlbSkge1xuICAgIHJldHVybiBpdGVtLm5hbWU7XG4gIH1cblxuICByZXNvbHZlQ2VsbFZhbHVlKHJvdywgcGF0aCkge1xuICAgIHJldHVybiBmbG93KFtcbiAgICAgIHggPT4gdGhpcy5kYXRhU291cmNlLnJlc29sdmVWYWx1ZSh4LCBwYXRoKSxcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5yZXNvbHZlRnVuY3Rpb24sXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uubm9ybWFsaXplTmlsXG4gICAgXSkocm93KTtcbiAgfVxuXG4gIGNoYW5nZVNvcnRPcmRlcihjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW5OYW1lKTtcblxuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIGNvbnN0IHsgc29ydE9yZGVyIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmICghc29ydE9yZGVyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydGluZyhbY29sdW1uTmFtZV0sIFNvcnRpbmdPcmRlci5BU0MpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0T3JkZXIgPT09IFNvcnRpbmdPcmRlci5BU0MpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgU29ydGluZ09yZGVyLkRFU0MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNvcnRpbmcoY29sdW1uTmFtZXM6IHN0cmluZ1tdLCBzb3J0T3JkZXI6IFNvcnRPcmRlcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfU09SVElOR19PUkRFUixcbiAgICAgIGNvbHVtbnM6IGNvbHVtbk5hbWVzLFxuICAgICAgc29ydE9yZGVyOiBzb3J0T3JkZXIgPT09ICcnID8gJ25vbmUnIDogc29ydE9yZGVyXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pOiBDb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICByZXR1cm4geyAuLi5jb2x1bW4sIHNvcnRPcmRlciB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgnc29ydCcpO1xuXG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5BUFBMWV9GSUxURVIsXG4gICAgICBjb2x1bW46IGNvbHVtbk5hbWUsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICAgIHRoaXMub25CZWZvcmVGaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllciB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHtcbiAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICBwYXlsb2FkOiB7IGZpbHRlcmluZ01vZGlmaWVyIH1cbiAgICB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyIH0pO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIoY29sdW1uTmFtZSwgZHJvcGRvd24pIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRVNFVF9GSUxURVIsIGNvbHVtbjogY29sdW1uTmFtZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHsgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlciB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24gfSk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMocmVsb2FkID0gdHJ1ZSkge1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFxuICAgICAgdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLFxuICAgICAge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyXG4gICAgICB9LFxuICAgICAgcmVsb2FkXG4gICAgKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe30pO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX0ZJTFRFUiB9KTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZyhcbiAgICBjb2x1bW5OYW1lczogc3RyaW5nW10sXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlO1xuICAgICAgcGF5bG9hZD86IHsgZmlsdGVyaW5nTW9kaWZpZXI6IEZpbHRlcmluZ01vZGlmaWVyIH07XG4gICAgfSxcbiAgICByZWxvYWQgPSB0cnVlXG4gICkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgLi4uKGFjdGlvbi50eXBlID09PSBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyXG4gICAgICAgICAgICA/IGFjdGlvbi5wYXlsb2FkLmZpbHRlcmluZ01vZGlmaWVyXG4gICAgICAgICAgICA6IHRoaXMub25SZXNldEZpbHRlckFjdGlvbihjb2x1bW4pKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuXG4gICAgaWYgKHJlbG9hZCkge1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJpbmdBcHBsaWVkKCkge1xuICAgIHRoaXMuY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZCA9IHRoaXMuY29sdW1ucy5maWx0ZXIodGhpcy5pc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWQpO1xuICAgIHRoaXMuZmlsdGVyaW5nQXBwbGllZCA9IHRoaXMuY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZC5sZW5ndGggPiAwO1xuXG4gICAgdGhpcy5maWx0ZXJzSGVscFBvcG92ZXJIdG1sID0gdGhpcy5maWx0ZXJpbmdBcHBsaWVkXG4gICAgICA/IGdldHRleHQoXG4gICAgICAgICAgJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLiBDbGljayA8Yj5BY3RpdmUgZmlsdGVyczwvYj4gYnV0dG9uIHRvIG1hbmFnZSBhcHBsaWVkIGZpbHRlcnMuJ1xuICAgICAgICApXG4gICAgICA6IGdldHRleHQoJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicpO1xuICB9XG5cbiAgaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkKGNvbHVtbjogQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBmaWx0ZXJhYmxlLCBmaWx0ZXJQcmVkaWNhdGUsIGV4dGVybmFsRmlsdGVyUXVlcnkgfSA9IGNvbHVtbjtcblxuICAgIHJldHVybiAhIShmaWx0ZXJhYmxlICYmIChmaWx0ZXJQcmVkaWNhdGUgfHwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpO1xuICB9XG5cbiAgdXBkYXRlUGFnaW5hdGlvbih7IGl0ZW1zUGVyUGFnZSwgcGFnZSB9KSB7XG4gICAgY29uc3QgY29uZmlnQ2hhbmdlZCA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZVNpemUgIT09IGl0ZW1zUGVyUGFnZTtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgcGFnZVNpemU6IGl0ZW1zUGVyUGFnZSwgY3VycmVudFBhZ2U6IHBhZ2UgfTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgncGFnaW5hdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfUEFHSU5BVElPTiwgaXRlbXNQZXJQYWdlLCBwYWdlIH0pO1xuICB9XG5cbiAgY2xpY2tSZWxvYWQoKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgICB0aGlzLm9uUmVsb2FkLm5leHQoKTtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRUxPQUQgfSk7XG4gIH1cblxuICByZWxvYWQocmVkaXJlY3QgPSB0cnVlKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgY3VycmVudFBhZ2U6IHJlZGlyZWN0ID8gMSA6IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZVxuICAgIH07XG4gICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmxvYWREYXRhKHRydWUpO1xuICAgIHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgfVxuXG4gIGxvYWROZXh0UGFnZSgpOiBQcm9taXNlPElSZXN1bHRMaXN0PG9iamVjdD4+IHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgY3VycmVudFBhZ2U6IHRoaXMucGFnaW5hdGlvbi5uZXh0UGFnZSB9O1xuXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5yZXN1bHRMaXN0JFxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gaW4gb3JkZXIgZm9yIGB0b1Byb21pc2VgIHRvIHdvcmssIHRoZSBvYnNlcnZhYmxlIG5lZWRzIHRvIGNvbXBsZXRlXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHBhZ2luZzoge1xuICAgICAgICAgICAgLi4ucmVzdWx0LnBhZ2luZyxcbiAgICAgICAgICAgIG5leHQ6IHRoaXMubG9hZE5leHRQYWdlLmJpbmQodGhpcylcbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSVJlc3VsdExpc3Q8b2JqZWN0PjtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0NFTEwnLCB2YWx1ZSwgcm93LCBjb2x1bW5OYW1lIH0pO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyh7IHZhbHVlLCBjb2x1bW5OYW1lIH0pOiBDZWxsUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGU6ICdIRUFERVInLCB2YWx1ZSwgcm93OiB1bmRlZmluZWQsIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjKHsgY29sdW1uLCBkcm9wZG93biB9KTogRmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmVyOlxuICAgICAgICBnZXQodGhpcy5nZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pLCAnZmlsdGVyaW5nRm9ybVJlbmRlcmVyRGVmLnRlbXBsYXRlJykgfHxcbiAgICAgICAgY29sdW1uLmZpbHRlcmluZ0Zvcm1SZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgcHJvcGVydHk6IGNvbHVtbixcbiAgICAgICAgYXBwbHlGaWx0ZXI6IHRoaXMuYXBwbHlGaWx0ZXIuYmluZCh0aGlzLCBjb2x1bW4ubmFtZSwgZHJvcGRvd24pLFxuICAgICAgICByZXNldEZpbHRlcjogdGhpcy5yZXNldEZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93bilcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0QWxsSXRlbXNTZWxlY3RlZChzZWxlY3RlZCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zZWxlY3Rpb24kXG4gICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmaWx0ZXJlZERhdGFJZHMgfSkgPT4gdGhpcy5zZXRJdGVtc1NlbGVjdGVkKGZpbHRlcmVkRGF0YUlkcywgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5zZXRJdGVtc1NlbGVjdGVkKGRhdGEsIHNlbGVjdGVkKSk7XG4gIH1cblxuICBzZXRJdGVtc1NlbGVjdGVkKGl0ZW1zOiBhbnksIHNlbGVjdGVkKSB7XG4gICAgY29uc3QgaXRlbUlkcyA9IGl0ZW1zLm1hcCgoaXRlbTogb2JqZWN0IHwgc3RyaW5nKSA9PlxuICAgICAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID8gaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldIDogaXRlbVxuICAgICk7XG5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IHNlbGVjdGVkXG4gICAgICA/IHVuaW9uKHRoaXMuc2VsZWN0ZWRJdGVtSWRzLCBpdGVtSWRzKVxuICAgICAgOiB3aXRob3V0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzLCAuLi5pdGVtSWRzKTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMpO1xuICB9XG5cbiAgY2hhbmdlU2VsZWN0ZWRJdGVtKGl0ZW06IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gW2l0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XV07XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IFtdO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBpc0l0ZW1TZWxlY3RlZChpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtSWRzLmluY2x1ZGVzKGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSk7XG4gIH1cblxuICBvbkNvbHVtbkRyb3AoeyBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXggfSkge1xuICAgIGNvbnN0IGRpZmZlcmVudEluZGV4ID0gcHJldmlvdXNJbmRleCAhPT0gY3VycmVudEluZGV4O1xuXG4gICAgaWYgKGRpZmZlcmVudEluZGV4KSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU9SREVSX0NPTFVNTlMsXG4gICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5OYW1lc1twcmV2aW91c0luZGV4XVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuc3BsaWNlKHByZXZpb3VzSW5kZXgsIDEpO1xuICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShjdXJyZW50SW5kZXgsIDAsIGNvbHVtblswXSk7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3Jlb3JkZXJDb2x1bW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICB0aGlzLmNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4udmlzaWJsZSlcbiAgICAgICAgICAubWFwKCh7IGdyaWRUcmFja1NpemUgfSkgPT4gZ3JpZFRyYWNrU2l6ZSlcbiAgICAgICAgICAuam9pbignICcpXG4gICAgICApLFxuICAgICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoYDEgLyAtMWApXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZVRoRWxzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50aEVscyA9IHRoaXMudGhSZWZzXG4gICAgICAgID8gdGhpcy50aFJlZnMudG9BcnJheSgpLm1hcCgoeyBuYXRpdmVFbGVtZW50IH0pID0+IG5hdGl2ZUVsZW1lbnQpXG4gICAgICAgIDogW107XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBUbyBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuXG4gIGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW46IENvbHVtbikge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleE9mKFxuICAgICAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKSxcbiAgICAgICAgY29sdW1uXG4gICAgICApID5cbiAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUpLmxlbmd0aCAvIDJcbiAgICApO1xuICB9XG5cbiAgZW1pdENvbmZpZ0NoYW5nZShldmVudFR5cGU/OiBHcmlkRXZlbnRUeXBlKSB7XG4gICAgaWYgKHRoaXMuY29sdW1uc0luaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpO1xuICAgICAgY29uc3QgY29uZmlnID0geyBjb2x1bW5zLCBwYWdpbmF0aW9uOiB0aGlzLnBhZ2luYXRpb24gfTtcbiAgICAgIHRoaXMub25Db25maWdDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgICAgdGhpcy5vblNvcnQuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYWdpbmF0aW9uJzpcbiAgICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZW9yZGVyQ29sdW1uJzpcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uUmVvcmRlcmVkLmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2hhbmdlQ29sdW1uVmlzaWJpbGl0eSc6XG4gICAgICAgICAgdGhpcy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChldmVudERhdGEpIHtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KHRoaXMucHJvZHVjdEV4cGVyaWVuY2VFdmVudD8uZXZlbnROYW1lIHx8IFBYX0VWRU5UX05BTUUsIHtcbiAgICAgIC4uLnRoaXMucHJvZHVjdEV4cGVyaWVuY2VFdmVudD8uZGF0YSxcbiAgICAgIC4uLmV2ZW50RGF0YVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2socm93OiBSb3cpIHtcbiAgICB0aGlzLmxhc3RDbGlja2VkUm93ID0gcm93O1xuICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuICB9XG5cbiAgcGVyZm9ybVNlYXJjaChzZWFyY2hUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgIHRoaXMubWFudWFsU2VhcmNoJC5uZXh0KHNlYXJjaFRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNlYXJjaE9ic2VydmFibGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGF1dG9TZWFyY2gkID0gdGhpcy5zZWFyY2hUZXh0JC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuU0VBUkNIX0RFQk9VTkNFX1RJTUUpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUpLFxuICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG1hbnVhbFNlYXJjaCQgPSB0aGlzLm1hbnVhbFNlYXJjaCQucGlwZShcbiAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZS50cmltKCkgIT09ICcnKSxcbiAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgIHRoaXMubGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBtZXJnZShhdXRvU2VhcmNoJCwgbWFudWFsU2VhcmNoJClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgICB0YXAoc2VhcmNoVGV4dCA9PiB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICAgICAgICB0aGlzLm9uQmVmb3JlU2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFQVJDSCxcbiAgICAgICAgICAgIHNlYXJjaElucHV0OiBzZWFyY2hUZXh0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2V0RmlsdGVyQWN0aW9uKGNvbHVtbjogQ29sdW1uKSB7XG4gICAgdGhpcy5vbkNvbHVtbkZpbHRlclJlc2V0LmVtaXQoY29sdW1uKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyUHJlZGljYXRlOiB1bmRlZmluZWQsXG4gICAgICBleHRlcm5hbEZpbHRlclF1ZXJ5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBDb2x1bW5Ub0NvbmZpZyhjb2x1bW46IENvbHVtbik6IENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZyB7XG4gICAgbGV0IGNvbmZpZztcbiAgICBpZiAoY29sdW1uLmN1c3RvbSkge1xuICAgICAgY29uc3QgeyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGV4dGVybmFsRmlsdGVyUXVlcnksIGhlYWRlciwgcGF0aCB9ID0gY29sdW1uO1xuICAgICAgY29uZmlnID0ge1xuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBzb3J0T3JkZXIsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZpbHRlcjogeyBleHRlcm5hbEZpbHRlclF1ZXJ5IH0sXG4gICAgICAgIGhlYWRlcixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgY3VzdG9tOiB0cnVlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9ID0gY29sdW1uO1xuICAgICAgY29uZmlnID0geyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGZpbHRlcjogeyBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gfTtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXB0eShjb25maWc/LmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuZmlsdGVyO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGxvYWREYXRhKHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm93cyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwYWdpbmF0aW9uLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0aW9uUHJpbWFyeUtleSxcbiAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgfSA9IHRoaXM7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UubG9hZERhdGEoe1xuICAgICAgcm93cyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwYWdpbmF0aW9uLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0aW9uUHJpbWFyeUtleSxcbiAgICAgIGluZmluaXRlU2Nyb2xsLFxuICAgICAgcmVsb2FkXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnMoKSB7XG4gICAgY29uc3Qgc3BlY2lhbENvbHVtbiA9IHtcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHNlbGVjdGlvbkNvbHVtbiA9IHRoaXMuc2VsZWN0YWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICBuYW1lOiB0aGlzLnNpbmdsZVNlbGVjdGlvbiA/IFNwZWNpYWxDb2x1bW5OYW1lLlJhZGlvQnV0dG9uIDogU3BlY2lhbENvbHVtbk5hbWUuQ2hlY2tib3gsXG4gICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogJzMycHgnXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGlvbnNDb2x1bW4gPVxuICAgICAgdGhpcy5hY3Rpb25Db250cm9scz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwZWNpYWxDb2x1bW4sXG4gICAgICAgICAgICBuYW1lOiBTcGVjaWFsQ29sdW1uTmFtZS5BY3Rpb25zLFxuICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogJ21pbm1heCg0MHB4LCBhdXRvKSdcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZXhwYW5kYWJsZVJvd3NDb2x1bW4gPSB0aGlzLmV4cGFuZGFibGVSb3dzICE9PSAnTk9ORScgPyBuZXcgRXhwYW5kYWJsZVJvd0NvbHVtbigpIDogbnVsbDtcbiAgICBjb25zdCBjb2x1bW5zID0gW2V4cGFuZGFibGVSb3dzQ29sdW1uLCBzZWxlY3Rpb25Db2x1bW4sIC4uLnRoaXMuY29sdW1ucywgYWN0aW9uc0NvbHVtbl1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAodGhpcy53aXRoQ29sdW1uRGVmYXVsdHMpO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gdW5pcUJ5KGNvbHVtbnMsICduYW1lJyk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5OYW1lcygpO1xuICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgdGhpcy51cGRhdGVUaEVscygpO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqLCByZXN1bHRzID0gW10pIHtcbiAgICBpZiAob2JqICYmIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5jaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqW2tleV0sIHJlc3VsdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzLnNvbWUodmFsID0+ICEhdmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aENvbHVtbkRlZmF1bHRzKGNvbHVtbik6IENvbHVtbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGUgfHwgQ29sdW1uRGF0YVR5cGUuVGV4dFNob3J0O1xuICAgIGNvbnN0IHsgaGVhZGVyQ1NTQ2xhc3NOYW1lLCBjZWxsQ1NTQ2xhc3NOYW1lIH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0T3JkZXI6ICcnLFxuICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGdyaWRUcmFja1NpemU6XG4gICAgICAgIGNvbHVtbi5ncmlkVHJhY2tTaXplIHx8XG4gICAgICAgIGBtaW5tYXgoJHttaW5Db2x1bW5HcmlkVHJhY2tTaXplfXB4LCAke3JhdGlvc0J5Q29sdW1uVHlwZXNbZGF0YVR5cGVdfWZyKWAsXG4gICAgICBoZWFkZXJDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgaGVhZGVyQ1NTQ2xhc3NOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gaGVhZGVyQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJylcbiAgICAgICAgICA6IGhlYWRlckNTU0NsYXNzTmFtZSkgfHwgW10sXG4gICAgICBjZWxsQ1NTQ2xhc3NOYW1lOlxuICAgICAgICAodHlwZW9mIGNlbGxDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnID8gY2VsbENTU0NsYXNzTmFtZS5zcGxpdCgnICcpIDogY2VsbENTU0NsYXNzTmFtZSkgfHxcbiAgICAgICAgW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1lcygpIHtcbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJlc2l6ZUhhbmRsZSgpIHtcbiAgICBjb25zdCByZXNpemVIYW5kbGVEcmFnJCA9IHRoaXMucmVzaXplSGFuZGxlTW91c2VEb3duJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgbWVyZ2VNYXAoKHsgZXZlbnQsIHRhcmdldENvbHVtbk5hbWUgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0YXJnZXRDb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogdW5pb24oY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgWydoZWFkZXItLWJlaW5nLXJlc2l6ZWQnXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB7XG4gICAgICAgICAgY29sdW1uTmFtZTogdGFyZ2V0Q29sdW1uTmFtZSxcbiAgICAgICAgICBlbDogKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgICAgICB0YWJsZUN1cnNvcjogJ2NvbC1yZXNpemUnXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VNb3ZlJC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmVzaXplSGFuZGxlRHJhZyQuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkICYmIGNvbHVtbi5uYW1lID09PSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5jb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJEaXY6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gUmVhZCBzY3JvbGxDb250YWluZXJFbCdzIG9mZnNldCBsZWZ0IHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPSBzY3JvbGxDb250YWluZXJEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgICAgICAgICAgLy8gQWRqdXN0IHdpdGggdGhlIHNjcm9sbENvbnRhaW5lckVsIGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbFNjcm9sbE9mZnNldCA9IHNjcm9sbENvbnRhaW5lckRpdi5zY3JvbGxMZWZ0IC0gaG9yaXpvbnRhbE9mZnNldDtcblxuICAgICAgICAgICAgLy8gUmVhZCBsZWZ0IG9mZnNldCBvZiB0aGUgcmVzaXplZCBoZWFkZXIuXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJPZmZzZXRMZWZ0ID0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuZWwub2Zmc2V0TGVmdCB8fCAwO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRlc2lyZWQgd2lkdGguXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGhvcml6b250YWxTY3JvbGxPZmZzZXQgKyBldmVudC5jbGllbnRYIC0gaGVhZGVyT2Zmc2V0TGVmdDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbHVtbiBvYmplY3Qgd2l0aCB0aGUgbmV3IHNpemUgdmFsdWUsIGVuZm9yY2Ugb3VyIG1pbmltdW0gc2l6ZS5cbiAgICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogYCR7TWF0aC5tYXgobWluQ29sdW1uR3JpZFRyYWNrU2l6ZSwgd2lkdGgpfXB4YFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgdGhlIG90aGVyIGhlYWRlcnMgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNldCB3aWR0aCwgZml4IGl0IHRvIHRoZWlyIGNvbXB1dGVkIHdpZHRoLlxuICAgICAgICAgIGlmIChjb2x1bW4uZ3JpZFRyYWNrU2l6ZS5zdGFydHNXaXRoKCdtaW5tYXgnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAvLyBpc24ndCBmaXhlZCB5ZXQgKGl0IHdvdWxkIGJlIGEgcHggdmFsdWUpXG4gICAgICAgICAgICAgIGdyaWRUcmFja1NpemU6IGAke19wYXJzZUludCh0aGlzLnRoRWxzW2ldLmNsaWVudFdpZHRoKX1weGBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVXBkYXRlIHRoZSBjb2x1bW4gc2l6ZXMuXG4gICAgICAgICAqIE5vdGU6IGdyaWQtdGVtcGxhdGUtY29sdW1ucyBzZXRzIHRoZSB3aWR0aCBmb3IgYWxsIGNvbHVtbnMgaW4gb25lIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4ubmFtZSA9PT0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICBoZWFkZXJDU1NDbGFzc05hbWU6IHdpdGhvdXQoY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgJ2hlYWRlci0tYmVpbmctcmVzaXplZCcpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhlYWRlckJlaW5nUmVzaXplZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgICAgICB0YWJsZUN1cnNvcjogJ2F1dG8nXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyTW91c2VIaWdobGlnaHRzKCkge1xuICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGUsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgY29uc3QgY29sdW1uUmVuZGVyZXIgPSB0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbik7XG4gICAgY29uc3QgcmVuZGVyZXJUZW1wbGF0ZSA9IGdldChcbiAgICAgIGNvbHVtblJlbmRlcmVyLFxuICAgICAgYCR7dHlwZSA9PT0gJ0hFQURFUicgPyAnaGVhZGVyQ2VsbFJlbmRlcmVyRGVmJyA6ICdjZWxsUmVuZGVyZXJEZWYnfS50ZW1wbGF0ZWBcbiAgICApO1xuXG4gICAgY29uc3QgeyBjZWxsUmVuZGVyZXJDb21wb25lbnQsIGhlYWRlckNlbGxSZW5kZXJlckNvbXBvbmVudCB9ID0gY29sdW1uO1xuICAgIGNvbnN0IHJlbmRlcmVyQ29tcG9uZW50ID1cbiAgICAgIHR5cGUgPT09ICdIRUFERVInID8gaGVhZGVyQ2VsbFJlbmRlcmVyQ29tcG9uZW50IDogY2VsbFJlbmRlcmVyQ29tcG9uZW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmVyOiByZW5kZXJlclRlbXBsYXRlIHx8IHJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXRlbTogcm93LFxuICAgICAgICBwcm9wZXJ0eTogY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKTogQ29sdW1uRGlyZWN0aXZlIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5SZW5kZXJlcnMudG9BcnJheSgpLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcmluZ0xhYmVsc1BhcmFtcyhzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgdGhpcy5maWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgICBmaWx0ZXJlZEl0ZW1zQ291bnQ6IHN0YXRzLmZpbHRlcmVkU2l6ZSxcbiAgICAgIGFsbEl0ZW1zQ291bnQ6IHN0YXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdpbmF0aW9uTGFiZWxQYXJhbXMoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmIChzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIG5leHRQYWdlOiBzdGF0cy5uZXh0UGFnZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VGaXJzdEl0ZW1JZHggPSAoc3RhdHMuY3VycmVudFBhZ2UgLSAxKSAqIHN0YXRzLmZpcnN0UGFnZVNpemUgKyAxO1xuICAgIHRoaXMucGFnaW5hdGlvbkxhYmVsUGFyYW1zID0ge1xuICAgICAgcGFnZUZpcnN0SXRlbUlkeCxcbiAgICAgIHBhZ2VMYXN0SXRlbUlkeDogcGFnZUZpcnN0SXRlbUlkeCArIChzdGF0cy5jdXJyZW50UGFnZVNpemUgLSAxKSxcbiAgICAgIGl0ZW1zVG90YWw6IHN0YXRzLmZpbHRlcmVkU2l6ZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb25XaGVuTm9EZXZpY2VzTGFzdFBhZ2Uoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmICghc3RhdHMubmV4dFBhZ2UgJiYgc3RhdHMuY3VycmVudFBhZ2VTaXplID09PSAwICYmIHN0YXRzLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSB7XG4gICAgICAgIC4uLnRoaXMucGFnaW5hdGlvbixcbiAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSAtIDEsXG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgJiZcbiAgICAgIHN0YXRzICYmXG4gICAgICBzdGF0cy5uZXh0UGFnZSAmJlxuICAgICAgKCF0aGlzLmxvYWRNb3JlQ29tcG9uZW50IHx8IHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudClcbiAgICApIHtcbiAgICAgIHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudCA9IGZhbHNlO1xuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbENvbnRhaW5lci5jbGVhcigpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5pbmZpbml0ZVNjcm9sbENvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoTG9hZE1vcmVDb21wb25lbnQpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgTG9hZE1vcmVDb21wb25lbnQ7XG4gICAgICBpbnN0YW5jZS51c2VJbnRlcnNlY3Rpb24gPSB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnYXV0bycgfHwgdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2hpZGRlbic7XG4gICAgICBpbnN0YW5jZS5oaWRkZW4gPSB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnaGlkZGVuJztcbiAgICAgIGluc3RhbmNlLnBhZ2luZyA9IHtcbiAgICAgICAgbmV4dFBhZ2U6IHN0YXRzLm5leHRQYWdlLFxuICAgICAgICBuZXh0OiB0aGlzLmxvYWROZXh0UGFnZS5iaW5kKHRoaXMpXG4gICAgICB9IGFzIFBhZ2luZzxJSWRlbnRpZmllZD47XG4gICAgICBpbnN0YW5jZS5sb2FkTmV4dExhYmVsID0gdGhpcy5sb2FkTW9yZUl0ZW1zTGFiZWw7XG4gICAgICBpbnN0YW5jZS5sb2FkaW5nTGFiZWwgPSB0aGlzLmxvYWRpbmdJdGVtc0xhYmVsO1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudCA9IGluc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sb2FkTW9yZUNvbXBvbmVudCAmJiAhc3RhdHMubmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVDb21wb25lbnQucGFnaW5nID0ge1xuICAgICAgICBuZXh0UGFnZTogbnVsbFxuICAgICAgfSBhcyBQYWdpbmc8SUlkZW50aWZpZWQ+O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCkge1xuICAgIG1lcmdlKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMub25Tb3J0LFxuICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UsXG4gICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQsXG4gICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlXG4gICAgICApLnBpcGUobWFwKGNvbmZpZyA9PiBjb25maWcuY29sdW1ucykpLFxuICAgICAgbWVyZ2UodGhpcy5vbkFkZEN1c3RvbUNvbHVtbiwgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbikucGlwZShcbiAgICAgICAgbWFwKCgpID0+ICh0aGlzLmNvbHVtbnMgfHwgW10pLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpKVxuICAgICAgKSxcbiAgICAgIHRoaXMub25GaWx0ZXIucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbHVtbk5hbWUsIGZpbHRlcmluZ01vZGlmaWVyIH0pID0+XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpLm1hcCgoY29sdW1uOiBDb2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChpc05pbChjb2x1bW5OYW1lKSkge1xuICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLm5hbWUgPT09IGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoZmlsdGVyaW5nTW9kaWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5maWx0ZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlciA9IGZpbHRlcmluZ01vZGlmaWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGNvbHVtbnM6IEFycmF5PENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZz4pID0+ICh7XG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgfVxuICAgICAgICB9KSksXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5KSxcbiAgICAgICAgdGhpcy50cmltRmlsdGVyQ29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1Tb3J0Q29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uT3JkZXJQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKSxcbiAgICAgICAgY29uY2F0TWFwKChjb25maWc6IEdyaWRDb25maWcpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LnNhdmVDb25maWckKGNvbmZpZykpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1GaWx0ZXJDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnZmlsdGVyJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChjb2wgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBjb2wuZmlsdGVyO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1Tb3J0Q29uZmlnUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3NvcnQnLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29sLnNvcnRPcmRlciA9ICcnO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248XG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPixcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+XG4gID4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnY3VzdG9tQ29sdW1ucycsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoKGNvbDogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiAhY29sLmN1c3RvbSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uT3JkZXJQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnb3JkZXInLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRDb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgIG9sZENvbmZpZz8uY29sdW1ucyB8fCAodGhpcy5kZWZhdWx0Q29sdW1ucyBhcyBDb2x1bW5Db25maWdbXSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjdXN0b20gY29sdW1ucyBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnNBZGRlZCA9IChjb25maWcuY29sdW1ucyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICBjb2wgPT4gIW9sZENvbHVtbnMuZmluZChvbGQgPT4gb2xkLm5hbWUgPT09IGNvbC5uYW1lKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSBbXG4gICAgICAgICAgICAgIC4uLm9sZENvbHVtbnMubWFwKG9sZENvbCA9PlxuICAgICAgICAgICAgICAgIChjb25maWcuY29sdW1ucyB8fCBbXSkuZmluZChuZXdDb2wgPT4gbmV3Q29sLm5hbWUgPT09IG9sZENvbC5uYW1lKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5zQWRkZWRcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCd2aXNpYmlsaXR5JywgY29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbmZpZyQoKS5waXBlKFxuICAgICAgICAgIG1hcChvbGRDb25maWcgPT4ge1xuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChuZXdDb2wgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkQ29sID0gY29sdW1ucy5maW5kKChjb2w6IGFueSkgPT4gbmV3Q29sLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgbmV3Q29sLnZpc2libGUgPSBvbGRDb2w/LnZpc2libGUgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXZlbnRQaXBlKFxuICAgIGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0LFxuICAgIHRyaW1FdmVudERhdGFGbjogKGNvbmZpZzogR3JpZENvbmZpZykgPT4gR3JpZENvbmZpZyB8IE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ29uZmlnRmlsdGVyXG4gICAgICAgICAgLmNhbGwodGhpcywgY29uZmlnUGFydClcbiAgICAgICAgICAucGlwZShtYXAoa2VlcEV2ZW50RGF0YSA9PiAoeyBjb25maWcsIGtlZXBFdmVudERhdGEgfSkpKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSA9PlxuICAgICAgICBrZWVwRXZlbnREYXRhID8gY29uZmlnIDogdHJpbUV2ZW50RGF0YUZuLmNhbGwodGhpcywgY29uZmlnKVxuICAgICAgKSxcbiAgICAgIGNvbmNhdE1hcChjb25maWcgPT4gKGlzT2JzZXJ2YWJsZShjb25maWcpID8gY29uZmlnIDogb2YoY29uZmlnKSkgYXMgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29uZmlnRmlsdGVyKGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGNvbnN0IHZhbHVlT3JGbiA9IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbnRleHQoKT8uY29uZmlnRmlsdGVyPy5bY29uZmlnUGFydF07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZU9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlT3JGbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZU9yRm47XG4gICAgfVxuICAgIHJldHVybiB0b09ic2VydmFibGUocmVzdWx0ID8/IHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYWZlbHlJbnZva2VNYXRjaGVyKFxuICAgIG1hdGNoZXNGbjogKFxuICAgICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgY29udGV4dD86IEdyaWRDb25maWdDb250ZXh0XG4gICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIGNvbnRleHQ/OiBHcmlkQ29uZmlnQ29udGV4dFxuICApIHtcbiAgICBpZiAobWF0Y2hlc0ZuKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc0ZuKHJvdXRlLCBjb250ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1zY3JvbGxcIlxuICAjc2Nyb2xsXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndGFibGUtZGF0YS1ncmlkX19vdmVybGF5JzogKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiYgIWxvYWRNb3JlQ29tcG9uZW50Py5pc0xvYWRpbmdcbiAgfVwiXG4gIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS10YWJsZS1kYXRhLWdyaWQtc2Nyb2xsXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS13cmFwcGVyXCJcbiAgICAqbmdJZj1cIihkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudD8uaXNMb2FkaW5nXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWRfX2xvYWRpbmctLWxvYWRlclwiPlxuICAgICAgPGM4eS1sb2FkaW5nXG4gICAgICAgIGxheW91dD1cImFwcGxpY2F0aW9uXCJcbiAgICAgICAgW21lc3NhZ2VdPVwibG9hZGluZ0l0ZW1zTGFiZWxcIlxuICAgICAgPjwvYzh5LWxvYWRpbmc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1oZWFkZXIgc2VwYXJhdG9yIGxhcmdlLXBhZGRpbmdcIlxuICAgICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZ3JpZEhlYWRlclwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImg0XCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ20tci0xNic6ICEhdGl0bGUgfVwiXG4gICAgPlxuICAgICAge3sgdGl0bGUgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcmluZ0FwcGxpZWRcIj5cbiAgICAgICAgPHNtYWxsXG4gICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgKm5nSWY9XCIhIWZpbHRlcmluZ0xhYmVsc1BhcmFtcy5hbGxJdGVtc0NvdW50XCJcbiAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJmaWx0ZXJpbmdMYWJlbHNQYXJhbXNcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZmlsdGVyZWRJdGVtc0NvdW50IH19IG9mIHt7IGFsbEl0ZW1zQ291bnQgfX0gaXRlbXNcbiAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImxhYmVsIGxhYmVsLWRlZmF1bHQgbS1yLTRcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgTm8gZmlsdGVyc1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgKm5nSWY9XCJmaWx0ZXJpbmdBcHBsaWVkXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvIG0tci00XCI+XG4gICAgICAgICAgICAgIHt7IChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIG9mIHt7IGFsbEl0ZW1zQ291bnQgfX0gaXRlbXNcbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgI2RkRmlsdGVycz1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImRkRmlsdGVycy5pc09wZW5cIlxuICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBtLWwtOFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBY3RpdmUgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1maWx0ZXJzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cImZpbHRlclwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0FjdGl2ZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1yZWxhdGl2ZSBwLWwtNCBwLXItMTZcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1zeXN0ZW0gcC1hYnNvbHV0ZVwiPlxuICAgICAgICAgICAgICAgIHt7IGNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQubGVuZ3RoIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiXG4gICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1ncmlkX19kcm9wZG93biBiZy1sZXZlbC0wXCI+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbS0wXCI+XG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQ7IGxldCBsYXN0ID0gbGFzdFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZXBhcmF0b3ItYm90dG9tJzogIWxhc3QgfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taGVhZGVyIHN0aWNreS10b3AgdGV4dC10cnVuY2F0ZSBuby1ib3JkZXItdG9wIHAtYi0wXCJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJvcmRlcmxlc3MgZC1mbGV4IGQtY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cGVkRmlsdGVyQ2hpcHMgb2YgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWFwVG9GaWx0ZXJDaGlwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ3JvdXBlZEZpbHRlckNoaXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3AtdC0wJzogZmlyc3QgfVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWFsbCBwLWItNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyb3VwZWRGaWx0ZXJDaGlwcy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXBlZEZpbHRlckNoaXBzLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlciBnYXAtNCBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnIHRhZy0taW5mbyBjaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoaXAgb2YgZ3JvdXBlZEZpbHRlckNoaXBzLmNoaXBzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi14cyBidG4tY2xlYW4gdGV4dC0xMCBtLXItNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVtb3ZlIGZpbHRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoY2hpcC5yZW1vdmUoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yZW1vdmUtY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwidGltZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjaGlwLmRpc3BsYXlWYWx1ZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gc2VwYXJhdG9yLXRvcCBzdGlja3ktYm90dG9tXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NsZWFyIGFsbCBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tY2xlYXItZmlsdGVyc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyAnQ2xlYXIgYWxsIGZpbHRlcnMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtIGhpZGRlbi14cyBoaWRkZW4tc21cIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtwb3BvdmVyXT1cImZpbHRlcnNIZWxwUG9wb3ZlclwiXG4gICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImRpc3BsYXlPcHRpb25zLmZpbHRlclwiXG4gICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWhlbHAtZmlsdGVyc1wiXG4gICAgICA+XG4gICAgICAgIDxpIGM4eUljb249XCJxdWVzdGlvbi1jaXJjbGUtb1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLXRlbXBsYXRlICNmaWx0ZXJzSGVscFBvcG92ZXI+XG4gICAgICAgIDxkaXYgW2lubmVySHRtbF09XCJmaWx0ZXJzSGVscFBvcG92ZXJIdG1sIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIHRleHQtcHJpbWFyeSBoaWRkZW4teHMgaGlkZGVuLXNtXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBwb3BvdmVyPVwie3sgJ1RoZSBjb3VudGVyIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIG1pZ2h0IGJlIGluYWNjdXJhdGUuJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cInNob3dDb3VudGVyV2FybmluZ1wiXG4gICAgICA+XG4gICAgICAgIDxpIGM4eUljb249XCJ3YXJuaW5nXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG5iYXIgZC1mbGV4IGEtaS1jZW50ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBoZWFkZXJBY3Rpb25Db250cm9sIG9mIGhlYWRlckFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzIHwgYXN5bmNcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoZWFkZXJBY3Rpb25Db250cm9sLnRlbXBsYXRlOyBlbHNlIGN1c3RvbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0biBidG4tbGlua1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgaGVhZGVyQWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoZWFkZXJBY3Rpb25Db250cm9sLmNhbGxiYWNrKClcIlxuICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgdHlwZTogaGVhZGVyQWN0aW9uQ29udHJvbC50eXBlXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAgIFtjOHlJY29uXT1cImhlYWRlckFjdGlvbkNvbnRyb2wuaWNvblwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tVGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgaGVhZGVyQWN0aW9uQ29udHJvbC50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IGhlYWRlckFjdGlvbkNvbnRyb2w6IGhlYWRlckFjdGlvbkNvbnRyb2wgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdFwiXG4gICAgICAgICAgKm5nSWY9XCJjb25maWd1cmVDb2x1bW5zRW5hYmxlZFwiXG4gICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAjZGRDb25maWd1cmVDb2x1bW5zPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZGRDb25maWd1cmVDb2x1bW5zLmlzT3BlblwiXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NvbmZpZ3VyZSBjb2x1bW5zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4tYnRuXCJcbiAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJjb2x1bW5zXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyAnQ29uZmlndXJlIGNvbHVtbnMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPHVsXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZGF0YS1ncmlkX19kcm9wZG93blwiXG4gICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAgbS0wXCJcbiAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Db2x1bW5Ecm9wKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdMb2NrQXhpcz1cInlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLnBvc2l0aW9uRml4ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkcmFnZ2FibGUtYWZ0ZXIgcC0wIGEtaS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94IHAtbC0xNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4taGVhZGVyLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR3JpZENvbHVtbnNTaXplKCk7IGVtaXRDb25maWdDaGFuZ2UoJ2NoYW5nZUNvbHVtblZpc2liaWxpdHknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ0hBTkdFX1ZJU0lCSUxJVFksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiAhY29sdW1uLnZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBzaG93T25Ib3ZlciBtYXgtd2lkdGgtZml0IGEtaS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlYGNvbHVtbix2ZXJiYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdSZW1vdmVgY29sdW1uLHZlcmJgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ3VzdG9tQ29sdW1uKHBvQ29uZmlybSwgY29sdW1uLCBkZENvbmZpZ3VyZUNvbHVtbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmN1c3RvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGM4eS1wb3BvdmVyLWNvbmZpcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidDb25maXJtIHJlbW92YWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgI3BvQ29uZmlybVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYzh5LXBvcG92ZXItY29uZmlybT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJtaW51cy1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLXJlbW92ZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgIGNsYXNzPVwicC04IHN0aWNreS1ib3R0b20gc2VwYXJhdG9yLXRvcFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNDb25maWdDb250ZXh0S25vd25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQgY3VzdG9tIGNvbHVtbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWFkZC1jdXN0b20tY29sdW1uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkN1c3RvbUNvbHVtbk1vZGFsKCk7IGRkQ29uZmlndXJlQ29sdW1ucy5oaWRlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdBZGQgY3VzdG9tIGNvbHVtbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAqbmdJZj1cIiFoaWRlUmVsb2FkXCJcbiAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1yZWxvYWQtYnRuXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSZWxvYWQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8c3Bhbj57eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoIG0tbC1zbS0xNiBkYXRhLWdyaWRfX3NlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgKm5nSWY9XCIhc2VydmVyU2lkZURhdGFDYWxsYmFjayB8fCBzaG93U2VhcmNoXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VhcmNo4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hUZXh0JC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwZXJmb3JtU2VhcmNoKHNlYXJjaFRleHQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgYzh5SWNvbj1cInNlYXJjaFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGV4dC5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwicG9pbnRlclwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJ0aW1lc1wiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGV4dC5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaFRleHQgPSAnJzsgc2VhcmNoVGV4dCQuZW1pdCgnJylcIlxuICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX1NFQVJDSCB9XCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtaGVhZGVyLWJ1bGstYWN0aW9ucyBhbmltYXRlZCBzbGlkZUluRG93biBmYXN0XCJcbiAgICAgIGRhdGEtY3k9XCJ0YWJsZS1kYXRhLWdyaWQtaGVhZGVyLWJ1bGstYWN0aW9uc1wiXG4gICAgICAqbmdJZj1cInNlbGVjdGVkSXRlbUlkcy5sZW5ndGggIT09IDBcIlxuICAgID5cbiAgICAgIDxoND5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdQbHVyYWxdPVwic2VsZWN0ZWRJdGVtSWRzLmxlbmd0aFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCI9MVwiPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPjEgc2VsZWN0ZWQgaXRlbS48L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwib3RoZXJcIj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBjb3VudDogc2VsZWN0ZWRJdGVtSWRzLmxlbmd0aCB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgY291bnQgfX0gc2VsZWN0ZWQgaXRlbXMuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxiciBjbGFzcz1cInZpc2libGUteHNcIiAvPlxuICAgICAgICA8c21hbGwgKm5nSWY9XCIhc2VydmVyU2lkZURhdGFDYWxsYmFjayAmJiBzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoID49IHBhZ2luYXRpb24ucGFnZVNpemVcIj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgY2xhc3M9XCJpbnRlcmFjdFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0QWxsSXRlbXNTZWxlY3RlZCh0cnVlKVwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0FMTF9JVEVNUyB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInsgY291bnQ6IChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFNlbGVjdCBhbGwge3sgY291bnQgfX0gaXRlbXNcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvc21hbGw+XG4gICAgICA8L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cIm0tbC1hdXRvXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG5iYXIgZC1mbGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBidWxrQWN0aW9uQ29udHJvbCBvZiBidWxrQWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHNlbGVjdGVkSXRlbUlkcyB8IGFzeW5jXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImJ1bGtBY3Rpb25Db250cm9sLnR5cGVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XCJcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0VYUE9SVCB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJzaWduLW91dFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0RFTEVURSB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgYnVsa0FjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkJVTEtfQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGJ1bGtBY3Rpb25Db250cm9sLnRleHRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiYnVsa0FjdGlvbkNvbnRyb2wuaWNvbkNsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInt7IGJ1bGtBY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgYnVsa0FjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcbiAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkJVTEtfQ0FOQ0VMXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDx0YWJsZVxuICAgIGNsYXNzPVwidGFibGUgdGFibGUtZmlsdGVyZWQtc29ydGVkIHRhYmxlLWRhdGEtZ3JpZCBsYXJnZS1wYWRkaW5nXCJcbiAgICBbY2xhc3MudGFibGUtc3RyaXBlZF09XCJkaXNwbGF5T3B0aW9ucy5zdHJpcGVkXCJcbiAgICBbY2xhc3MudGFibGUtYm9yZGVyZWRdPVwiZGlzcGxheU9wdGlvbnMuYm9yZGVyZWRcIlxuICAgIFtjbGFzcy50YWJsZS1ob3Zlcl09XCJkaXNwbGF5T3B0aW9ucy5ob3ZlclwiXG4gICAgW2NsYXNzLnRhYmxlLWRhdGEtZ3JpZC13aXRoLWNoZWNrYm94ZXNdPVwic2VsZWN0YWJsZVwiXG4gICAgW2NsYXNzLnRhYmxlLWRhdGEtZ3JpZC13aXRoLWFjdGlvbnNdPVwiYWN0aW9uQ29udHJvbHMubGVuZ3RoID4gMFwiXG4gICAgW3N0eWxlLmdyaWQtdGVtcGxhdGUtY29sdW1uc109XCJzdHlsZXMuZ3JpZFRlbXBsYXRlQ29sdW1uc1wiXG4gICAgY2RrLXRhYmxlXG4gICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgW211bHRpVGVtcGxhdGVEYXRhUm93c109XCJ0cnVlXCJcbiAgICAobW91c2Vtb3ZlKT1cInJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQuZW1pdCgkZXZlbnQpXCJcbiAgICAobW91c2V1cCk9XCJyZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJC5lbWl0KCRldmVudClcIlxuICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS10YWJsZVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlOYW1lXCJcbiAgICAgIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi5uYW1lXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIGNkay1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKmNka0hlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0ZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIlxuICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUuYWxsU2VsZWN0ZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbERlc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0QWxsSXRlbXNJbkN1cnJlbnRQYWdlU2VsZWN0ZWQoJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0FMTF9JVEVNUyB9XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEl0ZW1zU2VsZWN0ZWQoW3Jvd10sICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUxFQ1RfSVRFTSxcbiAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tY2hlY2tib3hcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyYWRpby1idXR0b24nXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+PC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktcmFkaW9cIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0ZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwic2VsZWN0LXJvd1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVNlbGVjdGVkSXRlbShyb3cpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0lURU0sXG4gICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJhZGlvXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWN0aW9ucydcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIGNkay1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKmNka0hlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gc3Itb25seVwiPnt7ICdBY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkNvbnRyb2wgb2YgYWN0aW9uQ29udHJvbHNcbiAgICAgICAgICAgICAgICAgIHwgdmlzaWJsZUNvbnRyb2xzOiByb3dcbiAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgIHwgc2xpY2U6IDAgOiAoKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDIgPyAxIDogMilcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiYWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidFZGl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRWRpdFwiXG4gICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FRElUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWVkaXQtYnV0dG9uLWluLXJvd1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIHNob3dPbkhvdmVyXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RlbGV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5EZWxldGVcIlxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuREVMRVRFX0lURU0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yZW1vdmUtYnV0dG9uLWluLXJvd1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3RcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoYWN0aW9uQ29udHJvbC5pY29uID8gYWN0aW9uQ29udHJvbC50ZXh0IDogJycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAoYWN0aW9uQ29udHJvbC5pY29uID8gYWN0aW9uQ29udHJvbC50ZXh0IDogJycpIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IHNob3dPbkhvdmVyOiBhY3Rpb25Db250cm9sLnNob3dPbkhvdmVyIH1cIlxuICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DVVNUT01fQUNUSU9OX0lURU0sXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInYzh5LWRhdGEtZ3JpZC0tYnV0dG9uLWluLXJvdy0tJyArIGFjdGlvbkNvbnRyb2wudGV4dFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInt7IGFjdGlvbkNvbnRyb2wuaWNvbiB9fVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGlvbkNvbnRyb2wuaWNvbkNsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFjdGlvbkNvbnRyb2wuaWNvblwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYWN0aW9uQ29udHJvbC5pY29uXCI+e3sgYWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnbS1sLWF1dG8gb3ZlcmZsb3ctdmlzaWJsZSc6XG4gICAgICAgICAgICAgICAgICAoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMlxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSByaWdodFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIihhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93IHwgYXN5bmMpPy5sZW5ndGggPiAyXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlIGM4eS1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yb3ctYWN0aW9ucy1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJlbGxpcHNpcy12XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYWN0aW9uQ29udHJvbCBvZiBhY3Rpb25Db250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgfCB2aXNpYmxlQ29udHJvbHM6IHJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBzbGljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMiA/IDEgOiAyKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJhY3Rpb25Db250cm9sLnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkVESVRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5ERUxFVEVfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkVYUE9SVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRhdGEtZXhwb3J0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DVVNUT01fQUNUSU9OX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInt7IGFjdGlvbkNvbnRyb2wuaWNvbiB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGlvbkNvbnRyb2wuaWNvbkNsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBbY2xhc3Muc29ydGVkXT1cImNvbHVtbi5zb3J0T3JkZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmZpbHRlcmVkXT1cImNvbHVtbiB8IG1hcDogaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkXCJcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIWNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgIGNkay1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKmNka0hlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5oZWFkZXJDU1NDbGFzc05hbWVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10eXBlXT1cImNvbHVtbi5kYXRhVHlwZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhY29sdW1uLmZpbHRlcmFibGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXIgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gaXNEcm9wRG93blBsYWNlZFJpZ2h0IHRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20ge3sgaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbikgPyAncmlnaHQnIDogJ2xlZnQnIH19XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgICAgICNncmlkSGVhZGVyRHJvcGRvd249XCJicy1kcm9wZG93blwiXG4gICAgICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZ3JpZEhlYWRlckRyb3Bkb3duLmlzT3BlblwiXG4gICAgICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS1oZWFkZXItYnRuLS0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWMgOiB0aGlzIGFzIGNlbGxSZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGM4eS1jZWxsLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1jOHktY2VsbC1yZW5kZXJlclwiXG4gICAgICAgICAgICAgICAgICAgIFtzcGVjXT1cImNlbGxSZW5kZXJlclNwZWNcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPCEtLSBpc0Ryb3BEb3duUGxhY2VkUmlnaHQgdG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLiAtLT5cbiAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51XCJcbiAgICAgICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZHJvcGRvd24tbWVudS1yaWdodC1ncmlkJzogaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbikgfVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkYXRhLWdyaWRfX2Ryb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd246IGdyaWRIZWFkZXJEcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMgOiB0aGlzIGFzIGZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmctY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3BlY109XCJmaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tYzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXNvcnRcIlxuICAgICAgICAgICAgICBbc3R5bGVdPVwieyAnbWFyZ2luLWxlZnQnOiAhY29sdW1uLmZpbHRlcmFibGUgJiYgY29sdW1uLnNvcnRhYmxlID8gJy0yMHB4JyA6IG51bGwgfVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJzb3J0Q29sdW1uVGl0bGUgfCB0cmFuc2xhdGU6IHsgbmFtZTogY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSB9XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVNvcnRPcmRlcihjb2x1bW4ubmFtZSlcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwiY2hhbmdlLXNvcnQtb3JkZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4uc29ydE9yZGVyXCI+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJsb25nLWFycm93LXVwXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInYXNjJ1wiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImxvbmctYXJyb3ctZG93blwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2Rlc2MnXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwiZXhjaGFuZ2VcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnJlc2l6YWJsZVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiXG4gICAgICAgICAgICAgICAgcmVzaXplSGFuZGxlTW91c2VEb3duJC5lbWl0KHsgZXZlbnQ6ICRldmVudCwgdGFyZ2V0Q29sdW1uTmFtZTogY29sdW1uLm5hbWUgfSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jZWxsLXRpdGxlXT1cImNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uY2VsbENTU0NsYXNzTmFtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJjb2x1bW4uZGF0YVR5cGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXNvbHZlQ2VsbFZhbHVlKHJvdywgY29sdW1uLnBhdGgpLFxuICAgICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRDZWxsUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlciBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCI+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImluZmluaXRlU2Nyb2xsRm9vdGVyXCI+XG4gICAgICA8dGRcbiAgICAgICAgW3N0eWxlLmdyaWQtY29sdW1uXT1cInN0eWxlcy5ncmlkSW5maW5pdGVTY3JvbGxDb2x1bW5cIlxuICAgICAgICBjZGstZm9vdGVyLWNlbGxcbiAgICAgICAgKmNka0Zvb3RlckNlbGxEZWZcbiAgICAgID5cbiAgICAgICAgPHRlbXBsYXRlICNpbmZpbml0ZVNjcm9sbENvbnRhaW5lcj48L3RlbXBsYXRlPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0clxuICAgICAgY2RrLWhlYWRlci1yb3dcbiAgICAgICpjZGtIZWFkZXJSb3dEZWY9XCJjb2x1bW5OYW1lc1wiXG4gICAgPjwvdHI+XG5cbiAgICA8dHJcbiAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yb3ctaW4tZGF0YS1ncmlkXCJcbiAgICAgIGNkay1yb3dcbiAgICAgICpjZGtSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5OYW1lczsgbGV0IGlkeCA9IGRhdGFJbmRleFwiXG4gICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgIGFjdGl2ZUNsYXNzTmFtZSAmJiByb3cgPT09IGxhc3RDbGlja2VkUm93ID8gYWN0aXZlQ2xhc3NOYW1lIDogJycsXG4gICAgICAgIGlkeCAlIDIgPT09IDAgPyAnZXZlbicgOiAnb2RkJ1xuICAgICAgXVwiXG4gICAgICAobW91c2VvdmVyKT1cInJvd01vdXNlT3Zlci5lbWl0KHJvdylcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwicm93TW91c2VMZWF2ZS5lbWl0KHJvdylcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdylcIlxuICAgID48L3RyPlxuXG4gICAgPHRyXG4gICAgICBjbGFzcz1cImV4cGFuZGVkLXJvd1wiXG4gICAgICBbbmdDbGFzc109XCJ7IGhpZGRlbjogIShleHBhbmRlZFJvd3MuZ2V0KHJvdykudmlzaWJsZSQgfCBhc3luYykgfVwiXG4gICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tZXhwYW5kZWQtcm93LWluLWRhdGEtZ3JpZFwiXG4gICAgICBjZGstcm93XG4gICAgICAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydleHBhbmRlZC1yb3cnXTsgd2hlbjogaXNSb3dFeHBhbmRlZFwiXG4gICAgPjwvdHI+XG5cbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImV4cGFuZGVkLXJvd1wiPlxuICAgICAgPHRkXG4gICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCJzdHlsZXMuZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uXCJcbiAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBleHBhbmRhYmxlUm93Py50ZW1wbGF0ZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgJGltcGxpY2l0OiByb3csXG4gICAgICAgICAgICAgIGFzeW5jUmVuZGVyU3VjY2Vzczogc2V0RXhwYW5kYWJsZVJvd1Zpc2libGUuYmluZCh0aGlzLCByb3csIHRydWUpLFxuICAgICAgICAgICAgICBhc3luY1JlbmRlckZhaWw6IHNldEV4cGFuZGFibGVSb3dWaXNpYmxlLmJpbmQodGhpcywgcm93LCBmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgIDx0clxuICAgICAgICBbbmdDbGFzc109XCJ7IGhpZGRlbjogIWluZmluaXRlU2Nyb2xsIH1cIlxuICAgICAgICBjZGstZm9vdGVyLXJvd1xuICAgICAgICAqY2RrRm9vdGVyUm93RGVmPVwiWydpbmZpbml0ZVNjcm9sbEZvb3RlciddXCJcbiAgICAgID48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3RhYmxlPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImQtZmxleCBtLTAgcC10LTQwIHAtYi00MFwiXG4gICAgKm5nSWY9XCJcbiAgICAgICEoZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jKSAmJlxuICAgICAgKChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPT09IDAgfHwgKGRhdGFTb3VyY2UuZGF0YSQgfCBhc3luYykubGVuZ3RoID09PSAwKVxuICAgIFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgY29sLXNtLTQgbS1sLWF1dG8gbS1yLWF1dG9cIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImM4eS11aS1lbXB0eS1zdGF0ZSwgLmM4eS1lbXB0eS1zdGF0ZVwiPjwvbmctY29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICBlbXB0eVN0YXRlPy50ZW1wbGF0ZVJlZjtcbiAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogZW1wdHlTdGF0ZUNvbnRleHQkIHwgYXN5bmMgfVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtZm9vdGVyIHNlcGFyYXRvciBsYXJnZS1wYWRkaW5nXCJcbiAgICAqbmdJZj1cInBhZ2luYXRpb24gJiYgIWluZmluaXRlU2Nyb2xsXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjb3VudGVyIHAtdC04IHAtYi04XCJcbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuY3VycmVudFBhZ2VTaXplID4gMFwiXG4gICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWNvdW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZFwiXG4gICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwicGFnaW5hdGlvbkxhYmVsUGFyYW1zXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHBhZ2VGaXJzdEl0ZW1JZHggfX0gLSB7eyBwYWdlTGFzdEl0ZW1JZHggfX0gb2Yge3sgaXRlbXNUb3RhbCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0taW5saW5lIHAtdC04IHAtYi04XCJcbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID4gbWluUG9zc2libGVQYWdlU2l6ZVwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgIGZvcj1cImZpbHRlcmVkU2l6ZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAnSXRlbXMgcGVyIHBhZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBpZD1cImZpbHRlcmVkU2l6ZVwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1wYWdlc2l6ZS1vcHRpb25zXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgIHVwZGF0ZVBhZ2luYXRpb24oeyBpdGVtc1BlclBhZ2U6ICRldmVudCwgcGFnZTogcGFnaW5hdGlvbi5jdXJyZW50UGFnZSB9KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwYWdlU2l6ZSBvZiBwb3NzaWJsZVBhZ2VTaXplc1wiXG4gICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgcGFnZVNpemUgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG5vLWd1dHRlciB0ZXh0LXJpZ2h0XCI+XG4gICAgICA8cGFnaW5hdGlvblxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cImhpZGVQYWdpbmF0aW9uJCB8IGFzeW5jXCJcbiAgICAgICAgY2xhc3M9XCJwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSA+IDBcIlxuICAgICAgICBbbmdNb2RlbF09XCJwYWdpbmF0aW9uLmN1cnJlbnRQYWdlXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cInVwZGF0ZVBhZ2luYXRpb24oJGV2ZW50KVwiXG4gICAgICAgIFt0b3RhbEl0ZW1zXT1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemVcIlxuICAgICAgICBbaXRlbXNQZXJQYWdlXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAobnVtUGFnZXMpPVwidG90YWxQYWdlc0NvdW50JC5uZXh0KCRldmVudClcIlxuICAgICAgICBbbWF4U2l6ZV09XCI1XCJcbiAgICAgICAgW2JvdW5kYXJ5TGlua3NdPVwiZmFsc2VcIlxuICAgICAgICBwcmV2aW91c1RleHQ9XCJQcmV2aW91c1wiXG4gICAgICAgIG5leHRUZXh0PVwiTmV4dFwiXG4gICAgICA+PC9wYWdpbmF0aW9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
1233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxRQUFRLElBQUksU0FBUyxFQUNyQixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE9BQU8sRUFDUixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNM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TUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBR2hDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxzQkFBc0I7Z0JBR0csZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHckMsVUFBVTtzQkFBbkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBc0VtQixNQUFNO3NCQUFoRSxZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWpELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrSGVhZGVyQ2VsbCwgQ2RrVGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJUmVzdWx0TGlzdCwgUGFnaW5nIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgcGFyc2VJbnQgYXMgX3BhcnNlSW50LFxuICBjYXN0QXJyYXksXG4gIGZsb3csXG4gIGdldCxcbiAgaW5kZXhPZixcbiAgaXNFbXB0eSxcbiAgaXNOaWwsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFVuYXJ5RnVuY3Rpb24sXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZvcmtKb2luLFxuICBpc09ic2VydmFibGUsXG4gIG1lcmdlLFxuICBvZixcbiAgcGlwZVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3RXaXRoLFxuICBjb25jYXRNYXAsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbW1vbi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1jb250ZXh0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IExvYWRNb3JlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9hZE1vcmVNb2RlIH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5tb2RlbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IFBvcG92ZXJDb25maXJtQnV0dG9ucywgUG9wb3ZlckNvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC9wb3BvdmVyLWNvbmZpcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZVxufSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvcHJvZHVjdC1leHBlcmllbmNlLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vYWN0aW9uLWNvbnRyb2xzLWV4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxSZW5kZXJlclNwZWMgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uL2NvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vY3VzdG9tLmNvbHVtbic7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93Q29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vZXhwYW5kYWJsZS1yb3ctY29sdW1uL2V4cGFuZGFibGUuZGF0YS1ncmlkLWNvbHVtbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjLCBGaWx0ZXJpbmdNb2RpZmllciB9IGZyb20gJy4vY29sdW1uL2ZpbHRlcmluZy1mb3JtLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4nO1xuaW1wb3J0IHtcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIERhdGFHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5LFxuICBHcmlkQ29uZmlnQ29udGV4dCxcbiAgR3JpZENvbmZpZ1BhcnQsXG4gIEdyaWRFdmVudFR5cGVcbn0gZnJvbSAnLi9kYXRhLWdyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQge1xuICBBY3Rpb25Db250cm9sLFxuICBBY3Rpb25Db250cm9sSG9vayxcbiAgQnVpbHRJbkFjdGlvblR5cGUsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29sdW1uRGF0YVR5cGUsXG4gIEN1c3RvbUNvbHVtbkNvbmZpZyxcbiAgRGF0YUdyaWQsXG4gIERhdGFTb3VyY2VTdGF0cyxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIEZpbHRlcixcbiAgRmlsdGVyQ2hpcCxcbiAgRmlsdGVyaW5nQWN0aW9uVHlwZSxcbiAgR3JpZENvbmZpZyxcbiAgSGVhZGVyQWN0aW9uQ29udHJvbCxcbiAgUGFnaW5hdGlvbixcbiAgUm93LFxuICBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICBTb3J0T3JkZXIsXG4gIFNwZWNpYWxDb2x1bW5OYW1lLFxuICBtaW5Db2x1bW5HcmlkVHJhY2tTaXplLFxuICByYXRpb3NCeUNvbHVtblR5cGVzXG59IGZyb20gJy4vZGF0YS1ncmlkLm1vZGVsJztcbmltcG9ydCB7IERhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vZGF0YS1ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vZXhwYW5kYWJsZS1yb3cuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWREYXRhU291cmNlIH0gZnJvbSAnLi9ncmlkLWRhdGEtc291cmNlJztcbmltcG9ydCB7IFBYX0FDVElPTlMsIFBYX0VWRU5UX05BTUUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5jb25zdGFudHMnO1xuXG5lbnVtIFNvcnRpbmdPcmRlciB7XG4gIEFTQyA9ICdhc2MnLFxuICBERVNDID0gJ2Rlc2MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhR3JpZENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBEYXRhR3JpZCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG57XG4gIC8qKiBUaGUgdGl0bGUgZm9yIHRoZSBkYXRhIGdyaWQsIGl0J3MgZGlzcGxheWVkIGluIHRoZSBncmlkJ3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnSXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkIG1vcmUgaXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGl0ZW1z4oCmJyk7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGV4dCBzZWFyY2ggaW5wdXQgaXMgc2hvd24gaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gW107XG4gIC8qKiBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC4gKi9cbiAgQElucHV0KCdjb2x1bW5zJylcbiAgX2NvbHVtbnM6IENvbHVtbltdO1xuXG4gIGRhdGFTb3VyY2UgPSBuZXcgR3JpZERhdGFTb3VyY2UoKTtcbiAgcm93czogUm93W107XG4gIC8qKiBUaGUgbGlzdCBvZiByb3dzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZCAodXNlZCBmb3IgY2xpZW50IHNpZGUgZGF0YSkuICovXG4gIEBJbnB1dCgncm93cycpXG4gIHNldCBfcm93cyhyb3dzOiBSb3dbXSkge1xuICAgIHRoaXMucm93cyA9IHJvd3MgfHwgW107XG4gIH1cblxuICBmaWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgZmlsdGVyZWRJdGVtc0NvdW50OiAwLFxuICAgIGFsbEl0ZW1zQ291bnQ6IDBcbiAgfTtcblxuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uO1xuICBwYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgcGFnZUZpcnN0SXRlbUlkeDogMCxcbiAgICBwYWdlTGFzdEl0ZW1JZHg6IDAsXG4gICAgaXRlbXNUb3RhbDogMFxuICB9O1xuICBsYXN0Q2xpY2tlZFJvdzogUm93O1xuICByZWFkb25seSBwb3NzaWJsZVBhZ2VTaXplczogbnVtYmVyW10gPSBbMjUsIDUwLCAxMDBdO1xuICByZWFkb25seSBtaW5Qb3NzaWJsZVBhZ2VTaXplID0gTWF0aC5taW4oLi4udGhpcy5wb3NzaWJsZVBhZ2VTaXplcyk7XG4gIC8qKiBQYWdpbmF0aW9uIHNldHRpbmdzLCBlLmcuIGFsbG93cyBmb3Igc2V0dGluZyBjdXJyZW50IHBhZ2Ugb3IgcGFnZSBzaXplLiAqL1xuICBASW5wdXQoJ3BhZ2luYXRpb24nKVxuICBzZXQgX3BhZ2luYXRpb24ocGFnaW5hdGlvbjogUGFnaW5hdGlvbikge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHBhZ2luYXRpb247XG4gIH1cblxuICBpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlO1xuICAvKiogU2V0cyBsb2FkIG1vcmUgbW9kZS4gKi9cbiAgQElucHV0KCdpbmZpbml0ZVNjcm9sbCcpXG4gIHNldCBfaW5maW5pdGVTY3JvbGwoaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZSkge1xuICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSBpbmZpbml0ZVNjcm9sbDtcbiAgfVxuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIC8qKlxuICAgKiBTZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGRhdGEgbmVlZHMgdG8gYmUgbG9hZGVkIGZyb20gc2VydmVyLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgW1tEYXRhU291cmNlTW9kaWZpZXJdXSBhbmQgcmV0dXJuIFtbU2VydmVyU2lkZURhdGFSZXN1bHRdXS5cbiAgICovXG4gIEBJbnB1dCgnc2VydmVyU2lkZURhdGFDYWxsYmFjaycpXG4gIHNldCBfc2VydmVyU2lkZURhdGFDYWxsYmFjayhzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKSB7XG4gICAgdGhpcy5zZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrID0gc2VydmVyU2lkZURhdGFDYWxsYmFjaztcbiAgfVxuXG4gIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgYSBjaGVja2JveCBpbiB0aGUgZmlyc3QgY29sdW1uLiAqL1xuICBASW5wdXQoJ3NlbGVjdGFibGUnKVxuICBzZXQgX3NlbGVjdGFibGUoc2VsZWN0YWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gIH1cblxuICBzaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqIFJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcm93IG9ubHkuIFNlbGVjdGlvbiBjb2x1bW4gZGlzcGxheXMgcmFkaW8gYnV0dG9uIGluc3RlYWQgb2YgY2hlY2tib3hlcyAqL1xuICBASW5wdXQoJ3NpbmdsZVNlbGVjdGlvbicpXG4gIHNldCBfc2luZ2xlU2VsZWN0aW9uKHNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uID0gc2luZ2xlU2VsZWN0aW9uO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleSA9ICdpZCc7XG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGl0ZW0ncyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2VsZWN0aW9uIHN0YXR1cy4gKi9cbiAgQElucHV0KCdzZWxlY3Rpb25QcmltYXJ5S2V5JylcbiAgc2V0IF9zZWxlY3Rpb25QcmltYXJ5S2V5KHNlbGVjdGlvblByaW1hcnlLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0aW9uUHJpbWFyeUtleSA9IHNlbGVjdGlvblByaW1hcnlLZXk7XG4gIH1cblxuICBkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMgPSB7XG4gICAgc3RyaXBlZDogdHJ1ZSxcbiAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgZ3JpZEhlYWRlcjogdHJ1ZSxcbiAgICBmaWx0ZXI6IHRydWUsXG4gICAgaG92ZXI6IHRydWVcbiAgfTtcbiAgLyoqIFNldHMgZGlzcGxheSBvcHRpb25zLiAqL1xuICBASW5wdXQoJ2Rpc3BsYXlPcHRpb25zJylcbiAgc2V0IF9kaXNwbGF5T3B0aW9ucyhkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMpIHtcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0geyAuLi50aGlzLmRpc3BsYXlPcHRpb25zLCAuLi5kaXNwbGF5T3B0aW9ucyB9O1xuICB9XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQubmV4dChhY3Rpb25Db250cm9scyk7XG4gIH1cblxuICBidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGJ1bGsgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaXRlbXMgc2VsZWN0ZWQgYnkgdXNlcikuICovXG4gIEBJbnB1dCgnYnVsa0FjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9idWxrQWN0aW9uQ29udHJvbHMoYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5idWxrQWN0aW9uQ29udHJvbHMgPSBidWxrQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICBoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBoZWFkZXIgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmcm9tIGRhdGEgZ3JpZCBoZWFkZXIpLiAqL1xuICBASW5wdXQoJ2hlYWRlckFjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9oZWFkZXJBY3Rpb25Db250cm9scyhoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5oZWFkZXJBY3Rpb25Db250cm9scyA9IGhlYWRlckFjdGlvbkNvbnRyb2xzIHx8IFtdO1xuICB9XG5cbiAgLyoqIFNldHMgaW5pdGlhbCBzZWFyY2ggdGV4dC4gKi9cbiAgQElucHV0KClcbiAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIGN1c3RvbSBjb2x1bW5zIGJ1dHRvbiB3aWxsIGJlIGVuYWJsZWQuICovXG4gIEBJbnB1dCgpXG4gIGNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkID0gdHJ1ZTtcblxuICAvKiogU2hvd3MgdGhlIHdhcm5pbmcgZm9yIHRoZSBzdWItYXNzZXRzIGNvdW50ZXIgKi9cbiAgQElucHV0KClcbiAgc2hvd0NvdW50ZXJXYXJuaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIHJvd3MgKGxhc3QgY2xpY2tlZCkuXG4gICAqIFNldCBlbXB0eSBzdHJpbmcgdG8gZGlzYWJsZSBhcHBlbmRpbmcgYWN0aXZlIGNsYXNzIHRvIGdyaWQgcm93cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUNsYXNzTmFtZSA9ICdhY3RpdmUnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSByb3dzIG9mIHRoZSBkYXRhIGdyaWQgd2lsbCBiZSBleHBhbmRhYmxlLlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqIC0gYE5PTkVgIC0gbm8gZXhwYW5kYWJsZSByb3dzIChkZWZhdWx0IHZhbHVlKVxuICAgKiAtIGBTWU5DYCAtIGFkZGl0aW9uYWwgY29sdW1uIHdpdGggZXhwYW5kIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIGV4cGFuZGFibGUgcm93cyBhcmUgZXhwYW5kaW5nIHN5bmNocm9ub3VzbHkgd2hlbiBidXR0b24gaXMgY2xpY2tlZFxuICAgKiAtIGBBU1lOQ2AgLSBhZGRpdGlvbmFsIGNvbHVtbiB3aXRoIGV4cGFuZCBidXR0b24gaXMgZGlzcGxheWVkIGFuZCBleHBhbmRhYmxlIHJvd3MgYXJlIGV4cGFuZGluZyBhc3luY2hyb25vdXNseSB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlUm93czogJ05PTkUnIHwgJ1NZTkMnIHwgJ0FTWU5DJyA9ICdOT05FJztcblxuICAvKiogRGV0ZXJtaW5lcyBpZiB0aGUgUmVsb2FkIGJ1dHRvbiB3aWxsIGJlIGhpZGRlbi4gKi9cbiAgQElucHV0KCkgaGlkZVJlbG9hZCA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIG1vdXNlIGlzIG92ZXIgYSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dNb3VzZU92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gbW91c2UgbGVhdmVzIGEgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93TW91c2VMZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIHJvdyBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gZ3JpZCdzIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4gKi9cbiAgQE91dHB1dCgpIG9uQ29uZmlnQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSBmaWx0ZXIgaXMgYXBwbGllZC4gKi9cbiAgQE91dHB1dCgpIG9uQmVmb3JlRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBiZWZvcmUgdGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQuICovXG4gIEBPdXRwdXQoKSBvbkJlZm9yZVNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkIGluIGEgY29sdW1uLiAqL1xuICBAT3V0cHV0KCkgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBjb2x1bW5OYW1lPzogc3RyaW5nO1xuICAgIGRyb3Bkb3duPzogQnNEcm9wZG93bkRpcmVjdGl2ZTtcbiAgICBmaWx0ZXJpbmdNb2RpZmllcj86IEZpbHRlcjtcbiAgfT4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gaXRlbXMgc2VsZWN0aW9uIGNoYW5nZXMuIFRoZSBhcnJheSBjb250YWlucyBrZXlzIG9mIHNlbGVjdGVkIGl0ZW1zIChrZXkgcHJvcGVydHkgaXMgZGVmaW5lZCBieSBgc2VsZWN0aW9uUHJpbWFyeUtleWApLiAqL1xuICBAT3V0cHV0KCkgaXRlbXNTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiByZWxvYWQgYnV0dG9uIGlzIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBvblJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBjdXN0b20gY29sdW1uIGlzIGFkZGVkICovXG4gIEBPdXRwdXQoKSBvbkFkZEN1c3RvbUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tQ29sdW1uQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGN1c3RvbSBjb2x1bW4gaXMgcmVtb3ZlZCAqL1xuICBAT3V0cHV0KCkgb25SZW1vdmVDdXN0b21Db2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbj4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IGFmdGVyIHRoZSBjb2x1bW4gZmlsdGVyIGhhcyBiZWVuIHJlc2V0ICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtbkZpbHRlclJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW4+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBzb3J0aW5nIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gcGFnZSBzaXplIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uUGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBvcmRlciBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtblJlb3JkZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIG9yZGVyIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKENvbHVtbkRpcmVjdGl2ZSkgY29sdW1uUmVuZGVyZXJzOiBRdWVyeUxpc3Q8Q29sdW1uRGlyZWN0aXZlPjtcblxuICBAQ29udGVudENoaWxkKEV4cGFuZGFibGVSb3dEaXJlY3RpdmUpXG4gIGV4cGFuZGFibGVSb3c6IEV4cGFuZGFibGVSb3dEaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZCgnc2Nyb2xsJywgeyBzdGF0aWM6IHRydWUgfSkgc2Nyb2xsQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2luZmluaXRlU2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGluZmluaXRlU2Nyb2xsQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoRW1wdHlTdGF0ZUNvbnRleHREaXJlY3RpdmUpIGVtcHR5U3RhdGU6IEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlO1xuXG4gIGxvYWRNb3JlQ29tcG9uZW50OiBMb2FkTW9yZUNvbXBvbmVudDtcblxuICBjb2x1bW5OYW1lcyA9IFtdO1xuXG4gIHN0eWxlcyA9IHtcbiAgICB0YWJsZUN1cnNvcjogJ2F1dG8nLFxuICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IHVuZGVmaW5lZCxcbiAgICBncmlkSW5maW5pdGVTY3JvbGxDb2x1bW46IHVuZGVmaW5lZFxuICB9O1xuXG4gIHNlYXJjaFRleHQkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIGZpbHRlcmluZ0FwcGxpZWQgPSBmYWxzZTtcbiAgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZDogQ29sdW1uW10gPSBbXTtcblxuICB0b3RhbFBhZ2VzQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KEluZmluaXR5KTtcbiAgaGlkZVBhZ2luYXRpb24kID0gdGhpcy50b3RhbFBhZ2VzQ291bnQkLnBpcGUoXG4gICAgbWFwKHRvdGFsUGFnZXNDb3VudCA9PiB0b3RhbFBhZ2VzQ291bnQgPD0gMSksXG4gICAgZGVsYXkoMCkgLy8gcHJldmVudHMgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclxuICApO1xuXG4gIHNlbGVjdGVkSXRlbUlkczogc3RyaW5nW10gPSBbXTtcbiAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZSA9IHtcbiAgICBhbGxTZWxlY3RlZDogZmFsc2UsXG4gICAgYWxsRGVzZWxlY3RlZDogdHJ1ZVxuICB9O1xuXG4gIGJ1aWx0SW5BY3Rpb25UeXBlID0ge1xuICAgIEVkaXQ6IEJ1aWx0SW5BY3Rpb25UeXBlLkVkaXQsXG4gICAgRGVsZXRlOiBCdWlsdEluQWN0aW9uVHlwZS5EZWxldGUsXG4gICAgRXhwb3J0OiBCdWlsdEluQWN0aW9uVHlwZS5FeHBvcnRcbiAgfTtcblxuICBjb25maXJtUmVtb3ZlQ29sdW1uQnV0dG9uczogUG9wb3ZlckNvbmZpcm1CdXR0b25zW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0NhbmNlbCcpLFxuICAgICAgYWN0aW9uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnUmVtb3ZlYGNvbHVtbix2ZXJiYCcpLFxuICAgICAgc3RhdHVzOiAnZGFuZ2VyJyxcbiAgICAgIGFjdGlvbjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgfVxuICBdO1xuXG4gIGlzQ29uZmlnQ29udGV4dEtub3duID0gZmFsc2U7XG4gIGVtcHR5U3RhdGVDb250ZXh0JDogT2JzZXJ2YWJsZTxEYXRhU291cmNlU3RhdHM+O1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiByb3dzIHdoaWNoIGhhdmUgYmVlbiBleHBhbmRlZC5cbiAgICovXG4gIGV4cGFuZGVkUm93czogTWFwPFJvdywgeyB2aXNpYmxlJDogU3ViamVjdDxib29sZWFuPiB8IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB9PiA9IG5ldyBNYXAoKTtcblxuICAvKiogUHJvZHVjdCBleHBlcmllbmNlIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgKi9cbiAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudDogUHJvZHVjdEV4cGVyaWVuY2VFdmVudCA9IHsgZXZlbnROYW1lOiBQWF9FVkVOVF9OQU1FIH07XG4gIFBYX0FDVElPTlMgPSBQWF9BQ1RJT05TO1xuXG4gIHJlYWRvbmx5IHNvcnRDb2x1bW5UaXRsZSA9IGdldHRleHQoJ1NvcnQgY29sdW1uIFwie3sgbmFtZSB9fVwiJyk7XG5cbiAgcmVzaXplSGFuZGxlTW91c2VEb3duJCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgdGFyZ2V0Q29sdW1uTmFtZTogc3RyaW5nIH0+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gIGZpbHRlcnNIZWxwUG9wb3Zlckh0bWw6IHN0cmluZyA9IGdldHRleHQoJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicpO1xuXG4gIHByaXZhdGUgaGVhZGVyQmVpbmdSZXNpemVkOiB7XG4gICAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAgIGVsOiBIVE1MRWxlbWVudDtcbiAgfTtcbiAgQFZpZXdDaGlsZHJlbihDZGtIZWFkZXJDZWxsLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSB0aFJlZnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgcHJpdmF0ZSB0aEVsczogSFRNTEVsZW1lbnRbXTtcblxuICBAVmlld0NoaWxkKENka1RhYmxlLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVSZWY6IENka1RhYmxlPGFueT47XG5cbiAgcHJpdmF0ZSByZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50OiBib29sZWFuO1xuXG4gIHByaXZhdGUgY29sdW1uc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Q29sdW1uczogQ29sdW1uW10gPSBbXTtcblxuICBwcml2YXRlIHJlbG9hZENvbmZpZ3VyYXRpb24kOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIGFjdGlvbkNvbnRyb2xzSW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBY3Rpb25Db250cm9sW10+KFtdKTtcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBtYW51YWxTZWFyY2gkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgbGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBTRUFSQ0hfREVCT1VOQ0VfVElNRSA9IDUwMDtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlciwgdGFraW5nIGJvb2xlYW4gdmFsdWVzIHVzZWQgZm9yIGxvYWRpbmcgZGF0YSBncmlkIGRhdGEgd2l0aCBkZWJvdW5jZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuIFNldCB0byB0cnVlIGlmIGRhdGEgZ3JpZCBpcyB1c2luZyBpbmZpbml0ZSBzY3JvbGwgYW5kIHBhZ2Ugc2hvdWxkIGJlIHJlbG9hZGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIG11bHRpcGxlIHRoaXMubG9hZERhdGEoKSBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlckxvYWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSlcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvblN0cmF0ZWd5OiBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIGRhdGFHcmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25Db250cm9sc1NlcnZpY2U6IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxuICApIHtcbiAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5waXBlKGRlYm91bmNlVGltZSgxKSwgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKHJlbG9hZCA9PiB7XG4gICAgICB0aGlzLmxvYWREYXRhKHJlbG9hZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb25maWckKCkgPz8gb2YobnVsbCkpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbnMoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLnNldFBhZ2VTaXplKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdCghIXRoaXMuaW5maW5pdGVTY3JvbGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGF0YVNvdXJjZS5zdGF0cyQpLFxuICAgICAgICB0YXAoc3RhdHMgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0cyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uV2hlbk5vRGV2aWNlc0xhc3RQYWdlKHN0YXRzKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNDb25maWdDb250ZXh0S25vd24gPSAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5pc0NvbnRleHRLbm93bigpO1xuXG4gICAgdGhpcy5zZXR1cFNlYXJjaE9ic2VydmFibGVzKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuZGF0YVNvdXJjZS5kYXRhJCwgdGhpcy5pdGVtc1NlbGVjdC5hc09ic2VydmFibGUoKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VFbXB0eSA9IGRhdGEubGVuZ3RoID09PSAwO1xuXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgICAgICAgYWxsU2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyBmYWxzZSA6IGRhdGEuZXZlcnkoaXRlbSA9PiB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSxcbiAgICAgICAgICAgIGFsbERlc2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyB0cnVlIDogZGF0YS5ldmVyeShpdGVtID0+ICF0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuXG4gICAgdGhpcy5hY3Rpb25Db250cm9sc1NlcnZpY2UuaXRlbXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgc3dpdGNoTWFwKChob29rczogQWN0aW9uQ29udHJvbEhvb2tbXSkgPT5cbiAgICAgICAgICBmb3JrSm9pbihcbiAgICAgICAgICAgIGhvb2tzLm1hcChob29rID0+XG4gICAgICAgICAgICAgIHRvT2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICBob29rPy5tYXRjaGVzR3JpZFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgICAgICAgICAgICAgICAgICAgaG9vay5tYXRjaGVzR3JpZCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb250ZXh0KClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBmYWxzZVxuICAgICAgICAgICAgICApLnBpcGUobWFwKG1hdGNoZXMgPT4gKHsgaG9vaywgbWF0Y2hlcyB9KSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKS5waXBlKHN0YXJ0V2l0aChbXSkpXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFycmF5PHsgaG9vazogQWN0aW9uQ29udHJvbEhvb2s7IG1hdGNoZXM6IGJvb2xlYW4gfT4pID0+XG4gICAgICAgICAgaG9va3MuZmlsdGVyKGhvb2sgPT4gaG9vay5tYXRjaGVzKS5tYXAoaG9vayA9PiBob29rLmhvb2spXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFjdGlvbkNvbnRyb2xIb29rW10pID0+XG4gICAgICAgICAgaG9va3MucmVkdWNlKChhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdLCBjdXJyZW50SG9vazogQWN0aW9uQ29udHJvbEhvb2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWN0aW9uQ29udHJvbHMsIC4uLmNhc3RBcnJheShjdXJyZW50SG9vay5hY3Rpb25Db250cm9scyldO1xuICAgICAgICAgIH0sIFtdKVxuICAgICAgICApLFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmFjdGlvbkNvbnRyb2xzSW5wdXQkKSxcbiAgICAgICAgdGFwKFxuICAgICAgICAgIChbaG9va0NvbnRyb2xzLCBpbnB1dENvbnRyb2xzXSkgPT5cbiAgICAgICAgICAgICh0aGlzLmFjdGlvbkNvbnRyb2xzID0gWy4uLmlucHV0Q29udHJvbHMsIC4uLmhvb2tDb250cm9sc10pXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmICh0aGlzLnJlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVmcmVzaC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG5cbiAgICAvLyBSZXNldHRpbmcgdGhlIHN0YXRzIHNpemUgdG8gMCB3aGVuIG1hbmFnZWQgb2JqZWN0cyBhcmUgZGVsZXRlZCBidXQgc2l6aW5nIG5vdCB5ZXQgdXBkYXRlZFxuICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIE1UTS02MDIyNiBpcyByZXNvbHZlZFxuICAgIHRoaXMuZW1wdHlTdGF0ZUNvbnRleHQkID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXRhU291cmNlLnN0YXRzJCwgdGhpcy5kYXRhU291cmNlLmRhdGEkXSkucGlwZShcbiAgICAgIG1hcCgoW3N0YXRzLCBkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHMuZmlsdGVyZWRTaXplID09PSAxICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdHMsIHNpemU6IDAsIGZpbHRlcmVkU2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0cztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldEV4cGFuZGFibGVSb3dWaXNpYmxlKHJvdzogUm93LCBzdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgICB0aGlzLnRhYmxlUmVmLnJlbmRlclJvd3MoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhldmVudCkge1xuICAgIGlmIChcbiAgICAgICgoIWV2ZW50Ll9hY3Rpb25Db250cm9scyAmJiAhZXZlbnQuc2VhcmNoVGV4dCkgfHwgZXZlbnQuX2FjdGlvbkNvbnRyb2xzPy5maXJzdENoYW5nZSkgJiZcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkXG4gICAgKSB7XG4gICAgICBjb25zdCByZWxvYWQgPSAhIWV2ZW50Ll9pbmZpbml0ZVNjcm9sbD8uY3VycmVudFZhbHVlICYmICFldmVudC5faW5maW5pdGVTY3JvbGw/LmZpcnN0Q2hhbmdlO1xuICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdChyZWxvYWQpO1xuICAgIH1cbiAgICBpZiAoISFldmVudC5fY29sdW1ucyAmJiAhZXZlbnQuX2NvbHVtbnMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnNldHVwUmVzaXplSGFuZGxlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGV4cGFuZChyb3c6IFJvdykge1xuICAgIGNvbnN0IGlzU3luY0V4cGFuZCA9IHRoaXMuZXhwYW5kYWJsZVJvd3MgPT09ICdTWU5DJztcbiAgICBsZXQgdmlzaWJsZVN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gfCBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgaWYgKGlzU3luY0V4cGFuZCkge1xuICAgICAgdmlzaWJsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aXNpYmxlU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuZXhwYW5kZWRSb3dzLnNldChyb3csIHsgdmlzaWJsZSQ6IHZpc2libGVTdWJqZWN0IH0pO1xuICAgIHRoaXMudGFibGVSZWYucmVuZGVyUm93cygpO1xuICAgIHJldHVybiB2aXNpYmxlU3ViamVjdDtcbiAgfVxuXG4gIGNvbGxhcHNlKHJvdzogUm93KTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgdGhpcy50YWJsZVJlZi5yZW5kZXJSb3dzKCk7XG4gIH1cblxuICBpc1Jvd0V4cGFuZGVkID0gKF8sIHJvdzogUm93KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdyk7XG4gIH07XG5cbiAgc2V0Q29sdW1ucyhjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneSAmJiAhaXNFbXB0eSh0aGlzLl9jb2x1bW5zKSkge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kYXRhR3JpZFNlcnZpY2UuYXBwbHlDb25maWdUb0NvbHVtbnMoY29uZmlnLCB0aGlzLl9jb2x1bW5zKTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgfHwgISF0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHRoaXMuZGVmYXVsdENvbHVtbnMgPSB0aGlzLmNvbHVtbnMgfHwgW107XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gIH1cblxuICBzZXRQYWdlU2l6ZShjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISFjb25maWc/LnBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24ucGFnZVNpemVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSBnZXQodGhpcy5wYWdpbmF0aW9uLCAncGFnZVNpemUnKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICF0aGlzLnBvc3NpYmxlUGFnZVNpemVzLmZpbmQocG9zc2libGVQYWdlU2l6ZSA9PiBwb3NzaWJsZVBhZ2VTaXplID09PSBwYWdlU2l6ZSlcbiAgICApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5taW5Qb3NzaWJsZVBhZ2VTaXplIH07XG4gICAgfVxuICB9XG5cbiAgb3BlbkN1c3RvbUNvbHVtbk1vZGFsKCk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5ic01vZGFsU2VydmljZS5zaG93KENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdtb2RhbC1ib2R5JyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnbW9kYWwtdGl0bGUnLFxuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgIGluaXRpYWxTdGF0ZToge1xuICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnNcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1vZGFsUmVmLmNvbnRlbnQub25BZGRDdXN0b21Db2x1bW5cbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGN1c3RvbUNvbHVtbkNvbmZpZzogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlyc3RGaXhlZENvbHVtUG9zaXRpb24gPSB0aGlzLmNvbHVtbnMuaW5kZXhPZihcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4ucG9zaXRpb25GaXhlZClcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoXG4gICAgICAgICAgICBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA+IC0xID8gZmlyc3RGaXhlZENvbHVtUG9zaXRpb24gOiB0aGlzLmNvbHVtbnMubGVuZ3RoLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIG5ldyBDdXN0b21Db2x1bW4oY3VzdG9tQ29sdW1uQ29uZmlnKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkFERF9DVVNUT01fQ09MVU1OLFxuICAgICAgICAgICAgY29sdW1uOiBjdXN0b21Db2x1bW5Db25maWcuaGVhZGVyIHx8IGN1c3RvbUNvbHVtbkNvbmZpZy5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwobW9kYWxSZWYub25IaWRkZW4pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMub25BZGRDdXN0b21Db2x1bW4uZW1pdChldmVudCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlQ3VzdG9tQ29sdW1uKFxuICAgIHBvQ29uZmlybTogUG9wb3ZlckNvbmZpcm1Db21wb25lbnQsXG4gICAgY29sdW1uOiBDb2x1bW4sXG4gICAgZGRDb25maWd1cmVDb2x1bW5zOiBCc0Ryb3Bkb3duRGlyZWN0aXZlXG4gICkge1xuICAgIGRkQ29uZmlndXJlQ29sdW1ucy5hdXRvQ2xvc2UgPSBmYWxzZTtcbiAgICBwb0NvbmZpcm0ubWVzc2FnZSA9IGdldHRleHQoJ0RvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGNvbHVtbj8nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVtb3ZlOiBib29sZWFuID0gYXdhaXQgcG9Db25maXJtLnNob3codGhpcy5jb25maXJtUmVtb3ZlQ29sdW1uQnV0dG9ucyk7XG4gICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbD8ubmFtZSAhPT0gY29sdW1uPy5uYW1lKTtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMub25SZW1vdmVDdXN0b21Db2x1bW4uZW1pdChjb2x1bW4pO1xuICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTU9WRV9DVVNUT01fQ09MVU1OLFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uLmhlYWRlciB8fCBjb2x1bW4ubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGUpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4gKGRkQ29uZmlndXJlQ29sdW1ucy5hdXRvQ2xvc2UgPSB0cnVlKSwgMCk7XG4gIH1cblxuICBhc3luYyByZW1vdmVGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPEZpbHRlckNoaXA+KSB7XG4gICAgY29uc3QgZmlsdGVyaW5nTW9kaWZpZXIgPSBmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeVxuICAgICAgPyB7IGV4dGVybmFsRmlsdGVyUXVlcnk6IGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5IH1cbiAgICAgIDogeyBmaWx0ZXJQcmVkaWNhdGU6IGZpbHRlci5maWx0ZXJQcmVkaWNhdGUgfTtcbiAgICB0aGlzLm9uQmVmb3JlRmlsdGVyLmVtaXQoe1xuICAgICAgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbk5hbWUsXG4gICAgICBkcm9wZG93bjogdW5kZWZpbmVkLFxuICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAoZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnkgJiYgIXRoaXMuY2hlY2tJZkFueVZhbHVlc0V4aXN0KGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5KSkgfHxcbiAgICAgIGZpbHRlci5maWx0ZXJQcmVkaWNhdGVcbiAgICApIHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtmaWx0ZXIuY29sdW1uTmFtZV0sIHtcbiAgICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlclxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW5OYW1lIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbZmlsdGVyLmNvbHVtbk5hbWVdLCB7XG4gICAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICAgIHBheWxvYWQ6IHsgZmlsdGVyaW5nTW9kaWZpZXIgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe1xuICAgICAgICBjb2x1bW5OYW1lOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgICAgZHJvcGRvd246IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU1PVkVfRklMVEVSLFxuICAgICAgY29sdW1uOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgfSk7XG4gIH1cblxuICB0cmFja0J5TmFtZShpbmRleCwgaXRlbSkge1xuICAgIHJldHVybiBpdGVtLm5hbWU7XG4gIH1cblxuICByZXNvbHZlQ2VsbFZhbHVlKHJvdywgcGF0aCkge1xuICAgIHJldHVybiBmbG93KFtcbiAgICAgIHggPT4gdGhpcy5kYXRhU291cmNlLnJlc29sdmVWYWx1ZSh4LCBwYXRoKSxcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5yZXNvbHZlRnVuY3Rpb24sXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uubm9ybWFsaXplTmlsXG4gICAgXSkocm93KTtcbiAgfVxuXG4gIGNoYW5nZVNvcnRPcmRlcihjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW5OYW1lKTtcblxuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIGNvbnN0IHsgc29ydE9yZGVyIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmICghc29ydE9yZGVyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydGluZyhbY29sdW1uTmFtZV0sIFNvcnRpbmdPcmRlci5BU0MpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0T3JkZXIgPT09IFNvcnRpbmdPcmRlci5BU0MpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgU29ydGluZ09yZGVyLkRFU0MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNvcnRpbmcoY29sdW1uTmFtZXM6IHN0cmluZ1tdLCBzb3J0T3JkZXI6IFNvcnRPcmRlcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfU09SVElOR19PUkRFUixcbiAgICAgIGNvbHVtbnM6IGNvbHVtbk5hbWVzLFxuICAgICAgc29ydE9yZGVyOiBzb3J0T3JkZXIgPT09ICcnID8gJ25vbmUnIDogc29ydE9yZGVyXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pOiBDb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICByZXR1cm4geyAuLi5jb2x1bW4sIHNvcnRPcmRlciB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgnc29ydCcpO1xuXG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5BUFBMWV9GSUxURVIsXG4gICAgICBjb2x1bW46IGNvbHVtbk5hbWUsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICAgIHRoaXMub25CZWZvcmVGaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllciB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHtcbiAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICBwYXlsb2FkOiB7IGZpbHRlcmluZ01vZGlmaWVyIH1cbiAgICB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyIH0pO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIoY29sdW1uTmFtZSwgZHJvcGRvd24pIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRVNFVF9GSUxURVIsIGNvbHVtbjogY29sdW1uTmFtZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHsgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlciB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24gfSk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMocmVsb2FkID0gdHJ1ZSkge1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFxuICAgICAgdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLFxuICAgICAge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyXG4gICAgICB9LFxuICAgICAgcmVsb2FkXG4gICAgKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe30pO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX0ZJTFRFUiB9KTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZyhcbiAgICBjb2x1bW5OYW1lczogc3RyaW5nW10sXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlO1xuICAgICAgcGF5bG9hZD86IHsgZmlsdGVyaW5nTW9kaWZpZXI6IEZpbHRlcmluZ01vZGlmaWVyIH07XG4gICAgfSxcbiAgICByZWxvYWQgPSB0cnVlXG4gICkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgLi4uKGFjdGlvbi50eXBlID09PSBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyXG4gICAgICAgICAgICA/IGFjdGlvbi5wYXlsb2FkLmZpbHRlcmluZ01vZGlmaWVyXG4gICAgICAgICAgICA6IHRoaXMub25SZXNldEZpbHRlckFjdGlvbihjb2x1bW4pKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuXG4gICAgaWYgKHJlbG9hZCkge1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJpbmdBcHBsaWVkKCkge1xuICAgIHRoaXMuY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZCA9IHRoaXMuY29sdW1ucy5maWx0ZXIodGhpcy5pc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWQpO1xuICAgIHRoaXMuZmlsdGVyaW5nQXBwbGllZCA9IHRoaXMuY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZC5sZW5ndGggPiAwO1xuXG4gICAgdGhpcy5maWx0ZXJzSGVscFBvcG92ZXJIdG1sID0gdGhpcy5maWx0ZXJpbmdBcHBsaWVkXG4gICAgICA/IGdldHRleHQoXG4gICAgICAgICAgJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLiBDbGljayA8Yj5BY3RpdmUgZmlsdGVyczwvYj4gYnV0dG9uIHRvIG1hbmFnZSBhcHBsaWVkIGZpbHRlcnMuJ1xuICAgICAgICApXG4gICAgICA6IGdldHRleHQoJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicpO1xuICB9XG5cbiAgaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkKGNvbHVtbjogQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBmaWx0ZXJhYmxlLCBmaWx0ZXJQcmVkaWNhdGUsIGV4dGVybmFsRmlsdGVyUXVlcnkgfSA9IGNvbHVtbjtcblxuICAgIHJldHVybiAhIShmaWx0ZXJhYmxlICYmIChmaWx0ZXJQcmVkaWNhdGUgfHwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpO1xuICB9XG5cbiAgdXBkYXRlUGFnaW5hdGlvbih7IGl0ZW1zUGVyUGFnZSwgcGFnZSB9KSB7XG4gICAgY29uc3QgY29uZmlnQ2hhbmdlZCA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZVNpemUgIT09IGl0ZW1zUGVyUGFnZTtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgcGFnZVNpemU6IGl0ZW1zUGVyUGFnZSwgY3VycmVudFBhZ2U6IHBhZ2UgfTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgncGFnaW5hdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfUEFHSU5BVElPTiwgaXRlbXNQZXJQYWdlLCBwYWdlIH0pO1xuICB9XG5cbiAgY2xpY2tSZWxvYWQoKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgICB0aGlzLm9uUmVsb2FkLm5leHQoKTtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRUxPQUQgfSk7XG4gIH1cblxuICByZWxvYWQocmVkaXJlY3QgPSB0cnVlKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgY3VycmVudFBhZ2U6IHJlZGlyZWN0ID8gMSA6IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZVxuICAgIH07XG4gICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmxvYWREYXRhKHRydWUpO1xuICAgIHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgfVxuXG4gIGxvYWROZXh0UGFnZSgpOiBQcm9taXNlPElSZXN1bHRMaXN0PG9iamVjdD4+IHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgY3VycmVudFBhZ2U6IHRoaXMucGFnaW5hdGlvbi5uZXh0UGFnZSB9O1xuXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5yZXN1bHRMaXN0JFxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gaW4gb3JkZXIgZm9yIGB0b1Byb21pc2VgIHRvIHdvcmssIHRoZSBvYnNlcnZhYmxlIG5lZWRzIHRvIGNvbXBsZXRlXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHBhZ2luZzoge1xuICAgICAgICAgICAgLi4ucmVzdWx0LnBhZ2luZyxcbiAgICAgICAgICAgIG5leHQ6IHRoaXMubG9hZE5leHRQYWdlLmJpbmQodGhpcylcbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSVJlc3VsdExpc3Q8b2JqZWN0PjtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0NFTEwnLCB2YWx1ZSwgcm93LCBjb2x1bW5OYW1lIH0pO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyh7IHZhbHVlLCBjb2x1bW5OYW1lIH0pOiBDZWxsUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGU6ICdIRUFERVInLCB2YWx1ZSwgcm93OiB1bmRlZmluZWQsIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjKHsgY29sdW1uLCBkcm9wZG93biB9KTogRmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmVyOlxuICAgICAgICBnZXQodGhpcy5nZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pLCAnZmlsdGVyaW5nRm9ybVJlbmRlcmVyRGVmLnRlbXBsYXRlJykgfHxcbiAgICAgICAgY29sdW1uLmZpbHRlcmluZ0Zvcm1SZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgcHJvcGVydHk6IGNvbHVtbixcbiAgICAgICAgYXBwbHlGaWx0ZXI6IHRoaXMuYXBwbHlGaWx0ZXIuYmluZCh0aGlzLCBjb2x1bW4ubmFtZSwgZHJvcGRvd24pLFxuICAgICAgICByZXNldEZpbHRlcjogdGhpcy5yZXNldEZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93bilcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0QWxsSXRlbXNTZWxlY3RlZChzZWxlY3RlZCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zZWxlY3Rpb24kXG4gICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmaWx0ZXJlZERhdGFJZHMgfSkgPT4gdGhpcy5zZXRJdGVtc1NlbGVjdGVkKGZpbHRlcmVkRGF0YUlkcywgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5zZXRJdGVtc1NlbGVjdGVkKGRhdGEsIHNlbGVjdGVkKSk7XG4gIH1cblxuICBzZXRJdGVtc1NlbGVjdGVkKGl0ZW1zOiBhbnksIHNlbGVjdGVkKSB7XG4gICAgY29uc3QgaXRlbUlkcyA9IGl0ZW1zLm1hcCgoaXRlbTogb2JqZWN0IHwgc3RyaW5nKSA9PlxuICAgICAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID8gaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldIDogaXRlbVxuICAgICk7XG5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IHNlbGVjdGVkXG4gICAgICA/IHVuaW9uKHRoaXMuc2VsZWN0ZWRJdGVtSWRzLCBpdGVtSWRzKVxuICAgICAgOiB3aXRob3V0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzLCAuLi5pdGVtSWRzKTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMpO1xuICB9XG5cbiAgY2hhbmdlU2VsZWN0ZWRJdGVtKGl0ZW06IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gW2l0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XV07XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IFtdO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBpc0l0ZW1TZWxlY3RlZChpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtSWRzLmluY2x1ZGVzKGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSk7XG4gIH1cblxuICBvbkNvbHVtbkRyb3AoeyBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXggfSkge1xuICAgIGNvbnN0IGRpZmZlcmVudEluZGV4ID0gcHJldmlvdXNJbmRleCAhPT0gY3VycmVudEluZGV4O1xuXG4gICAgaWYgKGRpZmZlcmVudEluZGV4KSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU9SREVSX0NPTFVNTlMsXG4gICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5OYW1lc1twcmV2aW91c0luZGV4XVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuc3BsaWNlKHByZXZpb3VzSW5kZXgsIDEpO1xuICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShjdXJyZW50SW5kZXgsIDAsIGNvbHVtblswXSk7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3Jlb3JkZXJDb2x1bW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICB0aGlzLmNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4udmlzaWJsZSlcbiAgICAgICAgICAubWFwKCh7IGdyaWRUcmFja1NpemUgfSkgPT4gZ3JpZFRyYWNrU2l6ZSlcbiAgICAgICAgICAuam9pbignICcpXG4gICAgICApLFxuICAgICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoYDEgLyAtMWApXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZVRoRWxzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50aEVscyA9IHRoaXMudGhSZWZzXG4gICAgICAgID8gdGhpcy50aFJlZnMudG9BcnJheSgpLm1hcCgoeyBuYXRpdmVFbGVtZW50IH0pID0+IG5hdGl2ZUVsZW1lbnQpXG4gICAgICAgIDogW107XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBUbyBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuXG4gIGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW46IENvbHVtbikge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleE9mKFxuICAgICAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKSxcbiAgICAgICAgY29sdW1uXG4gICAgICApID5cbiAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUpLmxlbmd0aCAvIDJcbiAgICApO1xuICB9XG5cbiAgZW1pdENvbmZpZ0NoYW5nZShldmVudFR5cGU/OiBHcmlkRXZlbnRUeXBlKSB7XG4gICAgaWYgKHRoaXMuY29sdW1uc0luaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpO1xuICAgICAgY29uc3QgY29uZmlnID0geyBjb2x1bW5zLCBwYWdpbmF0aW9uOiB0aGlzLnBhZ2luYXRpb24gfTtcbiAgICAgIHRoaXMub25Db25maWdDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgICAgdGhpcy5vblNvcnQuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYWdpbmF0aW9uJzpcbiAgICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZW9yZGVyQ29sdW1uJzpcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uUmVvcmRlcmVkLmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2hhbmdlQ29sdW1uVmlzaWJpbGl0eSc6XG4gICAgICAgICAgdGhpcy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChldmVudERhdGEpIHtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KHRoaXMucHJvZHVjdEV4cGVyaWVuY2VFdmVudD8uZXZlbnROYW1lIHx8IFBYX0VWRU5UX05BTUUsIHtcbiAgICAgIC4uLnRoaXMucHJvZHVjdEV4cGVyaWVuY2VFdmVudD8uZGF0YSxcbiAgICAgIC4uLmV2ZW50RGF0YVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2socm93OiBSb3cpIHtcbiAgICB0aGlzLmxhc3RDbGlja2VkUm93ID0gcm93O1xuICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuICB9XG5cbiAgcGVyZm9ybVNlYXJjaChzZWFyY2hUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgIHRoaXMubWFudWFsU2VhcmNoJC5uZXh0KHNlYXJjaFRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNlYXJjaE9ic2VydmFibGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGF1dG9TZWFyY2gkID0gdGhpcy5zZWFyY2hUZXh0JC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuU0VBUkNIX0RFQk9VTkNFX1RJTUUpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUpLFxuICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG1hbnVhbFNlYXJjaCQgPSB0aGlzLm1hbnVhbFNlYXJjaCQucGlwZShcbiAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZS50cmltKCkgIT09ICcnKSxcbiAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgIHRoaXMubGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBtZXJnZShhdXRvU2VhcmNoJCwgbWFudWFsU2VhcmNoJClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgICB0YXAoc2VhcmNoVGV4dCA9PiB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICAgICAgICB0aGlzLm9uQmVmb3JlU2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFQVJDSCxcbiAgICAgICAgICAgIHNlYXJjaElucHV0OiBzZWFyY2hUZXh0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2V0RmlsdGVyQWN0aW9uKGNvbHVtbjogQ29sdW1uKSB7XG4gICAgdGhpcy5vbkNvbHVtbkZpbHRlclJlc2V0LmVtaXQoY29sdW1uKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyUHJlZGljYXRlOiB1bmRlZmluZWQsXG4gICAgICBleHRlcm5hbEZpbHRlclF1ZXJ5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBDb2x1bW5Ub0NvbmZpZyhjb2x1bW46IENvbHVtbik6IENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZyB7XG4gICAgbGV0IGNvbmZpZztcbiAgICBpZiAoY29sdW1uLmN1c3RvbSkge1xuICAgICAgY29uc3QgeyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGV4dGVybmFsRmlsdGVyUXVlcnksIGhlYWRlciwgcGF0aCB9ID0gY29sdW1uO1xuICAgICAgY29uZmlnID0ge1xuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBzb3J0T3JkZXIsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZpbHRlcjogeyBleHRlcm5hbEZpbHRlclF1ZXJ5IH0sXG4gICAgICAgIGhlYWRlcixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgY3VzdG9tOiB0cnVlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9ID0gY29sdW1uO1xuICAgICAgY29uZmlnID0geyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGZpbHRlcjogeyBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gfTtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXB0eShjb25maWc/LmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuZmlsdGVyO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGxvYWREYXRhKHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm93cyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwYWdpbmF0aW9uLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0aW9uUHJpbWFyeUtleSxcbiAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgfSA9IHRoaXM7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UubG9hZERhdGEoe1xuICAgICAgcm93cyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwYWdpbmF0aW9uLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0aW9uUHJpbWFyeUtleSxcbiAgICAgIGluZmluaXRlU2Nyb2xsLFxuICAgICAgcmVsb2FkXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnMoKSB7XG4gICAgY29uc3Qgc3BlY2lhbENvbHVtbiA9IHtcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHNlbGVjdGlvbkNvbHVtbiA9IHRoaXMuc2VsZWN0YWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICBuYW1lOiB0aGlzLnNpbmdsZVNlbGVjdGlvbiA/IFNwZWNpYWxDb2x1bW5OYW1lLlJhZGlvQnV0dG9uIDogU3BlY2lhbENvbHVtbk5hbWUuQ2hlY2tib3gsXG4gICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogJzMycHgnXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGlvbnNDb2x1bW4gPVxuICAgICAgdGhpcy5hY3Rpb25Db250cm9scz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwZWNpYWxDb2x1bW4sXG4gICAgICAgICAgICBuYW1lOiBTcGVjaWFsQ29sdW1uTmFtZS5BY3Rpb25zLFxuICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogJ21pbm1heCg0MHB4LCBhdXRvKSdcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZXhwYW5kYWJsZVJvd3NDb2x1bW4gPSB0aGlzLmV4cGFuZGFibGVSb3dzICE9PSAnTk9ORScgPyBuZXcgRXhwYW5kYWJsZVJvd0NvbHVtbigpIDogbnVsbDtcbiAgICBjb25zdCBjb2x1bW5zID0gW2V4cGFuZGFibGVSb3dzQ29sdW1uLCBzZWxlY3Rpb25Db2x1bW4sIC4uLnRoaXMuY29sdW1ucywgYWN0aW9uc0NvbHVtbl1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAodGhpcy53aXRoQ29sdW1uRGVmYXVsdHMpO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gdW5pcUJ5KGNvbHVtbnMsICduYW1lJyk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5OYW1lcygpO1xuICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgdGhpcy51cGRhdGVUaEVscygpO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqLCByZXN1bHRzID0gW10pIHtcbiAgICBpZiAob2JqICYmIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5jaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqW2tleV0sIHJlc3VsdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzLnNvbWUodmFsID0+ICEhdmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aENvbHVtbkRlZmF1bHRzKGNvbHVtbik6IENvbHVtbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGUgfHwgQ29sdW1uRGF0YVR5cGUuVGV4dFNob3J0O1xuICAgIGNvbnN0IHsgaGVhZGVyQ1NTQ2xhc3NOYW1lLCBjZWxsQ1NTQ2xhc3NOYW1lIH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0T3JkZXI6ICcnLFxuICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGdyaWRUcmFja1NpemU6XG4gICAgICAgIGNvbHVtbi5ncmlkVHJhY2tTaXplIHx8XG4gICAgICAgIGBtaW5tYXgoJHttaW5Db2x1bW5HcmlkVHJhY2tTaXplfXB4LCAke3JhdGlvc0J5Q29sdW1uVHlwZXNbZGF0YVR5cGVdfWZyKWAsXG4gICAgICBoZWFkZXJDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgaGVhZGVyQ1NTQ2xhc3NOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gaGVhZGVyQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJylcbiAgICAgICAgICA6IGhlYWRlckNTU0NsYXNzTmFtZSkgfHwgW10sXG4gICAgICBjZWxsQ1NTQ2xhc3NOYW1lOlxuICAgICAgICAodHlwZW9mIGNlbGxDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnID8gY2VsbENTU0NsYXNzTmFtZS5zcGxpdCgnICcpIDogY2VsbENTU0NsYXNzTmFtZSkgfHxcbiAgICAgICAgW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1lcygpIHtcbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJlc2l6ZUhhbmRsZSgpIHtcbiAgICBjb25zdCByZXNpemVIYW5kbGVEcmFnJCA9IHRoaXMucmVzaXplSGFuZGxlTW91c2VEb3duJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgbWVyZ2VNYXAoKHsgZXZlbnQsIHRhcmdldENvbHVtbk5hbWUgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0YXJnZXRDb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogdW5pb24oY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgWydoZWFkZXItLWJlaW5nLXJlc2l6ZWQnXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB7XG4gICAgICAgICAgY29sdW1uTmFtZTogdGFyZ2V0Q29sdW1uTmFtZSxcbiAgICAgICAgICBlbDogKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgICAgICB0YWJsZUN1cnNvcjogJ2NvbC1yZXNpemUnXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VNb3ZlJC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmVzaXplSGFuZGxlRHJhZyQuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkICYmIGNvbHVtbi5uYW1lID09PSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5jb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJEaXY6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gUmVhZCBzY3JvbGxDb250YWluZXJFbCdzIG9mZnNldCBsZWZ0IHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPSBzY3JvbGxDb250YWluZXJEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgICAgICAgICAgLy8gQWRqdXN0IHdpdGggdGhlIHNjcm9sbENvbnRhaW5lckVsIGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbFNjcm9sbE9mZnNldCA9IHNjcm9sbENvbnRhaW5lckRpdi5zY3JvbGxMZWZ0IC0gaG9yaXpvbnRhbE9mZnNldDtcblxuICAgICAgICAgICAgLy8gUmVhZCBsZWZ0IG9mZnNldCBvZiB0aGUgcmVzaXplZCBoZWFkZXIuXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJPZmZzZXRMZWZ0ID0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuZWwub2Zmc2V0TGVmdCB8fCAwO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRlc2lyZWQgd2lkdGguXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGhvcml6b250YWxTY3JvbGxPZmZzZXQgKyBldmVudC5jbGllbnRYIC0gaGVhZGVyT2Zmc2V0TGVmdDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbHVtbiBvYmplY3Qgd2l0aCB0aGUgbmV3IHNpemUgdmFsdWUsIGVuZm9yY2Ugb3VyIG1pbmltdW0gc2l6ZS5cbiAgICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogYCR7TWF0aC5tYXgobWluQ29sdW1uR3JpZFRyYWNrU2l6ZSwgd2lkdGgpfXB4YFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgdGhlIG90aGVyIGhlYWRlcnMgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNldCB3aWR0aCwgZml4IGl0IHRvIHRoZWlyIGNvbXB1dGVkIHdpZHRoLlxuICAgICAgICAgIGlmIChjb2x1bW4uZ3JpZFRyYWNrU2l6ZS5zdGFydHNXaXRoKCdtaW5tYXgnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAvLyBpc24ndCBmaXhlZCB5ZXQgKGl0IHdvdWxkIGJlIGEgcHggdmFsdWUpXG4gICAgICAgICAgICAgIGdyaWRUcmFja1NpemU6IGAke19wYXJzZUludCh0aGlzLnRoRWxzW2ldLmNsaWVudFdpZHRoKX1weGBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVXBkYXRlIHRoZSBjb2x1bW4gc2l6ZXMuXG4gICAgICAgICAqIE5vdGU6IGdyaWQtdGVtcGxhdGUtY29sdW1ucyBzZXRzIHRoZSB3aWR0aCBmb3IgYWxsIGNvbHVtbnMgaW4gb25lIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4ubmFtZSA9PT0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICBoZWFkZXJDU1NDbGFzc05hbWU6IHdpdGhvdXQoY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgJ2hlYWRlci0tYmVpbmctcmVzaXplZCcpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhlYWRlckJlaW5nUmVzaXplZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgICAgICB0YWJsZUN1cnNvcjogJ2F1dG8nXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyTW91c2VIaWdobGlnaHRzKCkge1xuICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGUsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgY29uc3QgY29sdW1uUmVuZGVyZXIgPSB0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbik7XG4gICAgY29uc3QgcmVuZGVyZXJUZW1wbGF0ZSA9IGdldChcbiAgICAgIGNvbHVtblJlbmRlcmVyLFxuICAgICAgYCR7dHlwZSA9PT0gJ0hFQURFUicgPyAnaGVhZGVyQ2VsbFJlbmRlcmVyRGVmJyA6ICdjZWxsUmVuZGVyZXJEZWYnfS50ZW1wbGF0ZWBcbiAgICApO1xuXG4gICAgY29uc3QgeyBjZWxsUmVuZGVyZXJDb21wb25lbnQsIGhlYWRlckNlbGxSZW5kZXJlckNvbXBvbmVudCB9ID0gY29sdW1uO1xuICAgIGNvbnN0IHJlbmRlcmVyQ29tcG9uZW50ID1cbiAgICAgIHR5cGUgPT09ICdIRUFERVInID8gaGVhZGVyQ2VsbFJlbmRlcmVyQ29tcG9uZW50IDogY2VsbFJlbmRlcmVyQ29tcG9uZW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmVyOiByZW5kZXJlclRlbXBsYXRlIHx8IHJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXRlbTogcm93LFxuICAgICAgICBwcm9wZXJ0eTogY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKTogQ29sdW1uRGlyZWN0aXZlIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5SZW5kZXJlcnMudG9BcnJheSgpLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcmluZ0xhYmVsc1BhcmFtcyhzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgdGhpcy5maWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgICBmaWx0ZXJlZEl0ZW1zQ291bnQ6IHN0YXRzLmZpbHRlcmVkU2l6ZSxcbiAgICAgIGFsbEl0ZW1zQ291bnQ6IHN0YXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdpbmF0aW9uTGFiZWxQYXJhbXMoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmIChzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIG5leHRQYWdlOiBzdGF0cy5uZXh0UGFnZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VGaXJzdEl0ZW1JZHggPSAoc3RhdHMuY3VycmVudFBhZ2UgLSAxKSAqIHN0YXRzLmZpcnN0UGFnZVNpemUgKyAxO1xuICAgIHRoaXMucGFnaW5hdGlvbkxhYmVsUGFyYW1zID0ge1xuICAgICAgcGFnZUZpcnN0SXRlbUlkeCxcbiAgICAgIHBhZ2VMYXN0SXRlbUlkeDogcGFnZUZpcnN0SXRlbUlkeCArIChzdGF0cy5jdXJyZW50UGFnZVNpemUgLSAxKSxcbiAgICAgIGl0ZW1zVG90YWw6IHN0YXRzLmZpbHRlcmVkU2l6ZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb25XaGVuTm9EZXZpY2VzTGFzdFBhZ2Uoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmICghc3RhdHMubmV4dFBhZ2UgJiYgc3RhdHMuY3VycmVudFBhZ2VTaXplID09PSAwICYmIHN0YXRzLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSB7XG4gICAgICAgIC4uLnRoaXMucGFnaW5hdGlvbixcbiAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSAtIDEsXG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgJiZcbiAgICAgIHN0YXRzICYmXG4gICAgICBzdGF0cy5uZXh0UGFnZSAmJlxuICAgICAgKCF0aGlzLmxvYWRNb3JlQ29tcG9uZW50IHx8IHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudClcbiAgICApIHtcbiAgICAgIHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudCA9IGZhbHNlO1xuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbENvbnRhaW5lci5jbGVhcigpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5pbmZpbml0ZVNjcm9sbENvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoTG9hZE1vcmVDb21wb25lbnQpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgTG9hZE1vcmVDb21wb25lbnQ7XG4gICAgICBpbnN0YW5jZS51c2VJbnRlcnNlY3Rpb24gPSB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnYXV0bycgfHwgdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2hpZGRlbic7XG4gICAgICBpbnN0YW5jZS5oaWRkZW4gPSB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnaGlkZGVuJztcbiAgICAgIGluc3RhbmNlLnBhZ2luZyA9IHtcbiAgICAgICAgbmV4dFBhZ2U6IHN0YXRzLm5leHRQYWdlLFxuICAgICAgICBuZXh0OiB0aGlzLmxvYWROZXh0UGFnZS5iaW5kKHRoaXMpXG4gICAgICB9IGFzIFBhZ2luZzxJSWRlbnRpZmllZD47XG4gICAgICBpbnN0YW5jZS5sb2FkTmV4dExhYmVsID0gdGhpcy5sb2FkTW9yZUl0ZW1zTGFiZWw7XG4gICAgICBpbnN0YW5jZS5sb2FkaW5nTGFiZWwgPSB0aGlzLmxvYWRpbmdJdGVtc0xhYmVsO1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudCA9IGluc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sb2FkTW9yZUNvbXBvbmVudCAmJiAhc3RhdHMubmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVDb21wb25lbnQucGFnaW5nID0ge1xuICAgICAgICBuZXh0UGFnZTogbnVsbFxuICAgICAgfSBhcyBQYWdpbmc8SUlkZW50aWZpZWQ+O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCkge1xuICAgIG1lcmdlKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMub25Tb3J0LFxuICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UsXG4gICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQsXG4gICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlXG4gICAgICApLnBpcGUobWFwKGNvbmZpZyA9PiBjb25maWcuY29sdW1ucykpLFxuICAgICAgbWVyZ2UodGhpcy5vbkFkZEN1c3RvbUNvbHVtbiwgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbikucGlwZShcbiAgICAgICAgbWFwKCgpID0+ICh0aGlzLmNvbHVtbnMgfHwgW10pLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpKVxuICAgICAgKSxcbiAgICAgIHRoaXMub25GaWx0ZXIucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbHVtbk5hbWUsIGZpbHRlcmluZ01vZGlmaWVyIH0pID0+XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpLm1hcCgoY29sdW1uOiBDb2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChpc05pbChjb2x1bW5OYW1lKSkge1xuICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLm5hbWUgPT09IGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoZmlsdGVyaW5nTW9kaWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5maWx0ZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlciA9IGZpbHRlcmluZ01vZGlmaWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGNvbHVtbnM6IEFycmF5PENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZz4pID0+ICh7XG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgfVxuICAgICAgICB9KSksXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5KSxcbiAgICAgICAgdGhpcy50cmltRmlsdGVyQ29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1Tb3J0Q29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uT3JkZXJQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKSxcbiAgICAgICAgY29uY2F0TWFwKChjb25maWc6IEdyaWRDb25maWcpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LnNhdmVDb25maWckKGNvbmZpZykpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1GaWx0ZXJDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnZmlsdGVyJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChjb2wgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBjb2wuZmlsdGVyO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1Tb3J0Q29uZmlnUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3NvcnQnLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29sLnNvcnRPcmRlciA9ICcnO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248XG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPixcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+XG4gID4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnY3VzdG9tQ29sdW1ucycsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoKGNvbDogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiAhY29sLmN1c3RvbSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uT3JkZXJQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnb3JkZXInLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRDb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgIG9sZENvbmZpZz8uY29sdW1ucyB8fCAodGhpcy5kZWZhdWx0Q29sdW1ucyBhcyBDb2x1bW5Db25maWdbXSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjdXN0b20gY29sdW1ucyBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnNBZGRlZCA9IChjb25maWcuY29sdW1ucyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICBjb2wgPT4gIW9sZENvbHVtbnMuZmluZChvbGQgPT4gb2xkLm5hbWUgPT09IGNvbC5uYW1lKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSBbXG4gICAgICAgICAgICAgIC4uLm9sZENvbHVtbnMubWFwKG9sZENvbCA9PlxuICAgICAgICAgICAgICAgIChjb25maWcuY29sdW1ucyB8fCBbXSkuZmluZChuZXdDb2wgPT4gbmV3Q29sLm5hbWUgPT09IG9sZENvbC5uYW1lKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5zQWRkZWRcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCd2aXNpYmlsaXR5JywgY29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbmZpZyQoKS5waXBlKFxuICAgICAgICAgIG1hcChvbGRDb25maWcgPT4ge1xuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChuZXdDb2wgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkQ29sID0gY29sdW1ucy5maW5kKChjb2w6IGFueSkgPT4gbmV3Q29sLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgbmV3Q29sLnZpc2libGUgPSBvbGRDb2w/LnZpc2libGUgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXZlbnRQaXBlKFxuICAgIGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0LFxuICAgIHRyaW1FdmVudERhdGFGbjogKGNvbmZpZzogR3JpZENvbmZpZykgPT4gR3JpZENvbmZpZyB8IE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ29uZmlnRmlsdGVyXG4gICAgICAgICAgLmNhbGwodGhpcywgY29uZmlnUGFydClcbiAgICAgICAgICAucGlwZShtYXAoa2VlcEV2ZW50RGF0YSA9PiAoeyBjb25maWcsIGtlZXBFdmVudERhdGEgfSkpKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSA9PlxuICAgICAgICBrZWVwRXZlbnREYXRhID8gY29uZmlnIDogdHJpbUV2ZW50RGF0YUZuLmNhbGwodGhpcywgY29uZmlnKVxuICAgICAgKSxcbiAgICAgIGNvbmNhdE1hcChjb25maWcgPT4gKGlzT2JzZXJ2YWJsZShjb25maWcpID8gY29uZmlnIDogb2YoY29uZmlnKSkgYXMgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29uZmlnRmlsdGVyKGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGNvbnN0IHZhbHVlT3JGbiA9IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbnRleHQoKT8uY29uZmlnRmlsdGVyPy5bY29uZmlnUGFydF07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZU9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlT3JGbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZU9yRm47XG4gICAgfVxuICAgIHJldHVybiB0b09ic2VydmFibGUocmVzdWx0ID8/IHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYWZlbHlJbnZva2VNYXRjaGVyKFxuICAgIG1hdGNoZXNGbjogKFxuICAgICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgY29udGV4dD86IEdyaWRDb25maWdDb250ZXh0XG4gICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIGNvbnRleHQ/OiBHcmlkQ29uZmlnQ29udGV4dFxuICApIHtcbiAgICBpZiAobWF0Y2hlc0ZuKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc0ZuKHJvdXRlLCBjb250ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1zY3JvbGxcIlxuICAjc2Nyb2xsXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndGFibGUtZGF0YS1ncmlkX19vdmVybGF5JzogKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiYgIWxvYWRNb3JlQ29tcG9uZW50Py5pc0xvYWRpbmdcbiAgfVwiXG4gIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS10YWJsZS1kYXRhLWdyaWQtc2Nyb2xsXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS13cmFwcGVyXCJcbiAgICAqbmdJZj1cIihkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudD8uaXNMb2FkaW5nXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWRfX2xvYWRpbmctLWxvYWRlclwiPlxuICAgICAgPGM4eS1sb2FkaW5nXG4gICAgICAgIGxheW91dD1cImFwcGxpY2F0aW9uXCJcbiAgICAgICAgW21lc3NhZ2VdPVwibG9hZGluZ0l0ZW1zTGFiZWxcIlxuICAgICAgPjwvYzh5LWxvYWRpbmc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1oZWFkZXIgc2VwYXJhdG9yIGxhcmdlLXBhZGRpbmdcIlxuICAgICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZ3JpZEhlYWRlclwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImg0XCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ20tci0xNic6ICEhdGl0bGUgfVwiXG4gICAgPlxuICAgICAge3sgdGl0bGUgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcmluZ0FwcGxpZWRcIj5cbiAgICAgICAgPHNtYWxsXG4gICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgKm5nSWY9XCIhIWZpbHRlcmluZ0xhYmVsc1BhcmFtcy5hbGxJdGVtc0NvdW50XCJcbiAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJmaWx0ZXJpbmdMYWJlbHNQYXJhbXNcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZmlsdGVyZWRJdGVtc0NvdW50IH19IG9mIHt7IGFsbEl0ZW1zQ291bnQgfX0gaXRlbXNcbiAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImxhYmVsIGxhYmVsLWRlZmF1bHQgbS1yLTRcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgTm8gZmlsdGVyc1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgKm5nSWY9XCJmaWx0ZXJpbmdBcHBsaWVkXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvIG0tci00XCI+XG4gICAgICAgICAgICAgIHt7IChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIG9mIHt7IGFsbEl0ZW1zQ291bnQgfX0gaXRlbXNcbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgI2RkRmlsdGVycz1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImRkRmlsdGVycy5pc09wZW5cIlxuICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBtLWwtOFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBY3RpdmUgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1maWx0ZXJzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cImZpbHRlclwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0FjdGl2ZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2Utc3lzdGVtXCI+XG4gICAgICAgICAgICAgIHt7IGNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQubGVuZ3RoIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIlxuICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtZ3JpZF9fZHJvcGRvd24gYmctbGV2ZWwtMFwiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIG0tMFwiPlxuICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkOyBsZXQgbGFzdCA9IGxhc3RcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VwYXJhdG9yLWJvdHRvbSc6ICFsYXN0IH1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBzdGlja3ktdG9wIHRleHQtdHJ1bmNhdGUgbm8tYm9yZGVyLXRvcCBwLWItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBib3JkZXJsZXNzIGQtZmxleCBkLWNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBlZEZpbHRlckNoaXBzIG9mIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1hcFRvRmlsdGVyQ2hpcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdyb3VwZWRGaWx0ZXJDaGlwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdwLXQtMCc6IGZpcnN0IH1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21hbGwgcC1iLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncm91cGVkRmlsdGVyQ2hpcHMubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwZWRGaWx0ZXJDaGlwcy5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgZ2FwLTQgZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhZyB0YWctLWluZm8gY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGlwIG9mIGdyb3VwZWRGaWx0ZXJDaGlwcy5jaGlwc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4teHMgYnRuLWNsZWFuIHRleHQtMTAgbS1yLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGNoaXAucmVtb3ZlKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcmVtb3ZlLWNoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hpcC5kaXNwbGF5VmFsdWUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIHNlcGFyYXRvci10b3Agc3RpY2t5LWJvdHRvbVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdDbGVhciBhbGwgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWNsZWFyLWZpbHRlcnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ0NsZWFyIGFsbCBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbSBoaWRkZW4teHMgaGlkZGVuLXNtXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbcG9wb3Zlcl09XCJmaWx0ZXJzSGVscFBvcG92ZXJcIlxuICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIlxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1oZWxwLWZpbHRlcnNcIlxuICAgICAgPlxuICAgICAgICA8aSBjOHlJY29uPVwicXVlc3Rpb24tY2lyY2xlLW9cIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmlsdGVyc0hlbHBQb3BvdmVyPlxuICAgICAgICA8ZGl2IFtpbm5lckh0bWxdPVwiZmlsdGVyc0hlbHBQb3BvdmVySHRtbCB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0bi1jbGVhbiB0ZXh0LXByaW1hcnkgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgcG9wb3Zlcj1cInt7ICdUaGUgY291bnRlciBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBtaWdodCBiZSBpbmFjY3VyYXRlLicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJzaG93Q291bnRlcldhcm5pbmdcIlxuICAgICAgPlxuICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cIm0tbC1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnRuYmFyIGQtZmxleCBhLWktY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyQWN0aW9uQ29udHJvbCBvZiBoZWFkZXJBY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9scyB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGVhZGVyQWN0aW9uQ29udHJvbC50ZW1wbGF0ZTsgZWxzZSBjdXN0b21UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG4gYnRuLWxpbmtcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGVhZGVyQWN0aW9uQ29udHJvbC5jYWxsYmFjaygpXCJcbiAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNVU1RPTV9BQ1RJT04sXG4gICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uTmFtZTogaGVhZGVyQWN0aW9uQ29udHJvbC50ZXh0LFxuICAgICAgICAgICAgICAgIHR5cGU6IGhlYWRlckFjdGlvbkNvbnRyb2wudHlwZVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgICBbYzh5SWNvbl09XCJoZWFkZXJBY3Rpb25Db250cm9sLmljb25cIlxuICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbVRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGhlYWRlckFjdGlvbkNvbnRyb2wudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBoZWFkZXJBY3Rpb25Db250cm9sOiBoZWFkZXJBY3Rpb25Db250cm9sIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICAgICpuZ0lmPVwiY29uZmlndXJlQ29sdW1uc0VuYWJsZWRcIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgI2RkQ29uZmlndXJlQ29sdW1ucz1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImRkQ29uZmlndXJlQ29sdW1ucy5pc09wZW5cIlxuICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdDb25maWd1cmUgY29sdW1ucycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLWJ0blwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwiY29sdW1uc1wiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0NvbmZpZ3VyZSBjb2x1bW5zJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDx1bFxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRhdGEtZ3JpZF9fZHJvcGRvd25cIlxuICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwIG0tMFwiXG4gICAgICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uQ29sdW1uRHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5wb3NpdGlvbkZpeGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZHJhZ2dhYmxlLWFmdGVyIHAtMCBhLWktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveCBwLWwtMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLWhlYWRlci0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpOyBlbWl0Q29uZmlnQ2hhbmdlKCdjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9WSVNJQklMSVRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogIWNvbHVtbi52aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3Qgc2hvd09uSG92ZXIgbWF4LXdpZHRoLWZpdCBhLWktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZWBjb2x1bW4sdmVyYmAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnUmVtb3ZlYGNvbHVtbix2ZXJiYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUN1c3RvbUNvbHVtbihwb0NvbmZpcm0sIGNvbHVtbiwgZGRDb25maWd1cmVDb2x1bW5zKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5jdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjOHktcG9wb3Zlci1jb25maXJtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ29uZmlybSByZW1vdmFsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2VtZW50XT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNwb0NvbmZpcm1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L2M4eS1wb3BvdmVyLWNvbmZpcm0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjOHlJY29uPVwibWludXMtY2lyY2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tY3VzdG9tLWNvbHVtbi1yZW1vdmUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICBjbGFzcz1cInAtOCBzdGlja3ktYm90dG9tIHNlcGFyYXRvci10b3BcIlxuICAgICAgICAgICAgICAqbmdJZj1cImlzQ29uZmlnQ29udGV4dEtub3duXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIGN1c3RvbSBjb2x1bW4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1hZGQtY3VzdG9tLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DdXN0b21Db2x1bW5Nb2RhbCgpOyBkZENvbmZpZ3VyZUNvbHVtbnMuaGlkZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJwbHVzLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQWRkIGN1c3RvbSBjb2x1bW4nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0biBidG4tbGlua1wiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKm5nSWY9XCIhaGlkZVJlbG9hZFwiXG4gICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcmVsb2FkLWJ0blwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luY1wiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrUmVsb2FkKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgID48L2k+XG4gICAgICAgICAgPHNwYW4+e3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNlYXJjaCBtLWwtc20tMTYgZGF0YS1ncmlkX19zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgfHwgc2hvd1NlYXJjaFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1NlYXJjaOKApicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoVGV4dCQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcGVyZm9ybVNlYXJjaChzZWFyY2hUZXh0KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXJcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwidGltZXNcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hUZXh0ID0gJyc7IHNlYXJjaFRleHQkLmVtaXQoJycpXCJcbiAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5DTEVBUl9TRUFSQ0ggfVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnMgYW5pbWF0ZWQgc2xpZGVJbkRvd24gZmFzdFwiXG4gICAgICBkYXRhLWN5PVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnNcIlxuICAgICAgKm5nSWY9XCJzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoICE9PSAwXCJcbiAgICA+XG4gICAgICA8aDQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nUGx1cmFsXT1cInNlbGVjdGVkSXRlbUlkcy5sZW5ndGhcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTFcIj5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT4xIHNlbGVjdGVkIGl0ZW0uPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIm90aGVyXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInsgY291bnQ6IHNlbGVjdGVkSXRlbUlkcy5sZW5ndGggfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGNvdW50IH19IHNlbGVjdGVkIGl0ZW1zLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8YnIgY2xhc3M9XCJ2aXNpYmxlLXhzXCIgLz5cbiAgICAgICAgPHNtYWxsICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgJiYgc2VsZWN0ZWRJdGVtSWRzLmxlbmd0aCA+PSBwYWdpbmF0aW9uLnBhZ2VTaXplXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwiaW50ZXJhY3RcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldEFsbEl0ZW1zU2VsZWN0ZWQodHJ1ZSlcIlxuICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiAoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBTZWxlY3QgYWxsIHt7IGNvdW50IH19IGl0ZW1zXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuYmFyIGQtZmxleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgYnVsa0FjdGlvbkNvbnRyb2wgb2YgYnVsa0FjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiBzZWxlY3RlZEl0ZW1JZHMgfCBhc3luY1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJidWxrQWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19FWFBPUlQgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic2lnbi1vdXRcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19ERUxFVEUgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NVU1RPTV9BQ1RJT04sXG4gICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBidWxrQWN0aW9uQ29udHJvbC50ZXh0XG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImJ1bGtBY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBidWxrQWN0aW9uQ29udHJvbC5pY29uIH19XCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NBTkNFTFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8dGFibGVcbiAgICBjbGFzcz1cInRhYmxlIHRhYmxlLWZpbHRlcmVkLXNvcnRlZCB0YWJsZS1kYXRhLWdyaWQgbGFyZ2UtcGFkZGluZ1wiXG4gICAgW2NsYXNzLnRhYmxlLXN0cmlwZWRdPVwiZGlzcGxheU9wdGlvbnMuc3RyaXBlZFwiXG4gICAgW2NsYXNzLnRhYmxlLWJvcmRlcmVkXT1cImRpc3BsYXlPcHRpb25zLmJvcmRlcmVkXCJcbiAgICBbY2xhc3MudGFibGUtaG92ZXJdPVwiZGlzcGxheU9wdGlvbnMuaG92ZXJcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1jaGVja2JveGVzXT1cInNlbGVjdGFibGVcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1hY3Rpb25zXT1cImFjdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDBcIlxuICAgIFtzdHlsZS5ncmlkLXRlbXBsYXRlLWNvbHVtbnNdPVwic3R5bGVzLmdyaWRUZW1wbGF0ZUNvbHVtbnNcIlxuICAgIGNkay10YWJsZVxuICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwidHJ1ZVwiXG4gICAgKG1vdXNlbW92ZSk9XCJyZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkLmVtaXQoJGV2ZW50KVwiXG4gICAgKG1vdXNldXApPVwicmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQuZW1pdCgkZXZlbnQpXCJcbiAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tdGFibGVcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5TmFtZVwiXG4gICAgICBbY2RrQ29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbFNlbGVjdGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxEZXNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKCRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3RlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRJdGVtc1NlbGVjdGVkKFtyb3ddLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0lURU0sXG4gICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmFkaW8tYnV0dG9uJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPjwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXJhZGlvXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cInNlbGVjdC1yb3dcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VTZWxlY3RlZEl0ZW0ocm93KVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yYWRpb1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FjdGlvbnMnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbWVkaXVtIHNyLW9ubHlcIj57eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25Db250cm9sIG9mIGFjdGlvbkNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICB8IHZpc2libGVDb250cm9sczogcm93XG4gICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICB8IHNsaWNlOiAwIDogKChhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93IHwgYXN5bmMpPy5sZW5ndGggPiAyID8gMSA6IDIpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImFjdGlvbkNvbnRyb2wudHlwZVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3RcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRWRpdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkVkaXRcIlxuICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRURJVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1lZGl0LWJ1dHRvbi1pbi1yb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IGJ0bi1kb3QtLWRhbmdlciBzaG93T25Ib3ZlclwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkRFTEVURV9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcmVtb3ZlLWJ1dHRvbi1pbi1yb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGFjdGlvbkNvbnRyb2wuaWNvbiA/IGFjdGlvbkNvbnRyb2wudGV4dCA6ICcnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgKGFjdGlvbkNvbnRyb2wuaWNvbiA/IGFjdGlvbkNvbnRyb2wudGV4dCA6ICcnKSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBzaG93T25Ib3ZlcjogYWN0aW9uQ29udHJvbC5zaG93T25Ib3ZlciB9XCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTl9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2M4eS1kYXRhLWdyaWQtLWJ1dHRvbi1pbi1yb3ctLScgKyBhY3Rpb25Db250cm9sLnRleHRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25Db250cm9sLmljb25cIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFjdGlvbkNvbnRyb2wuaWNvblwiPnt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ20tbC1hdXRvIG92ZXJmbG93LXZpc2libGUnOlxuICAgICAgICAgICAgICAgICAgKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDJcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gcmlnaHRcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMlwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBjOHktZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcm93LWFjdGlvbnMtZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZWxsaXBzaXMtdlwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGFjdGlvbkNvbnRyb2wgb2YgYWN0aW9uQ29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgdmlzaWJsZUNvbnRyb2xzOiByb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgc2xpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDIgPyAxIDogMilcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiYWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FRElUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5EZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuREVMRVRFX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FWFBPUlRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkYXRhLWV4cG9ydFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTl9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgW2NsYXNzLnNvcnRlZF09XCJjb2x1bW4uc29ydE9yZGVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5maWx0ZXJlZF09XCJjb2x1bW4gfCBtYXA6IGlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZFwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJjb2x1bW4uZGF0YVR5cGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWMgOiB0aGlzIGFzIGNlbGxSZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGM4eS1jZWxsLXJlbmRlcmVyIFtzcGVjXT1cImNlbGxSZW5kZXJlclNwZWNcIj48L2M4eS1jZWxsLXJlbmRlcmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIGlzRHJvcERvd25QbGFjZWRSaWdodCB0byBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIHt7IGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW4pID8gJ3JpZ2h0JyA6ICdsZWZ0JyB9fVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmZpbHRlcmFibGVcIlxuICAgICAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICAgICAjZ3JpZEhlYWRlckRyb3Bkb3duPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImdyaWRIZWFkZXJEcm9wZG93bi5pc09wZW5cIlxuICAgICAgICAgICAgICBbaW5zaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2RhdGEtZ3JpZC0taGVhZGVyLWJ0bi0tJyArIGNvbHVtbi5oZWFkZXJcIlxuICAgICAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tYzh5LWNlbGwtcmVuZGVyZXJcIlxuICAgICAgICAgICAgICAgICAgICBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCJcbiAgICAgICAgICAgICAgICAgID48L2M4eS1jZWxsLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0ZpbHRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDwhLS0gaXNEcm9wRG93blBsYWNlZFJpZ2h0IHRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy4gLS0+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiXG4gICAgICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQtZ3JpZCc6IGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW4pIH1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZGF0YS1ncmlkX19kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duOiBncmlkSGVhZGVyRHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBmaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLWNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NwZWNdPVwiZmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlY1wiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWM4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlclwiXG4gICAgICAgICAgICAgICAgICAgID48L2M4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1zb3J0XCJcbiAgICAgICAgICAgICAgW3N0eWxlXT1cInsgJ21hcmdpbi1sZWZ0JzogIWNvbHVtbi5maWx0ZXJhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSA/ICctMjBweCcgOiBudWxsIH1cIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwic29ydENvbHVtblRpdGxlIHwgdHJhbnNsYXRlOiB7IG5hbWU6IGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUgfVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTb3J0T3JkZXIoY29sdW1uLm5hbWUpXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImNoYW5nZS1zb3J0LW9yZGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnNvcnRPcmRlclwiPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwibG9uZy1hcnJvdy11cFwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2FzYydcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJsb25nLWFycm93LWRvd25cIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkZXNjJ1wiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImV4Y2hhbmdlXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5yZXNpemFibGVcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIlxuICAgICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZU1vdXNlRG93biQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHRhcmdldENvbHVtbk5hbWU6IGNvbHVtbi5uYW1lIH0pXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIWNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtY2VsbC10aXRsZV09XCJjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmNlbGxDU1NDbGFzc05hbWVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwiY29sdW1uLmRhdGFUeXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzb2x2ZUNlbGxWYWx1ZShyb3csIGNvbHVtbi5wYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0Q2VsbFJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXIgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJpbmZpbml0ZVNjcm9sbEZvb3RlclwiPlxuICAgICAgPHRkXG4gICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCJzdHlsZXMuZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uXCJcbiAgICAgICAgY2RrLWZvb3Rlci1jZWxsXG4gICAgICAgICpjZGtGb290ZXJDZWxsRGVmXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSAjaW5maW5pdGVTY3JvbGxDb250YWluZXI+PC90ZW1wbGF0ZT5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHJcbiAgICAgIGNkay1oZWFkZXItcm93XG4gICAgICAqY2RrSGVhZGVyUm93RGVmPVwiY29sdW1uTmFtZXNcIlxuICAgID48L3RyPlxuXG4gICAgPHRyXG4gICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcm93LWluLWRhdGEtZ3JpZFwiXG4gICAgICBjZGstcm93XG4gICAgICAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uTmFtZXM7IGxldCBpZHggPSBkYXRhSW5kZXhcIlxuICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICBhY3RpdmVDbGFzc05hbWUgJiYgcm93ID09PSBsYXN0Q2xpY2tlZFJvdyA/IGFjdGl2ZUNsYXNzTmFtZSA6ICcnLFxuICAgICAgICBpZHggJSAyID09PSAwID8gJ2V2ZW4nIDogJ29kZCdcbiAgICAgIF1cIlxuICAgICAgKG1vdXNlb3Zlcik9XCJyb3dNb3VzZU92ZXIuZW1pdChyb3cpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cInJvd01vdXNlTGVhdmUuZW1pdChyb3cpXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVDbGljayhyb3cpXCJcbiAgICA+PC90cj5cblxuICAgIDx0clxuICAgICAgY2xhc3M9XCJleHBhbmRlZC1yb3dcIlxuICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICEoZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkIHwgYXN5bmMpIH1cIlxuICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWV4cGFuZGVkLXJvdy1pbi1kYXRhLWdyaWRcIlxuICAgICAgY2RrLXJvd1xuICAgICAgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWQtcm93J107IHdoZW46IGlzUm93RXhwYW5kZWRcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJleHBhbmRlZC1yb3dcIj5cbiAgICAgIDx0ZFxuICAgICAgICBbc3R5bGUuZ3JpZC1jb2x1bW5dPVwic3R5bGVzLmdyaWRJbmZpbml0ZVNjcm9sbENvbHVtblwiXG4gICAgICAgIGNkay1jZWxsXG4gICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgZXhwYW5kYWJsZVJvdz8udGVtcGxhdGU7XG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICRpbXBsaWNpdDogcm93LFxuICAgICAgICAgICAgICBhc3luY1JlbmRlclN1Y2Nlc3M6IHNldEV4cGFuZGFibGVSb3dWaXNpYmxlLmJpbmQodGhpcywgcm93LCB0cnVlKSxcbiAgICAgICAgICAgICAgYXN5bmNSZW5kZXJGYWlsOiBzZXRFeHBhbmRhYmxlUm93VmlzaWJsZS5iaW5kKHRoaXMsIHJvdywgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8dHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICFpbmZpbml0ZVNjcm9sbCB9XCJcbiAgICAgICAgY2RrLWZvb3Rlci1yb3dcbiAgICAgICAgKmNka0Zvb3RlclJvd0RlZj1cIlsnaW5maW5pdGVTY3JvbGxGb290ZXInXVwiXG4gICAgICA+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90YWJsZT5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXggbS0wIHAtdC00MCBwLWItNDBcIlxuICAgICpuZ0lmPVwiXG4gICAgICAhKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiZcbiAgICAgICgoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID09PSAwIHx8IChkYXRhU291cmNlLmRhdGEkIHwgYXN5bmMpLmxlbmd0aCA9PT0gMClcbiAgICBcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGNvbC1zbS00IG0tbC1hdXRvIG0tci1hdXRvXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjOHktdWktZW1wdHktc3RhdGUsIC5jOHktZW1wdHktc3RhdGVcIj48L25nLWNvbnRlbnQ+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgZW1wdHlTdGF0ZT8udGVtcGxhdGVSZWY7XG4gICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IGVtcHR5U3RhdGVDb250ZXh0JCB8IGFzeW5jIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWZvb3RlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiXG4gICAgKm5nSWY9XCJwYWdpbmF0aW9uICYmICFpbmZpbml0ZVNjcm9sbFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbm8tZ3V0dGVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY291bnRlciBwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmN1cnJlbnRQYWdlU2l6ZSA+IDBcIlxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jb3VudGVyXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cInRleHQtbXV0ZWRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInBhZ2luYXRpb25MYWJlbFBhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBwYWdlRmlyc3RJdGVtSWR4IH19IC0ge3sgcGFnZUxhc3RJdGVtSWR4IH19IG9mIHt7IGl0ZW1zVG90YWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbm8tZ3V0dGVyIHRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWlubGluZSBwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSA+IG1pblBvc3NpYmxlUGFnZVNpemVcIlxuICAgICAgPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICBmb3I9XCJmaWx0ZXJlZFNpemVcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0l0ZW1zIHBlciBwYWdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgaWQ9XCJmaWx0ZXJlZFNpemVcIlxuICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcGFnZXNpemUtb3B0aW9uc1wiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICB1cGRhdGVQYWdpbmF0aW9uKHsgaXRlbXNQZXJQYWdlOiAkZXZlbnQsIHBhZ2U6IHBhZ2luYXRpb24uY3VycmVudFBhZ2UgfSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcGFnZVNpemUgb2YgcG9zc2libGVQYWdlU2l6ZXNcIlxuICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHBhZ2VTaXplIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1yaWdodFwiPlxuICAgICAgPHBhZ2luYXRpb25cbiAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJoaWRlUGFnaW5hdGlvbiQgfCBhc3luY1wiXG4gICAgICAgIGNsYXNzPVwicC10LTggcC1iLThcIlxuICAgICAgICAqbmdJZj1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPiAwXCJcbiAgICAgICAgW25nTW9kZWxdPVwicGFnaW5hdGlvbi5jdXJyZW50UGFnZVwiXG4gICAgICAgIChwYWdlQ2hhbmdlZCk9XCJ1cGRhdGVQYWdpbmF0aW9uKCRldmVudClcIlxuICAgICAgICBbdG90YWxJdGVtc109XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplXCJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcbiAgICAgICAgKG51bVBhZ2VzKT1cInRvdGFsUGFnZXNDb3VudCQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgW21heFNpemVdPVwiNVwiXG4gICAgICAgIFtib3VuZGFyeUxpbmtzXT1cImZhbHNlXCJcbiAgICAgICAgcHJldmlvdXNUZXh0PVwiUHJldmlvdXNcIlxuICAgICAgICBuZXh0VGV4dD1cIk5leHRcIlxuICAgICAgPjwvcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|