@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
126 lines • 23.3 kB
JavaScript
import { Component, Input, Optional, ViewChild } from '@angular/core';
import { CommonModule as NgCommonModule } from '@angular/common';
import { FormsModule as NgFormsModule } from '@angular/forms';
import { InventoryService } from '@c8y/client';
import { ClusterMapComponent, MapModule } from '@c8y/ngx-components/map';
import { AssetLinkPipe, CommonModule, DashboardChildComponent, DismissAlertStrategy, DynamicComponentAlert, FormsModule, gettext } from '@c8y/ngx-components';
import { filter, takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';
import { MapEventInfoComponent } from './map-event-info.component';
import { IconSelectorModule } from '@c8y/ngx-components/icon-selector';
import { TooltipModule } from 'ngx-bootstrap/tooltip';
import { RouterLink } from '@angular/router';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "@c8y/ngx-components/context-dashboard";
import * as i3 from "@c8y/client";
import * as i4 from "@angular/common";
import * as i5 from "@c8y/ngx-components/map";
export class MapWidgetComponent {
constructor(dashboardChild, dashboardContextComponent, inventory) {
this.dashboardContextComponent = dashboardContextComponent;
this.inventory = inventory;
this.mapConfig = { center: [0, 0] };
this.TIMEOUT_ERROR_TEXT = gettext('The request is taking longer than usual. We apologize for the inconvenience.');
this.SERVER_ERROR_TEXT = gettext('Server error occurred.');
this.destroy$ = new Subject();
this.listenToWidgetResizeEvent(dashboardChild);
}
async ngOnInit() {
this.alerts.setAlertGroupDismissStrategy('warning', DismissAlertStrategy.TEMPORARY_OR_PERMANENT);
if (this.dashboardContextComponent?.dashboard?.deviceType && !this.config.device) {
const context = this.dashboardContextComponent.context;
if (context?.id) {
const { id } = context;
this.config.device = (await this.inventory.detail(id)).data;
}
}
if (this.config.device) {
this.rootNode = this.config.device;
}
this.mapConfig = { ...this.config.mapConfig };
if (this.config.widgetInstanceGlobalTimeContext) {
this.updateMapConfigRealtime();
}
this.savedNode = this.rootNode;
}
ngOnChanges(changes) {
if (changes.config?.currentValue?.widgetInstanceGlobalTimeContext) {
this.updateMapConfigRealtime();
}
}
ngAfterViewInit() {
this.subscribeToErrorsOccurred();
}
startFollow(context) {
if (context.id !== this.rootNode?.id) {
this.rootNode = context;
}
this.mapConfig = {
...this.config.mapConfig,
follow: true,
realtime: true
};
}
stopFollow() {
this.mapConfig = {
...this.config.mapConfig,
follow: false
};
if (this.config.widgetInstanceGlobalTimeContext) {
this.updateMapConfigRealtime();
}
this.rootNode = this.savedNode;
}
ngOnDestroy() {
this.destroy$.next();
}
listenToWidgetResizeEvent(dashboardChild) {
dashboardChild.changeEnd
.pipe(filter(child => child.lastChange === 'resize'), takeUntil(this.destroy$))
.subscribe(() => {
this.clusterMap.reset();
});
}
subscribeToErrorsOccurred() {
this.clusterMap.errorNotifier
.pipe(filter(Boolean), takeUntil(this.destroy$))
.subscribe(error => {
this.alerts.addAlerts(new DynamicComponentAlert({
type: 'warning',
text: error?.name === 'TimeoutError'
? this.TIMEOUT_ERROR_TEXT
: error?.message ?? this.SERVER_ERROR_TEXT
}));
});
}
updateMapConfigRealtime() {
this.mapConfig.realtime = this.config.realtime || false;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapWidgetComponent, deps: [{ token: i1.DashboardChildComponent }, { token: i2.ContextDashboardComponent, optional: true }, { token: i3.InventoryService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapWidgetComponent, isStandalone: true, selector: "c8y-map-widget", inputs: { config: "config" }, viewQueries: [{ propertyName: "clusterMap", first: true, predicate: ClusterMapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n [buttonsConfig]=\"config.widgetInstanceGlobalTimeContext ? { realtime: { show: false } } : null\"\n></c8y-map-status>\n<c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n>\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n <strong>{{ context.name }}</strong>\n </a>\n <c8y-map-event-info [asset]=\"context\">\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n *ngIf=\"!mapConfig.follow\"\n translate\n >\n Follow\n </button>\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n *ngIf=\"mapConfig.follow\"\n translate\n >\n Unfollow\n </button>\n </c8y-map-event-info>\n </div>\n</c8y-cluster-map>\n", dependencies: [{ kind: "component", type: MapEventInfoComponent, selector: "c8y-map-event-info", inputs: ["asset"] }, { kind: "ngmodule", type: NgCommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgFormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: i1.AssetLinkPipe, name: "assetLink" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i5.MapStatusComponent, selector: "c8y-map-status", inputs: ["config", "clusterMap", "buttonsConfig"], outputs: ["configChange", "onUnfollow"] }, { kind: "component", type: i5.ClusterMapComponent, selector: "c8y-cluster-map", inputs: ["config", "rootNode", "asset", "showClusterColor"], outputs: ["mapChange"] }, { kind: "directive", type: i5.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapWidgetComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-map-widget', standalone: true, imports: [
MapEventInfoComponent,
NgCommonModule,
NgFormsModule,
CommonModule,
FormsModule,
IconSelectorModule,
MapModule,
AssetLinkPipe,
TooltipModule,
RouterLink
], template: "<c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n [buttonsConfig]=\"config.widgetInstanceGlobalTimeContext ? { realtime: { show: false } } : null\"\n></c8y-map-status>\n<c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n>\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n <strong>{{ context.name }}</strong>\n </a>\n <c8y-map-event-info [asset]=\"context\">\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n *ngIf=\"!mapConfig.follow\"\n translate\n >\n Follow\n </button>\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n *ngIf=\"mapConfig.follow\"\n translate\n >\n Unfollow\n </button>\n </c8y-map-event-info>\n </div>\n</c8y-cluster-map>\n" }]
}], ctorParameters: () => [{ type: i1.DashboardChildComponent }, { type: i2.ContextDashboardComponent, decorators: [{
type: Optional
}] }, { type: i3.InventoryService }], propDecorators: { config: [{
type: Input
}], clusterMap: [{
type: ViewChild,
args: [ClusterMapComponent]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9tYXAvbWFwLXdpZGdldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9tYXAvbWFwLXdpZGdldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULEtBQUssRUFJTCxRQUFRLEVBRVIsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLElBQUksY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsSUFBSSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0YsT0FBTyxFQUNMLGFBQWEsRUFDYixZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUVwQixxQkFBcUIsRUFFckIsV0FBVyxFQUNYLE9BQU8sRUFDUixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNsRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFD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SUFDMUQsQ0FBQzsrR0FqSFUsa0JBQWtCO21HQUFsQixrQkFBa0Isb0pBT2xCLG1CQUFtQixxRUMzRGhDLHF3Q0E2Q0EsNENETEkscUJBQXFCLGlGQUNyQixjQUFjLGtJQUNkLGFBQWEsOEJBQ2IsWUFBWSwyUEFDWixXQUFXLDhCQUNYLGtCQUFrQiw4QkFDbEIsU0FBUywrYkFFVCxhQUFhLCtCQUNiLFVBQVU7OzRGQUdELGtCQUFrQjtrQkFqQjlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBRWQsSUFBSSxXQUNQO3dCQUNQLHFCQUFxQjt3QkFDckIsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxrQkFBa0I7d0JBQ2xCLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixhQUFhO3dCQUNiLFVBQVU7cUJBQ1g7OzBCQXNCRSxRQUFRO3dFQWZGLE1BQU07c0JBQWQsS0FBSztnQkFHTixVQUFVO3NCQURULFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSBhcyBOZ0NvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSBhcyBOZ0Zvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBDbHVzdGVyTWFwQ29tcG9uZW50LCBDbHVzdGVyTWFwQ29uZmlnLCBNYXBNb2R1bGUgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQge1xuICBBc3NldExpbmtQaXBlLFxuICBDb21tb25Nb2R1bGUsXG4gIERhc2hib2FyZENoaWxkQ29tcG9uZW50LFxuICBEaXNtaXNzQWxlcnRTdHJhdGVneSxcbiAgRHluYW1pY0NvbXBvbmVudCxcbiAgRHluYW1pY0NvbXBvbmVudEFsZXJ0LFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yLFxuICBGb3Jtc01vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IE1hcFdpZGdldENvbmZpZyB9IGZyb20gJy4vbWFwLXdpZGdldC5tb2RlbCc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2NvbnRleHQtZGFzaGJvYXJkJztcbmltcG9ydCB7IE1hcEV2ZW50SW5mb0NvbXBvbmVudCB9IGZyb20gJy4vbWFwLWV2ZW50LWluZm8uY29tcG9uZW50JztcbmltcG9ydCB7IEljb25TZWxlY3Rvck1vZHVsZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaWNvbi1zZWxlY3Rvcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90b29sdGlwJztcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktbWFwLXdpZGdldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAtd2lkZ2V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hcEV2ZW50SW5mb0NvbXBvbmVudCxcbiAgICBOZ0NvbW1vbk1vZHVsZSxcbiAgICBOZ0Zvcm1zTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBJY29uU2VsZWN0b3JNb2R1bGUsXG4gICAgTWFwTW9kdWxlLFxuICAgIEFzc2V0TGlua1BpcGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTWFwV2lkZ2V0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgRHluYW1pY0NvbXBvbmVudFxue1xuICBtYXBDb25maWc6IENsdXN0ZXJNYXBDb25maWcgPSB7IGNlbnRlcjogWzAsIDBdIH07XG4gIHJvb3ROb2RlOiBJTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgY29uZmlnOiBNYXBXaWRnZXRDb25maWc7XG5cbiAgQFZpZXdDaGlsZChDbHVzdGVyTWFwQ29tcG9uZW50KVxuICBjbHVzdGVyTWFwOiBDbHVzdGVyTWFwQ29tcG9uZW50O1xuICBhbGVydHM6IER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3I7XG5cbiAgcHJpdmF0ZSBUSU1FT1VUX0VSUk9SX1RFWFQgPSBnZXR0ZXh0KFxuICAgICdUaGUgcmVxdWVzdCBpcyB0YWtpbmcgbG9uZ2VyIHRoYW4gdXN1YWwuIFdlIGFwb2xvZ2l6ZSBmb3IgdGhlIGluY29udmVuaWVuY2UuJ1xuICApO1xuICBwcml2YXRlIFNFUlZFUl9FUlJPUl9URVhUID0gZ2V0dGV4dCgnU2VydmVyIGVycm9yIG9jY3VycmVkLicpO1xuICBwcml2YXRlIHNhdmVkTm9kZTogSU1hbmFnZWRPYmplY3Q7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhc2hib2FyZENoaWxkOiBEYXNoYm9hcmRDaGlsZENvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZENvbnRleHRDb21wb25lbnQ6IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5saXN0ZW5Ub1dpZGdldFJlc2l6ZUV2ZW50KGRhc2hib2FyZENoaWxkKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0R3JvdXBEaXNtaXNzU3RyYXRlZ3koXG4gICAgICAnd2FybmluZycsXG4gICAgICBEaXNtaXNzQWxlcnRTdHJhdGVneS5URU1QT1JBUllfT1JfUEVSTUFORU5UXG4gICAgKTtcbiAgICBpZiAodGhpcy5kYXNoYm9hcmRDb250ZXh0Q29tcG9uZW50Py5kYXNoYm9hcmQ/LmRldmljZVR5cGUgJiYgIXRoaXMuY29uZmlnLmRldmljZSkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuZGFzaGJvYXJkQ29udGV4dENvbXBvbmVudC5jb250ZXh0O1xuICAgICAgaWYgKGNvbnRleHQ/LmlkKSB7XG4gICAgICAgIGNvbnN0IHsgaWQgfSA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY29uZmlnLmRldmljZSA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoaWQpKS5kYXRhO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcuZGV2aWNlKSB7XG4gICAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5jb25maWcuZGV2aWNlO1xuICAgIH1cbiAgICB0aGlzLm1hcENvbmZpZyA9IHsgLi4udGhpcy5jb25maWcubWFwQ29uZmlnIH07XG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMudXBkYXRlTWFwQ29uZmlnUmVhbHRpbWUoKTtcbiAgICB9XG4gICAgdGhpcy5zYXZlZE5vZGUgPSB0aGlzLnJvb3ROb2RlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpZz8uY3VycmVudFZhbHVlPy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICB0aGlzLnVwZGF0ZU1hcENvbmZpZ1JlYWx0aW1lKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaWJlVG9FcnJvcnNPY2N1cnJlZCgpO1xuICB9XG5cbiAgc3RhcnRGb2xsb3coY29udGV4dCkge1xuICAgIGlmIChjb250ZXh0LmlkICE9PSB0aGlzLnJvb3ROb2RlPy5pZCkge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IGNvbnRleHQ7XG4gICAgfVxuICAgIHRoaXMubWFwQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgZm9sbG93OiB0cnVlLFxuICAgICAgcmVhbHRpbWU6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgc3RvcEZvbGxvdygpIHtcbiAgICB0aGlzLm1hcENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIGZvbGxvdzogZmFsc2VcbiAgICB9O1xuICAgIGlmICh0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICB0aGlzLnVwZGF0ZU1hcENvbmZpZ1JlYWx0aW1lKCk7XG4gICAgfVxuICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLnNhdmVkTm9kZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Ub1dpZGdldFJlc2l6ZUV2ZW50KGRhc2hib2FyZENoaWxkOiBEYXNoYm9hcmRDaGlsZENvbXBvbmVudCkge1xuICAgIGRhc2hib2FyZENoaWxkLmNoYW5nZUVuZFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihjaGlsZCA9PiBjaGlsZC5sYXN0Q2hhbmdlID09PSAncmVzaXplJyksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2x1c3Rlck1hcC5yZXNldCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvRXJyb3JzT2NjdXJyZWQoKSB7XG4gICAgdGhpcy5jbHVzdGVyTWFwLmVycm9yTm90aWZpZXJcbiAgICAgIC5waXBlKGZpbHRlcihCb29sZWFuKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuYWxlcnRzLmFkZEFsZXJ0cyhcbiAgICAgICAgICBuZXcgRHluYW1pY0NvbXBvbmVudEFsZXJ0KHtcbiAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICAgIGVycm9yPy5uYW1lID09PSAnVGltZW91dEVycm9yJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5USU1FT1VUX0VSUk9SX1RFWFRcbiAgICAgICAgICAgICAgICA6IGVycm9yPy5tZXNzYWdlID8/IHRoaXMuU0VSVkVSX0VSUk9SX1RFWFRcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1hcENvbmZpZ1JlYWx0aW1lKCkge1xuICAgIHRoaXMubWFwQ29uZmlnLnJlYWx0aW1lID0gdGhpcy5jb25maWcucmVhbHRpbWUgfHwgZmFsc2U7XG4gIH1cbn1cbiIsIjxjOHktbWFwLXN0YXR1c1xuICBbY2x1c3Rlck1hcF09XCJtYXBXaWRnZXRcIlxuICBbKGNvbmZpZyldPVwibWFwQ29uZmlnXCJcbiAgKG9uVW5mb2xsb3cpPVwic3RvcEZvbGxvdygpXCJcbiAgW2J1dHRvbnNDb25maWddPVwiY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQgPyB7IHJlYWx0aW1lOiB7IHNob3c6IGZhbHNlIH0gfSA6IG51bGxcIlxuPjwvYzh5LW1hcC1zdGF0dXM+XG48Yzh5LWNsdXN0ZXItbWFwXG4gICNtYXBXaWRnZXRcbiAgW3Jvb3ROb2RlXT1cInJvb3ROb2RlXCJcbiAgW2NvbmZpZ109XCJtYXBDb25maWdcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtYXAtbWFya2VyXCJcbiAgICAqYzh5TWFwUG9wdXA9XCJsZXQgY29udGV4dFwiXG4gID5cbiAgICA8YVxuICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlIGRldmljZUxpbmsgdGV4dC0xMlwiXG4gICAgICByb3V0ZXJMaW5rPVwie3sgY29udGV4dCB8IGFzc2V0TGluayB9fVwiXG4gICAgPlxuICAgICAgPHN0cm9uZz57eyBjb250ZXh0Lm5hbWUgfX08L3N0cm9uZz5cbiAgICA8L2E+XG4gICAgPGM4eS1tYXAtZXZlbnQtaW5mbyBbYXNzZXRdPVwiY29udGV4dFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4teHMgYnRuLWJsb2NrIG0tdC04XCJcbiAgICAgICAgW3RpdGxlXT1cIidBY3RpdmF0ZSByZWFsdGltZSBvbiB0aGlzIGFzc2V0IGFuZCBmb2xsb3cgaXQgaWYgaXQgbW92ZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJzdGFydEZvbGxvdyhjb250ZXh0KVwiXG4gICAgICAgICpuZ0lmPVwiIW1hcENvbmZpZy5mb2xsb3dcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgRm9sbG93XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIGJ0bi1ibG9jayBtLXQtOFwiXG4gICAgICAgIFt0aXRsZV09XCInU3RvcCBmb2xsb3dpbmcgdGhpcyBhc3NldC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJzdG9wRm9sbG93KClcIlxuICAgICAgICAqbmdJZj1cIm1hcENvbmZpZy5mb2xsb3dcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgVW5mb2xsb3dcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvYzh5LW1hcC1ldmVudC1pbmZvPlxuICA8L2Rpdj5cbjwvYzh5LWNsdXN0ZXItbWFwPlxuIl19