UNPKG

@nova-ui/dashboards

Version:

Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and

152 lines 25.8 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from "@angular/core"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { LoggerService } from "@nova-ui/bits"; import { ChartAssist, } from "@nova-ui/charts"; import { mapDataToFormatterProperties } from "../../../functions/map-data-to-formatter-properties"; import { ProportionalContentAggregatorsRegistryService } from "../../../services/proportional-content-aggregators-registry.service"; import { ProportionalDonutContentFormattersRegistryService } from "../../../services/public-api"; import * as i0 from "@angular/core"; import * as i1 from "../../../services/proportional-content-aggregators-registry.service"; import * as i2 from "../../../services/public-api"; import * as i3 from "@nova-ui/bits"; import * as i4 from "@angular/common"; import * as i5 from "@angular/cdk/portal"; import * as i6 from "../../../pizzagna/directives/component-portal/component-portal.directive"; export class ProportionalDonutContentComponent { static { this.lateLoadKey = "ProportionalDonutContentComponent"; } constructor(aggregatorRegistry, formatterRegistry, changeDetector, logger) { this.aggregatorRegistry = aggregatorRegistry; this.formatterRegistry = formatterRegistry; this.changeDetector = changeDetector; this.logger = logger; this.destroy$ = new Subject(); } ngOnChanges(changes) { if (changes.donutConfig) { const donutConfig = changes.donutConfig.currentValue; const { formatter, aggregator } = donutConfig; if (aggregator?.aggregatorType) { this.updateAggregatorDefinition(aggregator); this.updateAggregatedValue(); } if (formatter?.componentType) { this.contentFormatter = formatter; this.updateFormatterDefinition(formatter); this.updateFormatterProperties(); } } if (changes.widgetData) { this.updateAggregatedValue(); this.updateFormatterProperties(); } if (changes.chartAssist) { this.subscribeToChartAssist(); } } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } /** * Iterates over formatters and maps their properties from the data * * @param formattersConfiguration */ getFormatterProperties(formatter) { if (!formatter) { return undefined; } return { ...this.contentFormatterDefinition?.properties, data: mapDataToFormatterProperties(formatter, { // add "aggregatedValue" as "value" so that formatter processes it by default value: this.aggregatedValue, }), }; } updateAggregatorDefinition(aggregatorConfig) { const fromRegistry = this.aggregatorRegistry.getItem(aggregatorConfig.aggregatorType); if (fromRegistry) { this.contentAggregatorDefinition = fromRegistry; } else { this.logger.warn(`No aggregator with key ${aggregatorConfig.aggregatorType} found in registry.`); } } updateFormatterDefinition(formatterConfig) { const fromRegistry = this.formatterRegistry.getItem(formatterConfig.componentType); if (fromRegistry) { this.contentFormatterDefinition = fromRegistry; } else { this.logger.warn(`No aggregator with key ${formatterConfig.componentType} found in registry.`); } } updateAggregatedValue() { if (!this.widgetData || !this.contentAggregatorDefinition) { this.logger.warn(`Can't aggregate value. Aggregator key: ${this.contentAggregatorDefinition?.aggregatorType}. Data: ${this.widgetData}`); return; } const properties = this.getAggregatorProperties(); this.aggregatedValue = this.contentAggregatorDefinition .fn(this.widgetData, { ...properties, // prioritize emphasizedSeriesId if series is hovered on the chart activeMetricId: this.emphasizedSeriesId || properties.activeMetricId, }) .toString(); } updateFormatterProperties() { this.contentFormatterProperties = this.getFormatterProperties(this.contentFormatter); } getAggregatorProperties() { return { ...this.contentAggregatorDefinition?.properties, ...this.donutConfig?.aggregator?.properties, }; } subscribeToChartAssist() { this.chartAssistSubscription?.unsubscribe(); this.chartAssistSubscription = this.chartAssist?.chartAssistSubject ?.pipe(takeUntil(this.destroy$)) .subscribe((data) => { this.emphasizedSeriesId = data.payload?.seriesId; this.updateAggregatedValue(); this.updateFormatterProperties(); this.changeDetector.detectChanges(); }); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProportionalDonutContentComponent, deps: [{ token: i1.ProportionalContentAggregatorsRegistryService }, { token: i2.ProportionalDonutContentFormattersRegistryService }, { token: i0.ChangeDetectorRef }, { token: i3.LoggerService }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ProportionalDonutContentComponent, selector: "nui-proportional-donut-content", inputs: { widgetData: "widgetData", donutConfig: "donutConfig", chartAssist: "chartAssist" }, usesOnChanges: true, ngImport: i0, template: "<ng-container\n *ngIf=\"contentFormatter?.componentType\"\n nuiComponentPortal\n [componentType]=\"contentFormatter?.componentType\"\n [properties]=\"contentFormatterProperties\"\n #componentPortal=\"nuiComponentPortal\"\n>\n <ng-template\n [cdkPortalOutlet]=\"componentPortal.portal\"\n (attached)=\"componentPortal.attached($event)\"\n ></ng-template>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "directive", type: i6.ComponentPortalDirective, selector: "[nuiComponentPortal]", inputs: ["componentId", "componentType", "properties", "providers", "outputs"], outputs: ["output"], exportAs: ["nuiComponentPortal"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProportionalDonutContentComponent, decorators: [{ type: Component, args: [{ selector: "nui-proportional-donut-content", changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container\n *ngIf=\"contentFormatter?.componentType\"\n nuiComponentPortal\n [componentType]=\"contentFormatter?.componentType\"\n [properties]=\"contentFormatterProperties\"\n #componentPortal=\"nuiComponentPortal\"\n>\n <ng-template\n [cdkPortalOutlet]=\"componentPortal.portal\"\n (attached)=\"componentPortal.attached($event)\"\n ></ng-template>\n</ng-container>\n" }] }], ctorParameters: () => [{ type: i1.ProportionalContentAggregatorsRegistryService }, { type: i2.ProportionalDonutContentFormattersRegistryService }, { type: i0.ChangeDetectorRef }, { type: i3.LoggerService }], propDecorators: { widgetData: [{ type: Input }], donutConfig: [{ type: Input }], chartAssist: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9ydGlvbmFsLWRvbnV0LWNvbnRlbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3Byb3BvcnRpb25hbC13aWRnZXQvcHJvcG9ydGlvbmFsLWRvbnV0LWNvbnRlbnQvcHJvcG9ydGlvbmFsLWRvbnV0LWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3Byb3BvcnRpb25hbC13aWRnZXQvcHJvcG9ydGlvbmFsLWRvbnV0LWNvbnRlbnQvcHJvcG9ydGlvbmFsLWRvbnV0LWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEdBSVIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUNILFdBQVcsR0FJZCxNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBTW5H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QUMvQixTQUFTLENBQUMsQ0FBQyxJQUF1QixFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1lBQ2pELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO2tJQXpKUSxpQ0FBaUM7c0hBQWpDLGlDQUFpQyx5TEM5RDlDLHlaQVlBOzs0RkRrRGEsaUNBQWlDO2tCQU43QyxTQUFTOytCQUNJLGdDQUFnQyxtQkFHekIsdUJBQXVCLENBQUMsTUFBTTs4T0FPL0IsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUVXLFdBQVc7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcbmltcG9ydCB7XG4gICAgQ2hhcnRBc3Npc3QsXG4gICAgSUFjY2Vzc29ycyxcbiAgICBJQ2hhcnRBc3Npc3RFdmVudCxcbiAgICBJQ2hhcnRBc3Npc3RTZXJpZXMsXG59IGZyb20gXCJAbm92YS11aS9jaGFydHNcIjtcblxuaW1wb3J0IHsgbWFwRGF0YVRvRm9ybWF0dGVyUHJvcGVydGllcyB9IGZyb20gXCIuLi8uLi8uLi9mdW5jdGlvbnMvbWFwLWRhdGEtdG8tZm9ybWF0dGVyLXByb3BlcnRpZXNcIjtcbmltcG9ydCB7XG4gICAgSVByb3BvcnRpb25hbERvbnV0Q29udGVudEFnZ3JlZ2F0b3IsXG4gICAgSVByb3BvcnRpb25hbERvbnV0Q29udGVudEFnZ3JlZ2F0b3JEZWZpbml0aW9uLFxuICAgIElQcm9wb3J0aW9uYWxEb251dENvbnRlbnRBZ2dyZWdhdG9yUHJvcGVydGllcyxcbn0gZnJvbSBcIi4uLy4uLy4uL2Z1bmN0aW9ucy9wcm9wb3J0aW9uYWwtYWdncmVnYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7IFByb3BvcnRpb25hbENvbnRlbnRBZ2dyZWdhdG9yc1JlZ2lzdHJ5U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9wcm9wb3J0aW9uYWwtY29udGVudC1hZ2dyZWdhdG9ycy1yZWdpc3RyeS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcm9wb3J0aW9uYWxEb251dENvbnRlbnRGb3JtYXR0ZXJzUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IElIYXNDaGFuZ2VEZXRlY3RvciB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgICBJRm9ybWF0dGVyLFxuICAgIElGb3JtYXR0ZXJEZWZpbml0aW9uLFxuICAgIElGb3JtYXR0ZXJQcm9wZXJ0aWVzLFxufSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IElEb251dENvbnRlbnRDb25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXByb3BvcnRpb25hbC1kb251dC1jb250ZW50XCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9wcm9wb3J0aW9uYWwtZG9udXQtY29udGVudC5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi9wcm9wb3J0aW9uYWwtZG9udXQtY29udGVudC5jb21wb25lbnQubGVzc1wiXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcG9ydGlvbmFsRG9udXRDb250ZW50Q29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgSUhhc0NoYW5nZURldGVjdG9yXG57XG4gICAgc3RhdGljIGxhdGVMb2FkS2V5ID0gXCJQcm9wb3J0aW9uYWxEb251dENvbnRlbnRDb21wb25lbnRcIjtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyB3aWRnZXREYXRhOiBJQ2hhcnRBc3Npc3RTZXJpZXM8SUFjY2Vzc29ycz5bXTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZG9udXRDb25maWc6IElEb251dENvbnRlbnRDb25maWc7XG5cbiAgICBASW5wdXQoKSBwcml2YXRlIGNoYXJ0QXNzaXN0OiBDaGFydEFzc2lzdDtcblxuICAgIHB1YmxpYyBhZ2dyZWdhdGVkVmFsdWU6IHN0cmluZztcbiAgICBwdWJsaWMgY29udGVudEZvcm1hdHRlcjogSUZvcm1hdHRlcjtcbiAgICBwdWJsaWMgY29udGVudEZvcm1hdHRlclByb3BlcnRpZXM6IElGb3JtYXR0ZXJQcm9wZXJ0aWVzIHwgdW5kZWZpbmVkO1xuXG4gICAgcHJpdmF0ZSBjb250ZW50Rm9ybWF0dGVyRGVmaW5pdGlvbjogSUZvcm1hdHRlckRlZmluaXRpb247XG4gICAgcHJpdmF0ZSBjb250ZW50QWdncmVnYXRvckRlZmluaXRpb246IElQcm9wb3J0aW9uYWxEb251dENvbnRlbnRBZ2dyZWdhdG9yRGVmaW5pdGlvbjtcbiAgICAvKiogSG92ZXJlZCBzZXJpZXMgSWQgKi9cbiAgICBwcml2YXRlIGVtcGhhc2l6ZWRTZXJpZXNJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgY2hhcnRBc3Npc3RTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGFnZ3JlZ2F0b3JSZWdpc3RyeTogUHJvcG9ydGlvbmFsQ29udGVudEFnZ3JlZ2F0b3JzUmVnaXN0cnlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZvcm1hdHRlclJlZ2lzdHJ5OiBQcm9wb3J0aW9uYWxEb251dENvbnRlbnRGb3JtYXR0ZXJzUmVnaXN0cnlTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgICkge31cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmRvbnV0Q29uZmlnKSB7XG4gICAgICAgICAgICBjb25zdCBkb251dENvbmZpZzogSURvbnV0Q29udGVudENvbmZpZyA9XG4gICAgICAgICAgICAgICAgY2hhbmdlcy5kb251dENvbmZpZy5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgZm9ybWF0dGVyLCBhZ2dyZWdhdG9yIH0gPSBkb251dENvbmZpZztcbiAgICAgICAgICAgIGlmIChhZ2dyZWdhdG9yPy5hZ2dyZWdhdG9yVHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQWdncmVnYXRvckRlZmluaXRpb24oYWdncmVnYXRvcik7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGVkVmFsdWUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvcm1hdHRlcj8uY29tcG9uZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEZvcm1hdHRlciA9IGZvcm1hdHRlcjtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlckRlZmluaXRpb24oZm9ybWF0dGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlclByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLndpZGdldERhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWdncmVnYXRlZFZhbHVlKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlclByb3BlcnRpZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLmNoYXJ0QXNzaXN0KSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvQ2hhcnRBc3Npc3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGZvcm1hdHRlcnMgYW5kIG1hcHMgdGhlaXIgcHJvcGVydGllcyBmcm9tIHRoZSBkYXRhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9ybWF0dGVyc0NvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEZvcm1hdHRlclByb3BlcnRpZXMoZm9ybWF0dGVyOiBJRm9ybWF0dGVyIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRoaXMuY29udGVudEZvcm1hdHRlckRlZmluaXRpb24/LnByb3BlcnRpZXMsXG4gICAgICAgICAgICBkYXRhOiBtYXBEYXRhVG9Gb3JtYXR0ZXJQcm9wZXJ0aWVzKGZvcm1hdHRlciwge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBcImFnZ3JlZ2F0ZWRWYWx1ZVwiIGFzIFwidmFsdWVcIiBzbyB0aGF0IGZvcm1hdHRlciBwcm9jZXNzZXMgaXQgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmFnZ3JlZ2F0ZWRWYWx1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQWdncmVnYXRvckRlZmluaXRpb24oXG4gICAgICAgIGFnZ3JlZ2F0b3JDb25maWc6IElQcm9wb3J0aW9uYWxEb251dENvbnRlbnRBZ2dyZWdhdG9yXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZyb21SZWdpc3RyeSA9IHRoaXMuYWdncmVnYXRvclJlZ2lzdHJ5LmdldEl0ZW0oXG4gICAgICAgICAgICBhZ2dyZWdhdG9yQ29uZmlnLmFnZ3JlZ2F0b3JUeXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGZyb21SZWdpc3RyeSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50QWdncmVnYXRvckRlZmluaXRpb24gPSBmcm9tUmVnaXN0cnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgIGBObyBhZ2dyZWdhdG9yIHdpdGgga2V5ICR7YWdncmVnYXRvckNvbmZpZy5hZ2dyZWdhdG9yVHlwZX0gZm91bmQgaW4gcmVnaXN0cnkuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRm9ybWF0dGVyRGVmaW5pdGlvbihmb3JtYXR0ZXJDb25maWc6IElGb3JtYXR0ZXIpIHtcbiAgICAgICAgY29uc3QgZnJvbVJlZ2lzdHJ5ID0gdGhpcy5mb3JtYXR0ZXJSZWdpc3RyeS5nZXRJdGVtKFxuICAgICAgICAgICAgZm9ybWF0dGVyQ29uZmlnLmNvbXBvbmVudFR5cGVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZnJvbVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRGb3JtYXR0ZXJEZWZpbml0aW9uID0gZnJvbVJlZ2lzdHJ5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBgTm8gYWdncmVnYXRvciB3aXRoIGtleSAke2Zvcm1hdHRlckNvbmZpZy5jb21wb25lbnRUeXBlfSBmb3VuZCBpbiByZWdpc3RyeS5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVBZ2dyZWdhdGVkVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy53aWRnZXREYXRhIHx8ICF0aGlzLmNvbnRlbnRBZ2dyZWdhdG9yRGVmaW5pdGlvbikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBgQ2FuJ3QgYWdncmVnYXRlIHZhbHVlLiBBZ2dyZWdhdG9yIGtleTogJHt0aGlzLmNvbnRlbnRBZ2dyZWdhdG9yRGVmaW5pdGlvbj8uYWdncmVnYXRvclR5cGV9LiBEYXRhOiAke3RoaXMud2lkZ2V0RGF0YX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuZ2V0QWdncmVnYXRvclByb3BlcnRpZXMoKTtcblxuICAgICAgICB0aGlzLmFnZ3JlZ2F0ZWRWYWx1ZSA9IHRoaXMuY29udGVudEFnZ3JlZ2F0b3JEZWZpbml0aW9uXG4gICAgICAgICAgICAuZm4odGhpcy53aWRnZXREYXRhLCB7XG4gICAgICAgICAgICAgICAgLi4ucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAvLyBwcmlvcml0aXplIGVtcGhhc2l6ZWRTZXJpZXNJZCBpZiBzZXJpZXMgaXMgaG92ZXJlZCBvbiB0aGUgY2hhcnRcbiAgICAgICAgICAgICAgICBhY3RpdmVNZXRyaWNJZDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbXBoYXNpemVkU2VyaWVzSWQgfHwgcHJvcGVydGllcy5hY3RpdmVNZXRyaWNJZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZvcm1hdHRlclByb3BlcnRpZXMoKSB7XG4gICAgICAgIHRoaXMuY29udGVudEZvcm1hdHRlclByb3BlcnRpZXMgPSB0aGlzLmdldEZvcm1hdHRlclByb3BlcnRpZXMoXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRGb3JtYXR0ZXJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFnZ3JlZ2F0b3JQcm9wZXJ0aWVzKCk6IElQcm9wb3J0aW9uYWxEb251dENvbnRlbnRBZ2dyZWdhdG9yUHJvcGVydGllcyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi50aGlzLmNvbnRlbnRBZ2dyZWdhdG9yRGVmaW5pdGlvbj8ucHJvcGVydGllcyxcbiAgICAgICAgICAgIC4uLnRoaXMuZG9udXRDb25maWc/LmFnZ3JlZ2F0b3I/LnByb3BlcnRpZXMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb0NoYXJ0QXNzaXN0KCkge1xuICAgICAgICB0aGlzLmNoYXJ0QXNzaXN0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmNoYXJ0QXNzaXN0U3Vic2NyaXB0aW9uID0gdGhpcy5jaGFydEFzc2lzdD8uY2hhcnRBc3Npc3RTdWJqZWN0XG4gICAgICAgICAgICA/LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogSUNoYXJ0QXNzaXN0RXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtcGhhc2l6ZWRTZXJpZXNJZCA9IGRhdGEucGF5bG9hZD8uc2VyaWVzSWQ7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGVkVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlclByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cImNvbnRlbnRGb3JtYXR0ZXI/LmNvbXBvbmVudFR5cGVcIlxuICAgIG51aUNvbXBvbmVudFBvcnRhbFxuICAgIFtjb21wb25lbnRUeXBlXT1cImNvbnRlbnRGb3JtYXR0ZXI/LmNvbXBvbmVudFR5cGVcIlxuICAgIFtwcm9wZXJ0aWVzXT1cImNvbnRlbnRGb3JtYXR0ZXJQcm9wZXJ0aWVzXCJcbiAgICAjY29tcG9uZW50UG9ydGFsPVwibnVpQ29tcG9uZW50UG9ydGFsXCJcbj5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgW2Nka1BvcnRhbE91dGxldF09XCJjb21wb25lbnRQb3J0YWwucG9ydGFsXCJcbiAgICAgICAgKGF0dGFjaGVkKT1cImNvbXBvbmVudFBvcnRhbC5hdHRhY2hlZCgkZXZlbnQpXCJcbiAgICA+PC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuIl19