UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

75 lines 27 kB
import { __decorate, __metadata } from "tslib"; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { InventoryService } from '@c8y/client'; import { memoize } from '@c8y/ngx-components'; import { BulkOperationsService } from '@c8y/ngx-components/operations/bulk-operations-service'; import { RepositoryService } from '@c8y/ngx-components/repository/shared'; import { property } from 'lodash-es'; import { defer, of } from 'rxjs'; import { catchError, distinctUntilChanged, distinctUntilKeyChanged, map, shareReplay, switchMap, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components/repository/shared"; import * as i2 from "@c8y/client"; import * as i3 from "@c8y/ngx-components/operations/bulk-operations-service"; import * as i4 from "@c8y/ngx-components"; import * as i5 from "@angular/common"; export class VersionOrPatchComponent { constructor(repositoryService, inventoryService, bulkOpsService) { this.repositoryService = repositoryService; this.inventoryService = inventoryService; this.bulkOpsService = bulkOpsService; this.versionOrPatch = new EventEmitter(); this.elementCount = 0; this.DD_LOW_COUNT = 10; this.firmware$ = this.bulkOpsService.firmwareId.pipe(distinctUntilChanged(), switchMap(id => defer(() => this.inventoryService.detail(id).then(result => result.data)).pipe(catchError(error => of(error)))), shareReplay(1)); this.baseVersions$ = this.firmware$.pipe(distinctUntilKeyChanged('id'), switchMap(firmware => this.repositoryService.listBaseVersions(firmware)), tap(resp => { this.elementCount = resp.data ? resp.data.length : 0; }), shareReplay(1)); this.isLegacy$ = this.firmware$.pipe(map(firmware => this.repositoryService.isLegacyEntry(firmware)), shareReplay(1)); this.expanded = {}; this.DD_LOW_COUNT = this.bulkOpsService.DD_LOW_COUNT; } getBinaryName$(binaryUrl) { return this.repositoryService.getBinaryName$(binaryUrl); } getBaseVersionAndPatches$(baseVersion) { return this.firmware$.pipe(distinctUntilKeyChanged('id'), switchMap(firmware => this.repositoryService.listBaseVersionAndPatches(firmware, baseVersion)), shareReplay(1)); } getPatchVersionsCount$(baseVersion) { return this.firmware$.pipe(distinctUntilKeyChanged('id'), switchMap(() => this.firmware$), switchMap(firmware => this.repositoryService.getPatchVersionsCount$(firmware, baseVersion)), shareReplay(1)); } selectVersionOrPatch(selected, versionOrPatch) { if (selected) { this.versionOrPatch.emit(versionOrPatch); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: VersionOrPatchComponent, deps: [{ token: i1.RepositoryService }, { token: i2.InventoryService }, { token: i3.BulkOperationsService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: VersionOrPatchComponent, selector: "c8y-version-or-patch-step", inputs: { selected: "selected" }, outputs: { versionOrPatch: "versionOrPatch" }, ngImport: i0, template: "<c8y-list-group\n class=\"m-b-16\"\n *ngIf=\"(baseVersions$ | async)?.data.length > 0\"\n>\n <c8y-li *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\">\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-10\">\n <p>{{ baseVersion.c8y_Firmware.version }}</p>\n </div>\n <div class=\"col-2\">\n <span\n class=\"label label-warning\"\n *ngIf=\"isLegacy$ | async\"\n >\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\n class=\"icon-spin\"\n c8yIcon=\"circle-o-notch\"\n ></i>\n </span>\n </span>\n\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default\"><span translate>No patches</span></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]=\"{ count: getPatchVersionsCount$(baseVersion) | async }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <c8y-list-group>\n <c8y-li\n *c8yFor=\"\n let patchVersion of getBaseVersionAndPatches$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-radio\n (onSelect)=\"selectVersionOrPatch($event, patchVersion)\"\n [selected]=\"patchVersion === selected\"\n ></c8y-li-radio>\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-3\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-3\">\n <span\n class=\"label label-info\"\n *ngIf=\"patchVersion.c8y_Patch; else version\"\n translate\n >\n patch\n </span>\n <ng-template #version>\n <span\n class=\"label label-primary\"\n translate\n >\n version\n </span>\n </ng-template>\n </div>\n <div class=\"col-6 text-truncate\">\n <span\n class=\"text-label-small m-r-4\"\n translate\n >\n File\n </span>\n <span title=\"{{ getBinaryName$(patchVersion.c8y_Firmware.url) | async }}\">\n {{ getBinaryName$(patchVersion.c8y_Firmware.url) | async }}\n </span>\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", dependencies: [{ kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i5.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "directive", type: i4.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i4.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i4.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "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: "component", type: i4.ListItemRadioComponent, selector: "c8y-list-item-radio, c8y-li-radio", inputs: ["selected", "name", "disabled", "value"], outputs: ["onSelect"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); } } __decorate([ memoize(), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], VersionOrPatchComponent.prototype, "getBinaryName$", null); __decorate([ memoize(property('id')), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], VersionOrPatchComponent.prototype, "getBaseVersionAndPatches$", null); __decorate([ memoize(property('id')), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], VersionOrPatchComponent.prototype, "getPatchVersionsCount$", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: VersionOrPatchComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-version-or-patch-step', template: "<c8y-list-group\n class=\"m-b-16\"\n *ngIf=\"(baseVersions$ | async)?.data.length > 0\"\n>\n <c8y-li *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\">\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-10\">\n <p>{{ baseVersion.c8y_Firmware.version }}</p>\n </div>\n <div class=\"col-2\">\n <span\n class=\"label label-warning\"\n *ngIf=\"isLegacy$ | async\"\n >\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\n class=\"icon-spin\"\n c8yIcon=\"circle-o-notch\"\n ></i>\n </span>\n </span>\n\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default\"><span translate>No patches</span></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]=\"{ count: getPatchVersionsCount$(baseVersion) | async }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <c8y-list-group>\n <c8y-li\n *c8yFor=\"\n let patchVersion of getBaseVersionAndPatches$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-radio\n (onSelect)=\"selectVersionOrPatch($event, patchVersion)\"\n [selected]=\"patchVersion === selected\"\n ></c8y-li-radio>\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-3\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-3\">\n <span\n class=\"label label-info\"\n *ngIf=\"patchVersion.c8y_Patch; else version\"\n translate\n >\n patch\n </span>\n <ng-template #version>\n <span\n class=\"label label-primary\"\n translate\n >\n version\n </span>\n </ng-template>\n </div>\n <div class=\"col-6 text-truncate\">\n <span\n class=\"text-label-small m-r-4\"\n translate\n >\n File\n </span>\n <span title=\"{{ getBinaryName$(patchVersion.c8y_Firmware.url) | async }}\">\n {{ getBinaryName$(patchVersion.c8y_Firmware.url) | async }}\n </span>\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" }] }], ctorParameters: () => [{ type: i1.RepositoryService }, { type: i2.InventoryService }, { type: i3.BulkOperationsService }], propDecorators: { selected: [{ type: Input }], versionOrPatch: [{ type: Output }], getBinaryName$: [], getBaseVersionAndPatches$: [], getPatchVersionsCount$: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1vci1wYXRjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9vcGVyYXRpb25zL3N0ZXBwZXItYnVsay10eXBlLWZpcm13YXJlL3ZlcnNpb24tb3ItcGF0Y2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vb3BlcmF0aW9ucy9zdGVwcGVyLWJ1bGstdHlwZS1maXJtd2FyZS92ZXJzaW9uLW9yLXBhdGNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQWUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQy9GLE9BQU8sRUFBa0IsaUJBQWlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFDTCxVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLHVCQUF1QixFQUN2QixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxHQUFHLEVBQ0osTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQU14QixNQUFNLE9BQU8sdUJBQXVCO0lBaUNsQyxZQUNVLGlCQUFvQyxFQUNwQyxnQkFBa0MsRUFDbEMsY0FBcUM7UUFGckMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQWxDckMsbUJBQWMsR0FB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O0lBREMsT0FBTyxFQUFFOzs7OzZEQUdUO0FBR0Q7SUFEQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7O3dFQVN2QjtBQUdEO0lBREMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7OztxRUFRdkI7NEZBakVVLHVCQUF1QjtrQkFKbkMsU0FBUzsrQkFDRSwyQkFBMkI7eUpBSTVCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkF3Q1AsY0FBYyxNQUtkLHlCQUF5QixNQVd6QixzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UsIElSZXN1bHRMaXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQnVsa09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9vcGVyYXRpb25zL2J1bGstb3BlcmF0aW9ucy1zZXJ2aWNlJztcbmltcG9ydCB7IEZpcm13YXJlQmluYXJ5LCBSZXBvc2l0b3J5U2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS9zaGFyZWQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgZGVmZXIsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBjYXRjaEVycm9yLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZGlzdGluY3RVbnRpbEtleUNoYW5nZWQsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG4gIHN3aXRjaE1hcCxcbiAgdGFwXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXZlcnNpb24tb3ItcGF0Y2gtc3RlcCcsXG4gIHRlbXBsYXRlVXJsOiAndmVyc2lvbi1vci1wYXRjaC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVmVyc2lvbk9yUGF0Y2hDb21wb25lbnQge1xuICBASW5wdXQoKSBzZWxlY3RlZDogSU1hbmFnZWRPYmplY3Q7XG4gIEBPdXRwdXQoKSB2ZXJzaW9uT3JQYXRjaDogRXZlbnRFbWl0dGVyPElNYW5hZ2VkT2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8SU1hbmFnZWRPYmplY3Q+KCk7XG5cbiAgZWxlbWVudENvdW50ID0gMDtcbiAgRERfTE9XX0NPVU5UID0gMTA7XG5cbiAgZmlybXdhcmUkOiBPYnNlcnZhYmxlPElNYW5hZ2VkT2JqZWN0PiA9IHRoaXMuYnVsa09wc1NlcnZpY2UuZmlybXdhcmVJZC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc3dpdGNoTWFwKGlkID0+XG4gICAgICBkZWZlcigoKSA9PiB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gb2YoZXJyb3IpKVxuICAgICAgKVxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBiYXNlVmVyc2lvbnMkOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pj4gPSB0aGlzLmZpcm13YXJlJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkKCdpZCcpLFxuICAgIHN3aXRjaE1hcChmaXJtd2FyZSA9PiB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmxpc3RCYXNlVmVyc2lvbnMoZmlybXdhcmUpKSxcbiAgICB0YXAocmVzcCA9PiB7XG4gICAgICB0aGlzLmVsZW1lbnRDb3VudCA9IHJlc3AuZGF0YSA/IHJlc3AuZGF0YS5sZW5ndGggOiAwO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgaXNMZWdhY3kkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5maXJtd2FyZSQucGlwZShcbiAgICBtYXAoZmlybXdhcmUgPT4gdGhpcy5yZXBvc2l0b3J5U2VydmljZS5pc0xlZ2FjeUVudHJ5KGZpcm13YXJlKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBleHBhbmRlZDogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVwb3NpdG9yeVNlcnZpY2U6IFJlcG9zaXRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGJ1bGtPcHNTZXJ2aWNlOiBCdWxrT3BlcmF0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5ERF9MT1dfQ09VTlQgPSB0aGlzLmJ1bGtPcHNTZXJ2aWNlLkREX0xPV19DT1VOVDtcbiAgfVxuXG4gIEBtZW1vaXplKClcbiAgZ2V0QmluYXJ5TmFtZSQoYmluYXJ5VXJsKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3NpdG9yeVNlcnZpY2UuZ2V0QmluYXJ5TmFtZSQoYmluYXJ5VXJsKTtcbiAgfVxuXG4gIEBtZW1vaXplKHByb3BlcnR5KCdpZCcpKVxuICBnZXRCYXNlVmVyc2lvbkFuZFBhdGNoZXMkKGJhc2VWZXJzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlybXdhcmUkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsS2V5Q2hhbmdlZCgnaWQnKSxcbiAgICAgIHN3aXRjaE1hcChmaXJtd2FyZSA9PlxuICAgICAgICB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmxpc3RCYXNlVmVyc2lvbkFuZFBhdGNoZXMoZmlybXdhcmUsIGJhc2VWZXJzaW9uKVxuICAgICAgKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplKHByb3BlcnR5KCdpZCcpKVxuICBnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uOiBGaXJtd2FyZUJpbmFyeSkge1xuICAgIHJldHVybiB0aGlzLmZpcm13YXJlJC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbEtleUNoYW5nZWQoJ2lkJyksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5maXJtd2FyZSQpLFxuICAgICAgc3dpdGNoTWFwKGZpcm13YXJlID0+IHRoaXMucmVwb3NpdG9yeVNlcnZpY2UuZ2V0UGF0Y2hWZXJzaW9uc0NvdW50JChmaXJtd2FyZSwgYmFzZVZlcnNpb24pKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIHNlbGVjdFZlcnNpb25PclBhdGNoKHNlbGVjdGVkOiBib29sZWFuLCB2ZXJzaW9uT3JQYXRjaDogSU1hbmFnZWRPYmplY3QpIHtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMudmVyc2lvbk9yUGF0Y2guZW1pdCh2ZXJzaW9uT3JQYXRjaCk7XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LWxpc3QtZ3JvdXBcbiAgY2xhc3M9XCJtLWItMTZcIlxuICAqbmdJZj1cIihiYXNlVmVyc2lvbnMkIHwgYXN5bmMpPy5kYXRhLmxlbmd0aCA+IDBcIlxuPlxuICA8Yzh5LWxpICpjOHlGb3I9XCJsZXQgYmFzZVZlcnNpb24gb2YgYmFzZVZlcnNpb25zJCB8IGFzeW5jOyBsZXQgaSA9IGluZGV4OyBsb2FkTW9yZTogJ2F1dG8nXCI+XG4gICAgPGM4eS1saS1pY29uPlxuICAgICAgPGkgYzh5SWNvbj1cImM4eS1maXJtd2FyZVwiPjwvaT5cbiAgICA8L2M4eS1saS1pY29uPlxuXG4gICAgPGM4eS1saS1ib2R5IGNsYXNzPVwiY29udGVudC1mbGV4LTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XG4gICAgICAgIDxwPnt7IGJhc2VWZXJzaW9uLmM4eV9GaXJtd2FyZS52ZXJzaW9uIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImxhYmVsIGxhYmVsLXdhcm5pbmdcIlxuICAgICAgICAgICpuZ0lmPVwiaXNMZWdhY3kkIHwgYXN5bmNcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0xlZ2FjeScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIShpc0xlZ2FjeSQgfCBhc3luYylcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIihnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jKSA9PT0gbnVsbFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLXNwaW5cIlxuICAgICAgICAgICAgICAgIGM4eUljb249XCJjaXJjbGUtby1ub3RjaFwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIoZ2V0UGF0Y2hWZXJzaW9uc0NvdW50JChiYXNlVmVyc2lvbikgfCBhc3luYykgIT09IG51bGxcIj5cbiAgICAgICAgICAgIDxzcGFuIFtuZ1BsdXJhbF09XCJnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCI9MFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtZGVmYXVsdFwiPjxzcGFuIHRyYW5zbGF0ZT5ObyBwYXRjaGVzPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIj0xXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+MSBwYXRjaDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCJvdGhlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiBnZXRQYXRjaFZlcnNpb25zQ291bnQkKGJhc2VWZXJzaW9uKSB8IGFzeW5jIH1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb3VudCB9fSBwYXRjaGVzXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktYm9keT5cblxuICAgIDxjOHktbGktY29sbGFwc2U+XG4gICAgICA8Yzh5LWxpc3QtZ3JvdXA+XG4gICAgICAgIDxjOHktbGlcbiAgICAgICAgICAqYzh5Rm9yPVwiXG4gICAgICAgICAgICBsZXQgcGF0Y2hWZXJzaW9uIG9mIGdldEJhc2VWZXJzaW9uQW5kUGF0Y2hlcyQoYmFzZVZlcnNpb24pIHwgYXN5bmM7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgICAgICAgbG9hZE1vcmU6ICdhdXRvJ1xuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8Yzh5LWxpLXJhZGlvXG4gICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0VmVyc2lvbk9yUGF0Y2goJGV2ZW50LCBwYXRjaFZlcnNpb24pXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZF09XCJwYXRjaFZlcnNpb24gPT09IHNlbGVjdGVkXCJcbiAgICAgICAgICA+PC9jOHktbGktcmFkaW8+XG4gICAgICAgICAgPGM4eS1saS1pY29uPlxuICAgICAgICAgICAgPGkgYzh5SWNvbj1cImM4eS1maXJtd2FyZVwiPjwvaT5cbiAgICAgICAgICA8L2M4eS1saS1pY29uPlxuICAgICAgICAgIDxjOHktbGktYm9keSBjbGFzcz1cImNvbnRlbnQtZmxleC01MFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XG4gICAgICAgICAgICAgIHt7IHBhdGNoVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbiB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwicGF0Y2hWZXJzaW9uLmM4eV9QYXRjaDsgZWxzZSB2ZXJzaW9uXCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN2ZXJzaW9uPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImxhYmVsIGxhYmVsLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgdmVyc2lvblxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1yLTRcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgRmlsZVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRpdGxlPVwie3sgZ2V0QmluYXJ5TmFtZSQocGF0Y2hWZXJzaW9uLmM4eV9GaXJtd2FyZS51cmwpIHwgYXN5bmMgfX1cIj5cbiAgICAgICAgICAgICAgICB7eyBnZXRCaW5hcnlOYW1lJChwYXRjaFZlcnNpb24uYzh5X0Zpcm13YXJlLnVybCkgfCBhc3luYyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2M4eS1saS1ib2R5PlxuICAgICAgICA8L2M4eS1saT5cbiAgICAgIDwvYzh5LWxpc3QtZ3JvdXA+XG4gICAgPC9jOHktbGktY29sbGFwc2U+XG4gIDwvYzh5LWxpPlxuPC9jOHktbGlzdC1ncm91cD5cbiJdfQ==