@c8y/ngx-components 1017.0.68 → 1017.0.69

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.
@@ -157,7 +157,7 @@ export class FirmwareDetailsComponent {
157
157
  }
158
158
  }
159
159
  FirmwareDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: FirmwareDetailsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.InventoryService }, { token: i3.RepositoryService }, { token: i4.AlertService }, { token: i5.TranslateService }, { token: i4.ModalService }, { token: i6.BsModalService }, { token: i4.GainsightService }], target: i0.ɵɵFactoryTarget.Component });
160
- FirmwareDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: FirmwareDetailsComponent, selector: "c8y-firmware-details", ngImport: i0, template: "<c8y-title>\n {{ (firmware$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n icon=\"c8y-firmware\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ (firmware$ | async)?.name }}\"\n icon=\"c8y-firmware\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"!(isLegacy$ | async)\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"canAddPatchVersions$ | async\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n type=\"button\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | translate }}\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)=\"reload$.next()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <div class=\"card card--fullpage\">\n <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n <p>\n <small class=\"label label-info\">Firmware</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #nameInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.name\"\n #nameModel=\"ngModel\"\n placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length + 2 || 36 }\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #descriptionInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 36 }\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"\n updateFirmware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #deviceTypeInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.type?.length || 36 }\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"\n updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div class=\"card-title\" translate>Versions and patches</div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-firmware'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n </c8y-ui-empty-state>\n </div>\n\n <c8y-list-group *ngIf=\"(baseVersions$ | async)?.data.length > 0\">\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p class=\"text-truncate\" title=\"{{ baseVersion.c8y_Firmware.version }}\">\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>File</span>\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download\n url=\"{{ baseVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </span>\n </p>\n </div>\n <div class=\"col-2 d-flex a-i-start\">\n <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning m-l-auto-sm\">\n {{ 'Legacy' | translate }}\n </span>\n\n <span *ngIf=\"!(isLegacy$ | async)\">\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) === null\">\n <span class=\"label label-info\">\n <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n </span>\n </span>\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default m-l-auto-sm\">\n <span translate>No patches</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n count: getPatchVersionsCount$(baseVersion) | async\n }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n <div class=\"fit-h-20 visible-xs\" *ngIf=\"!(isLegacy$ | async)\">\n <button\n class=\"btn btn-default btn-sm m-t-8\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div *ngIf=\"!(isLegacy$ | async)\" class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [attr.aria-label]=\"'Delete' | translate\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n <c8y-li-collapse *ngIf=\"(getPatchVersions$(baseVersion) | async)?.data.length\">\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>File</span>\n <c8y-file-download\n url=\"{{ patchVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n (click)=\"deletePatchVersion(patchVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deletePatchVersion(patchVersion)\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [attr.aria-label]=\"'Delete' | translate\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i7.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i4.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i4.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i4.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i4.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i4.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i4.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i4.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i4.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i4.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i4.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i4.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "directive", type: i9.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: i10.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i3.FileDownloadComponent, selector: "c8y-file-download", inputs: ["url"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] });
160
+ FirmwareDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: FirmwareDetailsComponent, selector: "c8y-firmware-details", ngImport: i0, template: "<c8y-title>\n {{ (firmware$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n icon=\"c8y-firmware\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ (firmware$ | async)?.name }}\"\n icon=\"c8y-firmware\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"!(isLegacy$ | async)\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"canAddPatchVersions$ | async\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n type=\"button\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | translate }}\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)=\"reload$.next()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <div class=\"card card--fullpage\">\n <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n <p>\n <small class=\"label label-info\">Firmware</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #nameInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.name\"\n #nameModel=\"ngModel\"\n placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n data-cy=\"firmware-details--name-input\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length + 2 || 36 }\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--name-save-btn\"\n (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #descriptionInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n data-cy=\"firmware-details--description-input\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 36 }\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--description-save-btn\"\n (click)=\"\n updateFirmware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #deviceTypeInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n data-cy=\"firmware-details--device-type-filter-input\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.type?.length || 36 }\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--device-type-filter-save-btn\"\n (click)=\"\n updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div class=\"card-title\" translate>Versions and patches</div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-firmware'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n </c8y-ui-empty-state>\n </div>\n\n <c8y-list-group *ngIf=\"(baseVersions$ | async)?.data.length > 0\">\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p class=\"text-truncate\" title=\"{{ baseVersion.c8y_Firmware.version }}\">\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>File</span>\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download\n url=\"{{ baseVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </span>\n </p>\n </div>\n <div class=\"col-2 d-flex a-i-start\">\n <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning m-l-auto-sm\">\n {{ 'Legacy' | translate }}\n </span>\n\n <span *ngIf=\"!(isLegacy$ | async)\">\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) === null\">\n <span class=\"label label-info\">\n <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n </span>\n </span>\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default m-l-auto-sm\">\n <span translate>No patches</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n count: getPatchVersionsCount$(baseVersion) | async\n }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n <div class=\"fit-h-20 visible-xs\" *ngIf=\"!(isLegacy$ | async)\">\n <button\n class=\"btn btn-default btn-sm m-t-8\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div *ngIf=\"!(isLegacy$ | async)\" class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [attr.aria-label]=\"'Delete' | translate\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n <c8y-li-collapse *ngIf=\"(getPatchVersions$(baseVersion) | async)?.data.length\">\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>File</span>\n <c8y-file-download\n url=\"{{ patchVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n (click)=\"deletePatchVersion(patchVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deletePatchVersion(patchVersion)\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [attr.aria-label]=\"'Delete' | translate\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i7.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i4.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i4.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i4.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i4.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i4.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i4.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i4.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i4.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i4.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i4.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i4.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "directive", type: i9.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: i10.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i3.FileDownloadComponent, selector: "c8y-file-download", inputs: ["url"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] });
161
161
  __decorate([
162
162
  memoize(property('id')),
163
163
  __metadata("design:type", Function),
@@ -178,6 +178,6 @@ __decorate([
178
178
  ], FirmwareDetailsComponent.prototype, "getPatchVersions$", null);
179
179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: FirmwareDetailsComponent, decorators: [{
180
180
  type: Component,
181
- args: [{ selector: 'c8y-firmware-details', template: "<c8y-title>\n {{ (firmware$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n icon=\"c8y-firmware\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ (firmware$ | async)?.name }}\"\n icon=\"c8y-firmware\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"!(isLegacy$ | async)\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"canAddPatchVersions$ | async\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n type=\"button\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | translate }}\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)=\"reload$.next()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <div class=\"card card--fullpage\">\n <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n <p>\n <small class=\"label label-info\">Firmware</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #nameInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.name\"\n #nameModel=\"ngModel\"\n placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length + 2 || 36 }\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #descriptionInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 36 }\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"\n updateFirmware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #deviceTypeInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.type?.length || 36 }\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"\n updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div class=\"card-title\" translate>Versions and patches</div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-firmware'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n </c8y-ui-empty-state>\n </div>\n\n <c8y-list-group *ngIf=\"(baseVersions$ | async)?.data.length > 0\">\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p class=\"text-truncate\" title=\"{{ baseVersion.c8y_Firmware.version }}\">\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>File</span>\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download\n url=\"{{ baseVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </span>\n </p>\n </div>\n <div class=\"col-2 d-flex a-i-start\">\n <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning m-l-auto-sm\">\n {{ 'Legacy' | translate }}\n </span>\n\n <span *ngIf=\"!(isLegacy$ | async)\">\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) === null\">\n <span class=\"label label-info\">\n <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n </span>\n </span>\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default m-l-auto-sm\">\n <span translate>No patches</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n count: getPatchVersionsCount$(baseVersion) | async\n }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n <div class=\"fit-h-20 visible-xs\" *ngIf=\"!(isLegacy$ | async)\">\n <button\n class=\"btn btn-default btn-sm m-t-8\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div *ngIf=\"!(isLegacy$ | async)\" class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [attr.aria-label]=\"'Delete' | translate\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n <c8y-li-collapse *ngIf=\"(getPatchVersions$(baseVersion) | async)?.data.length\">\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>File</span>\n <c8y-file-download\n url=\"{{ patchVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n (click)=\"deletePatchVersion(patchVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deletePatchVersion(patchVersion)\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [attr.aria-label]=\"'Delete' | translate\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
181
+ args: [{ selector: 'c8y-firmware-details', template: "<c8y-title>\n {{ (firmware$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n icon=\"c8y-firmware\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ (firmware$ | async)?.name }}\"\n icon=\"c8y-firmware\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"!(isLegacy$ | async)\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"canAddPatchVersions$ | async\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n type=\"button\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | translate }}\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)=\"reload$.next()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <div class=\"card card--fullpage\">\n <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n <p>\n <small class=\"label label-info\">Firmware</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #nameInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.name\"\n #nameModel=\"ngModel\"\n placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n data-cy=\"firmware-details--name-input\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length + 2 || 36 }\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--name-save-btn\"\n (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #descriptionInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n data-cy=\"firmware-details--description-input\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 36 }\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--description-save-btn\"\n (click)=\"\n updateFirmware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #deviceTypeInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n data-cy=\"firmware-details--device-type-filter-input\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.type?.length || 36 }\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--device-type-filter-save-btn\"\n (click)=\"\n updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div class=\"card-title\" translate>Versions and patches</div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-firmware'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n </c8y-ui-empty-state>\n </div>\n\n <c8y-list-group *ngIf=\"(baseVersions$ | async)?.data.length > 0\">\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p class=\"text-truncate\" title=\"{{ baseVersion.c8y_Firmware.version }}\">\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>File</span>\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download\n url=\"{{ baseVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </span>\n </p>\n </div>\n <div class=\"col-2 d-flex a-i-start\">\n <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning m-l-auto-sm\">\n {{ 'Legacy' | translate }}\n </span>\n\n <span *ngIf=\"!(isLegacy$ | async)\">\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) === null\">\n <span class=\"label label-info\">\n <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n </span>\n </span>\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default m-l-auto-sm\">\n <span translate>No patches</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n count: getPatchVersionsCount$(baseVersion) | async\n }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n <div class=\"fit-h-20 visible-xs\" *ngIf=\"!(isLegacy$ | async)\">\n <button\n class=\"btn btn-default btn-sm m-t-8\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div *ngIf=\"!(isLegacy$ | async)\" class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [attr.aria-label]=\"'Delete' | translate\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n <c8y-li-collapse *ngIf=\"(getPatchVersions$(baseVersion) | async)?.data.length\">\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>File</span>\n <c8y-file-download\n url=\"{{ patchVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n (click)=\"deletePatchVersion(patchVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deletePatchVersion(patchVersion)\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [attr.aria-label]=\"'Delete' | translate\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
182
182
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.InventoryService }, { type: i3.RepositoryService }, { type: i4.AlertService }, { type: i5.TranslateService }, { type: i4.ModalService }, { type: i6.BsModalService }, { type: i4.GainsightService }]; }, propDecorators: { getPatchVersionsCount$: [], getBinaryName$: [], getPatchVersions$: [] } });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlybXdhcmUtZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L2Zpcm13YXJlL2xpc3QvZmlybXdhcmUtZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L2Zpcm13YXJlL2xpc3QvZmlybXdhcmUtZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBa0IsZ0JBQWdCLEVBQWUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUNMLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLEVBQ1osTUFBTSxFQUNQLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUVMLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDbEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQWdCLE1BQU0scUJBQXFCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekYsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxjQUFjLEVBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0Ms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b3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UsIElSZXN1bHRMaXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBHYWluc2lnaHRTZXJ2aWNlLFxuICBnZXR0ZXh0LFxuICBtZW1vaXplLFxuICBNb2RhbFNlcnZpY2UsXG4gIFN0YXR1c1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIEZpcm13YXJlQmluYXJ5LFxuICBQUk9EVUNUX0VYUEVSSUVOQ0UsXG4gIFJlcG9zaXRvcnlTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS9zaGFyZWQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UsIE1vZGFsT3B0aW9ucyB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBkZWZlciwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB3aXRoTGF0ZXN0RnJvbVxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBZGRGaXJtd2FyZU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9hZGQtZmlybXdhcmUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IEFkZEZpcm13YXJlUGF0Y2hNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vYWRkLWZpcm13YXJlLXBhdGNoLW1vZGFsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1maXJtd2FyZS1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zpcm13YXJlLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEZpcm13YXJlRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcmVsb2FkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHJlbG9hZGluZyQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHVwZGF0ZUZpcm13YXJlJDogU3ViamVjdDxQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0Pj4gPSBuZXcgU3ViamVjdCgpO1xuICBmaXJtd2FyZVVwZGF0ZWQkOiBTdWJqZWN0PElNYW5hZ2VkT2JqZWN0PiA9IG5ldyBTdWJqZWN0KCk7XG4gIGJhc2VWZXJzaW9uc1VwZGF0ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcGF0Y2hWZXJzaW9uc1VwZGF0ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBmaXJtd2FyZSQ6IE9ic2VydmFibGU8SU1hbmFnZWRPYmplY3Q+ID0gbWVyZ2UoXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5wYXJhbXMucGlwZShcbiAgICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLmlkKSxcbiAgICAgIHN3aXRjaE1hcChpZCA9PiBkZWZlcigoKSA9PiB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpKVxuICAgICksXG4gICAgdGhpcy5yZWxvYWQkLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5yZWxvYWRpbmckLm5leHQodHJ1ZSkpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYWN0aXZhdGVkUm91dGUucGFyYW1zKSxcbiAgICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLmlkKSxcbiAgICAgIHN3aXRjaE1hcChpZCA9PiBkZWZlcigoKSA9PiB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnJlbG9hZGluZyQubmV4dChmYWxzZSkpXG4gICAgKSxcbiAgICB0aGlzLmZpcm13YXJlVXBkYXRlZCRcbiAgKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICBiYXNlVmVyc2lvbnMkOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pj4gPSBtZXJnZShcbiAgICB0aGlzLmZpcm13YXJlJC5waXBlKGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkKCdpZCcpKSxcbiAgICB0aGlzLmJhc2VWZXJzaW9uc1VwZGF0ZWQkLFxuICAgIHRoaXMucGF0Y2hWZXJzaW9uc1VwZGF0ZWQkLFxuICAgIHRoaXMucmVsb2FkJFxuICApLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZmlybXdhcmUkKSxcbiAgICBzd2l0Y2hNYXAoZmlybXdhcmUgPT4gdGhpcy5yZXBvc2l0b3J5U2VydmljZS5saXN0QmFzZVZlcnNpb25zKGZpcm13YXJlKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBpc0xlZ2FjeSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmZpcm13YXJlJC5waXBlKFxuICAgIG1hcChmaXJtd2FyZSA9PiB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmlzTGVnYWN5RW50cnkoZmlybXdhcmUpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIGNhbkFkZFBhdGNoVmVyc2lvbnMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gY29tYmluZUxhdGVzdChcbiAgICB0aGlzLmlzTGVnYWN5JCxcbiAgICB0aGlzLmJhc2VWZXJzaW9ucyQucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhLmxlbmd0aCA+IDApKVxuICApLnBpcGUobWFwKChbaXNMZWdhY3ksIGhhc0Jhc2VWZXJzaW9uc10pID0+ICFpc0xlZ2FjeSAmJiBoYXNCYXNlVmVyc2lvbnMpKTtcblxuICBleHBhbmRlZDogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gIGRlc3Ryb3kkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXBvc2l0b3J5U2VydmljZTogUmVwb3NpdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGJzTW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXBkYXRlRmlybXdhcmUkXG4gICAgICAucGlwZShcbiAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5maXJtd2FyZSQpLFxuICAgICAgICBzd2l0Y2hNYXAoKFtmaXJtd2FyZVBhcnRpYWwsIGZpcm13YXJlXSkgPT5cbiAgICAgICAgICB0aGlzLmludmVudG9yeVNlcnZpY2UudXBkYXRlKHtcbiAgICAgICAgICAgIGlkOiBmaXJtd2FyZS5pZCxcbiAgICAgICAgICAgIC4uLmZpcm13YXJlUGFydGlhbFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpLFxuICAgICAgICB0YXAoZmlybXdhcmUgPT4gdGhpcy5maXJtd2FyZVVwZGF0ZWQkLm5leHQoZmlybXdhcmUpKSxcbiAgICAgICAgdGFwKCgpID0+XG4gICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChQUk9EVUNUX0VYUEVSSUVOQ0UuRklSTVdBUkUuRVZFTlRTLlJFUE9TSVRPUlksIHtcbiAgICAgICAgICAgIHJlc3VsdDogUFJPRFVDVF9FWFBFUklFTkNFLkZJUk1XQVJFLlJFU1VMVFMuRURJVF9GSVJNV0FSRVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1NhdmVkLicpKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgQG1lbW9pemUocHJvcGVydHkoJ2lkJykpXG4gIGdldFBhdGNoVmVyc2lvbnNDb3VudCQoYmFzZVZlcnNpb246IEZpcm13YXJlQmluYXJ5KSB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgdGhpcy5maXJtd2FyZSQucGlwZShkaXN0aW5jdFVudGlsS2V5Q2hhbmdlZCgnaWQnKSksXG4gICAgICB0aGlzLmJhc2VWZXJzaW9uc1VwZGF0ZWQkLFxuICAgICAgdGhpcy5wYXRjaFZlcnNpb25zVXBkYXRlZCQsXG4gICAgICB0aGlzLnJlbG9hZCRcbiAgICApLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5maXJtd2FyZSQpLFxuICAgICAgc3dpdGNoTWFwKGZpcm13YXJlID0+IHRoaXMucmVwb3NpdG9yeVNlcnZpY2UuZ2V0UGF0Y2hWZXJzaW9uc0NvdW50JChmaXJtd2FyZSwgYmFzZVZlcnNpb24pKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplKClcbiAgZ2V0QmluYXJ5TmFtZSQoYmluYXJ5VXJsKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3NpdG9yeVNlcnZpY2UuZ2V0QmluYXJ5TmFtZSQoYmluYXJ5VXJsKTtcbiAgfVxuXG4gIEBtZW1vaXplKHByb3BlcnR5KCdpZCcpKVxuICBnZXRQYXRjaFZlcnNpb25zJChiYXNlVmVyc2lvbikge1xuICAgIHJldHVybiBtZXJnZShcbiAgICAgIHRoaXMuZmlybXdhcmUkLnBpcGUoZGlzdGluY3RVbnRpbEtleUNoYW5nZWQoJ2lkJykpLFxuICAgICAgdGhpcy5wYXRjaFZlcnNpb25zVXBkYXRlZCQsXG4gICAgICB0aGlzLnJlbG9hZCRcbiAgICApLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5maXJtd2FyZSQpLFxuICAgICAgc3dpdGNoTWFwKGZpcm13YXJlID0+IHRoaXMucmVwb3NpdG9yeVNlcnZpY2UubGlzdFBhdGNoVmVyc2lvbnMoZmlybXdhcmUsIGJhc2VWZXJzaW9uKSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gIH1cblxuICBhZGRCYXNlVmVyc2lvbigpIHtcbiAgICB0aGlzLmZpcm13YXJlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcChmaXJtd2FyZSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGZpcm13YXJlLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZmlybXdhcmUuZGVzY3JpcHRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzogTW9kYWxPcHRpb25zPEFkZEZpcm13YXJlTW9kYWxDb21wb25lbnQ+ID0ge1xuICAgICAgICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnYWRkRmlybXdhcmVNb2RhbERlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnYWRkRmlybXdhcmVNb2RhbFRpdGxlJyxcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQWRkRmlybXdhcmVNb2RhbENvbXBvbmVudCwgY29uZmlnKTtcbiAgICAgICAgICByZXR1cm4gbW9kYWxSZWYuY29udGVudC5zYXZlZDtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5iYXNlVmVyc2lvbnNVcGRhdGVkJC5uZXh0KCkpO1xuICB9XG5cbiAgYWRkUGF0Y2hWZXJzaW9uKCkge1xuICAgIHRoaXMuZmlybXdhcmUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKGZpcm13YXJlID0+IHtcbiAgICAgICAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgICBzZWxlY3RlZDogZmlybXdhcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzogTW9kYWxPcHRpb25zPEFkZEZpcm13YXJlUGF0Y2hNb2RhbENvbXBvbmVudD4gPSB7XG4gICAgICAgICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgICAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBhcmlhRGVzY3JpYmVkYnk6ICdhZGRGaXJtd2FyZVBhdGNoTW9kYWxEZXNjcmlwdGlvbicsXG4gICAgICAgICAgICBhcmlhTGFiZWxsZWRCeTogJ2FkZEZpcm13YXJlUGF0Y2hNb2RhbFRpdGxlJyxcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQWRkRmlybXdhcmVQYXRjaE1vZGFsQ29tcG9uZW50LCBjb25maWcpO1xuICAgICAgICAgIHJldHVybiBtb2RhbFJlZi5jb250ZW50LnNhdmVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnBhdGNoVmVyc2lvbnNVcGRhdGVkJC5uZXh0KCkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQmFzZVZlcnNpb24oYmFzZVZlcnNpb246IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRpdGxlID0gZ2V0dGV4dCgnRGVsZXRlIGZpcm13YXJlJyk7XG4gICAgICBjb25zdCBib2R5ID0gYFxuICAgICAgICAke3RoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgIGdldHRleHQoJ1lvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGZpcm13YXJlIHt7IHZlcnNpb24gfX0gd2l0aCBhbGwgaXRzIHBhdGNoZXMuJyksXG4gICAgICAgICAgeyB2ZXJzaW9uOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbiB9XG4gICAgICAgICl9XG4gICAgICAgICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnVGhpcyBvcGVyYXRpb24gaXMgaXJyZXZlcnNpYmxlLicpKX1cbiAgICAgICAgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpKX1cbiAgICAgIGA7XG4gICAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIG9rOiBnZXR0ZXh0KCdEZWxldGUnKVxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBib2R5LFxuICAgICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAgICBsYWJlbHMsXG4gICAgICAgIHt9LFxuICAgICAgICB7IGV2ZW50TmFtZTogUFJPRFVDVF9FWFBFUklFTkNFLkZJUk1XQVJFLkVWRU5UUy5SRVBPU0lUT1JZIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmRlbGV0ZShiYXNlVmVyc2lvbik7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0Zpcm13YXJlIGRlbGV0ZWQuJykpO1xuICAgICAgdGhpcy5iYXNlVmVyc2lvbnNVcGRhdGVkJC5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIG9ubHkgaWYgbm90IGNhbmNlbCBmcm9tIG1vZGFsXG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlUGF0Y2hWZXJzaW9uKHBhdGNoVmVyc2lvbjogSU1hbmFnZWRPYmplY3QpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGl0bGUgPSBnZXR0ZXh0KCdEZWxldGUgZmlybXdhcmUgcGF0Y2gnKTtcbiAgICAgIGNvbnN0IGJvZHkgPSBgXG4gICAgICAgICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgZ2V0dGV4dCgnWW91IGFyZSBhYm91dCB0byBkZWxldGUgZmlybXdhcmUgcGF0Y2gge3sgdmVyc2lvbiB9fS4nKSxcbiAgICAgICAgICB7IHZlcnNpb246IHBhdGNoVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbiB9XG4gICAgICAgICl9XG4gICAgICAgICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnVGhpcyBvcGVyYXRpb24gaXMgaXJyZXZlcnNpYmxlLicpKX1cbiAgICAgICAgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpKX1cbiAgICAgIGA7XG4gICAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIG9rOiBnZXR0ZXh0KCdEZWxldGUnKVxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBib2R5LFxuICAgICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAgICBsYWJlbHMsXG4gICAgICAgIHt9LFxuICAgICAgICB7IGV2ZW50TmFtZTogUFJPRFVDVF9FWFBFUklFTkNFLkZJUk1XQVJFLkVWRU5UUy5SRVBPU0lUT1JZIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmRlbGV0ZShwYXRjaFZlcnNpb24pO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdGaXJtd2FyZSBwYXRjaCBkZWxldGVkLicpKTtcbiAgICAgIHRoaXMucGF0Y2hWZXJzaW9uc1VwZGF0ZWQkLm5leHQoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgLy8gb25seSBpZiBub3QgY2FuY2VsIGZyb20gbW9kYWxcbiAgICAgIGlmIChleCkge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPlxuICB7eyAoZmlybXdhcmUkIHwgYXN5bmMpPy5uYW1lIH19XG48L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIGxhYmVsPVwie3sgJ01hbmFnZW1lbnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICBpY29uPVwiYzh5LW1hbmFnZW1lbnRcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIHBhdGg9XCIjL2Zpcm13YXJlXCJcbiAgICBsYWJlbD1cInt7ICdGaXJtd2FyZSByZXBvc2l0b3J5JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgaWNvbj1cImM4eS1maXJtd2FyZVwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgbGFiZWw9XCJ7eyAoZmlybXdhcmUkIHwgYXN5bmMpPy5uYW1lIH19XCJcbiAgICBpY29uPVwiYzh5LWZpcm13YXJlXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCIhKGlzTGVnYWN5JCB8IGFzeW5jKVwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIHRpdGxlPVwie3sgJ0FkZCBmaXJtd2FyZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJhZGRCYXNlVmVyc2lvbigpXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJwbHVzLWNpcmNsZVwiPjwvaT5cbiAgICB7eyAnQWRkIGZpcm13YXJlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICAqbmdJZj1cImNhbkFkZFBhdGNoVmVyc2lvbnMkIHwgYXN5bmNcIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdBZGQgZmlybXdhcmUgcGF0Y2gnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwiYWRkUGF0Y2hWZXJzaW9uKClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCI+PC9pPlxuICAgIHt7ICdBZGQgZmlybXdhcmUgcGF0Y2gnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwicmVsb2FkJC5uZXh0KClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInJlZnJlc2hcIiBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiByZWxvYWRpbmckIHwgYXN5bmMgfVwiPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIGNvbC1sZy1tYXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLS1mdWxscGFnZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgYmctbGV2ZWwtMSBmbGV4LW5vLXNocmluayBwLXQtMjQgcC1iLTI0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZsZXgtNzBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYzh5LWljb24tZHVvY29sb3IgaWNvbi00OCBjOHktaWNvbiBjOHktaWNvbi1maXJtd2FyZVwiPjwvaT5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+RmlybXdhcmU8L3NtYWxsPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3cgY29sLTEwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ05hbWUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICNuYW1lSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihmaXJtd2FyZSQgfCBhc3luYyk/Lm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICNuYW1lTW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIE15IGZpcm13YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGguY2gnOiAoZmlybXdhcmUkIHwgYXN5bmMpPy5uYW1lPy5sZW5ndGggKyAyIHx8IDM2IH1cIlxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZUZpcm13YXJlJC5uZXh0KHsgbmFtZTogbmFtZUlucHV0LnZhbHVlIH0pOyBuYW1lTW9kZWwucmVzZXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmFtZUlucHV0LnZhbHVlLmxlbmd0aCA9PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICNkZXNjcmlwdGlvbklucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoZmlybXdhcmUkIHwgYXN5bmMpPy5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgI2Rlc2NyaXB0aW9uTW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIEZpcm13YXJlIGZvciBoYXJkd2FyZSByZXZpc2lvbiBiJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGguY2gnOiAoZmlybXdhcmUkIHwgYXN5bmMpPy5kZXNjcmlwdGlvbj8ubGVuZ3RoIHx8IDM2IH1cIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmlybXdhcmUkLm5leHQoeyBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25JbnB1dC52YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25Nb2RlbC5yZXNldCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdEZXZpY2UgdHlwZSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHBcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIHBvcG92ZXI9XCJ7e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHRoZSBmaWx0ZXIgaXMgc2V0LCB0aGUgZmlybXdhcmUgd2lsbCBzaG93IHVwIGZvciBpbnN0YWxsYXRpb24gb25seSBmb3IgZGV2aWNlcyBvZiB0aGF0IHR5cGUuIElmIG5vIGZpbHRlciBpcyBzZXQsIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGZvciBhbGwgZGV2aWNlcy4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJxdWVzdGlvbi1jaXJjbGUtb1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICNkZXZpY2VUeXBlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihmaXJtd2FyZSQgfCBhc3luYyk/LmM4eV9GaWx0ZXI/LnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICNkZXZpY2VUeXBlTW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuJyB8IHRyYW5zbGF0ZSB9fSBjOHlfTGludXhcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoLmNoJzogKGZpcm13YXJlJCB8IGFzeW5jKT8udHlwZT8ubGVuZ3RoIHx8IDM2IH1cIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmlybXdhcmUkLm5leHQoeyBjOHlfRmlsdGVyOiB7IHR5cGU6IGRldmljZVR5cGVJbnB1dC52YWx1ZSB9IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlTW9kZWwucmVzZXQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgc2VwYXJhdG9yLXRvcC1ib3R0b20gYmctY29tcG9uZW50IHN0aWNreS10b3BcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiIHRyYW5zbGF0ZT5WZXJzaW9ucyBhbmQgcGF0Y2hlczwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBwLXQtMCBwLWItMjRcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGJhc2VWZXJzaW9ucyQgfCBhc3luYyk/LmRhdGEubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICAgIFtpY29uXT1cIidjOHktZmlybXdhcmUnXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidObyB2ZXJzaW9ucyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbc3VidGl0bGVdPVwiJ0FkZCBhIG5ldyB2ZXJzaW9uIGJ5IGNsaWNraW5nIGJlbG93LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdCBtLXQtOFwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIGZpcm13YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEJhc2VWZXJzaW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICAgIHt7ICdBZGQgZmlybXdhcmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9jOHktdWktZW1wdHktc3RhdGU+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8Yzh5LWxpc3QtZ3JvdXAgKm5nSWY9XCIoYmFzZVZlcnNpb25zJCB8IGFzeW5jKT8uZGF0YS5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8Yzh5LWxpXG4gICAgICAgICAgICAgICpjOHlGb3I9XCJsZXQgYmFzZVZlcnNpb24gb2YgYmFzZVZlcnNpb25zJCB8IGFzeW5jOyBsZXQgaSA9IGluZGV4OyBsb2FkTW9yZTogJ2F1dG8nXCJcbiAgICAgICAgICAgICAgW2VtcHR5QWN0aW9uc109XCIhKGdldFBhdGNoVmVyc2lvbnMkKGJhc2VWZXJzaW9uKSB8IGFzeW5jKT8uZGF0YS5sZW5ndGhcIlxuICAgICAgICAgICAgICBbY29sbGFwc2VkXT1cIiFleHBhbmRlZFtiYXNlVmVyc2lvbi5pZF1cIlxuICAgICAgICAgICAgICAoY29sbGFwc2VkQ2hhbmdlKT1cImV4cGFuZGVkW2Jhc2VWZXJzaW9uLmlkXSA9ICEkZXZlbnRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Yzh5LWxpLWljb24+XG4gICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImM4eS1maXJtd2FyZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9jOHktbGktaWNvbj5cblxuICAgICAgICAgICAgICA8Yzh5LWxpLWJvZHkgY2xhc3M9XCJjb250ZW50LWZsZXgtNTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiIHRpdGxlPVwie3sgYmFzZVZlcnNpb24uYzh5X0Zpcm13YXJlLnZlcnNpb24gfX1cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgYmFzZVZlcnNpb24uYzh5X0Zpcm13YXJlLnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTVcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1yLThcIiB0cmFuc2xhdGU+RmlsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9XCJ7eyBnZXRCaW5hcnlOYW1lJChiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudXJsKSB8IGFzeW5jIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGM4eS1maWxlLWRvd25sb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw9XCJ7eyBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudXJsIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9jOHktZmlsZS1kb3dubG9hZD5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBkLWZsZXggYS1pLXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzTGVnYWN5JCB8IGFzeW5jXCIgY2xhc3M9XCJsYWJlbCBsYWJlbC13YXJuaW5nIG0tbC1hdXRvLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdMZWdhY3knIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIShpc0xlZ2FjeSQgfCBhc3luYylcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIoZ2V0UGF0Y2hWZXJzaW9uc0NvdW50JChiYXNlVmVyc2lvbikgfCBhc3luYykgPT09IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJjaXJjbGUtby1ub3RjaFwiIGNsYXNzPVwiaWNvbi1zcGluXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIihnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jKSAhPT0gbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ1BsdXJhbF09XCJnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1kZWZhdWx0IG0tbC1hdXRvLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk5vIHBhdGNoZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPjEgcGF0Y2g8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwib3RoZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb3VudCB9fSBwYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXQtaC0yMCB2aXNpYmxlLXhzXCIgKm5nSWY9XCIhKGlzTGVnYWN5JCB8IGFzeW5jKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gbS10LThcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQmFzZVZlcnNpb24oYmFzZVZlcnNpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiEoaXNMZWdhY3kkIHwgYXN5bmMpXCIgY2xhc3M9XCJtLWwtYXV0byBmaXQtaC0yMCBwLXItOCBoaWRkZW4teHNcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tZG90LS1kYW5nZXIgc2hvd09uSG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQmFzZVZlcnNpb24oYmFzZVZlcnNpb24pXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2M4eS1saS1ib2R5PlxuICAgICAgICAgICAgICA8Yzh5LWxpLWNvbGxhcHNlICpuZ0lmPVwiKGdldFBhdGNoVmVyc2lvbnMkKGJhc2VWZXJzaW9uKSB8IGFzeW5jKT8uZGF0YS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LWxpc3QtZ3JvdXAgY2xhc3M9XCJzZXBhcmF0b3ItdG9wXCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWxpXG4gICAgICAgICAgICAgICAgICAgICpjOHlGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0Y2hWZXJzaW9uIG9mIGdldFBhdGNoVmVyc2lvbnMkKGJhc2VWZXJzaW9uKSB8IGFzeW5jO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgbG9hZE1vcmU6ICdhdXRvJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Yzh5LWxpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImM4eS1maXJtd2FyZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9jOHktbGktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1saS1ib2R5IGNsYXNzPVwiY29udGVudC1mbGV4LTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwYXRjaFZlcnNpb24uYzh5X0Zpcm13YXJlLnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXItOFwiIHRyYW5zbGF0ZT5GaWxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Yzh5LWZpbGUtZG93bmxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw9XCJ7eyBwYXRjaFZlcnNpb24uYzh5X0Zpcm13YXJlLnVybCB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2M4eS1maWxlLWRvd25sb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpc2libGUteHMgbS10LThcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRhbmdlciBidG4teHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUGF0Y2hWZXJzaW9uKHBhdGNoVmVyc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG8gcC1yLTggaGlkZGVuLXhzIGZpdC1oLTIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgdGV4dC1kYW5nZXIgc2hvd09uSG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUGF0Y2hWZXJzaW9uKHBhdGNoVmVyc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYzh5LWxpLWJvZHk+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgICAgICA8L2M4eS1saXN0LWdyb3VwPlxuICAgICAgICAgICAgICA8L2M4eS1saS1jb2xsYXBzZT5cbiAgICAgICAgICAgIDwvYzh5LWxpPlxuICAgICAgICAgIDwvYzh5LWxpc3QtZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlybXdhcmUtZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L2Zpcm13YXJlL2xpc3QvZmlybXdhcmUtZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L2Zpcm13YXJlL2xpc3QvZmlybXdhcmUtZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBa0IsZ0JBQWdCLEVBQWUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUNMLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLEVBQ1osTUFBTSxFQUNQLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUVMLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDbEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQWdCLE1BQU0scUJBQXFCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekYsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxjQUFjLEVBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0Ms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b3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UsIElSZXN1bHRMaXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBHYWluc2lnaHRTZXJ2aWNlLFxuICBnZXR0ZXh0LFxuICBtZW1vaXplLFxuICBNb2RhbFNlcnZpY2UsXG4gIFN0YXR1c1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIEZpcm13YXJlQmluYXJ5LFxuICBQUk9EVUNUX0VYUEVSSUVOQ0UsXG4gIFJlcG9zaXRvcnlTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS9zaGFyZWQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UsIE1vZGFsT3B0aW9ucyB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBkZWZlciwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB3aXRoTGF0ZXN0RnJvbVxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBZGRGaXJtd2FyZU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9hZGQtZmlybXdhcmUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IEFkZEZpcm13YXJlUGF0Y2hNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vYWRkLWZpcm13YXJlLXBhdGNoLW1vZGFsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1maXJtd2FyZS1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zpcm13YXJlLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEZpcm13YXJlRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcmVsb2FkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHJlbG9hZGluZyQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHVwZGF0ZUZpcm13YXJlJDogU3ViamVjdDxQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0Pj4gPSBuZXcgU3ViamVjdCgpO1xuICBmaXJtd2FyZVVwZGF0ZWQkOiBTdWJqZWN0PElNYW5hZ2VkT2JqZWN0PiA9IG5ldyBTdWJqZWN0KCk7XG4gIGJhc2VWZXJzaW9uc1VwZGF0ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcGF0Y2hWZXJzaW9uc1VwZGF0ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBmaXJtd2FyZSQ6IE9ic2VydmFibGU8SU1hbmFnZWRPYmplY3Q+ID0gbWVyZ2UoXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5wYXJhbXMucGlwZShcbiAgICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLmlkKSxcbiAgICAgIHN3aXRjaE1hcChpZCA9PiBkZWZlcigoKSA9PiB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpKVxuICAgICksXG4gICAgdGhpcy5yZWxvYWQkLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5yZWxvYWRpbmckLm5leHQodHJ1ZSkpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYWN0aXZhdGVkUm91dGUucGFyYW1zKSxcbiAgICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLmlkKSxcbiAgICAgIHN3aXRjaE1hcChpZCA9PiBkZWZlcigoKSA9PiB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnJlbG9hZGluZyQubmV4dChmYWxzZSkpXG4gICAgKSxcbiAgICB0aGlzLmZpcm13YXJlVXBkYXRlZCRcbiAgKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICBiYXNlVmVyc2lvbnMkOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pj4gPSBtZXJnZShcbiAgICB0aGlzLmZpcm13YXJlJC5waXBlKGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkKCdpZCcpKSxcbiAgICB0aGlzLmJhc2VWZXJzaW9uc1VwZGF0ZWQkLFxuICAgIHRoaXMucGF0Y2hWZXJzaW9uc1VwZGF0ZWQkLFxuICAgIHRoaXMucmVsb2FkJFxuICApLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZmlybXdhcmUkKSxcbiAgICBzd2l0Y2hNYXAoZmlybXdhcmUgPT4gdGhpcy5yZXBvc2l0b3J5U2VydmljZS5saXN0QmFzZVZlcnNpb25zKGZpcm13YXJlKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBpc0xlZ2FjeSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmZpcm13YXJlJC5waXBlKFxuICAgIG1hcChmaXJtd2FyZSA9PiB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmlzTGVnYWN5RW50cnkoZmlybXdhcmUpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIGNhbkFkZFBhdGNoVmVyc2lvbnMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gY29tYmluZUxhdGVzdChcbiAgICB0aGlzLmlzTGVnYWN5JCxcbiAgICB0aGlzLmJhc2VWZXJzaW9ucyQucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhLmxlbmd0aCA+IDApKVxuICApLnBpcGUobWFwKChbaXNMZWdhY3ksIGhhc0Jhc2VWZXJzaW9uc10pID0+ICFpc0xlZ2FjeSAmJiBoYXNCYXNlVmVyc2lvbnMpKTtcblxuICBleHBhbmRlZDogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gIGRlc3Ryb3kkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXBvc2l0b3J5U2VydmljZTogUmVwb3NpdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGJzTW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXBkYXRlRmlybXdhcmUkXG4gICAgICAucGlwZShcbiAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5maXJtd2FyZSQpLFxuICAgICAgICBzd2l0Y2hNYXAoKFtmaXJtd2FyZVBhcnRpYWwsIGZpcm13YXJlXSkgPT5cbiAgICAgICAgICB0aGlzLmludmVudG9yeVNlcnZpY2UudXBkYXRlKHtcbiAgICAgICAgICAgIGlkOiBmaXJtd2FyZS5pZCxcbiAgICAgICAgICAgIC4uLmZpcm13YXJlUGFydGlhbFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpLFxuICAgICAgICB0YXAoZmlybXdhcmUgPT4gdGhpcy5maXJtd2FyZVVwZGF0ZWQkLm5leHQoZmlybXdhcmUpKSxcbiAgICAgICAgdGFwKCgpID0+XG4gICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChQUk9EVUNUX0VYUEVSSUVOQ0UuRklSTVdBUkUuRVZFTlRTLlJFUE9TSVRPUlksIHtcbiAgICAgICAgICAgIHJlc3VsdDogUFJPRFVDVF9FWFBFUklFTkNFLkZJUk1XQVJFLlJFU1VMVFMuRURJVF9GSVJNV0FSRVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1NhdmVkLicpKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgQG1lbW9pemUocHJvcGVydHkoJ2lkJykpXG4gIGdldFBhdGNoVmVyc2lvbnNDb3VudCQoYmFzZVZlcnNpb246IEZpcm13YXJlQmluYXJ5KSB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgdGhpcy5maXJtd2FyZSQucGlwZShkaXN0aW5jdFVudGlsS2V5Q2hhbmdlZCgnaWQnKSksXG4gICAgICB0aGlzLmJhc2VWZXJzaW9uc1VwZGF0ZWQkLFxuICAgICAgdGhpcy5wYXRjaFZlcnNpb25zVXBkYXRlZCQsXG4gICAgICB0aGlzLnJlbG9hZCRcbiAgICApLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5maXJtd2FyZSQpLFxuICAgICAgc3dpdGNoTWFwKGZpcm13YXJlID0+IHRoaXMucmVwb3NpdG9yeVNlcnZpY2UuZ2V0UGF0Y2hWZXJzaW9uc0NvdW50JChmaXJtd2FyZSwgYmFzZVZlcnNpb24pKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplKClcbiAgZ2V0QmluYXJ5TmFtZSQoYmluYXJ5VXJsKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3NpdG9yeVNlcnZpY2UuZ2V0QmluYXJ5TmFtZSQoYmluYXJ5VXJsKTtcbiAgfVxuXG4gIEBtZW1vaXplKHByb3BlcnR5KCdpZCcpKVxuICBnZXRQYXRjaFZlcnNpb25zJChiYXNlVmVyc2lvbikge1xuICAgIHJldHVybiBtZXJnZShcbiAgICAgIHRoaXMuZmlybXdhcmUkLnBpcGUoZGlzdGluY3RVbnRpbEtleUNoYW5nZWQoJ2lkJykpLFxuICAgICAgdGhpcy5wYXRjaFZlcnNpb25zVXBkYXRlZCQsXG4gICAgICB0aGlzLnJlbG9hZCRcbiAgICApLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5maXJtd2FyZSQpLFxuICAgICAgc3dpdGNoTWFwKGZpcm13YXJlID0+IHRoaXMucmVwb3NpdG9yeVNlcnZpY2UubGlzdFBhdGNoVmVyc2lvbnMoZmlybXdhcmUsIGJhc2VWZXJzaW9uKSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gIH1cblxuICBhZGRCYXNlVmVyc2lvbigpIHtcbiAgICB0aGlzLmZpcm13YXJlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcChmaXJtd2FyZSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGZpcm13YXJlLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZmlybXdhcmUuZGVzY3JpcHRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzogTW9kYWxPcHRpb25zPEFkZEZpcm13YXJlTW9kYWxDb21wb25lbnQ+ID0ge1xuICAgICAgICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnYWRkRmlybXdhcmVNb2RhbERlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnYWRkRmlybXdhcmVNb2RhbFRpdGxlJyxcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQWRkRmlybXdhcmVNb2RhbENvbXBvbmVudCwgY29uZmlnKTtcbiAgICAgICAgICByZXR1cm4gbW9kYWxSZWYuY29udGVudC5zYXZlZDtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5iYXNlVmVyc2lvbnNVcGRhdGVkJC5uZXh0KCkpO1xuICB9XG5cbiAgYWRkUGF0Y2hWZXJzaW9uKCkge1xuICAgIHRoaXMuZmlybXdhcmUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKGZpcm13YXJlID0+IHtcbiAgICAgICAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgICBzZWxlY3RlZDogZmlybXdhcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzogTW9kYWxPcHRpb25zPEFkZEZpcm13YXJlUGF0Y2hNb2RhbENvbXBvbmVudD4gPSB7XG4gICAgICAgICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgICAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBhcmlhRGVzY3JpYmVkYnk6ICdhZGRGaXJtd2FyZVBhdGNoTW9kYWxEZXNjcmlwdGlvbicsXG4gICAgICAgICAgICBhcmlhTGFiZWxsZWRCeTogJ2FkZEZpcm13YXJlUGF0Y2hNb2RhbFRpdGxlJyxcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQWRkRmlybXdhcmVQYXRjaE1vZGFsQ29tcG9uZW50LCBjb25maWcpO1xuICAgICAgICAgIHJldHVybiBtb2RhbFJlZi5jb250ZW50LnNhdmVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnBhdGNoVmVyc2lvbnNVcGRhdGVkJC5uZXh0KCkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQmFzZVZlcnNpb24oYmFzZVZlcnNpb246IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRpdGxlID0gZ2V0dGV4dCgnRGVsZXRlIGZpcm13YXJlJyk7XG4gICAgICBjb25zdCBib2R5ID0gYFxuICAgICAgICAke3RoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgIGdldHRleHQoJ1lvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGZpcm13YXJlIHt7IHZlcnNpb24gfX0gd2l0aCBhbGwgaXRzIHBhdGNoZXMuJyksXG4gICAgICAgICAgeyB2ZXJzaW9uOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbiB9XG4gICAgICAgICl9XG4gICAgICAgICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnVGhpcyBvcGVyYXRpb24gaXMgaXJyZXZlcnNpYmxlLicpKX1cbiAgICAgICAgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpKX1cbiAgICAgIGA7XG4gICAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIG9rOiBnZXR0ZXh0KCdEZWxldGUnKVxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBib2R5LFxuICAgICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAgICBsYWJlbHMsXG4gICAgICAgIHt9LFxuICAgICAgICB7IGV2ZW50TmFtZTogUFJPRFVDVF9FWFBFUklFTkNFLkZJUk1XQVJFLkVWRU5UUy5SRVBPU0lUT1JZIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmRlbGV0ZShiYXNlVmVyc2lvbik7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0Zpcm13YXJlIGRlbGV0ZWQuJykpO1xuICAgICAgdGhpcy5iYXNlVmVyc2lvbnNVcGRhdGVkJC5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIG9ubHkgaWYgbm90IGNhbmNlbCBmcm9tIG1vZGFsXG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlUGF0Y2hWZXJzaW9uKHBhdGNoVmVyc2lvbjogSU1hbmFnZWRPYmplY3QpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGl0bGUgPSBnZXR0ZXh0KCdEZWxldGUgZmlybXdhcmUgcGF0Y2gnKTtcbiAgICAgIGNvbnN0IGJvZHkgPSBgXG4gICAgICAgICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgZ2V0dGV4dCgnWW91IGFyZSBhYm91dCB0byBkZWxldGUgZmlybXdhcmUgcGF0Y2gge3sgdmVyc2lvbiB9fS4nKSxcbiAgICAgICAgICB7IHZlcnNpb246IHBhdGNoVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbiB9XG4gICAgICAgICl9XG4gICAgICAgICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnVGhpcyBvcGVyYXRpb24gaXMgaXJyZXZlcnNpYmxlLicpKX1cbiAgICAgICAgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpKX1cbiAgICAgIGA7XG4gICAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIG9rOiBnZXR0ZXh0KCdEZWxldGUnKVxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBib2R5LFxuICAgICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAgICBsYWJlbHMsXG4gICAgICAgIHt9LFxuICAgICAgICB7IGV2ZW50TmFtZTogUFJPRFVDVF9FWFBFUklFTkNFLkZJUk1XQVJFLkVWRU5UUy5SRVBPU0lUT1JZIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmRlbGV0ZShwYXRjaFZlcnNpb24pO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdGaXJtd2FyZSBwYXRjaCBkZWxldGVkLicpKTtcbiAgICAgIHRoaXMucGF0Y2hWZXJzaW9uc1VwZGF0ZWQkLm5leHQoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgLy8gb25seSBpZiBub3QgY2FuY2VsIGZyb20gbW9kYWxcbiAgICAgIGlmIChleCkge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPlxuICB7eyAoZmlybXdhcmUkIHwgYXN5bmMpPy5uYW1lIH19XG48L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIGxhYmVsPVwie3sgJ01hbmFnZW1lbnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICBpY29uPVwiYzh5LW1hbmFnZW1lbnRcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIHBhdGg9XCIjL2Zpcm13YXJlXCJcbiAgICBsYWJlbD1cInt7ICdGaXJtd2FyZSByZXBvc2l0b3J5JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgaWNvbj1cImM4eS1maXJtd2FyZVwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgbGFiZWw9XCJ7eyAoZmlybXdhcmUkIHwgYXN5bmMpPy5uYW1lIH19XCJcbiAgICBpY29uPVwiYzh5LWZpcm13YXJlXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCIhKGlzTGVnYWN5JCB8IGFzeW5jKVwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIHRpdGxlPVwie3sgJ0FkZCBmaXJtd2FyZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJhZGRCYXNlVmVyc2lvbigpXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJwbHVzLWNpcmNsZVwiPjwvaT5cbiAgICB7eyAnQWRkIGZpcm13YXJlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICAqbmdJZj1cImNhbkFkZFBhdGNoVmVyc2lvbnMkIHwgYXN5bmNcIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdBZGQgZmlybXdhcmUgcGF0Y2gnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwiYWRkUGF0Y2hWZXJzaW9uKClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCI+PC9pPlxuICAgIHt7ICdBZGQgZmlybXdhcmUgcGF0Y2gnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwicmVsb2FkJC5uZXh0KClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInJlZnJlc2hcIiBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiByZWxvYWRpbmckIHwgYXN5bmMgfVwiPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIGNvbC1sZy1tYXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLS1mdWxscGFnZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgYmctbGV2ZWwtMSBmbGV4LW5vLXNocmluayBwLXQtMjQgcC1iLTI0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZsZXgtNzBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYzh5LWljb24tZHVvY29sb3IgaWNvbi00OCBjOHktaWNvbiBjOHktaWNvbi1maXJtd2FyZVwiPjwvaT5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+RmlybXdhcmU8L3NtYWxsPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3cgY29sLTEwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ05hbWUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICNuYW1lSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihmaXJtd2FyZSQgfCBhc3luYyk/Lm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICNuYW1lTW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIE15IGZpcm13YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImZpcm13YXJlLWRldGFpbHMtLW5hbWUtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoLmNoJzogKGZpcm13YXJlJCB8IGFzeW5jKT8ubmFtZT8ubGVuZ3RoICsgMiB8fCAzNiB9XCJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJmaXJtd2FyZS1kZXRhaWxzLS1uYW1lLXNhdmUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVGaXJtd2FyZSQubmV4dCh7IG5hbWU6IG5hbWVJbnB1dC52YWx1ZSB9KTsgbmFtZU1vZGVsLnJlc2V0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5hbWVJbnB1dC52YWx1ZS5sZW5ndGggPT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1lZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAjZGVzY3JpcHRpb25JbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKGZpcm13YXJlJCB8IGFzeW5jKT8uZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICNkZXNjcmlwdGlvbk1vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLiBGaXJtd2FyZSBmb3IgaGFyZHdhcmUgcmV2aXNpb24gYicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJmaXJtd2FyZS1kZXRhaWxzLS1kZXNjcmlwdGlvbi1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGguY2gnOiAoZmlybXdhcmUkIHwgYXN5bmMpPy5kZXNjcmlwdGlvbj8ubGVuZ3RoIHx8IDM2IH1cIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJmaXJtd2FyZS1kZXRhaWxzLS1kZXNjcmlwdGlvbi1zYXZlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZpcm13YXJlJC5uZXh0KHsgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uSW5wdXQudmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uTW9kZWwucmVzZXQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnRGV2aWNlIHR5cGUgZmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdJZiB0aGUgZmlsdGVyIGlzIHNldCwgdGhlIGZpcm13YXJlIHdpbGwgc2hvdyB1cCBmb3IgaW5zdGFsbGF0aW9uIG9ubHkgZm9yIGRldmljZXMgb2YgdGhhdCB0eXBlLiBJZiBubyBmaWx0ZXIgaXMgc2V0LCBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYWxsIGRldmljZXMuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicXVlc3Rpb24tY2lyY2xlLW9cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1lZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAjZGV2aWNlVHlwZUlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoZmlybXdhcmUkIHwgYXN5bmMpPy5jOHlfRmlsdGVyPy50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAjZGV2aWNlVHlwZU1vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gYzh5X0xpbnV4XCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZmlybXdhcmUtZGV0YWlscy0tZGV2aWNlLXR5cGUtZmlsdGVyLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aC5jaCc6IChmaXJtd2FyZSQgfCBhc3luYyk/LnR5cGU/Lmxlbmd0aCB8fCAzNiB9XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZmlybXdhcmUtZGV0YWlscy0tZGV2aWNlLXR5cGUtZmlsdGVyLXNhdmUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmlybXdhcmUkLm5leHQoeyBjOHlfRmlsdGVyOiB7IHR5cGU6IGRldmljZVR5cGVJbnB1dC52YWx1ZSB9IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlTW9kZWwucmVzZXQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgc2VwYXJhdG9yLXRvcC1ib3R0b20gYmctY29tcG9uZW50IHN0aWNreS10b3BcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiIHRyYW5zbGF0ZT5WZXJzaW9ucyBhbmQgcGF0Y2hlczwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBwLXQtMCBwLWItMjRcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGJhc2VWZXJzaW9ucyQgfCBhc3luYyk/LmRhdGEubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICAgIFtpY29uXT1cIidjOHktZmlybXdhcmUnXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidObyB2ZXJzaW9ucyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbc3VidGl0bGVdPVwiJ0FkZCBhIG5ldyB2ZXJzaW9uIGJ5IGNsaWNraW5nIGJlbG93LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdCBtLXQtOFwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIGZpcm13YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEJhc2VWZXJzaW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICAgIHt7ICdBZGQgZmlybXdhcmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9jOHktdWktZW1wdHktc3RhdGU+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8Yzh5LWxpc3QtZ3JvdXAgKm5nSWY9XCIoYmFzZVZlcnNpb25zJCB8IGFzeW5jKT8uZGF0YS5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8Yzh5LWxpXG4gICAgICAgICAgICAgICpjOHlGb3I9XCJsZXQgYmFzZVZlcnNpb24gb2YgYmFzZVZlcnNpb25zJCB8IGFzeW5jOyBsZXQgaSA9IGluZGV4OyBsb2FkTW9yZTogJ2F1dG8nXCJcbiAgICAgICAgICAgICAgW2VtcHR5QWN0aW9uc109XCIhKGdldFBhdGNoVmVyc2lvbnMkKGJhc2VWZXJzaW9uKSB8IGFzeW5jKT8uZGF0YS5sZW5ndGhcIlxuICAgICAgICAgICAgICBbY29sbGFwc2VkXT1cIiFleHBhbmRlZFtiYXNlVmVyc2lvbi5pZF1cIlxuICAgICAgICAgICAgICAoY29sbGFwc2VkQ2hhbmdlKT1cImV4cGFuZGVkW2Jhc2VWZXJzaW9uLmlkXSA9ICEkZXZlbnRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Yzh5LWxpLWljb24+XG4gICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImM4eS1maXJtd2FyZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9jOHktbGktaWNvbj5cblxuICAgICAgICAgICAgICA8Yzh5LWxpLWJvZHkgY2xhc3M9XCJjb250ZW50LWZsZXgtNTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiIHRpdGxlPVwie3sgYmFzZVZlcnNpb24uYzh5X0Zpcm13YXJlLnZlcnNpb24gfX1cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgYmFzZVZlcnNpb24uYzh5X0Zpcm13YXJlLnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTVcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1yLThcIiB0cmFuc2xhdGU+RmlsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9XCJ7eyBnZXRCaW5hcnlOYW1lJChiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudXJsKSB8IGFzeW5jIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGM4eS1maWxlLWRvd25sb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw9XCJ7eyBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudXJsIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9jOHktZmlsZS1kb3dubG9hZD5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBkLWZsZXggYS1pLXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzTGVnYWN5JCB8IGFzeW5jXCIgY2xhc3M9XCJsYWJlbCBsYWJlbC13YXJuaW5nIG0tbC1hdXRvLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdMZWdhY3knIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIShpc0xlZ2FjeSQgfCBhc3luYylcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIoZ2V0UGF0Y2hWZXJzaW9uc0NvdW50JChiYXNlVmVyc2lvbikgfCBhc3luYykgPT09IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJjaXJjbGUtby1ub3RjaFwiIGNsYXNzPVwiaWNvbi1zcGluXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIihnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jKSAhPT0gbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ1BsdXJhbF09XCJnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1kZWZhdWx0IG0tbC1hdXRvLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk5vIHBhdGNoZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPjEgcGF0Y2g8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwib3RoZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb3VudCB9fSBwYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXQtaC0yMCB2aXNpYmxlLXhzXCIgKm5nSWY9XCIhKGlzTGVnYWN5JCB8IGFzeW5jKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gbS10LThcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQmFzZVZlcnNpb24oYmFzZVZlcnNpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiEoaXNMZWdhY3kkIHwgYXN5bmMpXCIgY2xhc3M9XCJtLWwtYXV0byBmaXQtaC0yMCBwLXItOCBoaWRkZW4teHNcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tZG90LS1kYW5nZXIgc2hvd09uSG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQmFzZVZlcnNpb24oYmFzZVZlcnNpb24pXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2M4eS1saS1ib2R5PlxuICAgICAgICAgICAgICA8Yzh5LWxpLWNvbGxhcHNlICpuZ0lmPVwiKGdldFBhdGNoVmVyc2lvbnMkKGJhc2VWZXJzaW9uKSB8IGFzeW5jKT8uZGF0YS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LWxpc3QtZ3JvdXAgY2xhc3M9XCJzZXBhcmF0b3ItdG9wXCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWxpXG4gICAgICAgICAgICAgICAgICAgICpjOHlGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0Y2hWZXJzaW9uIG9mIGdldFBhdGNoVmVyc2lvbnMkKGJhc2VWZXJzaW9uKSB8IGFzeW5jO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgbG9hZE1vcmU6ICdhdXRvJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Yzh5LWxpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImM4eS1maXJtd2FyZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9jOHktbGktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1saS1ib2R5IGNsYXNzPVwiY29udGVudC1mbGV4LTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwYXRjaFZlcnNpb24uYzh5X0Zpcm13YXJlLnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXItOFwiIHRyYW5zbGF0ZT5GaWxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Yzh5LWZpbGUtZG93bmxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw9XCJ7eyBwYXRjaFZlcnNpb24uYzh5X0Zpcm13YXJlLnVybCB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2M4eS1maWxlLWRvd25sb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpc2libGUteHMgbS10LThcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRhbmdlciBidG4teHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUGF0Y2hWZXJzaW9uKHBhdGNoVmVyc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG8gcC1yLTggaGlkZGVuLXhzIGZpdC1oLTIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgdGV4dC1kYW5nZXIgc2hvd09uSG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUGF0Y2hWZXJzaW9uKHBhdGNoVmVyc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYzh5LWxpLWJvZHk+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgICAgICA8L2M4eS1saXN0LWdyb3VwPlxuICAgICAgICAgICAgICA8L2M4eS1saS1jb2xsYXBzZT5cbiAgICAgICAgICAgIDwvYzh5LWxpPlxuICAgICAgICAgIDwvYzh5LWxpc3QtZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=