@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
151 lines • 23.6 kB
JavaScript
// © 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 { Inject, Injectable, Optional } from "@angular/core";
import keyBy from "lodash/keyBy";
import uniq from "lodash/uniq";
import { Subject } from "rxjs";
import { takeUntil } from "rxjs/operators";
import { EventBus } from "@nova-ui/bits";
import { PizzagnaService } from "../pizzagna/services/pizzagna.service";
import { DASHBOARD_EVENT_BUS, PizzagnaLayer, PIZZAGNA_EVENT_BUS, } from "../types";
import { EventRegistryService } from "./event-registry.service";
import { WidgetConfigurationService } from "./widget-configuration.service";
import * as i0 from "@angular/core";
import * as i1 from "./widget-configuration.service";
import * as i2 from "./event-registry.service";
import * as i3 from "../pizzagna/services/pizzagna.service";
import * as i4 from "@nova-ui/bits";
/**
* This provider transmits events between the dashboard event bus and the widget event bus.
* It needs to be configured with the events that need transmission each way.
*/
export class WidgetToDashboardEventProxyService {
constructor(pizzagnaBus, dashboardBus, widgetConfigurationService, eventRegistry, pizzagnaService) {
this.pizzagnaBus = pizzagnaBus;
this.dashboardBus = dashboardBus;
this.widgetConfigurationService = widgetConfigurationService;
this.eventRegistry = eventRegistry;
this.pizzagnaService = pizzagnaService;
this.upstreamSubscriptions = {};
this.downstreamSubscriptions = {};
this.destroy$ = new Subject();
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
setComponent(component) {
this.component = component;
}
updateConfiguration(properties) {
this.providerKey = properties.providerKey;
this.upstreams = properties.upstreams;
this.downstreams = properties.downstreams;
if (this.upstreams) {
// upstream = widget -> dashboard
this.registerUpstreamSubscriptions(...this.upstreams);
}
if (this.downstreams) {
// downstream = dashboard -> widget
this.registerDownstreamSubscriptions(...this.downstreams);
}
}
addUpstream(stream) {
this.addStream(stream, "upstreams");
}
addDownstream(stream) {
this.addStream(stream, "downstreams");
}
addStream(stream, streamKey) {
const streams = uniq((this[streamKey] || []).concat(stream.id));
this[streamKey] = streams;
if (!this.component) {
return;
}
this.pizzagnaService.setProperty({
componentId: this.component.componentId,
pizzagnaKey: PizzagnaLayer.Data,
providerKey: this.providerKey,
propertyPath: [streamKey],
}, streams);
}
registerUpstreamSubscriptions(...upstreams) {
if (!this.dashboardBus) {
return;
}
this.registerSubscriptions(upstreams, this.upstreamSubscriptions, this.pizzagnaBus, (stream, event) => {
// add widgetId to all events passed to the dashboard
const widgetId = this.widgetConfigurationService.getWidget().id;
this.dashboardBus
.getStream(stream)
.next(Object.assign({}, event, { widgetId }));
});
}
registerDownstreamSubscriptions(...downstreams) {
if (!this.dashboardBus) {
return;
}
this.registerSubscriptions(downstreams, this.downstreamSubscriptions, this.dashboardBus, (stream, event) => {
// pass only events that have matching widgetId or a widgetId that is not defined
const widgetId = this.widgetConfigurationService.getWidget().id;
if (typeof event.widgetId === "undefined" ||
widgetId === event.widgetId) {
this.pizzagnaBus.getStream(stream).next(event);
}
});
}
registerSubscriptions(streams = [], subscriptions, sourceBus, handleEvent) {
const streamsIndex = streams
? keyBy(streams, (x) => x)
: null;
// remove subscriptions that are not valid anymore
for (const streamId of Object.keys(subscriptions)) {
if (!streamsIndex || !streamsIndex[streamId]) {
subscriptions[streamId].unsubscribe();
delete subscriptions[streamId];
}
}
// add subscriptions that were not registered before
for (const streamId of Object.keys(streamsIndex ?? {}).filter((s) => !subscriptions[s])) {
const eventDefinition = this.eventRegistry.getEvent(streamId);
subscriptions[streamId] = sourceBus.getStream(eventDefinition)
.pipe(takeUntil(this.destroy$))
.subscribe((event) => {
handleEvent(eventDefinition, event);
});
}
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetToDashboardEventProxyService, deps: [{ token: PIZZAGNA_EVENT_BUS }, { token: DASHBOARD_EVENT_BUS, optional: true }, { token: i1.WidgetConfigurationService, optional: true }, { token: i2.EventRegistryService }, { token: i3.PizzagnaService }], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetToDashboardEventProxyService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetToDashboardEventProxyService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i4.EventBus, decorators: [{
type: Inject,
args: [PIZZAGNA_EVENT_BUS]
}] }, { type: i4.EventBus, decorators: [{
type: Optional
}, {
type: Inject,
args: [DASHBOARD_EVENT_BUS]
}] }, { type: i1.WidgetConfigurationService, decorators: [{
type: Optional
}] }, { type: i2.EventRegistryService }, { type: i3.PizzagnaService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRvLWRhc2hib2FyZC1ldmVudC1wcm94eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy93aWRnZXQtdG8tZGFzaGJvYXJkLWV2ZW50LXByb3h5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQ0gsbUJBQW1CLEVBR25CLGFBQWEsRUFDYixrQkFBa0IsR0FDckIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7OztBQW9CNUU7OztHQUdHO0FBRUgs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LFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDMUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsQztTQUNKO1FBRUQsb0RBQW9EO1FBQ3BELEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUN6RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQzNCLEVBQUU7WUFDQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5RCxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQ25CLFNBQVMsQ0FBQyxTQUFTLENBQ2YsZUFBZSxDQUV0QjtpQkFDSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDOUIsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQ3pCLFdBQVcsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7U0FDVjtJQUNMLENBQUM7a0lBMUpRLGtDQUFrQyxrQkFhL0Isa0JBQWtCLGFBRWxCLG1CQUFtQjtzSUFmdEIsa0NBQWtDOzs0RkFBbEMsa0NBQWtDO2tCQUQ5QyxVQUFVOzswQkFjRixNQUFNOzJCQUFDLGtCQUFrQjs7MEJBQ3pCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsbUJBQW1COzswQkFFMUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGtleUJ5IGZyb20gXCJsb2Rhc2gva2V5QnlcIjtcbmltcG9ydCB1bmlxIGZyb20gXCJsb2Rhc2gvdW5pcVwiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgRXZlbnRCdXMsIElFdmVudCwgSUV2ZW50RGVmaW5pdGlvbiB9IGZyb20gXCJAbm92YS11aS9iaXRzXCI7XG5cbmltcG9ydCB7IFBpenphZ25hU2VydmljZSB9IGZyb20gXCIuLi9waXp6YWduYS9zZXJ2aWNlcy9waXp6YWduYS5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIERBU0hCT0FSRF9FVkVOVF9CVVMsXG4gICAgSUNvbmZpZ3VyYWJsZSxcbiAgICBJUHJvcGVydGllcyxcbiAgICBQaXp6YWduYUxheWVyLFxuICAgIFBJWlpBR05BX0VWRU5UX0JVUyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBFdmVudFJlZ2lzdHJ5U2VydmljZSB9IGZyb20gXCIuL2V2ZW50LXJlZ2lzdHJ5LnNlcnZpY2VcIjtcbmltcG9ydCB7IFdpZGdldENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4vd2lkZ2V0LWNvbmZpZ3VyYXRpb24uc2VydmljZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXaWRnZXRFdmVudCBleHRlbmRzIElFdmVudCB7XG4gICAgd2lkZ2V0SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvZiBXaWRnZXRUb0Rhc2hib2FyZEV2ZW50UHJveHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2lkZ2V0VG9EYXNoYm9hcmRFdmVudFByb3h5Q29uZmlndXJhdGlvbiBleHRlbmRzIElQcm9wZXJ0aWVzIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV2ZW50cyB0aGF0IGFyZSB0cmFuc21pdHRlZCBmcm9tIHdpZGdldCB0byBkYXNoYm9hcmRcbiAgICAgKi9cbiAgICB1cHN0cmVhbXM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV2ZW50cyB0aGF0IGFyZSB0cmFuc21pdHRlZCBmcm9tIGRhc2hib2FyZCB0byB3aWRnZXRcbiAgICAgKi9cbiAgICBkb3duc3RyZWFtcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoaXMgcHJvdmlkZXIgdHJhbnNtaXRzIGV2ZW50cyBiZXR3ZWVuIHRoZSBkYXNoYm9hcmQgZXZlbnQgYnVzIGFuZCB0aGUgd2lkZ2V0IGV2ZW50IGJ1cy5cbiAqIEl0IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgZXZlbnRzIHRoYXQgbmVlZCB0cmFuc21pc3Npb24gZWFjaCB3YXkuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXaWRnZXRUb0Rhc2hib2FyZEV2ZW50UHJveHlTZXJ2aWNlXG4gICAgaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlLCBPbkRlc3Ryb3lcbntcbiAgICBwcml2YXRlIHVwc3RyZWFtU3Vic2NyaXB0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHByaXZhdGUgZG93bnN0cmVhbVN1YnNjcmlwdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIGNvbXBvbmVudDogeyBjb21wb25lbnRJZDogc3RyaW5nIH07XG5cbiAgICBwcml2YXRlIHVwc3RyZWFtcz86IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgZG93bnN0cmVhbXM/OiBzdHJpbmdbXTtcbiAgICBwdWJsaWMgcHJvdmlkZXJLZXk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBJWlpBR05BX0VWRU5UX0JVUykgcHJpdmF0ZSBwaXp6YWduYUJ1czogRXZlbnRCdXM8SUV2ZW50PixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChEQVNIQk9BUkRfRVZFTlRfQlVTKVxuICAgICAgICBwcml2YXRlIGRhc2hib2FyZEJ1czogRXZlbnRCdXM8SUV2ZW50PixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgcHJpdmF0ZSB3aWRnZXRDb25maWd1cmF0aW9uU2VydmljZTogV2lkZ2V0Q29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZXZlbnRSZWdpc3RyeTogRXZlbnRSZWdpc3RyeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGl6emFnbmFTZXJ2aWNlOiBQaXp6YWduYVNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbXBvbmVudChjb21wb25lbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQ29uZmlndXJhdGlvbihcbiAgICAgICAgcHJvcGVydGllczogSVdpZGdldFRvRGFzaGJvYXJkRXZlbnRQcm94eUNvbmZpZ3VyYXRpb25cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm92aWRlcktleSA9IHByb3BlcnRpZXMucHJvdmlkZXJLZXk7XG4gICAgICAgIHRoaXMudXBzdHJlYW1zID0gcHJvcGVydGllcy51cHN0cmVhbXM7XG4gICAgICAgIHRoaXMuZG93bnN0cmVhbXMgPSBwcm9wZXJ0aWVzLmRvd25zdHJlYW1zO1xuXG4gICAgICAgIGlmICh0aGlzLnVwc3RyZWFtcykge1xuICAgICAgICAgICAgLy8gdXBzdHJlYW0gPSB3aWRnZXQgLT4gZGFzaGJvYXJkXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVXBzdHJlYW1TdWJzY3JpcHRpb25zKC4uLnRoaXMudXBzdHJlYW1zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kb3duc3RyZWFtcykge1xuICAgICAgICAgICAgLy8gZG93bnN0cmVhbSA9IGRhc2hib2FyZCAtPiB3aWRnZXRcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJEb3duc3RyZWFtU3Vic2NyaXB0aW9ucyguLi50aGlzLmRvd25zdHJlYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRVcHN0cmVhbShzdHJlYW06IElFdmVudERlZmluaXRpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRTdHJlYW0oc3RyZWFtLCBcInVwc3RyZWFtc1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRG93bnN0cmVhbShzdHJlYW06IElFdmVudERlZmluaXRpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRTdHJlYW0oc3RyZWFtLCBcImRvd25zdHJlYW1zXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkU3RyZWFtKFxuICAgICAgICBzdHJlYW06IElFdmVudERlZmluaXRpb24sXG4gICAgICAgIHN0cmVhbUtleTogXCJ1cHN0cmVhbXNcIiB8IFwiZG93bnN0cmVhbXNcIlxuICAgICkge1xuICAgICAgICBjb25zdCBzdHJlYW1zID0gdW5pcSgodGhpc1tzdHJlYW1LZXldIHx8IFtdKS5jb25jYXQoc3RyZWFtLmlkKSk7XG4gICAgICAgIHRoaXNbc3RyZWFtS2V5XSA9IHN0cmVhbXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5waXp6YWduYVNlcnZpY2Uuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmNvbXBvbmVudElkLFxuICAgICAgICAgICAgICAgIHBpenphZ25hS2V5OiBQaXp6YWduYUxheWVyLkRhdGEsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJLZXk6IHRoaXMucHJvdmlkZXJLZXksXG4gICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoOiBbc3RyZWFtS2V5XSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJlYW1zXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclVwc3RyZWFtU3Vic2NyaXB0aW9ucyguLi51cHN0cmVhbXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXNoYm9hcmRCdXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb25zKFxuICAgICAgICAgICAgdXBzdHJlYW1zLFxuICAgICAgICAgICAgdGhpcy51cHN0cmVhbVN1YnNjcmlwdGlvbnMsXG4gICAgICAgICAgICB0aGlzLnBpenphZ25hQnVzLFxuICAgICAgICAgICAgKHN0cmVhbTogSUV2ZW50RGVmaW5pdGlvbiwgZXZlbnQ6IElFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB3aWRnZXRJZCB0byBhbGwgZXZlbnRzIHBhc3NlZCB0byB0aGUgZGFzaGJvYXJkXG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkZ2V0SWQgPSB0aGlzLndpZGdldENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFdpZGdldCgpLmlkO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRCdXNcbiAgICAgICAgICAgICAgICAgICAgLmdldFN0cmVhbShzdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgIC5uZXh0KDxhbnk+T2JqZWN0LmFzc2lnbih7fSwgZXZlbnQsIHsgd2lkZ2V0SWQgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJEb3duc3RyZWFtU3Vic2NyaXB0aW9ucyguLi5kb3duc3RyZWFtczogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhc2hib2FyZEJ1cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbnMoXG4gICAgICAgICAgICBkb3duc3RyZWFtcyxcbiAgICAgICAgICAgIHRoaXMuZG93bnN0cmVhbVN1YnNjcmlwdGlvbnMsXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZEJ1cyxcbiAgICAgICAgICAgIChzdHJlYW06IElFdmVudERlZmluaXRpb24sIGV2ZW50OiBJV2lkZ2V0RXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBwYXNzIG9ubHkgZXZlbnRzIHRoYXQgaGF2ZSBtYXRjaGluZyB3aWRnZXRJZCBvciBhIHdpZGdldElkIHRoYXQgaXMgbm90IGRlZmluZWRcbiAgICAgICAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHRoaXMud2lkZ2V0Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0V2lkZ2V0KCkuaWQ7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQud2lkZ2V0SWQgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgd2lkZ2V0SWQgPT09IGV2ZW50LndpZGdldElkXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl6emFnbmFCdXMuZ2V0U3RyZWFtKHN0cmVhbSkubmV4dChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJTdWJzY3JpcHRpb25zKFxuICAgICAgICBzdHJlYW1zOiBzdHJpbmdbXSA9IFtdLFxuICAgICAgICBzdWJzY3JpcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICBzb3VyY2VCdXM6IEV2ZW50QnVzPElFdmVudD4sXG4gICAgICAgIGhhbmRsZUV2ZW50OiAoc3RyZWFtOiBJRXZlbnREZWZpbml0aW9uLCBldmVudDogSUV2ZW50KSA9PiB2b2lkXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbXNJbmRleDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBzdHJlYW1zXG4gICAgICAgICAgICA/IGtleUJ5KHN0cmVhbXMsICh4KSA9PiB4KVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIC8vIHJlbW92ZSBzdWJzY3JpcHRpb25zIHRoYXQgYXJlIG5vdCB2YWxpZCBhbnltb3JlXG4gICAgICAgIGZvciAoY29uc3Qgc3RyZWFtSWQgb2YgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgICAgIGlmICghc3RyZWFtc0luZGV4IHx8ICFzdHJlYW1zSW5kZXhbc3RyZWFtSWRdKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uc1tzdHJlYW1JZF0udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgc3Vic2NyaXB0aW9uc1tzdHJlYW1JZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgc3Vic2NyaXB0aW9ucyB0aGF0IHdlcmUgbm90IHJlZ2lzdGVyZWQgYmVmb3JlXG4gICAgICAgIGZvciAoY29uc3Qgc3RyZWFtSWQgb2YgT2JqZWN0LmtleXMoc3RyZWFtc0luZGV4ID8/IHt9KS5maWx0ZXIoXG4gICAgICAgICAgICAocykgPT4gIXN1YnNjcmlwdGlvbnNbc11cbiAgICAgICAgKSkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREZWZpbml0aW9uID0gdGhpcy5ldmVudFJlZ2lzdHJ5LmdldEV2ZW50KHN0cmVhbUlkKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnNbc3RyZWFtSWRdID0gKFxuICAgICAgICAgICAgICAgIHNvdXJjZUJ1cy5nZXRTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGVmaW5pdGlvblxuICAgICAgICAgICAgICAgICkgYXMgb2JqZWN0IGFzIFN1YmplY3Q8SUV2ZW50PlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogSUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50KGV2ZW50RGVmaW5pdGlvbiwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19