@c8y/ngx-components 1017.0.300 → 1017.0.310

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.
@@ -126,12 +126,12 @@ export class ReportDashboardListComponent {
126
126
  }
127
127
  }
128
128
  ReportDashboardListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ReportDashboardListComponent, deps: [{ token: i1.InventoryService }, { token: i2.ContextDashboardService }, { token: i3.BsModalService }, { token: i4.TranslateService }, { token: i5.ModalService }, { token: i5.AlertService }, { token: i6.ReportDashboardService }, { token: i5.Permissions }], target: i0.ɵɵFactoryTarget.Component });
129
- ReportDashboardListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ReportDashboardListComponent, selector: "c8y-report-dashboard-list", viewQueries: [{ propertyName: "filter", first: true, predicate: FilterInputComponent, descendants: true }], ngImport: i0, template: "<c8y-title>\n {{ 'Reports' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n type=\"search\"\n [attr.aria-label]=\"'Filter' | translate\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n px-event=\"Clear filtering reports\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add report' | translate }}\"\n [attr.data-cy]=\"'reports-add-report-action-bar-button'\"\n type=\"button\"\n (click)=\"add()\"\n [disabled]=\"!canAddReport\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add report' | translate }}\n </button>\n <button\n *ngIf=\"!canAddReport\"\n class=\"btn btn-dot m-r-16\"\n popover=\"{{ 'You don\\'t have permission to add reports' | translate }}\"\n triggers=\"focus\"\n placement=\"top\"\n container=\"body\"\n >\n <i [c8yIcon]=\"'info-circle'\" class=\"text-primary\"></i>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadReports()\"\n >\n <i [ngClass]=\"{ 'icon-spin': reloading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/cockpit/#reports\"></c8y-help>\n\n<c8y-list-group>\n <c8y-li\n class=\"page-sticky-header hidden-xs hidden-sm\"\n *ngIf=\"(reports$ | async)?.data.length > 0\"\n >\n <c8y-li-icon>\n <i class=\"p-l-24\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{ 'Report' | translate }}\n </div>\n <div class=\"col-6\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Show in navigator' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let report of reports$; let i = index; loadMore: 'auto'\">\n <c8y-li-icon [icon]=\"report.icon\"></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n <button\n class=\"btn-clean\"\n title=\"{{ report.name }}\"\n type=\"button\"\n routerLink=\"/reports/{{ report.id }}\"\n >\n <span class=\"text-truncate\">\n {{ report.name }}\n </span>\n </button>\n </div>\n <div class=\"col-6\">\n <p class=\"small text-truncate-wrap\">\n <em class=\"text-muted\" *ngIf=\"!report.description; else showDescription\">\n {{ 'No description available' | translate }}\n </em>\n <ng-template #showDescription>\n {{ report.description }}\n </ng-template>\n </p>\n </div>\n <div class=\"col-2 fit-h-20 m-t-xs-8\">\n <label class=\"c8y-switch c8y-switch--inline\" title=\"{{ 'Show in navigator' | translate }}\">\n <input\n [(ngModel)]=\"!!report.c8y_IsNavigatorNode\"\n type=\"checkbox\"\n (change)=\"update(report)\"\n />\n <span></span>\n <span class=\"visible-xs\">\n {{ 'Show in navigator' | translate }}\n </span>\n </label>\n </div>\n <div class=\"col-1 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto d-flex\"\n (click)=\"delete(report)\"\n tooltip=\"{{ 'Remove report' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Remove report' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div class=\"visible-xs p-t-8 text-right\">\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"delete(report)\"\n title=\"{{ 'Remove report' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Remove report' | translate }}\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n\n<c8y-ui-empty-state\n *ngIf=\"(reports$ | async)?.data.length === 0\"\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n>\n <p>\n <button\n title=\"{{ 'Add report' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\n [attr.data-cy]=\"'reports-add-report-empty-state-button'\"\n (click)=\"add()\"\n >\n {{ 'Add report' | translate }}\n </button>\n </p>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#reports\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n</c8y-ui-empty-state>\n", dependencies: [{ kind: "component", type: i5.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i5.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i5.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i8.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: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i5.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i5.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i5.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i5.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i5.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i5.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "directive", type: i9.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: "directive", type: i10.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { kind: "directive", type: i11.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }] });
129
+ ReportDashboardListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ReportDashboardListComponent, selector: "c8y-report-dashboard-list", viewQueries: [{ propertyName: "filter", first: true, predicate: FilterInputComponent, descendants: true }], ngImport: i0, template: "<c8y-title>\n {{ 'Reports' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n type=\"search\"\n [attr.aria-label]=\"'Filter' | translate\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n px-event=\"Clear filtering reports\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add report' | translate }}\"\n [attr.data-cy]=\"'reports-add-report-action-bar-button'\"\n type=\"button\"\n (click)=\"add()\"\n [disabled]=\"!canAddReport\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add report' | translate }}\n </button>\n <button\n *ngIf=\"!canAddReport\"\n class=\"btn btn-dot m-r-16\"\n popover=\"{{ 'You don\\'t have permission to add reports' | translate }}\"\n triggers=\"focus\"\n placement=\"top\"\n container=\"body\"\n >\n <i [c8yIcon]=\"'info-circle'\" class=\"text-primary\"></i>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadReports()\"\n >\n <i [ngClass]=\"{ 'icon-spin': reloading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/cockpit/#reports\"></c8y-help>\n\n<c8y-list-group>\n <c8y-li\n class=\"page-sticky-header hidden-xs hidden-sm\"\n *ngIf=\"(reports$ | async)?.data.length > 0\"\n >\n <c8y-li-icon>\n <i class=\"p-l-24\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{ 'Report' | translate }}\n </div>\n <div class=\"col-6\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Show in navigator' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let report of reports$; let i = index; loadMore: 'auto'\">\n <c8y-li-icon [icon]=\"report.icon\"></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n <button\n class=\"btn-clean\"\n title=\"{{ report.name }}\"\n type=\"button\"\n routerLink=\"/reports/{{ report.id }}\"\n >\n <span class=\"text-truncate\">\n {{ report.name }}\n </span>\n </button>\n </div>\n <div class=\"col-6\">\n <p class=\"small text-truncate-wrap\">\n <em class=\"text-muted\" *ngIf=\"!report.description; else showDescription\">\n {{ 'No description available' | translate }}\n </em>\n <ng-template #showDescription>\n {{ report.description }}\n </ng-template>\n </p>\n </div>\n <div class=\"col-2 fit-h-20 m-t-xs-8\">\n <label class=\"c8y-switch c8y-switch--inline\" title=\"{{ 'Show in navigator' | translate }}\">\n <input\n [(ngModel)]=\"!!report.c8y_IsNavigatorNode\"\n type=\"checkbox\"\n (change)=\"update(report)\"\n />\n <span></span>\n <span class=\"visible-xs\">\n {{ 'Show in navigator' | translate }}\n </span>\n </label>\n </div>\n <div class=\"col-1 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto d-flex\"\n (click)=\"delete(report)\"\n tooltip=\"{{ 'Remove report' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Remove report' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div class=\"visible-xs p-t-8 text-right\">\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"delete(report)\"\n title=\"{{ 'Remove report' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Remove report' | translate }}\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n\n<c8y-ui-empty-state\n *ngIf=\"(reports$ | async)?.data.length === 0\"\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n>\n <p>\n <button\n title=\"{{ 'Add report' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\n [attr.data-cy]=\"'reports-add-report-empty-state-button'\"\n [disabled]=\"!canAddReport\"\n (click)=\"add()\"\n >\n {{ 'Add report' | translate }}\n </button>\n </p>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#reports\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n</c8y-ui-empty-state>\n", dependencies: [{ kind: "component", type: i5.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i5.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i5.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i8.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: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i5.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i5.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i5.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i5.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i5.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i5.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "directive", type: i9.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: "directive", type: i10.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { kind: "directive", type: i11.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }] });
130
130
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ReportDashboardListComponent, decorators: [{
131
131
  type: Component,
132
- args: [{ selector: 'c8y-report-dashboard-list', template: "<c8y-title>\n {{ 'Reports' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n type=\"search\"\n [attr.aria-label]=\"'Filter' | translate\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n px-event=\"Clear filtering reports\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add report' | translate }}\"\n [attr.data-cy]=\"'reports-add-report-action-bar-button'\"\n type=\"button\"\n (click)=\"add()\"\n [disabled]=\"!canAddReport\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add report' | translate }}\n </button>\n <button\n *ngIf=\"!canAddReport\"\n class=\"btn btn-dot m-r-16\"\n popover=\"{{ 'You don\\'t have permission to add reports' | translate }}\"\n triggers=\"focus\"\n placement=\"top\"\n container=\"body\"\n >\n <i [c8yIcon]=\"'info-circle'\" class=\"text-primary\"></i>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadReports()\"\n >\n <i [ngClass]=\"{ 'icon-spin': reloading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/cockpit/#reports\"></c8y-help>\n\n<c8y-list-group>\n <c8y-li\n class=\"page-sticky-header hidden-xs hidden-sm\"\n *ngIf=\"(reports$ | async)?.data.length > 0\"\n >\n <c8y-li-icon>\n <i class=\"p-l-24\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{ 'Report' | translate }}\n </div>\n <div class=\"col-6\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Show in navigator' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let report of reports$; let i = index; loadMore: 'auto'\">\n <c8y-li-icon [icon]=\"report.icon\"></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n <button\n class=\"btn-clean\"\n title=\"{{ report.name }}\"\n type=\"button\"\n routerLink=\"/reports/{{ report.id }}\"\n >\n <span class=\"text-truncate\">\n {{ report.name }}\n </span>\n </button>\n </div>\n <div class=\"col-6\">\n <p class=\"small text-truncate-wrap\">\n <em class=\"text-muted\" *ngIf=\"!report.description; else showDescription\">\n {{ 'No description available' | translate }}\n </em>\n <ng-template #showDescription>\n {{ report.description }}\n </ng-template>\n </p>\n </div>\n <div class=\"col-2 fit-h-20 m-t-xs-8\">\n <label class=\"c8y-switch c8y-switch--inline\" title=\"{{ 'Show in navigator' | translate }}\">\n <input\n [(ngModel)]=\"!!report.c8y_IsNavigatorNode\"\n type=\"checkbox\"\n (change)=\"update(report)\"\n />\n <span></span>\n <span class=\"visible-xs\">\n {{ 'Show in navigator' | translate }}\n </span>\n </label>\n </div>\n <div class=\"col-1 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto d-flex\"\n (click)=\"delete(report)\"\n tooltip=\"{{ 'Remove report' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Remove report' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div class=\"visible-xs p-t-8 text-right\">\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"delete(report)\"\n title=\"{{ 'Remove report' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Remove report' | translate }}\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n\n<c8y-ui-empty-state\n *ngIf=\"(reports$ | async)?.data.length === 0\"\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n>\n <p>\n <button\n title=\"{{ 'Add report' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\n [attr.data-cy]=\"'reports-add-report-empty-state-button'\"\n (click)=\"add()\"\n >\n {{ 'Add report' | translate }}\n </button>\n </p>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#reports\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n</c8y-ui-empty-state>\n" }]
132
+ args: [{ selector: 'c8y-report-dashboard-list', template: "<c8y-title>\n {{ 'Reports' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n type=\"search\"\n [attr.aria-label]=\"'Filter' | translate\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n px-event=\"Clear filtering reports\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add report' | translate }}\"\n [attr.data-cy]=\"'reports-add-report-action-bar-button'\"\n type=\"button\"\n (click)=\"add()\"\n [disabled]=\"!canAddReport\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add report' | translate }}\n </button>\n <button\n *ngIf=\"!canAddReport\"\n class=\"btn btn-dot m-r-16\"\n popover=\"{{ 'You don\\'t have permission to add reports' | translate }}\"\n triggers=\"focus\"\n placement=\"top\"\n container=\"body\"\n >\n <i [c8yIcon]=\"'info-circle'\" class=\"text-primary\"></i>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadReports()\"\n >\n <i [ngClass]=\"{ 'icon-spin': reloading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/cockpit/#reports\"></c8y-help>\n\n<c8y-list-group>\n <c8y-li\n class=\"page-sticky-header hidden-xs hidden-sm\"\n *ngIf=\"(reports$ | async)?.data.length > 0\"\n >\n <c8y-li-icon>\n <i class=\"p-l-24\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{ 'Report' | translate }}\n </div>\n <div class=\"col-6\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Show in navigator' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let report of reports$; let i = index; loadMore: 'auto'\">\n <c8y-li-icon [icon]=\"report.icon\"></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n <button\n class=\"btn-clean\"\n title=\"{{ report.name }}\"\n type=\"button\"\n routerLink=\"/reports/{{ report.id }}\"\n >\n <span class=\"text-truncate\">\n {{ report.name }}\n </span>\n </button>\n </div>\n <div class=\"col-6\">\n <p class=\"small text-truncate-wrap\">\n <em class=\"text-muted\" *ngIf=\"!report.description; else showDescription\">\n {{ 'No description available' | translate }}\n </em>\n <ng-template #showDescription>\n {{ report.description }}\n </ng-template>\n </p>\n </div>\n <div class=\"col-2 fit-h-20 m-t-xs-8\">\n <label class=\"c8y-switch c8y-switch--inline\" title=\"{{ 'Show in navigator' | translate }}\">\n <input\n [(ngModel)]=\"!!report.c8y_IsNavigatorNode\"\n type=\"checkbox\"\n (change)=\"update(report)\"\n />\n <span></span>\n <span class=\"visible-xs\">\n {{ 'Show in navigator' | translate }}\n </span>\n </label>\n </div>\n <div class=\"col-1 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto d-flex\"\n (click)=\"delete(report)\"\n tooltip=\"{{ 'Remove report' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Remove report' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div class=\"visible-xs p-t-8 text-right\">\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"delete(report)\"\n title=\"{{ 'Remove report' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Remove report' | translate }}\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n\n<c8y-ui-empty-state\n *ngIf=\"(reports$ | async)?.data.length === 0\"\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n>\n <p>\n <button\n title=\"{{ 'Add report' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\n [attr.data-cy]=\"'reports-add-report-empty-state-button'\"\n [disabled]=\"!canAddReport\"\n (click)=\"add()\"\n >\n {{ 'Add report' | translate }}\n </button>\n </p>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#reports\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n</c8y-ui-empty-state>\n" }]
133
133
  }], ctorParameters: function () { return [{ type: i1.InventoryService }, { type: i2.ContextDashboardService }, { type: i3.BsModalService }, { type: i4.TranslateService }, { type: i5.ModalService }, { type: i5.AlertService }, { type: i6.ReportDashboardService }, { type: i5.Permissions }]; }, propDecorators: { filter: [{
134
134
  type: ViewChild,
135
135
  args: [FilterInputComponent, { static: false }]
136
136
  }] } });
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWRhc2hib2FyZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL3JlcG9ydC1kYXNoYm9hcmQvcmVwb3J0LWRhc2hib2FyZC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL3JlcG9ydC1kYXNoYm9hcmQvcmVwb3J0LWRhc2hib2FyZC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFlLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxZQUFZLEVBQ1osTUFBTSxFQUNOLFlBQVksRUFDWixXQUFXLEVBQ1osTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU1wRSxNQUFNLE9BQU8s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Q0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUM7WUFDNUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5RCxDQUFDOzt5SEFwSVUsNEJBQTRCOzZHQUE1Qiw0QkFBNEIseUdBQzVCLG9CQUFvQixnREN4QmpDLHF5S0FnTEE7MkZEekphLDRCQUE0QjtrQkFKeEMsU0FBUzsrQkFDRSwyQkFBMkI7OFRBSWUsTUFBTTtzQkFBekQsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCwgSW52ZW50b3J5U2VydmljZSwgSVJlc3VsdExpc3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBGaWx0ZXJJbnB1dENvbXBvbmVudCxcbiAgZ2V0dGV4dCxcbiAgTW9kYWxTZXJ2aWNlLFxuICBTdGF0dXMsXG4gIEFsZXJ0U2VydmljZSxcbiAgUGVybWlzc2lvbnNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBEYXNoYm9hcmREZXRhaWxDb21wb25lbnQgfSBmcm9tICcuLi9kYXNoYm9hcmQtZGV0YWlsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250ZXh0RGFzaGJvYXJkU2VydmljZSB9IGZyb20gJy4uL2NvbnRleHQtZGFzaGJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZFR5cGUgfSBmcm9tICcuLi9jb250ZXh0LWRhc2hib2FyZC5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBSZXBvcnREYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi9yZXBvcnQtZGFzaGJvYXJkLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktcmVwb3J0LWRhc2hib2FyZC1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1kYXNoYm9hcmQtbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0RGFzaGJvYXJkTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoRmlsdGVySW5wdXRDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSBmaWx0ZXI6IEZpbHRlcklucHV0Q29tcG9uZW50O1xuICB0ZXh0RmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcbiAgcmVsb2FkJDogQmVoYXZpb3JTdWJqZWN0PHZvaWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgcmVsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHJlcG9ydHMkOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pj4gPSBjb21iaW5lTGF0ZXN0KFxuICAgIHRoaXMudGV4dEZpbHRlciQucGlwZShkZWJvdW5jZVRpbWUoNDAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSksXG4gICAgdGhpcy5yZWxvYWQkXG4gICkucGlwZShcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxvYWRpbmcgPSB0cnVlO1xuICAgIH0pLFxuICAgIHN3aXRjaE1hcCgoW3RleHRdKSA9PiB0aGlzLmxvYWRSZXBvcnRzKHRleHQpKSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICBjYW5BZGRSZXBvcnQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBERUxFVEVEX1NVQ0NFU1NfTVNHID0gZ2V0dGV4dCgnUmVwb3J0IGRlbGV0ZWQuJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnlTZXJ2aWNlOiBJbnZlbnRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udGV4dERhc2hib2FyZFNlcnZpY2U6IENvbnRleHREYXNoYm9hcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbDogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWw6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVwb3J0RGFzaGJvYXJkU2VydmljZTogUmVwb3J0RGFzaGJvYXJkU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uc1xuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jYW5BZGRSZXBvcnQgPSB0aGlzLnBlcm1pc3Npb25zLmhhc0FueVJvbGUoW1xuICAgICAgJ1JPTEVfSU5WRU5UT1JZX0NSRUFURScsXG4gICAgICAnUk9MRV9JTlZFTlRPUllfQURNSU4nXG4gICAgXSk7XG4gIH1cblxuICBhc3luYyBsb2FkUmVwb3J0cyhwYXJ0aWFsTmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBwYXJ0aWFsTmFtZVxuICAgICAgPyB0aGlzLnJlcG9ydERhc2hib2FyZFNlcnZpY2UubGlzdFJlcG9ydHMoeyBmaWx0ZXI6IHsgbmFtZTogYCoke3BhcnRpYWxOYW1lfSpgIH0gfSlcbiAgICAgIDogdGhpcy5yZXBvcnREYXNoYm9hcmRTZXJ2aWNlLmxpc3RSZXBvcnRzKCk7XG4gIH1cblxuICBhc3luYyBhZGQoKSB7XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgICAgaXNSZXBvcnQ6IHRydWUsXG4gICAgICBpc05hbWVkRGFzaGJvYXJkOiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMuYnNNb2RhbC5zaG93KERhc2hib2FyZERldGFpbENvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1sZycsXG4gICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnbW9kYWwtYm9keScsXG4gICAgICBhcmlhTGFiZWxsZWRCeTogJ21vZGFsLXRpdGxlJyxcbiAgICAgIGluaXRpYWxTdGF0ZVxuICAgIH0pLmNvbnRlbnQgYXMgRGFzaGJvYXJkRGV0YWlsQ29tcG9uZW50O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjZmcgPSBhd2FpdCBtb2RhbC5yZXN1bHQ7XG4gICAgICBjb25zdCB7IG5hbWUsIGljb24sIGM4eV9Jc05hdmlnYXRvck5vZGUsIHByaW9yaXR5LCBkZXNjcmlwdGlvbiwgLi4uZGFzaGJvYXJkQ2ZnIH0gPSBjZmc7XG4gICAgICBjb25zdCByZXBvcnQgPSAoXG4gICAgICAgIGF3YWl0IHRoaXMucmVwb3J0RGFzaGJvYXJkU2VydmljZS5jcmVhdGVSZXBvcnQoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICBjOHlfSXNOYXZpZ2F0b3JOb2RlLFxuICAgICAgICAgIHByaW9yaXR5LFxuICAgICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICAgIH0gYXMgUGFydGlhbDxJTWFuYWdlZE9iamVjdD4pXG4gICAgICApLmRhdGE7XG5cbiAgICAgIGF3YWl0IHRoaXMuY29udGV4dERhc2hib2FyZFNlcnZpY2UuY3JlYXRlKFxuICAgICAgICBkYXNoYm9hcmRDZmcsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYCR7dGhpcy5jb250ZXh0RGFzaGJvYXJkU2VydmljZS5SRVBPUlRfUEFSVElBTF9OQU1FfSR7cmVwb3J0LmlkfWBcbiAgICAgICk7XG4gICAgICBpZiAocmVwb3J0LmM4eV9Jc05hdmlnYXRvck5vZGUpIHtcbiAgICAgICAgdGhpcy5yZXBvcnREYXNoYm9hcmRTZXJ2aWNlLmFkZFJlcG9ydE5hdmlnYXRvck5vZGUocmVwb3J0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVsb2FkJC5uZXh0KCk7XG4gICAgICBtb2RhbC5jbG9zZSgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb21ldGhpbmcgd2VudCB3cm9uZzogJHtleH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGUocmVwb3J0OiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXNoYm9hcmQgPSBhd2FpdCB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlXG4gICAgICAgIC5nZXREYXNoYm9hcmQkKGByZXBvcnRfJHtyZXBvcnQuaWR9YCwgW0NvbnRleHREYXNoYm9hcmRUeXBlLk5hbWVkXSlcbiAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgICAgY29uc3QgaXNEYXNoYm9hcmRGcm96ZW4gPSAhIWRhc2hib2FyZD8uYzh5X0Rhc2hib2FyZD8uaXNGcm96ZW47XG5cbiAgICAgIGNvbnN0IG1zZyA9IGlzRGFzaGJvYXJkRnJvemVuXG4gICAgICAgID8gZ2V0dGV4dChcbiAgICAgICAgICAgIGBZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSB0aGUgcmVwb3J0IFwie3sgcmVwb3J0TmFtZSB9fVwiLiBCZSBhd2FyZSB0aGF0IHRoZSByZXBvcnQgaGFzIGEgbG9ja2VkIGRhc2hib2FyZCBhc3NpZ25lZC4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD9gXG4gICAgICAgICAgKVxuICAgICAgICA6IGdldHRleHQoYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIHRoZSByZXBvcnQgXCJ7eyByZXBvcnROYW1lIH19XCIuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/YCk7XG5cbiAgICAgIGF3YWl0IHRoaXMubW9kYWwuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnRGVsZXRlIHJlcG9ydCcpLFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChtc2csIHtcbiAgICAgICAgICByZXBvcnROYW1lOiByZXBvcnQubmFtZVxuICAgICAgICB9KSxcbiAgICAgICAgU3RhdHVzLkRBTkdFUixcbiAgICAgICAge1xuICAgICAgICAgIG9rOiBnZXR0ZXh0KCdEZWxldGUnKSxcbiAgICAgICAgICBjYW5jZWw6IGdldHRleHQoJ0NhbmNlbCcpXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IHRoaXMuY29udGV4dERhc2hib2FyZFNlcnZpY2UuZGVsZXRlKGRhc2hib2FyZCwgZmFsc2UpO1xuICAgICAgYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmRlbGV0ZShyZXBvcnQuaWQpO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2Vzcyh0aGlzLkRFTEVURURfU1VDQ0VTU19NU0cpO1xuICAgICAgaWYgKHJlcG9ydC5jOHlfSXNOYXZpZ2F0b3JOb2RlKSB7XG4gICAgICAgIHRoaXMucmVwb3J0RGFzaGJvYXJkU2VydmljZS5yZW1vdmVOYXZpZ2F0b3JOb2RlKHJlcG9ydCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbG9hZCQubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb21ldGhpbmcgd2VudCB3cm9uZzogJHtleH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGUocmVwb3J0OiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHJlcG9ydC5jOHlfSXNOYXZpZ2F0b3JOb2RlID0gcmVwb3J0LmM4eV9Jc05hdmlnYXRvck5vZGUgPyB7fSA6IG51bGw7XG4gICAgYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLnVwZGF0ZShyZXBvcnQpO1xuICAgIHJlcG9ydC5jOHlfSXNOYXZpZ2F0b3JOb2RlXG4gICAgICA/IHRoaXMucmVwb3J0RGFzaGJvYXJkU2VydmljZS5hZGRSZXBvcnROYXZpZ2F0b3JOb2RlKHJlcG9ydClcbiAgICAgIDogdGhpcy5yZXBvcnREYXNoYm9hcmRTZXJ2aWNlLnJlbW92ZU5hdmlnYXRvck5vZGUocmVwb3J0KTtcbiAgfVxufVxuIiwiPGM4eS10aXRsZT5cbiAge3sgJ1JlcG9ydHMnIHwgdHJhbnNsYXRlIH19XG48L2M4eS10aXRsZT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCInbGVmdCdcIiBpdGVtQ2xhc3M9XCJuYXZiYXItZm9ybVwiPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoXCI+XG4gICAgPGlucHV0XG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0ZpbHRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnRmlsdGVy4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBbbmdNb2RlbF09XCJ0ZXh0RmlsdGVyJCB8IGFzeW5jXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRleHRGaWx0ZXIkLm5leHQoJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG4gICAgICA8aSBjOHlJY29uPVwic2VhcmNoXCIgKm5nSWY9XCIodGV4dEZpbHRlciQgfCBhc3luYykubGVuZ3RoID09PSAwXCI+PC9pPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LW11dGVkXCJcbiAgICAgICAgYzh5SWNvbj1cInRpbWVzXCJcbiAgICAgICAgKm5nSWY9XCIodGV4dEZpbHRlciQgfCBhc3luYykubGVuZ3RoID4gMFwiXG4gICAgICAgIChjbGljayk9XCJ0ZXh0RmlsdGVyJC5uZXh0KCcnKVwiXG4gICAgICAgIHB4LWV2ZW50PVwiQ2xlYXIgZmlsdGVyaW5nIHJlcG9ydHNcIlxuICAgICAgPjwvaT5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdBZGQgcmVwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgW2F0dHIuZGF0YS1jeV09XCIncmVwb3J0cy1hZGQtcmVwb3J0LWFjdGlvbi1iYXItYnV0dG9uJ1wiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cImFkZCgpXCJcbiAgICBbZGlzYWJsZWRdPVwiIWNhbkFkZFJlcG9ydFwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAge3sgJ0FkZCByZXBvcnQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCIhY2FuQWRkUmVwb3J0XCJcbiAgICBjbGFzcz1cImJ0biBidG4tZG90IG0tci0xNlwiXG4gICAgcG9wb3Zlcj1cInt7ICdZb3UgZG9uXFwndCBoYXZlIHBlcm1pc3Npb24gdG8gYWRkIHJlcG9ydHMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICA+XG4gICAgPGkgW2M4eUljb25dPVwiJ2luZm8tY2lyY2xlJ1wiIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+PC9pPlxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cImxvYWRSZXBvcnRzKClcIlxuICA+XG4gICAgPGkgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogcmVsb2FkaW5nIH1cIiBjOHlJY29uPVwicmVmcmVzaFwiPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1oZWxwIHNyYz1cIi91c2Vycy1ndWlkZS9jb2NrcGl0LyNyZXBvcnRzXCI+PC9jOHktaGVscD5cblxuPGM4eS1saXN0LWdyb3VwPlxuICA8Yzh5LWxpXG4gICAgY2xhc3M9XCJwYWdlLXN0aWNreS1oZWFkZXIgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgKm5nSWY9XCIocmVwb3J0cyQgfCBhc3luYyk/LmRhdGEubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8Yzh5LWxpLWljb24+XG4gICAgICA8aSBjbGFzcz1cInAtbC0yNFwiPjwvaT5cbiAgICA8L2M4eS1saS1pY29uPlxuICAgIDxjOHktbGktYm9keSBjbGFzcz1cImNvbnRlbnQtZmxleC02MFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XG4gICAgICAgIHt7ICdSZXBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICB7eyAnRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICB7eyAnU2hvdyBpbiBuYXZpZ2F0b3InIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2M4eS1saS1ib2R5PlxuICA8L2M4eS1saT5cblxuICA8Yzh5LWxpICpjOHlGb3I9XCJsZXQgcmVwb3J0IG9mIHJlcG9ydHMkOyBsZXQgaSA9IGluZGV4OyBsb2FkTW9yZTogJ2F1dG8nXCI+XG4gICAgPGM4eS1saS1pY29uIFtpY29uXT1cInJlcG9ydC5pY29uXCI+PC9jOHktbGktaWNvbj5cbiAgICA8Yzh5LWxpLWJvZHkgY2xhc3M9XCJjb250ZW50LWZsZXgtNjBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW5cIlxuICAgICAgICAgIHRpdGxlPVwie3sgcmVwb3J0Lm5hbWUgfX1cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvdXRlckxpbms9XCIvcmVwb3J0cy97eyByZXBvcnQuaWQgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICB7eyByZXBvcnQubmFtZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICA8cCBjbGFzcz1cInNtYWxsIHRleHQtdHJ1bmNhdGUtd3JhcFwiPlxuICAgICAgICAgIDxlbSBjbGFzcz1cInRleHQtbXV0ZWRcIiAqbmdJZj1cIiFyZXBvcnQuZGVzY3JpcHRpb247IGVsc2Ugc2hvd0Rlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICB7eyAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93RGVzY3JpcHRpb24+XG4gICAgICAgICAgICB7eyByZXBvcnQuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBmaXQtaC0yMCBtLXQteHMtOFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoIGM4eS1zd2l0Y2gtLWlubGluZVwiIHRpdGxlPVwie3sgJ1Nob3cgaW4gbmF2aWdhdG9yJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCIhIXJlcG9ydC5jOHlfSXNOYXZpZ2F0b3JOb2RlXCJcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZShyZXBvcnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc2libGUteHNcIj5cbiAgICAgICAgICAgIHt7ICdTaG93IGluIG5hdmlnYXRvcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBoaWRkZW4teHNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIHNob3dPbkhvdmVyIG0tbC1hdXRvIGQtZmxleFwiXG4gICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZShyZXBvcnQpXCJcbiAgICAgICAgICB0b29sdGlwPVwie3sgJ1JlbW92ZSByZXBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgcmVwb3J0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwibWludXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInZpc2libGUteHMgcC10LTggdGV4dC1yaWdodFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKHJlcG9ydClcIlxuICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZSByZXBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAge3sgJ1JlbW92ZSByZXBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktYm9keT5cbiAgPC9jOHktbGk+XG48L2M4eS1saXN0LWdyb3VwPlxuXG48Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICpuZ0lmPVwiKHJlcG9ydHMkIHwgYXN5bmMpPy5kYXRhLmxlbmd0aCA9PT0gMFwiXG4gIFtpY29uXT1cIidjOHktcmVwb3J0cydcIlxuICBbdGl0bGVdPVwiJ1RoZXJlIGFyZSBubyByZXBvcnRzIGRlZmluZWQuJyB8IHRyYW5zbGF0ZVwiXG4gIFtzdWJ0aXRsZV09XCInQWRkIGEgcmVwb3J0IGZpcnN0LicgfCB0cmFuc2xhdGVcIlxuPlxuICA8cD5cbiAgICA8YnV0dG9uXG4gICAgICB0aXRsZT1cInt7ICdBZGQgcmVwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ3JlcG9ydHMtYWRkLXJlcG9ydC1lbXB0eS1zdGF0ZS1idXR0b24nXCJcbiAgICAgIChjbGljayk9XCJhZGQoKVwiXG4gICAgPlxuICAgICAge3sgJ0FkZCByZXBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gIDwvcD5cbiAgPHAgYzh5LWd1aWRlLWRvY3M+XG4gICAgPHNtYWxsIHRyYW5zbGF0ZSBuZ05vbkJpbmRhYmxlPlxuICAgICAgRmluZCBvdXQgbW9yZSBpbiB0aGVcbiAgICAgIDxhIGM4eS1ndWlkZS1ocmVmPVwidXNlcnMtZ3VpZGUvY29ja3BpdC8jcmVwb3J0c1wiPlVzZXIgZ3VpZGVgS0VFUF9PUklHSU5BTGA8L2E+XG4gICAgICAuXG4gICAgPC9zbWFsbD5cbiAgPC9wPlxuPC9jOHktdWktZW1wdHktc3RhdGU+XG4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWRhc2hib2FyZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL3JlcG9ydC1kYXNoYm9hcmQvcmVwb3J0LWRhc2hib2FyZC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL3JlcG9ydC1kYXNoYm9hcmQvcmVwb3J0LWRhc2hib2FyZC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFlLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxZQUFZLEVBQ1osTUFBTSxFQUNOLFlBQVksRUFDWixXQUFXLEVBQ1osTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU1wRSxNQUFNLE9BQU8s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Q0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUM7WUFDNUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5RCxDQUFDOzt5SEFwSVUsNEJBQTRCOzZHQUE1Qiw0QkFBNEIseUdBQzVCLG9CQUFvQixnREN4QmpDLHkwS0FpTEE7MkZEMUphLDRCQUE0QjtrQkFKeEMsU0FBUzsrQkFDRSwyQkFBMkI7OFRBSWUsTUFBTTtzQkFBekQsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCwgSW52ZW50b3J5U2VydmljZSwgSVJlc3VsdExpc3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBGaWx0ZXJJbnB1dENvbXBvbmVudCxcbiAgZ2V0dGV4dCxcbiAgTW9kYWxTZXJ2aWNlLFxuICBTdGF0dXMsXG4gIEFsZXJ0U2VydmljZSxcbiAgUGVybWlzc2lvbnNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBEYXNoYm9hcmREZXRhaWxDb21wb25lbnQgfSBmcm9tICcuLi9kYXNoYm9hcmQtZGV0YWlsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250ZXh0RGFzaGJvYXJkU2VydmljZSB9IGZyb20gJy4uL2NvbnRleHQtZGFzaGJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZFR5cGUgfSBmcm9tICcuLi9jb250ZXh0LWRhc2hib2FyZC5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBSZXBvcnREYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi9yZXBvcnQtZGFzaGJvYXJkLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktcmVwb3J0LWRhc2hib2FyZC1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1kYXNoYm9hcmQtbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0RGFzaGJvYXJkTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoRmlsdGVySW5wdXRDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSBmaWx0ZXI6IEZpbHRlcklucHV0Q29tcG9uZW50O1xuICB0ZXh0RmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcbiAgcmVsb2FkJDogQmVoYXZpb3JTdWJqZWN0PHZvaWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgcmVsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHJlcG9ydHMkOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pj4gPSBjb21iaW5lTGF0ZXN0KFxuICAgIHRoaXMudGV4dEZpbHRlciQucGlwZShkZWJvdW5jZVRpbWUoNDAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSksXG4gICAgdGhpcy5yZWxvYWQkXG4gICkucGlwZShcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxvYWRpbmcgPSB0cnVlO1xuICAgIH0pLFxuICAgIHN3aXRjaE1hcCgoW3RleHRdKSA9PiB0aGlzLmxvYWRSZXBvcnRzKHRleHQpKSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICBjYW5BZGRSZXBvcnQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBERUxFVEVEX1NVQ0NFU1NfTVNHID0gZ2V0dGV4dCgnUmVwb3J0IGRlbGV0ZWQuJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnlTZXJ2aWNlOiBJbnZlbnRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udGV4dERhc2hib2FyZFNlcnZpY2U6IENvbnRleHREYXNoYm9hcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbDogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWw6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVwb3J0RGFzaGJvYXJkU2VydmljZTogUmVwb3J0RGFzaGJvYXJkU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uc1xuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jYW5BZGRSZXBvcnQgPSB0aGlzLnBlcm1pc3Npb25zLmhhc0FueVJvbGUoW1xuICAgICAgJ1JPTEVfSU5WRU5UT1JZX0NSRUFURScsXG4gICAgICAnUk9MRV9JTlZFTlRPUllfQURNSU4nXG4gICAgXSk7XG4gIH1cblxuICBhc3luYyBsb2FkUmVwb3J0cyhwYXJ0aWFsTmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBwYXJ0aWFsTmFtZVxuICAgICAgPyB0aGlzLnJlcG9ydERhc2hib2FyZFNlcnZpY2UubGlzdFJlcG9ydHMoeyBmaWx0ZXI6IHsgbmFtZTogYCoke3BhcnRpYWxOYW1lfSpgIH0gfSlcbiAgICAgIDogdGhpcy5yZXBvcnREYXNoYm9hcmRTZXJ2aWNlLmxpc3RSZXBvcnRzKCk7XG4gIH1cblxuICBhc3luYyBhZGQoKSB7XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgICAgaXNSZXBvcnQ6IHRydWUsXG4gICAgICBpc05hbWVkRGFzaGJvYXJkOiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMuYnNNb2RhbC5zaG93KERhc2hib2FyZERldGFpbENvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1sZycsXG4gICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnbW9kYWwtYm9keScsXG4gICAgICBhcmlhTGFiZWxsZWRCeTogJ21vZGFsLXRpdGxlJyxcbiAgICAgIGluaXRpYWxTdGF0ZVxuICAgIH0pLmNvbnRlbnQgYXMgRGFzaGJvYXJkRGV0YWlsQ29tcG9uZW50O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjZmcgPSBhd2FpdCBtb2RhbC5yZXN1bHQ7XG4gICAgICBjb25zdCB7IG5hbWUsIGljb24sIGM4eV9Jc05hdmlnYXRvck5vZGUsIHByaW9yaXR5LCBkZXNjcmlwdGlvbiwgLi4uZGFzaGJvYXJkQ2ZnIH0gPSBjZmc7XG4gICAgICBjb25zdCByZXBvcnQgPSAoXG4gICAgICAgIGF3YWl0IHRoaXMucmVwb3J0RGFzaGJvYXJkU2VydmljZS5jcmVhdGVSZXBvcnQoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICBjOHlfSXNOYXZpZ2F0b3JOb2RlLFxuICAgICAgICAgIHByaW9yaXR5LFxuICAgICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICAgIH0gYXMgUGFydGlhbDxJTWFuYWdlZE9iamVjdD4pXG4gICAgICApLmRhdGE7XG5cbiAgICAgIGF3YWl0IHRoaXMuY29udGV4dERhc2hib2FyZFNlcnZpY2UuY3JlYXRlKFxuICAgICAgICBkYXNoYm9hcmRDZmcsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYCR7dGhpcy5jb250ZXh0RGFzaGJvYXJkU2VydmljZS5SRVBPUlRfUEFSVElBTF9OQU1FfSR7cmVwb3J0LmlkfWBcbiAgICAgICk7XG4gICAgICBpZiAocmVwb3J0LmM4eV9Jc05hdmlnYXRvck5vZGUpIHtcbiAgICAgICAgdGhpcy5yZXBvcnREYXNoYm9hcmRTZXJ2aWNlLmFkZFJlcG9ydE5hdmlnYXRvck5vZGUocmVwb3J0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVsb2FkJC5uZXh0KCk7XG4gICAgICBtb2RhbC5jbG9zZSgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb21ldGhpbmcgd2VudCB3cm9uZzogJHtleH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGUocmVwb3J0OiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXNoYm9hcmQgPSBhd2FpdCB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlXG4gICAgICAgIC5nZXREYXNoYm9hcmQkKGByZXBvcnRfJHtyZXBvcnQuaWR9YCwgW0NvbnRleHREYXNoYm9hcmRUeXBlLk5hbWVkXSlcbiAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgICAgY29uc3QgaXNEYXNoYm9hcmRGcm96ZW4gPSAhIWRhc2hib2FyZD8uYzh5X0Rhc2hib2FyZD8uaXNGcm96ZW47XG5cbiAgICAgIGNvbnN0IG1zZyA9IGlzRGFzaGJvYXJkRnJvemVuXG4gICAgICAgID8gZ2V0dGV4dChcbiAgICAgICAgICAgIGBZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSB0aGUgcmVwb3J0IFwie3sgcmVwb3J0TmFtZSB9fVwiLiBCZSBhd2FyZSB0aGF0IHRoZSByZXBvcnQgaGFzIGEgbG9ja2VkIGRhc2hib2FyZCBhc3NpZ25lZC4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD9gXG4gICAgICAgICAgKVxuICAgICAgICA6IGdldHRleHQoYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIHRoZSByZXBvcnQgXCJ7eyByZXBvcnROYW1lIH19XCIuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/YCk7XG5cbiAgICAgIGF3YWl0IHRoaXMubW9kYWwuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnRGVsZXRlIHJlcG9ydCcpLFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChtc2csIHtcbiAgICAgICAgICByZXBvcnROYW1lOiByZXBvcnQubmFtZVxuICAgICAgICB9KSxcbiAgICAgICAgU3RhdHVzLkRBTkdFUixcbiAgICAgICAge1xuICAgICAgICAgIG9rOiBnZXR0ZXh0KCdEZWxldGUnKSxcbiAgICAgICAgICBjYW5jZWw6IGdldHRleHQoJ0NhbmNlbCcpXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IHRoaXMuY29udGV4dERhc2hib2FyZFNlcnZpY2UuZGVsZXRlKGRhc2hib2FyZCwgZmFsc2UpO1xuICAgICAgYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmRlbGV0ZShyZXBvcnQuaWQpO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2Vzcyh0aGlzLkRFTEVURURfU1VDQ0VTU19NU0cpO1xuICAgICAgaWYgKHJlcG9ydC5jOHlfSXNOYXZpZ2F0b3JOb2RlKSB7XG4gICAgICAgIHRoaXMucmVwb3J0RGFzaGJvYXJkU2VydmljZS5yZW1vdmVOYXZpZ2F0b3JOb2RlKHJlcG9ydCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbG9hZCQubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb21ldGhpbmcgd2VudCB3cm9uZzogJHtleH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGUocmVwb3J0OiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHJlcG9ydC5jOHlfSXNOYXZpZ2F0b3JOb2RlID0gcmVwb3J0LmM4eV9Jc05hdmlnYXRvck5vZGUgPyB7fSA6IG51bGw7XG4gICAgYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLnVwZGF0ZShyZXBvcnQpO1xuICAgIHJlcG9ydC5jOHlfSXNOYXZpZ2F0b3JOb2RlXG4gICAgICA/IHRoaXMucmVwb3J0RGFzaGJvYXJkU2VydmljZS5hZGRSZXBvcnROYXZpZ2F0b3JOb2RlKHJlcG9ydClcbiAgICAgIDogdGhpcy5yZXBvcnREYXNoYm9hcmRTZXJ2aWNlLnJlbW92ZU5hdmlnYXRvck5vZGUocmVwb3J0KTtcbiAgfVxufVxuIiwiPGM4eS10aXRsZT5cbiAge3sgJ1JlcG9ydHMnIHwgdHJhbnNsYXRlIH19XG48L2M4eS10aXRsZT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCInbGVmdCdcIiBpdGVtQ2xhc3M9XCJuYXZiYXItZm9ybVwiPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoXCI+XG4gICAgPGlucHV0XG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0ZpbHRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnRmlsdGVy4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBbbmdNb2RlbF09XCJ0ZXh0RmlsdGVyJCB8IGFzeW5jXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRleHRGaWx0ZXIkLm5leHQoJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG4gICAgICA8aSBjOHlJY29uPVwic2VhcmNoXCIgKm5nSWY9XCIodGV4dEZpbHRlciQgfCBhc3luYykubGVuZ3RoID09PSAwXCI+PC9pPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LW11dGVkXCJcbiAgICAgICAgYzh5SWNvbj1cInRpbWVzXCJcbiAgICAgICAgKm5nSWY9XCIodGV4dEZpbHRlciQgfCBhc3luYykubGVuZ3RoID4gMFwiXG4gICAgICAgIChjbGljayk9XCJ0ZXh0RmlsdGVyJC5uZXh0KCcnKVwiXG4gICAgICAgIHB4LWV2ZW50PVwiQ2xlYXIgZmlsdGVyaW5nIHJlcG9ydHNcIlxuICAgICAgPjwvaT5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdBZGQgcmVwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgW2F0dHIuZGF0YS1jeV09XCIncmVwb3J0cy1hZGQtcmVwb3J0LWFjdGlvbi1iYXItYnV0dG9uJ1wiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cImFkZCgpXCJcbiAgICBbZGlzYWJsZWRdPVwiIWNhbkFkZFJlcG9ydFwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAge3sgJ0FkZCByZXBvcnQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCIhY2FuQWRkUmVwb3J0XCJcbiAgICBjbGFzcz1cImJ0biBidG4tZG90IG0tci0xNlwiXG4gICAgcG9wb3Zlcj1cInt7ICdZb3UgZG9uXFwndCBoYXZlIHBlcm1pc3Npb24gdG8gYWRkIHJlcG9ydHMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICA+XG4gICAgPGkgW2M4eUljb25dPVwiJ2luZm8tY2lyY2xlJ1wiIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+PC9pPlxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cImxvYWRSZXBvcnRzKClcIlxuICA+XG4gICAgPGkgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogcmVsb2FkaW5nIH1cIiBjOHlJY29uPVwicmVmcmVzaFwiPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1oZWxwIHNyYz1cIi91c2Vycy1ndWlkZS9jb2NrcGl0LyNyZXBvcnRzXCI+PC9jOHktaGVscD5cblxuPGM4eS1saXN0LWdyb3VwPlxuICA8Yzh5LWxpXG4gICAgY2xhc3M9XCJwYWdlLXN0aWNreS1oZWFkZXIgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgKm5nSWY9XCIocmVwb3J0cyQgfCBhc3luYyk/LmRhdGEubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8Yzh5LWxpLWljb24+XG4gICAgICA8aSBjbGFzcz1cInAtbC0yNFwiPjwvaT5cbiAgICA8L2M4eS1saS1pY29uPlxuICAgIDxjOHktbGktYm9keSBjbGFzcz1cImNvbnRlbnQtZmxleC02MFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XG4gICAgICAgIHt7ICdSZXBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICB7eyAnRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICB7eyAnU2hvdyBpbiBuYXZpZ2F0b3InIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2M4eS1saS1ib2R5PlxuICA8L2M4eS1saT5cblxuICA8Yzh5LWxpICpjOHlGb3I9XCJsZXQgcmVwb3J0IG9mIHJlcG9ydHMkOyBsZXQgaSA9IGluZGV4OyBsb2FkTW9yZTogJ2F1dG8nXCI+XG4gICAgPGM4eS1saS1pY29uIFtpY29uXT1cInJlcG9ydC5pY29uXCI+PC9jOHktbGktaWNvbj5cbiAgICA8Yzh5LWxpLWJvZHkgY2xhc3M9XCJjb250ZW50LWZsZXgtNjBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW5cIlxuICAgICAgICAgIHRpdGxlPVwie3sgcmVwb3J0Lm5hbWUgfX1cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvdXRlckxpbms9XCIvcmVwb3J0cy97eyByZXBvcnQuaWQgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICB7eyByZXBvcnQubmFtZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICA8cCBjbGFzcz1cInNtYWxsIHRleHQtdHJ1bmNhdGUtd3JhcFwiPlxuICAgICAgICAgIDxlbSBjbGFzcz1cInRleHQtbXV0ZWRcIiAqbmdJZj1cIiFyZXBvcnQuZGVzY3JpcHRpb247IGVsc2Ugc2hvd0Rlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICB7eyAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93RGVzY3JpcHRpb24+XG4gICAgICAgICAgICB7eyByZXBvcnQuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBmaXQtaC0yMCBtLXQteHMtOFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoIGM4eS1zd2l0Y2gtLWlubGluZVwiIHRpdGxlPVwie3sgJ1Nob3cgaW4gbmF2aWdhdG9yJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCIhIXJlcG9ydC5jOHlfSXNOYXZpZ2F0b3JOb2RlXCJcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZShyZXBvcnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc2libGUteHNcIj5cbiAgICAgICAgICAgIHt7ICdTaG93IGluIG5hdmlnYXRvcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBoaWRkZW4teHNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIHNob3dPbkhvdmVyIG0tbC1hdXRvIGQtZmxleFwiXG4gICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZShyZXBvcnQpXCJcbiAgICAgICAgICB0b29sdGlwPVwie3sgJ1JlbW92ZSByZXBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgcmVwb3J0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwibWludXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInZpc2libGUteHMgcC10LTggdGV4dC1yaWdodFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKHJlcG9ydClcIlxuICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZSByZXBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAge3sgJ1JlbW92ZSByZXBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktYm9keT5cbiAgPC9jOHktbGk+XG48L2M4eS1saXN0LWdyb3VwPlxuXG48Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICpuZ0lmPVwiKHJlcG9ydHMkIHwgYXN5bmMpPy5kYXRhLmxlbmd0aCA9PT0gMFwiXG4gIFtpY29uXT1cIidjOHktcmVwb3J0cydcIlxuICBbdGl0bGVdPVwiJ1RoZXJlIGFyZSBubyByZXBvcnRzIGRlZmluZWQuJyB8IHRyYW5zbGF0ZVwiXG4gIFtzdWJ0aXRsZV09XCInQWRkIGEgcmVwb3J0IGZpcnN0LicgfCB0cmFuc2xhdGVcIlxuPlxuICA8cD5cbiAgICA8YnV0dG9uXG4gICAgICB0aXRsZT1cInt7ICdBZGQgcmVwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ3JlcG9ydHMtYWRkLXJlcG9ydC1lbXB0eS1zdGF0ZS1idXR0b24nXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkUmVwb3J0XCJcbiAgICAgIChjbGljayk9XCJhZGQoKVwiXG4gICAgPlxuICAgICAge3sgJ0FkZCByZXBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gIDwvcD5cbiAgPHAgYzh5LWd1aWRlLWRvY3M+XG4gICAgPHNtYWxsIHRyYW5zbGF0ZSBuZ05vbkJpbmRhYmxlPlxuICAgICAgRmluZCBvdXQgbW9yZSBpbiB0aGVcbiAgICAgIDxhIGM4eS1ndWlkZS1ocmVmPVwidXNlcnMtZ3VpZGUvY29ja3BpdC8jcmVwb3J0c1wiPlVzZXIgZ3VpZGVgS0VFUF9PUklHSU5BTGA8L2E+XG4gICAgICAuXG4gICAgPC9zbWFsbD5cbiAgPC9wPlxuPC9jOHktdWktZW1wdHktc3RhdGU+XG4iXX0=
@@ -125,9 +125,9 @@ export class DeviceRegistrationViewComponent {
125
125
  }
126
126
  }
127
127
  DeviceRegistrationViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceRegistrationViewComponent, deps: [{ token: i1.RegisterDeviceService }, { token: i2.DeviceBootstrapRealtimeService }, { token: i2.TenantUiService }, { token: i2.ModalService }, { token: i3.TranslateService }, { token: i2.OptionsService }], target: i0.ɵɵFactoryTarget.Component });
128
- DeviceRegistrationViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DeviceRegistrationViewComponent, selector: "c8y-device-registration-view", ngImport: i0, template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'exchange'\" [label]=\"'Devices' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"10\">\n <button\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n class=\"btn btn-link\"\n title=\"{{ 'Accept all' | translate }}\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"9\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i [c8yIcon]=\"'refresh'\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help src=\"/users-guide/device-management/#connecting-devices\"></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div class=\"card-group\" [ngClass]=\"gridOrList\">\n <!-- START interact-list sticky header START -->\n <div *ngIf=\"gridOrList === 'interact-list'\" class=\"page-sticky-header hidden-xs\">\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div class=\"card-block card-column-30 p-0\" *ngIf=\"showTokenInputBasedOnSecurityMode()\">\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n container=\"body\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div class=\"d-contents\" *ngIf=\"isManagementTenant; else noManagement\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"card-actions-group\" style=\"min-width: 176px\">\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div *ngIf=\"limitStatus?.isReached\" class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <p class=\"alert alert-warning center-block\" role=\"alert\">\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n [class]=\"statusProps[singleRequest.status].cls\"\n ></i>\n </div>\n <p class=\"card-title text-truncate\" title=\"{{ singleRequest.id }}\">{{ singleRequest.id }}</p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span class=\"text-label-small\" translate>Status</span>\n <p>\n <i\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n c8yIcon=\"refresh\"\n class=\"icon-spin text-primary\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span *ngIf=\"gridOrList !== 'interact-list'\" class=\"text-label-small\" translate>\n Security token\n </span>\n <input\n [(ngModel)]=\"singleRequest.securityToken\"\n type=\"text\"\n class=\"form-control\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n type=\"button\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Accept' | translate }}\"\n type=\"button\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small *ngIf=\"isManagementTenant; else noManagement\" class=\"d-contents\">\n <div class=\"d-contents\" *ngIf=\"singleRequest.creationTime && singleRequest.owner\">\n <span class=\"text-label-small\" translate>Created on`date`</span>\n <span class=\"card-column-50\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span class=\"card-column-30\">\n <span class=\"text-truncate\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>in`tenant`</span>\n <span class=\"card-column-20\">{{ singleRequest.tenantId }}</span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span class=\"text-label-small\" translate>Created in`tenant`</span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span class=\"card-column-50\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span class=\"card-column-50\">\n <span class=\"text-truncate\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\" translate>\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4.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: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i2.LoadMoreComponent, selector: "c8y-load-more", inputs: ["paging", "useIntersection", "hidden", "container", "class", "maxIterations", "noMoreDataHint", "loadingTemplate", "hideNoMoreDataHint", "loadNextLabel", "loadingLabel"], outputs: ["onLoad"] }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i2.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: i7.RegisterDeviceDropdownComponent, selector: "c8y-register-device-dropdown" }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "c8yDate" }] });
128
+ DeviceRegistrationViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DeviceRegistrationViewComponent, selector: "c8y-device-registration-view", ngImport: i0, template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'exchange'\" [label]=\"'Devices' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"10\">\n <button\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n class=\"btn btn-link\"\n title=\"{{ 'Accept all' | translate }}\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"9\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i [c8yIcon]=\"'refresh'\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help src=\"/users-guide/device-management/#connecting-devices\"></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div class=\"card-group\" [ngClass]=\"gridOrList\">\n <!-- START interact-list sticky header START -->\n <div *ngIf=\"gridOrList === 'interact-list'\" class=\"page-sticky-header hidden-xs\">\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div class=\"card-block card-column-30 p-0\" *ngIf=\"showTokenInputBasedOnSecurityMode()\">\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n container=\"body\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div class=\"d-contents\" *ngIf=\"isManagementTenant; else noManagement\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"card-actions-group\" style=\"min-width: 176px\">\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div *ngIf=\"limitStatus?.isReached\" class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <p class=\"alert alert-warning center-block\" role=\"alert\">\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n [class]=\"statusProps[singleRequest.status].cls\"\n ></i>\n </div>\n <p class=\"card-title text-truncate\" title=\"{{ singleRequest.id }}\">{{ singleRequest.id }}</p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span class=\"text-label-small\" translate>Status</span>\n <p>\n <i\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n c8yIcon=\"refresh\"\n class=\"icon-spin text-primary\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span *ngIf=\"gridOrList !== 'interact-list'\" class=\"text-label-small\" translate>\n Security token\n </span>\n <input\n [(ngModel)]=\"singleRequest.securityToken\"\n type=\"text\"\n class=\"form-control\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n type=\"button\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Accept' | translate }}\"\n type=\"button\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small *ngIf=\"isManagementTenant; else noManagement\" class=\"d-contents\">\n <div class=\"d-contents\" *ngIf=\"singleRequest.creationTime && singleRequest.owner\">\n <span class=\"card-column-50\" >\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span data-cy=\"device-registration--creation-date\">{{ singleRequest.creationTime | c8yDate }}</span>\n </span>\n <span class=\"card-column-30 text-truncate\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span data-cy=\"device-registration--created-by\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"card-column-20\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>in`tenant`</span>\n <span>{{ singleRequest.tenantId }}</span>\n </span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span class=\"text-label-small\" translate>Created in`tenant`</span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"card-column-50\" >\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span data-cy=\"device-registration--creation-date\">{{ singleRequest.creationTime | c8yDate }}</span>\n </span>\n <span class=\"card-column-50 text-truncate\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span data-cy=\"device-registration--created-by\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\" translate>\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4.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: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i2.LoadMoreComponent, selector: "c8y-load-more", inputs: ["paging", "useIntersection", "hidden", "container", "class", "maxIterations", "noMoreDataHint", "loadingTemplate", "hideNoMoreDataHint", "loadNextLabel", "loadingLabel"], outputs: ["onLoad"] }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i2.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: i7.RegisterDeviceDropdownComponent, selector: "c8y-register-device-dropdown" }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "c8yDate" }] });
129
129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceRegistrationViewComponent, decorators: [{
130
130
  type: Component,
131
- args: [{ selector: 'c8y-device-registration-view', template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'exchange'\" [label]=\"'Devices' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"10\">\n <button\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n class=\"btn btn-link\"\n title=\"{{ 'Accept all' | translate }}\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"9\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i [c8yIcon]=\"'refresh'\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help src=\"/users-guide/device-management/#connecting-devices\"></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div class=\"card-group\" [ngClass]=\"gridOrList\">\n <!-- START interact-list sticky header START -->\n <div *ngIf=\"gridOrList === 'interact-list'\" class=\"page-sticky-header hidden-xs\">\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div class=\"card-block card-column-30 p-0\" *ngIf=\"showTokenInputBasedOnSecurityMode()\">\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n container=\"body\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div class=\"d-contents\" *ngIf=\"isManagementTenant; else noManagement\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"card-actions-group\" style=\"min-width: 176px\">\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div *ngIf=\"limitStatus?.isReached\" class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <p class=\"alert alert-warning center-block\" role=\"alert\">\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n [class]=\"statusProps[singleRequest.status].cls\"\n ></i>\n </div>\n <p class=\"card-title text-truncate\" title=\"{{ singleRequest.id }}\">{{ singleRequest.id }}</p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span class=\"text-label-small\" translate>Status</span>\n <p>\n <i\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n c8yIcon=\"refresh\"\n class=\"icon-spin text-primary\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span *ngIf=\"gridOrList !== 'interact-list'\" class=\"text-label-small\" translate>\n Security token\n </span>\n <input\n [(ngModel)]=\"singleRequest.securityToken\"\n type=\"text\"\n class=\"form-control\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n type=\"button\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Accept' | translate }}\"\n type=\"button\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small *ngIf=\"isManagementTenant; else noManagement\" class=\"d-contents\">\n <div class=\"d-contents\" *ngIf=\"singleRequest.creationTime && singleRequest.owner\">\n <span class=\"text-label-small\" translate>Created on`date`</span>\n <span class=\"card-column-50\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span class=\"card-column-30\">\n <span class=\"text-truncate\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>in`tenant`</span>\n <span class=\"card-column-20\">{{ singleRequest.tenantId }}</span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span class=\"text-label-small\" translate>Created in`tenant`</span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span class=\"card-column-50\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span class=\"card-column-50\">\n <span class=\"text-truncate\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\" translate>\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n" }]
131
+ args: [{ selector: 'c8y-device-registration-view', template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'exchange'\" [label]=\"'Devices' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"10\">\n <button\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n class=\"btn btn-link\"\n title=\"{{ 'Accept all' | translate }}\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"9\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i [c8yIcon]=\"'refresh'\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help src=\"/users-guide/device-management/#connecting-devices\"></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div class=\"card-group\" [ngClass]=\"gridOrList\">\n <!-- START interact-list sticky header START -->\n <div *ngIf=\"gridOrList === 'interact-list'\" class=\"page-sticky-header hidden-xs\">\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div class=\"card-block card-column-30 p-0\" *ngIf=\"showTokenInputBasedOnSecurityMode()\">\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n container=\"body\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div class=\"d-contents\" *ngIf=\"isManagementTenant; else noManagement\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"card-actions-group\" style=\"min-width: 176px\">\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div *ngIf=\"limitStatus?.isReached\" class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <p class=\"alert alert-warning center-block\" role=\"alert\">\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n [class]=\"statusProps[singleRequest.status].cls\"\n ></i>\n </div>\n <p class=\"card-title text-truncate\" title=\"{{ singleRequest.id }}\">{{ singleRequest.id }}</p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span class=\"text-label-small\" translate>Status</span>\n <p>\n <i\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n c8yIcon=\"refresh\"\n class=\"icon-spin text-primary\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span *ngIf=\"gridOrList !== 'interact-list'\" class=\"text-label-small\" translate>\n Security token\n </span>\n <input\n [(ngModel)]=\"singleRequest.securityToken\"\n type=\"text\"\n class=\"form-control\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n type=\"button\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Accept' | translate }}\"\n type=\"button\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small *ngIf=\"isManagementTenant; else noManagement\" class=\"d-contents\">\n <div class=\"d-contents\" *ngIf=\"singleRequest.creationTime && singleRequest.owner\">\n <span class=\"card-column-50\" >\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span data-cy=\"device-registration--creation-date\">{{ singleRequest.creationTime | c8yDate }}</span>\n </span>\n <span class=\"card-column-30 text-truncate\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span data-cy=\"device-registration--created-by\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"card-column-20\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>in`tenant`</span>\n <span>{{ singleRequest.tenantId }}</span>\n </span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span class=\"text-label-small\" translate>Created in`tenant`</span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"card-column-50\" >\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span data-cy=\"device-registration--creation-date\">{{ singleRequest.creationTime | c8yDate }}</span>\n </span>\n <span class=\"card-column-50 text-truncate\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span data-cy=\"device-registration--created-by\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\" translate>\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n" }]
132
132
  }], ctorParameters: function () { return [{ type: i1.RegisterDeviceService }, { type: i2.DeviceBootstrapRealtimeService }, { type: i2.TenantUiService }, { type: i2.ModalService }, { type: i3.TranslateService }, { type: i2.OptionsService }]; } });
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXJlZ2lzdHJhdGlvbi12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3JlZ2lzdGVyLWRldmljZS9kZXZpY2UtcmVnaXN0cmF0aW9uLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vcmVnaXN0ZXItZGV2aWNlL2RldmljZS1yZWdpc3RyYXRpb24tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLHdCQUF3QixFQUl6QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUNMLDhCQUE4QixFQUU5QixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixPQUFPLEVBQ1AsY0FBYyxFQUNmLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBTXZELE1BQU0sT0FBTywrQkFBK0I7SUF3QzFDLFlBQ1UscUJBQTRDLEVBQzVDLHdCQUF3RCxFQUN4RCxlQUFnQyxFQUNoQyxZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsY0FBOEI7UUFMOUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQWdDO1FBQ3hELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNo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QU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxLQUFLLDhCQUE4QixDQUFDLE9BQU8sQ0FBQztJQUN6RixDQUFDOzs0SEFyS1UsK0JBQStCO2dIQUEvQiwrQkFBK0Isb0VDM0I1QyxxellBOFJBOzJGRG5RYSwrQkFBK0I7a0JBSjNDLFNBQVM7K0JBQ0UsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlLFxuICBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMsXG4gIElEZXZpY2VSZWdpc3RyYXRpb24sXG4gIElEZXZpY2VSZWdpc3RyYXRpb25MaW1pdCxcbiAgUGFnaW5nXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGV2aWNlQm9vdHN0cmFwUmVhbHRpbWVTZXJ2aWNlLFxuICBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXAsXG4gIFRlbmFudFVpU2VydmljZSxcbiAgTW9kYWxTZXJ2aWNlLFxuICBTdGF0dXMsXG4gIGdldHRleHQsXG4gIE9wdGlvbnNTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgUmVnaXN0ZXJEZXZpY2VTZXJ2aWNlIH0gZnJvbSAnLi9yZWdpc3Rlci1kZXZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGV2aWNlLXJlZ2lzdHJhdGlvbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICdkZXZpY2UtcmVnaXN0cmF0aW9uLXZpZXcuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERldmljZVJlZ2lzdHJhdGlvblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGRldmljZVJlcXVlc3RzJDogT2JzZXJ2YWJsZTx7XG4gICAgZGF0YTogSURldmljZVJlZ2lzdHJhdGlvbltdO1xuICAgIHBhZ2luZz86IFBhZ2luZzxJRGV2aWNlUmVnaXN0cmF0aW9uPjtcbiAgfT47XG4gIGxpbWl0JDogT2JzZXJ2YWJsZTxJRGV2aWNlUmVnaXN0cmF0aW9uTGltaXQ+O1xuICBsaW1pdFJlYWNoZWRJbmZvJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICByZXF1aXJlU2VjdXJpdHlUb2tlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc01hbmFnZW1lbnRUZW5hbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGdyaWRPckxpc3Q6ICdpbnRlcmFjdC1saXN0JyB8ICdpbnRlcmFjdC1ncmlkJyA9ICdpbnRlcmFjdC1ncmlkJztcbiAgc3RhdHVzID0gRGV2aWNlUmVnaXN0cmF0aW9uU3RhdHVzO1xuXG4gIHJlYWRvbmx5IHN0YXR1c1Byb3BzID0ge1xuICAgIFtEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuV0FJVElOR19GT1JfQ09OTkVDVElPTl06IHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdXYWl0aW5nIGZvciBjb25uZWN0aW9uJyksXG4gICAgICBpY29uOiAndW5saW5rJyxcbiAgICAgIGNsczogJ3RleHQtZGFuZ2VyJ1xuICAgIH0sXG4gICAgW0RldmljZVJlZ2lzdHJhdGlvblN0YXR1cy5QRU5ESU5HX0FDQ0VQVEFOQ0VdOiB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnUGVuZGluZyBhY2NlcHRhbmNlJyksXG4gICAgICBpY29uOiAnY2lyY2xlJyxcbiAgICAgIGNsczogJ3RleHQtaW5mbydcbiAgICB9LFxuICAgIFtEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuQUNDRVBURURdOiB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnQWNjZXB0ZWQnKSxcbiAgICAgIGljb246ICdjaGVjay1jaXJjbGUnLFxuICAgICAgY2xzOiAndGV4dC1zdWNjZXNzJ1xuICAgIH0sXG4gICAgW0RldmljZVJlZ2lzdHJhdGlvblN0YXR1cy5CTE9DS0VEXToge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0Jsb2NrZWQnKSxcbiAgICAgIGljb246ICdiYW4nLFxuICAgICAgY2xzOiAndGV4dC1kYW5nZXInXG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWN1cml0eVRva2VuUG9saWN5OiBCZWhhdmlvclN1YmplY3Q8RGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdChEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuT1BUSU9OQUwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVnaXN0ZXJEZXZpY2VTZXJ2aWNlOiBSZWdpc3RlckRldmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBib290c3RyYXBSZWFsdGltZVNlcnZpY2U6IERldmljZUJvb3RzdHJhcFJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudFVpU2VydmljZTogVGVuYW50VWlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRBbGwoKTtcbiAgICB0aGlzLnNldElzTWFuYWdlbWVudFRlbmFudCgpO1xuICAgIHRoaXMuc2V0UmVxdWlyZVNlY3VyaXR5VG9rZW4oKTtcblxuICAgIHRoaXMuZGV2aWNlUmVxdWVzdHMkID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UuZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdHMkLnBpcGUoXG4gICAgICBtYXAocmVxID0+ICh7XG4gICAgICAgIGRhdGE6IHNvcnRCeShyZXEuZGF0YSwgW1xuICAgICAgICAgICh7IHN0YXR1cyB9KSA9PiAoc3RhdHVzID09PSBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFID8gMCA6IDEpLFxuICAgICAgICAgICctY3JlYXRpb25UaW1lJ1xuICAgICAgICBdKSxcbiAgICAgICAgcGFnaW5nOiByZXEucGFnaW5nXG4gICAgICB9KSlcbiAgICApO1xuICAgIHRoaXMubGltaXQkID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubGltaXQkO1xuICAgIHRoaXMubGltaXRSZWFjaGVkSW5mbyQgPSB0aGlzLmxpbWl0JC5waXBlKFxuICAgICAgZmlsdGVyKGRldmljZVJlZ2lzdHJhdGlvbkxpbWl0ID0+IGRldmljZVJlZ2lzdHJhdGlvbkxpbWl0LmlzUmVhY2hlZCksXG4gICAgICBzd2l0Y2hNYXAoKHsgbGltaXQgfSkgPT5cbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbShcbiAgICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICAgJ1lvdSByZWFjaGVkIHRoZSBsaW1pdCBvZiB7eyBtYXhEZXZpY2VzIH19IGRldmljZXMuIE5vIG1vcmUgZGV2aWNlcyBjYW4gYmUgcmVnaXN0ZXJlZC4nXG4gICAgICAgICAgKSxcbiAgICAgICAgICB7IG1heERldmljZXM6IGxpbWl0IH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubG9hZGluZyRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlID0+ICh0aGlzLmlzTG9hZGluZyA9IHZhbHVlKSk7XG5cbiAgICB0aGlzLmJvb3RzdHJhcFJlYWx0aW1lU2VydmljZVxuICAgICAgLm9uVXBkYXRlJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgLnN1YnNjcmliZSgoYm9vdHN0cmFwOiBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXApID0+IHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2Uub25EZXZpY2VCb290c3RyYXAoYm9vdHN0cmFwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICB1cGRhdGVMaXN0KGRhdGEpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5pbnRlcm5hbExpc3RVcGRhdGUoZGF0YSk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICBnZXR0ZXh0KCdDYW5jZWwgZGV2aWNlIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gY2FuY2VsIGRldmljZSByZWdpc3RyYXRpb24gZm9yIElEIFwie3tpZH19XCIuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICApLFxuICAgICAgICB7IGlkIH1cbiAgICAgICksXG4gICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAge1xuICAgICAgICBvazogZ2V0dGV4dCgnQ2FuY2VsIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgICBjYW5jZWw6IGdldHRleHQoJ0Nsb3NlJylcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UucmVtb3ZlKGlkKTtcbiAgICB9XG4gIH1cblxuICBhY2NlcHQocmVxdWVzdDogSURldmljZVJlZ2lzdHJhdGlvbikge1xuICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmFjY2VwdChyZXF1ZXN0KTtcbiAgfVxuXG4gIGFjY2VwdEFsbCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5hY2NlcHRBbGwoKTtcbiAgfVxuXG4gIGNhbkFjY2VwdEFsbCgpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdHMgPSB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5nZXRSZXF1ZXN0QnlTdGF0dXMoXG4gICAgICBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgKTtcbiAgICByZXR1cm4gIShwZW5kaW5nUmVxdWVzdHMubGVuZ3RoID4gMCAmJiAhdGhpcy5yZXF1aXJlU2VjdXJpdHlUb2tlbik7XG4gIH1cblxuICBsb2FkQWxsKCkge1xuICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmxpc3QoKTtcbiAgfVxuXG4gIGRpc3BsYXlNb2RlKGxpc3RDbGFzczogJ2ludGVyYWN0LWxpc3QnIHwgJ2ludGVyYWN0LWdyaWQnKSB7XG4gICAgdGhpcy5ncmlkT3JMaXN0ID0gbGlzdENsYXNzO1xuICB9XG5cbiAgYXN5bmMgc2V0UmVxdWlyZVNlY3VyaXR5VG9rZW4oKSB7XG4gICAgY29uc3QgbW9kZTogRGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlID1cbiAgICAgIChhd2FpdCB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldFRlbmFudE9wdGlvbjxEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGU+KFxuICAgICAgICAnZGV2aWNlLXJlZ2lzdHJhdGlvbicsXG4gICAgICAgICdzZWN1cml0eS10b2tlbi5wb2xpY3knLFxuICAgICAgICBEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuT1BUSU9OQUxcbiAgICAgICkpIGFzIERldmljZVJlZ2lzdHJhdGlvblNlY3VyaXR5TW9kZTtcbiAgICB0aGlzLl9zZWN1cml0eVRva2VuUG9saWN5Lm5leHQobW9kZSk7XG4gICAgdGhpcy5yZXF1aXJlU2VjdXJpdHlUb2tlbiA9IG1vZGUgPT09IERldmljZVJlZ2lzdHJhdGlvblNlY3VyaXR5TW9kZS5SRVFVSVJFRDtcbiAgfVxuXG4gIGFzeW5jIHNldElzTWFuYWdlbWVudFRlbmFudCgpIHtcbiAgICB0aGlzLmlzTWFuYWdlbWVudFRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50VWlTZXJ2aWNlLmlzTWFuYWdlbWVudFRlbmFudCgpO1xuICB9XG5cbiAgc2hvdWxkU2hvd1NlY3VyaXR5VG9rZW5JbnB1dChkYXRhOiBJRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGEuc3RhdHVzID09PSBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFICYmXG4gICAgICB0aGlzLnNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpXG4gICAgKTtcbiAgfVxuXG4gIHNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdXJpdHlUb2tlblBvbGljeS5nZXRWYWx1ZSgpICE9PSBEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuSUdOT1JFRDtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldmljZVJlcXVlc3RzJCB8IGFzeW5jIGFzIGRldmljZVJlcXVlc3RMaXN0XCI+XG4gIDxjOHktdGl0bGU+XG4gICAge3sgJ0RldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgPHNtYWxsICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPT09IDFcIj4xIHt7ICduZXcgZGV2aWNlJyB8IHRyYW5zbGF0ZSB9fTwvc21hbGw+XG4gICAgPHNtYWxsICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPiAxXCI+XG4gICAgICB7eyBkZXZpY2VSZXF1ZXN0TGlzdC5kYXRhLmxlbmd0aCB9fSB7eyAnbmV3IGRldmljZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zbWFsbD5cbiAgPC9jOHktdGl0bGU+XG5cbiAgPGM4eS1icmVhZGNydW1iPlxuICAgIDxjOHktYnJlYWRjcnVtYi1pdGVtIFtpY29uXT1cIidleGNoYW5nZSdcIiBbbGFiZWxdPVwiJ0RldmljZXMnIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICAgIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgICBbaWNvbl09XCInYzh5LWRldmljZS1jb25uZWN0J1wiXG4gICAgICBbbGFiZWxdPVwiJ0RldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8L2M4eS1icmVhZGNydW1iPlxuXG4gIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCIgaXRlbUNsYXNzPVwibmF2YmFyLWZvcm0gaGlkZGVuLXhzXCI+XG4gICAgPGM4eS1saXN0LWRpc3BsYXktc3dpdGNoIChvbkxpc3RDbGFzc0NoYW5nZSk9XCJkaXNwbGF5TW9kZSgkZXZlbnQpXCI+PC9jOHktbGlzdC1kaXNwbGF5LXN3aXRjaD5cbiAgPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaW1pdCQgfCBhc3luYyBhcyBsaW1pdFN0YXR1c1wiPlxuICAgIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiIFtwcmlvcml0eV09XCIxMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICAgIHRpdGxlPVwie3sgJ0FjY2VwdCBhbGwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGNsaWNrKT1cImFjY2VwdEFsbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImNhbkFjY2VwdEFsbCgpIHx8IGxpbWl0U3RhdHVzPy5pc1JlYWNoZWRcIlxuICAgICAgPlxuICAgICAgICA8aSBbYzh5SWNvbl09XCInY2hlY2snXCI+PC9pPlxuICAgICAgICB7eyAnQWNjZXB0IGFsbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuICAgIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiIFtwcmlvcml0eV09XCI5XCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwibG9hZEFsbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgICA+XG4gICAgICAgIDxpIFtjOHlJY29uXT1cIidyZWZyZXNoJ1wiIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IGlzTG9hZGluZyB9XCI+PC9pPlxuICAgICAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG4gICAgPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCIgKmM4eUlmQWxsb3dlZD1cIlsnUk9MRV9ERVZJQ0VfQ09OVFJPTF9BRE1JTiddXCI+XG4gICAgICA8Yzh5LXJlZ2lzdGVyLWRldmljZS1kcm9wZG93bj48L2M4eS1yZWdpc3Rlci1kZXZpY2UtZHJvcGRvd24+XG4gICAgPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG4gICAgPGM4eS1oZWxwIHNyYz1cIi91c2Vycy1ndWlkZS9kZXZpY2UtbWFuYWdlbWVudC8jY29ubmVjdGluZy1kZXZpY2VzXCI+PC9jOHktaGVscD5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXZpY2VSZXF1ZXN0TGlzdC5kYXRhLmxlbmd0aCA+IDA7IGVsc2Ugbm9EYXRhXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncm91cFwiIFtuZ0NsYXNzXT1cImdyaWRPckxpc3RcIj5cbiAgICAgICAgPCEtLSBTVEFSVCBpbnRlcmFjdC1saXN0IHN0aWNreSBoZWFkZXIgU1RBUlQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJncmlkT3JMaXN0ID09PSAnaW50ZXJhY3QtbGlzdCdcIiBjbGFzcz1cInBhZ2Utc3RpY2t5LWhlYWRlciBoaWRkZW4teHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC1sLTQwXCI+XG4gICAgICAgICAgICAgIDxwIHRyYW5zbGF0ZT5EZXZpY2U8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTMwIHAtbC0wIG0tbC04XCI+XG4gICAgICAgICAgICAgIDxwIHRyYW5zbGF0ZT5TdGF0dXM8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTMwIHAtMFwiICpuZ0lmPVwic2hvd1Rva2VuSW5wdXRCYXNlZE9uU2VjdXJpdHlNb2RlKClcIj5cbiAgICAgICAgICAgICAgPHAgdHJhbnNsYXRlPlNlY3VyaXR5IHRva2VuPC9wPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7XG4gICAgICAgICAgICAgICAgICAnU2VjdXJpdHkgdG9rZW4gaXMgcmVxdWlyZWQgaWYgdGhlIGNvbm5lY3RlZCBkZXZpY2UgdXNlcyBpdC4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBbYzh5SWNvbl09XCIncXVlc3Rpb24tY2lyY2xlLW8nXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWNvbnRlbnRzXCIgKm5nSWY9XCJpc01hbmFnZW1lbnRUZW5hbnQ7IGVsc2Ugbm9NYW5hZ2VtZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnQ3JlYXRlZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tMzBcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdCeWB1c2VyYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tMjBcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdUZW5hbnQgSUQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vTWFuYWdlbWVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdDcmVhdGVkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0J5YHVzZXJgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWFjdGlvbnMtZ3JvdXBcIiBzdHlsZT1cIm1pbi13aWR0aDogMTc2cHhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0biBidG4teHMgaW52aXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgPCEtLUVNUFRZIGJ5IGRlc2lnbi0tPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBFTkQgaW50ZXJhY3QtbGlzdCBzdGlja3kgaGVhZGVyIEVORCAtLT5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwibGltaXRTdGF0dXM/LmlzUmVhY2hlZFwiIGNsYXNzPVwiY29sLXhzLTEyIGNvbC1zbS02IGNvbC1tZC00IGNvbC1sZy0zXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIGNlbnRlci1ibG9ja1wiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAge3sgbGltaXRSZWFjaGVkSW5mbyQgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5QbGVhc2UgY29udGFjdCB5b3VyIHBsYXRmb3JtIGFkbWluaXN0cmF0b3IuPC9zcGFuPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2luZ2xlUmVxdWVzdCBvZiBkZXZpY2VSZXF1ZXN0TGlzdC5kYXRhXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtc20tNiBjb2wtbWQtNCBjb2wtbGctM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHNlcGFyYXRvclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWljb25cIj5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIFtjOHlJY29uXT1cInN0YXR1c1Byb3BzW3NpbmdsZVJlcXVlc3Quc3RhdHVzXS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInN0YXR1c1Byb3BzW3NpbmdsZVJlcXVlc3Quc3RhdHVzXS5jbHNcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGUgdGV4dC10cnVuY2F0ZVwiIHRpdGxlPVwie3sgc2luZ2xlUmVxdWVzdC5pZCB9fVwiPnt7IHNpbmdsZVJlcXVlc3QuaWQgfX08L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHRleHQtY2VudGVyIGNhcmQtY29sdW1uLTMwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlN0YXR1czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2luZ2xlUmVxdWVzdC5zdGF0dXMgPT09IHN0YXR1cy5XQUlUSU5HX0ZPUl9DT05ORUNUSU9OXCJcbiAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tc3BpbiB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIHt7IHN0YXR1c1Byb3BzW3NpbmdsZVJlcXVlc3Quc3RhdHVzXS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYmxvY2sgdGV4dC1jZW50ZXIgY2FyZC1jb2x1bW4tMzAgcC10LTBcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncC1iLTAnOiAhc2hvdWxkU2hvd1NlY3VyaXR5VG9rZW5JbnB1dChzaW5nbGVSZXF1ZXN0KSB9XCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1Rva2VuSW5wdXRCYXNlZE9uU2VjdXJpdHlNb2RlKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93U2VjdXJpdHlUb2tlbklucHV0KHNpbmdsZVJlcXVlc3QpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JpZE9yTGlzdCAhPT0gJ2ludGVyYWN0LWxpc3QnXCIgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5IHRva2VuXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzaW5nbGVSZXF1ZXN0LnNlY3VyaXR5VG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidlLmcuIHt7IGV4YW1wbGUgfX0nIHwgdHJhbnNsYXRlOiB7IGV4YW1wbGU6ICdBMWUzZ2g1ZHMnIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlU2VjdXJpdHlUb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1hY3Rpb25zLWdyb3VwIGQtZmxleCBhLWktY2VudGVyIGotYy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDE3NnB4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAnYnRuLWRhbmdlcic6IHNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICdidG4tZGVmYXVsdCc6IHNpbmdsZVJlcXVlc3Quc3RhdHVzICE9PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgICAgICAgICAgICAgc2luZ2xlUmVxdWVzdC5zdGF0dXMgPT09IHN0YXR1cy5QRU5ESU5HX0FDQ0VQVEFOQ0VcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKCdSZW1vdmUnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ0NhbmNlbCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoc2luZ2xlUmVxdWVzdC5pZClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaW5nbGVSZXF1ZXN0LnN0YXR1cyA9PT0gc3RhdHVzLlBFTkRJTkdfQUNDRVBUQU5DRVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZW1vdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaW5nbGVSZXF1ZXN0LnN0YXR1cyAhPT0gc3RhdHVzLlBFTkRJTkdfQUNDRVBUQU5DRVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBY2NlcHQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY2NlcHQoc2luZ2xlUmVxdWVzdClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0U3RhdHVzPy5pc1JlYWNoZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoIXNpbmdsZVJlcXVlc3Quc2VjdXJpdHlUb2tlbiAmJiByZXF1aXJlU2VjdXJpdHlUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0FjY2VwdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yIHRleHQtY2VudGVyIGNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXNNYW5hZ2VtZW50VGVuYW50OyBlbHNlIG5vTWFuYWdlbWVudFwiIGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIiAqbmdJZj1cInNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lICYmIHNpbmdsZVJlcXVlc3Qub3duZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPkNyZWF0ZWQgb25gZGF0ZWA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzaW5nbGVSZXF1ZXN0LmNyZWF0aW9uVGltZSB8IGM4eURhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1sLTQgbS1yLTRcIiB0cmFuc2xhdGU+YnlgdXNlcmA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tMzBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tbC00IG0tci00XCIgdHJhbnNsYXRlPmluYHRlbmFudGA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tMjBcIj57eyBzaW5nbGVSZXF1ZXN0LnRlbmFudElkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lIHx8ICFzaW5nbGVSZXF1ZXN0Lm93bmVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbHVtbi0zMFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIiB0cmFuc2xhdGU+Q3JlYXRlZCBpbmB0ZW5hbnRgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tMjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3QudGVuYW50SWQgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vTWFuYWdlbWVudD5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tbC00IG0tci00XCIgdHJhbnNsYXRlPkNyZWF0ZWQgb25gZGF0ZWA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzaW5nbGVSZXF1ZXN0LmNyZWF0aW9uVGltZSB8IGM4eURhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1sLTQgbS1yLTRcIiB0cmFuc2xhdGU+YnlgdXNlcmA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjOHktbG9hZC1tb3JlXG4gICAgICAgIFtwYWdpbmddPVwiZGV2aWNlUmVxdWVzdExpc3QucGFnaW5nXCJcbiAgICAgICAgW2hpZGRlbl09XCJ0cnVlXCJcbiAgICAgICAgKG9uTG9hZCk9XCJ1cGRhdGVMaXN0KCRldmVudClcIlxuICAgICAgPjwvYzh5LWxvYWQtbW9yZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSBtLXQtNDAgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPGgxIGNsYXNzPVwiYzh5LWljb24gYzh5LWljb24tZGV2aWNlLWNvbm5lY3QgYzh5LWljb24tZHVvY29sb3JcIj48L2gxPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGltaXRTdGF0dXM/LmlzUmVhY2hlZDsgZWxzZSBsaW1pdE5vdFJlYWNoZWRcIj5cbiAgICAgICAgICA8aDM+XG4gICAgICAgICAgICB7eyBsaW1pdFJlYWNoZWRJbmZvJCB8IGFzeW5jIH19XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8cCB0cmFuc2xhdGU+UGxlYXNlIGNvbnRhY3QgeW91ciBwbGF0Zm9ybSBhZG1pbmlzdHJhdG9yLjwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbGltaXROb3RSZWFjaGVkPlxuICAgICAgICAgIDxoMyB0cmFuc2xhdGU+Tm8gcGVuZGluZyByZWdpc3RyYXRpb25zIHRvIGRpc3BsYXkuPC9oMz5cbiAgICAgICAgICA8cCAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICBVc2UgdGhlIFwiUmVnaXN0ZXIgZGV2aWNlXCIgZHJvcGRvd24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXJlZ2lzdHJhdGlvbi12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3JlZ2lzdGVyLWRldmljZS9kZXZpY2UtcmVnaXN0cmF0aW9uLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vcmVnaXN0ZXItZGV2aWNlL2RldmljZS1yZWdpc3RyYXRpb24tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLHdCQUF3QixFQUl6QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUNMLDhCQUE4QixFQUU5QixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixPQUFPLEVBQ1AsY0FBYyxFQUNmLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBTXZELE1BQU0sT0FBTywrQkFBK0I7SUF3QzFDLFlBQ1UscUJBQTRDLEVBQzVDLHdCQUF3RCxFQUN4RCxlQUFnQyxFQUNoQyxZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsY0FBOEI7UUFMOUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQWdDO1FBQ3hELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXZDeEMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBQ3RDLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGVBQVUsR0FBc0MsZUFBZSxDQUFDO1FBQ2hFLFdBQU0sR0FBRyx3QkFBd0IsQ0FBQztRQUV6QixnQkFBVyxHQUFHO1lBQ3JCLENBQUMsd0JBQXdCLENBQUMsc0JBQXNCLENBQUMsRUFBRTtnQkFDakQsS0FBSyxFQUFFLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztnQkFDeEMsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsR0FBRyxFQUFFLGFBQWE7YUFDbkI7WUFDRCxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQzdDLEtBQUssRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3BDLElBQUksRUFBRSxRQUFRO2dCQUNkLEdBQUcsRUFBRSxXQUFXO2FBQ2pCO1lBQ0QsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDbkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLElBQUksRUFBRSxjQUFjO2dCQUNwQixHQUFHLEVBQUUsY0FBYzthQUNwQjtZQUNELENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUN6QixJQUFJLEVBQUUsS0FBSztnQkFDWCxHQUFHLEVBQUUsYUFBYTthQUNuQjtTQUNGLENBQUM7UUFFTSxpQkFBWSxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLHlCQUFvQixHQUNuQyxJQUFJLGVBQWUsQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQVM1RCxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FDaEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNWLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtnQkFDckIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hGLGVBQWU7YUFDaEIsQ0FBQztZQUNGLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtTQUNuQixDQUFDLENBQUMsQ0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdkMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsRUFDcEUsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQzFCLE9BQU8sQ0FDTCx1RkFBdUYsQ0FDeEYsRUFDRCxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FDdEIsQ0FDRixDQUNGLENBQUM7UUFDRixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUTthQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsd0JBQXdCO2FBQzFCLFNBQVMsRUFBRTthQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDLFNBQVMsQ0FBQyxDQUFDLFNBQW1DLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQUk7UUFDYixJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBVTtRQUNyQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUMvQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsRUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDM0IsT0FBTyxDQUNMLHNGQUFzRixDQUN2RixFQUNELEVBQUUsRUFBRSxFQUFFLENBQ1AsRUFDRCxNQUFNLENBQUMsTUFBTSxFQUNiO1lBQ0UsRUFBRSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztZQUNsQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUN6QixDQUNGLENBQUM7UUFFRixJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQTRCO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQ25FLHdCQUF3QixDQUFDLGtCQUFrQixDQUM1QyxDQUFDO1FBQ0YsT0FBTyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVyxDQUFDLFNBQTRDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCO1FBQzNCLE1BQU0sSUFBSSxHQUNSLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FDeEMscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2Qiw4QkFBOEIsQ0FBQyxRQUFRLENBQ3hDLENBQW1DLENBQUM7UUFDdkMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxLQUFLLDhCQUE4QixDQUFDLFFBQVEsQ0FBQztJQUMvRSxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQjtRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVELDRCQUE0QixDQUFDLElBQXlCO1FBQ3BELE9BQU8sQ0FDTCxJQUFJO1lBQ0osSUFBSSxDQUFDLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxrQkFBa0I7WUFDM0QsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQ3pDLENBQUM7SUFDSixDQUFDO0lBRUQsaUNBQWlDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxLQUFLLDhCQUE4QixDQUFDLE9BQU8sQ0FBQztJQUN6RixDQUFDOzs0SEFyS1UsK0JBQStCO2dIQUEvQiwrQkFBK0Isb0VDM0I1Qyxta1pBZ1NBOzJGRHJRYSwrQkFBK0I7a0JBSjNDLFNBQVM7K0JBQ0UsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlLFxuICBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMsXG4gIElEZXZpY2VSZWdpc3RyYXRpb24sXG4gIElEZXZpY2VSZWdpc3RyYXRpb25MaW1pdCxcbiAgUGFnaW5nXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGV2aWNlQm9vdHN0cmFwUmVhbHRpbWVTZXJ2aWNlLFxuICBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXAsXG4gIFRlbmFudFVpU2VydmljZSxcbiAgTW9kYWxTZXJ2aWNlLFxuICBTdGF0dXMsXG4gIGdldHRleHQsXG4gIE9wdGlvbnNTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgUmVnaXN0ZXJEZXZpY2VTZXJ2aWNlIH0gZnJvbSAnLi9yZWdpc3Rlci1kZXZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGV2aWNlLXJlZ2lzdHJhdGlvbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICdkZXZpY2UtcmVnaXN0cmF0aW9uLXZpZXcuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERldmljZVJlZ2lzdHJhdGlvblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGRldmljZVJlcXVlc3RzJDogT2JzZXJ2YWJsZTx7XG4gICAgZGF0YTogSURldmljZVJlZ2lzdHJhdGlvbltdO1xuICAgIHBhZ2luZz86IFBhZ2luZzxJRGV2aWNlUmVnaXN0cmF0aW9uPjtcbiAgfT47XG4gIGxpbWl0JDogT2JzZXJ2YWJsZTxJRGV2aWNlUmVnaXN0cmF0aW9uTGltaXQ+O1xuICBsaW1pdFJlYWNoZWRJbmZvJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICByZXF1aXJlU2VjdXJpdHlUb2tlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc01hbmFnZW1lbnRUZW5hbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGdyaWRPckxpc3Q6ICdpbnRlcmFjdC1saXN0JyB8ICdpbnRlcmFjdC1ncmlkJyA9ICdpbnRlcmFjdC1ncmlkJztcbiAgc3RhdHVzID0gRGV2aWNlUmVnaXN0cmF0aW9uU3RhdHVzO1xuXG4gIHJlYWRvbmx5IHN0YXR1c1Byb3BzID0ge1xuICAgIFtEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuV0FJVElOR19GT1JfQ09OTkVDVElPTl06IHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdXYWl0aW5nIGZvciBjb25uZWN0aW9uJyksXG4gICAgICBpY29uOiAndW5saW5rJyxcbiAgICAgIGNsczogJ3RleHQtZGFuZ2VyJ1xuICAgIH0sXG4gICAgW0RldmljZVJlZ2lzdHJhdGlvblN0YXR1cy5QRU5ESU5HX0FDQ0VQVEFOQ0VdOiB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnUGVuZGluZyBhY2NlcHRhbmNlJyksXG4gICAgICBpY29uOiAnY2lyY2xlJyxcbiAgICAgIGNsczogJ3RleHQtaW5mbydcbiAgICB9LFxuICAgIFtEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuQUNDRVBURURdOiB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnQWNjZXB0ZWQnKSxcbiAgICAgIGljb246ICdjaGVjay1jaXJjbGUnLFxuICAgICAgY2xzOiAndGV4dC1zdWNjZXNzJ1xuICAgIH0sXG4gICAgW0RldmljZVJlZ2lzdHJhdGlvblN0YXR1cy5CTE9DS0VEXToge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0Jsb2NrZWQnKSxcbiAgICAgIGljb246ICdiYW4nLFxuICAgICAgY2xzOiAndGV4dC1kYW5nZXInXG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWN1cml0eVRva2VuUG9saWN5OiBCZWhhdmlvclN1YmplY3Q8RGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdChEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuT1BUSU9OQUwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVnaXN0ZXJEZXZpY2VTZXJ2aWNlOiBSZWdpc3RlckRldmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBib290c3RyYXBSZWFsdGltZVNlcnZpY2U6IERldmljZUJvb3RzdHJhcFJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudFVpU2VydmljZTogVGVuYW50VWlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRBbGwoKTtcbiAgICB0aGlzLnNldElzTWFuYWdlbWVudFRlbmFudCgpO1xuICAgIHRoaXMuc2V0UmVxdWlyZVNlY3VyaXR5VG9rZW4oKTtcblxuICAgIHRoaXMuZGV2aWNlUmVxdWVzdHMkID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UuZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdHMkLnBpcGUoXG4gICAgICBtYXAocmVxID0+ICh7XG4gICAgICAgIGRhdGE6IHNvcnRCeShyZXEuZGF0YSwgW1xuICAgICAgICAgICh7IHN0YXR1cyB9KSA9PiAoc3RhdHVzID09PSBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFID8gMCA6IDEpLFxuICAgICAgICAgICctY3JlYXRpb25UaW1lJ1xuICAgICAgICBdKSxcbiAgICAgICAgcGFnaW5nOiByZXEucGFnaW5nXG4gICAgICB9KSlcbiAgICApO1xuICAgIHRoaXMubGltaXQkID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubGltaXQkO1xuICAgIHRoaXMubGltaXRSZWFjaGVkSW5mbyQgPSB0aGlzLmxpbWl0JC5waXBlKFxuICAgICAgZmlsdGVyKGRldmljZVJlZ2lzdHJhdGlvbkxpbWl0ID0+IGRldmljZVJlZ2lzdHJhdGlvbkxpbWl0LmlzUmVhY2hlZCksXG4gICAgICBzd2l0Y2hNYXAoKHsgbGltaXQgfSkgPT5cbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbShcbiAgICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICAgJ1lvdSByZWFjaGVkIHRoZSBsaW1pdCBvZiB7eyBtYXhEZXZpY2VzIH19IGRldmljZXMuIE5vIG1vcmUgZGV2aWNlcyBjYW4gYmUgcmVnaXN0ZXJlZC4nXG4gICAgICAgICAgKSxcbiAgICAgICAgICB7IG1heERldmljZXM6IGxpbWl0IH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubG9hZGluZyRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlID0+ICh0aGlzLmlzTG9hZGluZyA9IHZhbHVlKSk7XG5cbiAgICB0aGlzLmJvb3RzdHJhcFJlYWx0aW1lU2VydmljZVxuICAgICAgLm9uVXBkYXRlJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgLnN1YnNjcmliZSgoYm9vdHN0cmFwOiBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXApID0+IHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2Uub25EZXZpY2VCb290c3RyYXAoYm9vdHN0cmFwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICB1cGRhdGVMaXN0KGRhdGEpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5pbnRlcm5hbExpc3RVcGRhdGUoZGF0YSk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICBnZXR0ZXh0KCdDYW5jZWwgZGV2aWNlIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gY2FuY2VsIGRldmljZSByZWdpc3RyYXRpb24gZm9yIElEIFwie3tpZH19XCIuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICApLFxuICAgICAgICB7IGlkIH1cbiAgICAgICksXG4gICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAge1xuICAgICAgICBvazogZ2V0dGV4dCgnQ2FuY2VsIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgICBjYW5jZWw6IGdldHRleHQoJ0Nsb3NlJylcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UucmVtb3ZlKGlkKTtcbiAgICB9XG4gIH1cblxuICBhY2NlcHQocmVxdWVzdDogSURldmljZVJlZ2lzdHJhdGlvbikge1xuICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmFjY2VwdChyZXF1ZXN0KTtcbiAgfVxuXG4gIGFjY2VwdEFsbCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5hY2NlcHRBbGwoKTtcbiAgfVxuXG4gIGNhbkFjY2VwdEFsbCgpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdHMgPSB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5nZXRSZXF1ZXN0QnlTdGF0dXMoXG4gICAgICBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgKTtcbiAgICByZXR1cm4gIShwZW5kaW5nUmVxdWVzdHMubGVuZ3RoID4gMCAmJiAhdGhpcy5yZXF1aXJlU2VjdXJpdHlUb2tlbik7XG4gIH1cblxuICBsb2FkQWxsKCkge1xuICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmxpc3QoKTtcbiAgfVxuXG4gIGRpc3BsYXlNb2RlKGxpc3RDbGFzczogJ2ludGVyYWN0LWxpc3QnIHwgJ2ludGVyYWN0LWdyaWQnKSB7XG4gICAgdGhpcy5ncmlkT3JMaXN0ID0gbGlzdENsYXNzO1xuICB9XG5cbiAgYXN5bmMgc2V0UmVxdWlyZVNlY3VyaXR5VG9rZW4oKSB7XG4gICAgY29uc3QgbW9kZTogRGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlID1cbiAgICAgIChhd2FpdCB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldFRlbmFudE9wdGlvbjxEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGU+KFxuICAgICAgICAnZGV2aWNlLXJlZ2lzdHJhdGlvbicsXG4gICAgICAgICdzZWN1cml0eS10b2tlbi5wb2xpY3knLFxuICAgICAgICBEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuT1BUSU9OQUxcbiAgICAgICkpIGFzIERldmljZVJlZ2lzdHJhdGlvblNlY3VyaXR5TW9kZTtcbiAgICB0aGlzLl9zZWN1cml0eVRva2VuUG9saWN5Lm5leHQobW9kZSk7XG4gICAgdGhpcy5yZXF1aXJlU2VjdXJpdHlUb2tlbiA9IG1vZGUgPT09IERldmljZVJlZ2lzdHJhdGlvblNlY3VyaXR5TW9kZS5SRVFVSVJFRDtcbiAgfVxuXG4gIGFzeW5jIHNldElzTWFuYWdlbWVudFRlbmFudCgpIHtcbiAgICB0aGlzLmlzTWFuYWdlbWVudFRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50VWlTZXJ2aWNlLmlzTWFuYWdlbWVudFRlbmFudCgpO1xuICB9XG5cbiAgc2hvdWxkU2hvd1NlY3VyaXR5VG9rZW5JbnB1dChkYXRhOiBJRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGEuc3RhdHVzID09PSBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFICYmXG4gICAgICB0aGlzLnNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpXG4gICAgKTtcbiAgfVxuXG4gIHNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdXJpdHlUb2tlblBvbGljeS5nZXRWYWx1ZSgpICE9PSBEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuSUdOT1JFRDtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldmljZVJlcXVlc3RzJCB8IGFzeW5jIGFzIGRldmljZVJlcXVlc3RMaXN0XCI+XG4gIDxjOHktdGl0bGU+XG4gICAge3sgJ0RldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgPHNtYWxsICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPT09IDFcIj4xIHt7ICduZXcgZGV2aWNlJyB8IHRyYW5zbGF0ZSB9fTwvc21hbGw+XG4gICAgPHNtYWxsICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPiAxXCI+XG4gICAgICB7eyBkZXZpY2VSZXF1ZXN0TGlzdC5kYXRhLmxlbmd0aCB9fSB7eyAnbmV3IGRldmljZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zbWFsbD5cbiAgPC9jOHktdGl0bGU+XG5cbiAgPGM4eS1icmVhZGNydW1iPlxuICAgIDxjOHktYnJlYWRjcnVtYi1pdGVtIFtpY29uXT1cIidleGNoYW5nZSdcIiBbbGFiZWxdPVwiJ0RldmljZXMnIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICAgIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgICBbaWNvbl09XCInYzh5LWRldmljZS1jb25uZWN0J1wiXG4gICAgICBbbGFiZWxdPVwiJ0RldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8L2M4eS1icmVhZGNydW1iPlxuXG4gIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCIgaXRlbUNsYXNzPVwibmF2YmFyLWZvcm0gaGlkZGVuLXhzXCI+XG4gICAgPGM4eS1saXN0LWRpc3BsYXktc3dpdGNoIChvbkxpc3RDbGFzc0NoYW5nZSk9XCJkaXNwbGF5TW9kZSgkZXZlbnQpXCI+PC9jOHktbGlzdC1kaXNwbGF5LXN3aXRjaD5cbiAgPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaW1pdCQgfCBhc3luYyBhcyBsaW1pdFN0YXR1c1wiPlxuICAgIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiIFtwcmlvcml0eV09XCIxMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICAgIHRpdGxlPVwie3sgJ0FjY2VwdCBhbGwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGNsaWNrKT1cImFjY2VwdEFsbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImNhbkFjY2VwdEFsbCgpIHx8IGxpbWl0U3RhdHVzPy5pc1JlYWNoZWRcIlxuICAgICAgPlxuICAgICAgICA8aSBbYzh5SWNvbl09XCInY2hlY2snXCI+PC9pPlxuICAgICAgICB7eyAnQWNjZXB0IGFsbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuICAgIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiIFtwcmlvcml0eV09XCI5XCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwibG9hZEFsbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgICA+XG4gICAgICAgIDxpIFtjOHlJY29uXT1cIidyZWZyZXNoJ1wiIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IGlzTG9hZGluZyB9XCI+PC9pPlxuICAgICAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG4gICAgPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCIgKmM4eUlmQWxsb3dlZD1cIlsnUk9MRV9ERVZJQ0VfQ09OVFJPTF9BRE1JTiddXCI+XG4gICAgICA8Yzh5LXJlZ2lzdGVyLWRldmljZS1kcm9wZG93bj48L2M4eS1yZWdpc3Rlci1kZXZpY2UtZHJvcGRvd24+XG4gICAgPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG4gICAgPGM4eS1oZWxwIHNyYz1cIi91c2Vycy1ndWlkZS9kZXZpY2UtbWFuYWdlbWVudC8jY29ubmVjdGluZy1kZXZpY2VzXCI+PC9jOHktaGVscD5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXZpY2VSZXF1ZXN0TGlzdC5kYXRhLmxlbmd0aCA+IDA7IGVsc2Ugbm9EYXRhXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncm91cFwiIFtuZ0NsYXNzXT1cImdyaWRPckxpc3RcIj5cbiAgICAgICAgPCEtLSBTVEFSVCBpbnRlcmFjdC1saXN0IHN0aWNreSBoZWFkZXIgU1RBUlQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJncmlkT3JMaXN0ID09PSAnaW50ZXJhY3QtbGlzdCdcIiBjbGFzcz1cInBhZ2Utc3RpY2t5LWhlYWRlciBoaWRkZW4teHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC1sLTQwXCI+XG4gICAgICAgICAgICAgIDxwIHRyYW5zbGF0ZT5EZXZpY2U8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTMwIHAtbC0wIG0tbC04XCI+XG4gICAgICAgICAgICAgIDxwIHRyYW5zbGF0ZT5TdGF0dXM8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTMwIHAtMFwiICpuZ0lmPVwic2hvd1Rva2VuSW5wdXRCYXNlZE9uU2VjdXJpdHlNb2RlKClcIj5cbiAgICAgICAgICAgICAgPHAgdHJhbnNsYXRlPlNlY3VyaXR5IHRva2VuPC9wPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7XG4gICAgICAgICAgICAgICAgICAnU2VjdXJpdHkgdG9rZW4gaXMgcmVxdWlyZWQgaWYgdGhlIGNvbm5lY3RlZCBkZXZpY2UgdXNlcyBpdC4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBbYzh5SWNvbl09XCIncXVlc3Rpb24tY2lyY2xlLW8nXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWNvbnRlbnRzXCIgKm5nSWY9XCJpc01hbmFnZW1lbnRUZW5hbnQ7IGVsc2Ugbm9NYW5hZ2VtZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnQ3JlYXRlZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tMzBcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdCeWB1c2VyYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tMjBcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdUZW5hbnQgSUQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vTWFuYWdlbWVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdDcmVhdGVkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0J5YHVzZXJgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWFjdGlvbnMtZ3JvdXBcIiBzdHlsZT1cIm1pbi13aWR0aDogMTc2cHhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0biBidG4teHMgaW52aXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgPCEtLUVNUFRZIGJ5IGRlc2lnbi0tPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBFTkQgaW50ZXJhY3QtbGlzdCBzdGlja3kgaGVhZGVyIEVORCAtLT5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwibGltaXRTdGF0dXM/LmlzUmVhY2hlZFwiIGNsYXNzPVwiY29sLXhzLTEyIGNvbC1zbS02IGNvbC1tZC00IGNvbC1sZy0zXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIGNlbnRlci1ibG9ja1wiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAge3sgbGltaXRSZWFjaGVkSW5mbyQgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5QbGVhc2UgY29udGFjdCB5b3VyIHBsYXRmb3JtIGFkbWluaXN0cmF0b3IuPC9zcGFuPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2luZ2xlUmVxdWVzdCBvZiBkZXZpY2VSZXF1ZXN0TGlzdC5kYXRhXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtc20tNiBjb2wtbWQtNCBjb2wtbGctM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHNlcGFyYXRvclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWljb25cIj5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIFtjOHlJY29uXT1cInN0YXR1c1Byb3BzW3NpbmdsZVJlcXVlc3Quc3RhdHVzXS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInN0YXR1c1Byb3BzW3NpbmdsZVJlcXVlc3Quc3RhdHVzXS5jbHNcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGUgdGV4dC10cnVuY2F0ZVwiIHRpdGxlPVwie3sgc2luZ2xlUmVxdWVzdC5pZCB9fVwiPnt7IHNpbmdsZVJlcXVlc3QuaWQgfX08L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHRleHQtY2VudGVyIGNhcmQtY29sdW1uLTMwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlN0YXR1czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2luZ2xlUmVxdWVzdC5zdGF0dXMgPT09IHN0YXR1cy5XQUlUSU5HX0ZPUl9DT05ORUNUSU9OXCJcbiAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tc3BpbiB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIHt7IHN0YXR1c1Byb3BzW3NpbmdsZVJlcXVlc3Quc3RhdHVzXS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYmxvY2sgdGV4dC1jZW50ZXIgY2FyZC1jb2x1bW4tMzAgcC10LTBcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncC1iLTAnOiAhc2hvdWxkU2hvd1NlY3VyaXR5VG9rZW5JbnB1dChzaW5nbGVSZXF1ZXN0KSB9XCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1Rva2VuSW5wdXRCYXNlZE9uU2VjdXJpdHlNb2RlKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93U2VjdXJpdHlUb2tlbklucHV0KHNpbmdsZVJlcXVlc3QpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JpZE9yTGlzdCAhPT0gJ2ludGVyYWN0LWxpc3QnXCIgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5IHRva2VuXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzaW5nbGVSZXF1ZXN0LnNlY3VyaXR5VG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidlLmcuIHt7IGV4YW1wbGUgfX0nIHwgdHJhbnNsYXRlOiB7IGV4YW1wbGU6ICdBMWUzZ2g1ZHMnIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlU2VjdXJpdHlUb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1hY3Rpb25zLWdyb3VwIGQtZmxleCBhLWktY2VudGVyIGotYy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDE3NnB4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAnYnRuLWRhbmdlcic6IHNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICdidG4tZGVmYXVsdCc6IHNpbmdsZVJlcXVlc3Quc3RhdHVzICE9PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgICAgICAgICAgICAgc2luZ2xlUmVxdWVzdC5zdGF0dXMgPT09IHN0YXR1cy5QRU5ESU5HX0FDQ0VQVEFOQ0VcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKCdSZW1vdmUnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ0NhbmNlbCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoc2luZ2xlUmVxdWVzdC5pZClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaW5nbGVSZXF1ZXN0LnN0YXR1cyA9PT0gc3RhdHVzLlBFTkRJTkdfQUNDRVBUQU5DRVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZW1vdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaW5nbGVSZXF1ZXN0LnN0YXR1cyAhPT0gc3RhdHVzLlBFTkRJTkdfQUNDRVBUQU5DRVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBY2NlcHQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY2NlcHQoc2luZ2xlUmVxdWVzdClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0U3RhdHVzPy5pc1JlYWNoZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoIXNpbmdsZVJlcXVlc3Quc2VjdXJpdHlUb2tlbiAmJiByZXF1aXJlU2VjdXJpdHlUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0FjY2VwdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yIHRleHQtY2VudGVyIGNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXNNYW5hZ2VtZW50VGVuYW50OyBlbHNlIG5vTWFuYWdlbWVudFwiIGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIiAqbmdJZj1cInNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lICYmIHNpbmdsZVJlcXVlc3Qub3duZXJcIj5cbiAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCIgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWwtNCBtLXItNFwiIHRyYW5zbGF0ZT5DcmVhdGVkIG9uYGRhdGVgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtY3k9XCJkZXZpY2UtcmVnaXN0cmF0aW9uLS1jcmVhdGlvbi1kYXRlXCI+e3sgc2luZ2xlUmVxdWVzdC5jcmVhdGlvblRpbWUgfCBjOHlEYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tMzAgdGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWwtNCBtLXItNFwiIHRyYW5zbGF0ZT5ieWB1c2VyYDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWN5PVwiZGV2aWNlLXJlZ2lzdHJhdGlvbi0tY3JlYXRlZC1ieVwiIHRpdGxlPVwie3sgc2luZ2xlUmVxdWVzdC5vd25lciB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc2luZ2xlUmVxdWVzdC5vd25lciB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtY29sdW1uLTIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tbC00IG0tci00XCIgdHJhbnNsYXRlPmluYHRlbmFudGA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2luZ2xlUmVxdWVzdC50ZW5hbnRJZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lIHx8ICFzaW5nbGVSZXF1ZXN0Lm93bmVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbHVtbi0zMFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIiB0cmFuc2xhdGU+Q3JlYXRlZCBpbmB0ZW5hbnRgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tMjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3QudGVuYW50SWQgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vTWFuYWdlbWVudD5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWNvbHVtbi01MFwiID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1sLTQgbS1yLTRcIiB0cmFuc2xhdGU+Q3JlYXRlZCBvbmBkYXRlYDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWN5PVwiZGV2aWNlLXJlZ2lzdHJhdGlvbi0tY3JlYXRpb24tZGF0ZVwiPnt7IHNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lIHwgYzh5RGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtY29sdW1uLTUwIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1sLTQgbS1yLTRcIiB0cmFuc2xhdGU+YnlgdXNlcmA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1jeT1cImRldmljZS1yZWdpc3RyYXRpb24tLWNyZWF0ZWQtYnlcIiB0aXRsZT1cInt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjOHktbG9hZC1tb3JlXG4gICAgICAgIFtwYWdpbmddPVwiZGV2aWNlUmVxdWVzdExpc3QucGFnaW5nXCJcbiAgICAgICAgW2hpZGRlbl09XCJ0cnVlXCJcbiAgICAgICAgKG9uTG9hZCk9XCJ1cGRhdGVMaXN0KCRldmVudClcIlxuICAgICAgPjwvYzh5LWxvYWQtbW9yZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSBtLXQtNDAgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPGgxIGNsYXNzPVwiYzh5LWljb24gYzh5LWljb24tZGV2aWNlLWNvbm5lY3QgYzh5LWljb24tZHVvY29sb3JcIj48L2gxPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGltaXRTdGF0dXM/LmlzUmVhY2hlZDsgZWxzZSBsaW1pdE5vdFJlYWNoZWRcIj5cbiAgICAgICAgICA8aDM+XG4gICAgICAgICAgICB7eyBsaW1pdFJlYWNoZWRJbmZvJCB8IGFzeW5jIH19XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8cCB0cmFuc2xhdGU+UGxlYXNlIGNvbnRhY3QgeW91ciBwbGF0Zm9ybSBhZG1pbmlzdHJhdG9yLjwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbGltaXROb3RSZWFjaGVkPlxuICAgICAgICAgIDxoMyB0cmFuc2xhdGU+Tm8gcGVuZGluZyByZWdpc3RyYXRpb25zIHRvIGRpc3BsYXkuPC9oMz5cbiAgICAgICAgICA8cCAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICBVc2UgdGhlIFwiUmVnaXN0ZXIgZGV2aWNlXCIgZHJvcGRvd24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==