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

118 lines 17.1 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 { ChangeDetectorRef, Injectable, Input, } from "@angular/core"; import { Subject } from "rxjs"; import { LoggerService } from "@nova-ui/bits"; import { mergeChanges } from "../../functions/merge-changes"; import { PizzagnaService } from "../../pizzagna/services/pizzagna.service"; import * as i0 from "@angular/core"; import * as i1 from "../../pizzagna/services/pizzagna.service"; import * as i2 from "@nova-ui/bits"; export class BaseLayout { constructor(changeDetector, pizzagnaService, logger) { this.changeDetector = changeDetector; this.pizzagnaService = pizzagnaService; this.logger = logger; this.destroyed$ = new Subject(); } ngOnChanges(changes) { if (changes.nodes || changes.template) { this.updateNodeConfigs({ changesNodes: changes.nodes, changesTemplate: changes.template, }); } } ngDoCheck() { if (this.checkNodeConfigs()) { this.updateNodeConfigs(); this.changeDetector.detectChanges(); } } ngOnDestroy() { this.destroyed$.next(); this.destroyed$.complete(); } trackByFn(index, node) { return node.id; } checkNodeConfigs() { const nodes = this.getNodes(); if (!this.nodeComponentsConfigs || nodes.length !== this.nodeComponentsConfigs.length) { return true; } for (let i = 0; i < nodes.length; i++) { if (this.pizzagnaService.getComponent(nodes[i]) !== this.nodeComponentsConfigs[i]) { return true; } } return false; } updateNodeComponentConfigs() { const nodes = this.getNodes(); this.nodeComponentsConfigs = nodes && nodes.map((n) => { const c = this.pizzagnaService.getComponent(n); if (typeof c === "undefined") { throw new Error("No component with id '" + n + "' was defined in the configuration."); } return c; }); } updateNodeConfigs(changes) { this.nodeConfigs = mergeChanges(this.nodeConfigs, this.getTemplateChangeForNodes(changes), this.getNodeComponentsConfigs()); } getNodeComponentsConfigs() { const nodeComponentsConfigsChanges = { currentValue: undefined, previousValue: this.nodeComponentsConfigs ? [...this.nodeComponentsConfigs] : undefined, }; this.updateNodeComponentConfigs(); nodeComponentsConfigsChanges.currentValue = this.nodeComponentsConfigs; return nodeComponentsConfigsChanges; } getTemplateChangeForNodes(changes) { const { changesNodes, changesTemplate } = changes || {}; const getTemplatePerNode = (template) => template && this.getNodes()?.map(() => template); return { currentValue: getTemplatePerNode(changesTemplate ? changesTemplate.currentValue : this.template), previousValue: changesNodes ? this.template : getTemplatePerNode(changesTemplate ? changesTemplate.previousValue : this.template), }; } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseLayout, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.PizzagnaService }, { token: i2.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseLayout }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseLayout, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.PizzagnaService }, { type: i2.LoggerService }], propDecorators: { template: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1sYXlvdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGF5b3V0cy9iYXNlLWxheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUNILGlCQUFpQixFQUVqQixVQUFVLEVBQ1YsS0FBSyxHQUlSLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5QyxPQUFPLEVBQWdCLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7OztBQUkzRSxNQUFNLE9BQWdCLFVBQVU7SUFZNUIsWUFDVyxjQUFpQyxFQUM5QixlQUFnQyxFQUNoQyxNQUFxQjtRQUZ4QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDOUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFQekIsZUFBVSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO0lBUXZELENBQUM7SUFJRyxXQUFXLENBQUMsT0FBc0I7UUFDckMsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDbkMsSUFBSSxDQUFD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LFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXJELE9BQU87WUFDSCxZQUFZLEVBQUUsa0JBQWtCLENBQzVCLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FDakU7WUFDRCxhQUFhLEVBQUUsWUFBWTtnQkFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUNmLENBQUMsQ0FBQyxrQkFBa0IsQ0FDZCxlQUFlO29CQUNYLENBQUMsQ0FBQyxlQUFlLENBQUMsYUFBYTtvQkFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQ3RCO1NBQ1YsQ0FBQztJQUNOLENBQUM7a0lBNUhpQixVQUFVO3NJQUFWLFVBQVU7OzRGQUFWLFVBQVU7a0JBRC9CLFVBQVU7Z0pBV1MsUUFBUTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIERvQ2hlY2ssXG4gICAgSW5qZWN0YWJsZSxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gXCJAbm92YS11aS9iaXRzXCI7XG5cbmltcG9ydCB7IElWYWx1ZUNoYW5nZSwgbWVyZ2VDaGFuZ2VzIH0gZnJvbSBcIi4uLy4uL2Z1bmN0aW9ucy9tZXJnZS1jaGFuZ2VzXCI7XG5pbXBvcnQgeyBQaXp6YWduYVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vcGl6emFnbmEvc2VydmljZXMvcGl6emFnbmEuc2VydmljZVwiO1xuaW1wb3J0IHsgSUNvbXBvbmVudENvbmZpZ3VyYXRpb24sIElIYXNDaGFuZ2VEZXRlY3RvciB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUxheW91dFxuICAgIGltcGxlbWVudHMgSUhhc0NoYW5nZURldGVjdG9yLCBPbkNoYW5nZXMsIERvQ2hlY2ssIE9uRGVzdHJveVxue1xuICAgIC8vIGNvbXBvbmVudHMgY29uZmlnIGZyb20gJ3BpenphJ1xuICAgIHB1YmxpYyBub2RlQ29tcG9uZW50c0NvbmZpZ3M6IElDb21wb25lbnRDb25maWd1cmF0aW9uW107XG4gICAgLy8gcmVzdWx0IGNvbmZpZyBmcm9tIG1lcmdpbmcgJ25vZGVDb21wb25lbnRzQ29uZmlnJyBhbmQgcGFyZW50ICd0ZW1wbGF0ZSdcbiAgICBwdWJsaWMgbm9kZUNvbmZpZ3M6IElDb21wb25lbnRDb25maWd1cmF0aW9uW107XG5cbiAgICBwcm90ZWN0ZWQgZGVzdHJveWVkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGU6IFBhcnRpYWw8SUNvbXBvbmVudENvbmZpZ3VyYXRpb24+O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBwaXp6YWduYVNlcnZpY2U6IFBpenphZ25hU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgICkge31cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXROb2RlcygpOiBzdHJpbmdbXTtcblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLm5vZGVzIHx8IGNoYW5nZXMudGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTm9kZUNvbmZpZ3Moe1xuICAgICAgICAgICAgICAgIGNoYW5nZXNOb2RlczogY2hhbmdlcy5ub2RlcyxcbiAgICAgICAgICAgICAgICBjaGFuZ2VzVGVtcGxhdGU6IGNoYW5nZXMudGVtcGxhdGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrTm9kZUNvbmZpZ3MoKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlQ29uZmlncygpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgbm9kZTogSUNvbXBvbmVudENvbmZpZ3VyYXRpb24pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbm9kZS5pZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrTm9kZUNvbmZpZ3MoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5nZXROb2RlcygpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLm5vZGVDb21wb25lbnRzQ29uZmlncyB8fFxuICAgICAgICAgICAgbm9kZXMubGVuZ3RoICE9PSB0aGlzLm5vZGVDb21wb25lbnRzQ29uZmlncy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnBpenphZ25hU2VydmljZS5nZXRDb21wb25lbnQobm9kZXNbaV0pICE9PVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZUNvbXBvbmVudHNDb25maWdzW2ldXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVDb21wb25lbnRDb25maWdzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuZ2V0Tm9kZXMoKTtcblxuICAgICAgICB0aGlzLm5vZGVDb21wb25lbnRzQ29uZmlncyA9XG4gICAgICAgICAgICBub2RlcyAmJlxuICAgICAgICAgICAgbm9kZXMubWFwKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHRoaXMucGl6emFnbmFTZXJ2aWNlLmdldENvbXBvbmVudChuKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJObyBjb21wb25lbnQgd2l0aCBpZCAnXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiJyB3YXMgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbi5cIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTm9kZUNvbmZpZ3MoY2hhbmdlcz86IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5ub2RlQ29uZmlncyA9IG1lcmdlQ2hhbmdlcyhcbiAgICAgICAgICAgIHRoaXMubm9kZUNvbmZpZ3MsXG4gICAgICAgICAgICB0aGlzLmdldFRlbXBsYXRlQ2hhbmdlRm9yTm9kZXMoY2hhbmdlcyksXG4gICAgICAgICAgICB0aGlzLmdldE5vZGVDb21wb25lbnRzQ29uZmlncygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlQ29tcG9uZW50c0NvbmZpZ3MoKSB7XG4gICAgICAgIGNvbnN0IG5vZGVDb21wb25lbnRzQ29uZmlnc0NoYW5nZXM6IElWYWx1ZUNoYW5nZSA9IHtcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJldmlvdXNWYWx1ZTogdGhpcy5ub2RlQ29tcG9uZW50c0NvbmZpZ3NcbiAgICAgICAgICAgICAgICA/IFsuLi50aGlzLm5vZGVDb21wb25lbnRzQ29uZmlnc11cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlQ29tcG9uZW50Q29uZmlncygpO1xuICAgICAgICBub2RlQ29tcG9uZW50c0NvbmZpZ3NDaGFuZ2VzLmN1cnJlbnRWYWx1ZSA9IHRoaXMubm9kZUNvbXBvbmVudHNDb25maWdzO1xuXG4gICAgICAgIHJldHVybiBub2RlQ29tcG9uZW50c0NvbmZpZ3NDaGFuZ2VzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGVtcGxhdGVDaGFuZ2VGb3JOb2RlcyhjaGFuZ2VzPzogU2ltcGxlQ2hhbmdlcyk6IElWYWx1ZUNoYW5nZSB7XG4gICAgICAgIGNvbnN0IHsgY2hhbmdlc05vZGVzLCBjaGFuZ2VzVGVtcGxhdGUgfSA9IGNoYW5nZXMgfHwge307XG5cbiAgICAgICAgY29uc3QgZ2V0VGVtcGxhdGVQZXJOb2RlID0gKHRlbXBsYXRlOiBJQ29tcG9uZW50Q29uZmlndXJhdGlvbikgPT5cbiAgICAgICAgICAgIHRlbXBsYXRlICYmIHRoaXMuZ2V0Tm9kZXMoKT8ubWFwKCgpID0+IHRlbXBsYXRlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3VycmVudFZhbHVlOiBnZXRUZW1wbGF0ZVBlck5vZGUoXG4gICAgICAgICAgICAgICAgY2hhbmdlc1RlbXBsYXRlID8gY2hhbmdlc1RlbXBsYXRlLmN1cnJlbnRWYWx1ZSA6IHRoaXMudGVtcGxhdGVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlOiBjaGFuZ2VzTm9kZXNcbiAgICAgICAgICAgICAgICA/IHRoaXMudGVtcGxhdGVcbiAgICAgICAgICAgICAgICA6IGdldFRlbXBsYXRlUGVyTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjaGFuZ2VzVGVtcGxhdGUucHJldmlvdXNWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMudGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19