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

335 lines 44.5 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 { ScrollingModule } from "@angular/cdk/scrolling"; import { DecimalPipe } from "@angular/common"; import { NgModule } from "@angular/core"; import { ReactiveFormsModule } from "@angular/forms"; import { GridsterModule } from "angular-gridster2"; import { NuiBusyModule, NuiButtonModule, NuiCommonModule, NuiIconModule, NuiImageModule, NuiMenuModule, NuiPaginatorModule, NuiPopoverModule, NuiPopupModule, NuiProgressModule, NuiRepeatModule, NuiRiskScoreModule, NuiSearchModule, NuiSelectModule, NuiSpinnerModule, NuiTableModule, NuiTimeFrameBarModule, NuiTimeFramePickerModule, NuiTooltipModule, } from "@nova-ui/bits"; import { NuiChartsModule } from "@nova-ui/charts"; import { NuiDashboardsCommonModule } from "./common/common.module"; import { WidgetErrorComponent } from "./common/components/widget-error/widget-error.component"; import { DashboardComponent } from "./components/dashboard/dashboard.component"; import { EmbeddedContentComponent } from "./components/embedded-content/embedded-content.component"; import { KpiComponent } from "./components/kpi-widget/kpi.component"; import { StackComponent } from "./components/layouts/stack/stack.component"; import { TilesComponent } from "./components/layouts/tiles/tiles.component"; import { ListGroupItemComponent } from "./components/list-widget/list-elements/list-group-item/list-group-item.component"; import { ListLeafItemComponent } from "./components/list-widget/list-elements/list-leaf-item/list-leaf-item.component"; import { ListNavigationBarComponent } from "./components/list-widget/list-elements/list-navigation-bar/list-navigation-bar.component"; import { ListWidgetComponent } from "./components/list-widget/list-widget.component"; import { LoadingComponent } from "./components/loading/loading.component"; import { ProportionalDonutContentComponent } from "./components/proportional-widget/proportional-donut-content/proportional-donut-content.component"; import { ProportionalWidgetComponent } from "./components/proportional-widget/proportional-widget.component"; import { RefresherSettingsService } from "./components/providers/refresher-settings.service"; import { RiskScoreTileComponent } from "./components/risk-score-tile/risk-score-tile.component"; import { DelayedMousePresenceDetectionDirective } from "./components/table-widget/delayed-mouse-presence-detection.directive"; import { TableWidgetComponent } from "./components/table-widget/table-widget.component"; import { TemplateLoadErrorComponent } from "./components/template-load-error/template-load-error.component"; import { TimeframeSelectionComponent } from "./components/time-frame-selection/timeframe-selection.component"; import { StatusBarChartComponent } from "./components/timeseries-widget/chart-presets/status-bar-chart/status-bar-chart.component"; import { LineChartComponent } from "./components/timeseries-widget/chart-presets/xy-chart/chart-types/line-chart.component"; import { StackedAreaChartComponent } from "./components/timeseries-widget/chart-presets/xy-chart/chart-types/stacked-area-chart.component"; import { StackedBarChartComponent } from "./components/timeseries-widget/chart-presets/xy-chart/chart-types/stacked-bar-chart.component"; import { StackedPercentageAreaChartComponent } from "./components/timeseries-widget/chart-presets/xy-chart/chart-types/stacked-percentage-area-chart.component"; import { TimeseriesInspectionMenuComponent } from "./components/timeseries-widget/timeseries-inspection-menu/timeseries-inspection-menu.component"; import { TimeseriesWidgetComponent } from "./components/timeseries-widget/timeseries-widget.component"; import { WidgetBodyComponent } from "./components/widget/widget-body/widget-body.component"; import { WidgetBodyContentComponent } from "./components/widget/widget-body-content/widget-body-content.component"; import { WidgetHeaderComponent } from "./components/widget/widget-header/widget-header.component"; import { WidgetComponent } from "./components/widget/widget.component"; import { WidgetSearchComponent } from "./components/widget-search/widget-search.component"; import { NuiDashboardConfiguratorModule } from "./configurator/configurator.module"; import { DATA_SOURCE_OUTPUT } from "./configurator/types"; import { GridsterItemWidgetIdDirective } from "./directives/gridster-item-widget-id/gridster-item-widget-id.directive"; import { WidgetEditorDirective } from "./directives/widget-editor/widget-editor.directive"; import { NuiPizzagnaModule } from "./pizzagna/pizzagna.module"; import { ComponentPortalService } from "./pizzagna/services/component-portal.service"; import { ComponentRegistryService, } from "./pizzagna/services/component-registry.service"; import { EventRegistryService } from "./services/event-registry.service"; import { KpiFormattersRegistryService, RiskScoreFormattersRegistryService, } from "./services/table-formatter-registry.service"; import { DASHBOARD_EDIT_MODE, DATA_SOURCE_BUSY, PREVIEW_EVENT, REFRESH, SET_PROPERTY_VALUE, SET_TIMEFRAME, WIDGET_CREATE, WIDGET_EDIT, WIDGET_POSITION_CHANGE, WIDGET_READY, WIDGET_REMOVE, WIDGET_RESIZE, } from "./services/types"; import { WidgetTypesService } from "./services/widget-types.service"; import { drilldown } from "./widget-types/drilldown/drilldown"; import { embeddedContent } from "./widget-types/embedded-content/embedded-content"; import { kpi } from "./widget-types/kpi/kpi"; import { DEFAULT_KPI_FORMATTERS } from "./widget-types/kpi/kpi-configurator"; import { previewPlaceholder } from "./widget-types/preview-placeholder"; import { proportional } from "./widget-types/proportional/proportional"; import { riskScore } from "./widget-types/risk-score/risk-score"; import { DEFAULT_RISK_SCORE_FORMATTERS } from "./widget-types/risk-score/risk-score-configurator"; import { table } from "./widget-types/table/table"; import { timeseries } from "./widget-types/timeseries/timeseries"; import * as i0 from "@angular/core"; import * as i1 from "./services/widget-types.service"; import * as i2 from "./pizzagna/services/component-registry.service"; import * as i3 from "./services/event-registry.service"; import * as i4 from "./services/table-formatter-registry.service"; const dashboardComponents = [ DashboardComponent, EmbeddedContentComponent, GridsterItemWidgetIdDirective, KpiComponent, RiskScoreTileComponent, LineChartComponent, LoadingComponent, ProportionalWidgetComponent, StackComponent, StackedAreaChartComponent, StackedBarChartComponent, StackedPercentageAreaChartComponent, StatusBarChartComponent, TableWidgetComponent, DelayedMousePresenceDetectionDirective, TemplateLoadErrorComponent, TilesComponent, TimeframeSelectionComponent, TimeseriesWidgetComponent, WidgetBodyComponent, WidgetBodyContentComponent, WidgetComponent, WidgetEditorDirective, WidgetHeaderComponent, ListWidgetComponent, ListLeafItemComponent, ListGroupItemComponent, ListNavigationBarComponent, WidgetSearchComponent, ProportionalDonutContentComponent, TimeseriesInspectionMenuComponent, ]; const entryComponents = [ EmbeddedContentComponent, KpiComponent, RiskScoreTileComponent, LineChartComponent, LoadingComponent, ProportionalWidgetComponent, StackComponent, StackedAreaChartComponent, StackedBarChartComponent, StackedPercentageAreaChartComponent, StatusBarChartComponent, TableWidgetComponent, TemplateLoadErrorComponent, TilesComponent, TimeframeSelectionComponent, TimeseriesWidgetComponent, WidgetBodyComponent, WidgetBodyContentComponent, WidgetHeaderComponent, WidgetErrorComponent, ListWidgetComponent, ListLeafItemComponent, ListGroupItemComponent, ListNavigationBarComponent, WidgetSearchComponent, ProportionalDonutContentComponent, ]; export class NuiDashboardsModule { constructor(widgetTypesService, componentRegistry, eventRegistry, kpiFormattersRegistry, riskScoreFormattersRegistry) { widgetTypesService.registerWidgetType("kpi", 1, kpi); widgetTypesService.registerWidgetType("risk-score", 1, riskScore); widgetTypesService.registerWidgetType("table", 1, table); widgetTypesService.registerWidgetType("proportional", 1, proportional); widgetTypesService.registerWidgetType("timeseries", 1, timeseries); widgetTypesService.registerWidgetType("previewPlaceholder", 1, previewPlaceholder); widgetTypesService.registerWidgetType("embedded-content", 1, embeddedContent); widgetTypesService.registerWidgetType("drilldown", 1, drilldown); for (const ec of entryComponents.filter((c) => c.lateLoadKey)) { componentRegistry.registerByLateLoadKey(ec); } eventRegistry.registerEvent(REFRESH); eventRegistry.registerEvent(WIDGET_REMOVE); eventRegistry.registerEvent(WIDGET_READY); eventRegistry.registerEvent(WIDGET_EDIT); eventRegistry.registerEvent(WIDGET_CREATE); eventRegistry.registerEvent(WIDGET_RESIZE); eventRegistry.registerEvent(WIDGET_POSITION_CHANGE); eventRegistry.registerEvent(SET_PROPERTY_VALUE); eventRegistry.registerEvent(SET_TIMEFRAME); eventRegistry.registerEvent(PREVIEW_EVENT); eventRegistry.registerEvent(DASHBOARD_EDIT_MODE); eventRegistry.registerEvent(DATA_SOURCE_OUTPUT); eventRegistry.registerEvent(DATA_SOURCE_BUSY); kpiFormattersRegistry.addItems(DEFAULT_KPI_FORMATTERS); riskScoreFormattersRegistry.addItems(DEFAULT_RISK_SCORE_FORMATTERS); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NuiDashboardsModule, deps: [{ token: i1.WidgetTypesService }, { token: i2.ComponentRegistryService }, { token: i3.EventRegistryService }, { token: i4.KpiFormattersRegistryService }, { token: i4.RiskScoreFormattersRegistryService }], target: i0.ɵɵFactoryTarget.NgModule }); } /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: NuiDashboardsModule, declarations: [DashboardComponent, EmbeddedContentComponent, GridsterItemWidgetIdDirective, KpiComponent, RiskScoreTileComponent, LineChartComponent, LoadingComponent, ProportionalWidgetComponent, StackComponent, StackedAreaChartComponent, StackedBarChartComponent, StackedPercentageAreaChartComponent, StatusBarChartComponent, TableWidgetComponent, DelayedMousePresenceDetectionDirective, TemplateLoadErrorComponent, TilesComponent, TimeframeSelectionComponent, TimeseriesWidgetComponent, WidgetBodyComponent, WidgetBodyContentComponent, WidgetComponent, WidgetEditorDirective, WidgetHeaderComponent, ListWidgetComponent, ListLeafItemComponent, ListGroupItemComponent, ListNavigationBarComponent, WidgetSearchComponent, ProportionalDonutContentComponent, TimeseriesInspectionMenuComponent], imports: [NuiDashboardsCommonModule, GridsterModule, NuiBusyModule, NuiButtonModule, NuiChartsModule, NuiDashboardConfiguratorModule, NuiIconModule, NuiImageModule, NuiMenuModule, NuiPizzagnaModule, NuiPopupModule, NuiProgressModule, NuiTableModule, NuiTimeFrameBarModule, ScrollingModule, NuiTimeFramePickerModule, ReactiveFormsModule, NuiSpinnerModule, NuiTooltipModule, NuiSearchModule, NuiCommonModule, NuiRepeatModule, NuiRiskScoreModule, NuiSelectModule, NuiPopoverModule, NuiPaginatorModule], exports: [DashboardComponent, EmbeddedContentComponent, GridsterItemWidgetIdDirective, KpiComponent, RiskScoreTileComponent, LineChartComponent, LoadingComponent, ProportionalWidgetComponent, StackComponent, StackedAreaChartComponent, StackedBarChartComponent, StackedPercentageAreaChartComponent, StatusBarChartComponent, TableWidgetComponent, DelayedMousePresenceDetectionDirective, TemplateLoadErrorComponent, TilesComponent, TimeframeSelectionComponent, TimeseriesWidgetComponent, WidgetBodyComponent, WidgetBodyContentComponent, WidgetComponent, WidgetEditorDirective, WidgetHeaderComponent, ListWidgetComponent, ListLeafItemComponent, ListGroupItemComponent, ListNavigationBarComponent, WidgetSearchComponent, ProportionalDonutContentComponent, TimeseriesInspectionMenuComponent] }); } /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NuiDashboardsModule, providers: [ ComponentPortalService, WidgetTypesService, DecimalPipe, RefresherSettingsService, ], imports: [NuiDashboardsCommonModule, GridsterModule, NuiBusyModule, NuiButtonModule, NuiChartsModule, NuiDashboardConfiguratorModule, NuiIconModule, NuiImageModule, NuiMenuModule, NuiPizzagnaModule, NuiPopupModule, NuiProgressModule, NuiTableModule, NuiTimeFrameBarModule, ScrollingModule, NuiTimeFramePickerModule, ReactiveFormsModule, NuiSpinnerModule, NuiTooltipModule, NuiSearchModule, NuiCommonModule, NuiRepeatModule, NuiRiskScoreModule, NuiSelectModule, NuiPopoverModule, NuiPaginatorModule] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NuiDashboardsModule, decorators: [{ type: NgModule, args: [{ imports: [ NuiDashboardsCommonModule, GridsterModule, NuiBusyModule, NuiButtonModule, NuiChartsModule, NuiDashboardConfiguratorModule, NuiIconModule, NuiImageModule, NuiMenuModule, NuiPizzagnaModule, NuiPopupModule, NuiProgressModule, NuiTableModule, NuiTimeFrameBarModule, ScrollingModule, NuiTimeFramePickerModule, ReactiveFormsModule, NuiSpinnerModule, NuiTooltipModule, NuiSearchModule, NuiCommonModule, NuiRepeatModule, NuiRiskScoreModule, NuiSelectModule, NuiPopoverModule, NuiPaginatorModule, ], declarations: dashboardComponents, providers: [ ComponentPortalService, WidgetTypesService, DecimalPipe, RefresherSettingsService, ], exports: dashboardComponents, }] }], ctorParameters: () => [{ type: i1.WidgetTypesService }, { type: i2.ComponentRegistryService }, { type: i3.EventRegistryService }, { type: i4.KpiFormattersRegistryService }, { type: i4.RiskScoreFormattersRegistryService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkcy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Rhc2hib2FyZHMubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFDSCxhQUFhLEVBQ2IsZUFBZSxFQUNmLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBRSx5QkFBeUIsRUFB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Yzt3QkFDZCxhQUFhO3dCQUNiLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGNBQWM7d0JBQ2QscUJBQXFCO3dCQUNyQixlQUFlO3dCQUNmLHdCQUF3Qjt3QkFDeEIsbUJBQW1CO3dCQUNuQixnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsa0JBQWtCO3FCQUNyQjtvQkFDRCxZQUFZLEVBQUUsbUJBQW1CO29CQUNqQyxTQUFTLEVBQUU7d0JBQ1Asc0JBQXNCO3dCQUN0QixrQkFBa0I7d0JBQ2xCLFdBQVc7d0JBQ1gsd0JBQXdCO3FCQUMzQjtvQkFDRCxPQUFPLEVBQUUsbUJBQW1CO2lCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xuaW1wb3J0IHsgRGVjaW1hbFBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG4vLyBUaGlzIGlzIG5vdCB0ZWNobmljYWxseSB1c2VkIGhlcmUsIGJ1dCBpdCBkb2VzIHB1bGwgaW4gdGhlIHR5cGUgZm9yICRsb2NhbGl6ZVxuLy8gbm9pbnNwZWN0aW9uIEVTNlVudXNlZEltcG9ydHNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmltcG9ydCB7IExvY2FsaXplRm4gfSBmcm9tIFwiQGFuZ3VsYXIvbG9jYWxpemUvaW5pdFwiO1xuaW1wb3J0IHsgR3JpZHN0ZXJNb2R1bGUgfSBmcm9tIFwiYW5ndWxhci1ncmlkc3RlcjJcIjtcblxuaW1wb3J0IHtcbiAgICBOdWlCdXN5TW9kdWxlLFxuICAgIE51aUJ1dHRvbk1vZHVsZSxcbiAgICBOdWlDb21tb25Nb2R1bGUsXG4gICAgTnVpSWNvbk1vZHVsZSxcbiAgICBOdWlJbWFnZU1vZHVsZSxcbiAgICBOdWlNZW51TW9kdWxlLFxuICAgIE51aVBhZ2luYXRvck1vZHVsZSxcbiAgICBOdWlQb3BvdmVyTW9kdWxlLFxuICAgIE51aVBvcHVwTW9kdWxlLFxuICAgIE51aVByb2dyZXNzTW9kdWxlLFxuICAgIE51aVJlcGVhdE1vZHVsZSxcbiAgICBOdWlSaXNrU2NvcmVNb2R1bGUsXG4gICAgTnVpU2VhcmNoTW9kdWxlLFxuICAgIE51aVNlbGVjdE1vZHVsZSxcbiAgICBOdWlTcGlubmVyTW9kdWxlLFxuICAgIE51aVRhYmxlTW9kdWxlLFxuICAgIE51aVRpbWVGcmFtZUJhck1vZHVsZSxcbiAgICBOdWlUaW1lRnJhbWVQaWNrZXJNb2R1bGUsXG4gICAgTnVpVG9vbHRpcE1vZHVsZSxcbn0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcbmltcG9ydCB7IE51aUNoYXJ0c01vZHVsZSB9IGZyb20gXCJAbm92YS11aS9jaGFydHNcIjtcblxuaW1wb3J0IHsgTnVpRGFzaGJvYXJkc0NvbW1vbk1vZHVsZSB9IGZyb20gXCIuL2NvbW1vbi9jb21tb24ubW9kdWxlXCI7XG5pbXBvcnQgeyBXaWRnZXRFcnJvckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbW1vbi9jb21wb25lbnRzL3dpZGdldC1lcnJvci93aWRnZXQtZXJyb3IuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2Rhc2hib2FyZC9kYXNoYm9hcmQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBFbWJlZGRlZENvbnRlbnRDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2VtYmVkZGVkLWNvbnRlbnQvZW1iZWRkZWQtY29udGVudC5jb21wb25lbnRcIjtcbmltcG9ydCB7IEtwaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMva3BpLXdpZGdldC9rcGkuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdGFja0NvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvbGF5b3V0cy9zdGFjay9zdGFjay5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRpbGVzQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9sYXlvdXRzL3RpbGVzL3RpbGVzLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTGlzdEdyb3VwSXRlbUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvbGlzdC13aWRnZXQvbGlzdC1lbGVtZW50cy9saXN0LWdyb3VwLWl0ZW0vbGlzdC1ncm91cC1pdGVtLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTGlzdExlYWZJdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9saXN0LXdpZGdldC9saXN0LWVsZW1lbnRzL2xpc3QtbGVhZi1pdGVtL2xpc3QtbGVhZi1pdGVtLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTGlzdE5hdmlnYXRpb25CYXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2xpc3Qtd2lkZ2V0L2xpc3QtZWxlbWVudHMvbGlzdC1uYXZpZ2F0aW9uLWJhci9saXN0LW5hdmlnYXRpb24tYmFyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTGlzdFdpZGdldENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvbGlzdC13aWRnZXQvbGlzdC13aWRnZXQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBMb2FkaW5nQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9sb2FkaW5nL2xvYWRpbmcuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBQcm9wb3J0aW9uYWxEb251dENvbnRlbnRDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL3Byb3BvcnRpb25hbC13aWRnZXQvcHJvcG9ydGlvbmFsLWRvbnV0LWNvbnRlbnQvcHJvcG9ydGlvbmFsLWRvbnV0LWNvbnRlbnQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBQcm9wb3J0aW9uYWxXaWRnZXRDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL3Byb3BvcnRpb25hbC13aWRnZXQvcHJvcG9ydGlvbmFsLXdpZGdldC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFJlZnJlc2hlclNldHRpbmdzU2VydmljZSB9IGZyb20gXCIuL2NvbXBvbmVudHMvcHJvdmlkZXJzL3JlZnJlc2hlci1zZXR0aW5ncy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSaXNrU2NvcmVUaWxlQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9yaXNrLXNjb3JlLXRpbGUvcmlzay1zY29yZS10aWxlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVsYXllZE1vdXNlUHJlc2VuY2VEZXRlY3Rpb25EaXJlY3RpdmUgfSBmcm9tIFwiLi9jb21wb25lbnRzL3RhYmxlLXdpZGdldC9kZWxheWVkLW1vdXNlLXByZXNlbmNlLWRldGVjdGlvbi5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IFRhYmxlV2lkZ2V0Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy90YWJsZS13aWRnZXQvdGFibGUtd2lkZ2V0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGVtcGxhdGVMb2FkRXJyb3JDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL3RlbXBsYXRlLWxvYWQtZXJyb3IvdGVtcGxhdGUtbG9hZC1lcnJvci5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRpbWVmcmFtZVNlbGVjdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdGltZS1mcmFtZS1zZWxlY3Rpb24vdGltZWZyYW1lLXNlbGVjdGlvbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IFN0YXR1c0JhckNoYXJ0Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy90aW1lc2VyaWVzLXdpZGdldC9jaGFydC1wcmVzZXRzL3N0YXR1cy1iYXItY2hhcnQvc3RhdHVzLWJhci1jaGFydC5jb21wb25lbnRcIjtcbmltcG9ydCB7IExpbmVDaGFydENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdGltZXNlcmllcy13aWRnZXQvY2hhcnQtcHJlc2V0cy94eS1jaGFydC9jaGFydC10eXBlcy9saW5lLWNoYXJ0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgU3RhY2tlZEFyZWFDaGFydENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdGltZXNlcmllcy13aWRnZXQvY2hhcnQtcHJlc2V0cy94eS1jaGFydC9jaGFydC10eXBlcy9zdGFja2VkLWFyZWEtY2hhcnQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdGFja2VkQmFyQ2hhcnRDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL3RpbWVzZXJpZXMtd2lkZ2V0L2NoYXJ0LXByZXNldHMveHktY2hhcnQvY2hhcnQtdHlwZXMvc3RhY2tlZC1iYXItY2hhcnQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdGFja2VkUGVyY2VudGFnZUFyZWFDaGFydENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdGltZXNlcmllcy13aWRnZXQvY2hhcnQtcHJlc2V0cy94eS1jaGFydC9jaGFydC10eXBlcy9zdGFja2VkLXBlcmNlbnRhZ2UtYXJlYS1jaGFydC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRpbWVzZXJpZXNJbnNwZWN0aW9uTWVudUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdGltZXNlcmllcy13aWRnZXQvdGltZXNlcmllcy1pbnNwZWN0aW9uLW1lbnUvdGltZXNlcmllcy1pbnNwZWN0aW9uLW1lbnUuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUaW1lc2VyaWVzV2lkZ2V0Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy90aW1lc2VyaWVzLXdpZGdldC90aW1lc2VyaWVzLXdpZGdldC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFdpZGdldEJvZHlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL3dpZGdldC93aWRnZXQtYm9keS93aWRnZXQtYm9keS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFdpZGdldEJvZHlDb250ZW50Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy93aWRnZXQvd2lkZ2V0LWJvZHktY29udGVudC93aWRnZXQtYm9keS1jb250ZW50LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgV2lkZ2V0SGVhZGVyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy93aWRnZXQvd2lkZ2V0LWhlYWRlci93aWRnZXQtaGVhZGVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgV2lkZ2V0Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy93aWRnZXQvd2lkZ2V0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgV2lkZ2V0U2VhcmNoQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy93aWRnZXQtc2VhcmNoL3dpZGdldC1zZWFyY2guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBOdWlEYXNoYm9hcmRDb25maWd1cmF0b3JNb2R1bGUgfSBmcm9tIFwiLi9jb25maWd1cmF0b3IvY29uZmlndXJhdG9yLm1vZHVsZVwiO1xuaW1wb3J0IHsgREFUQV9TT1VSQ0VfT1VUUFVUIH0gZnJvbSBcIi4vY29uZmlndXJhdG9yL3R5cGVzXCI7XG5pbXBvcnQgeyBHcmlkc3Rlckl0ZW1XaWRnZXRJZERpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvZ3JpZHN0ZXItaXRlbS13aWRnZXQtaWQvZ3JpZHN0ZXItaXRlbS13aWRnZXQtaWQuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBXaWRnZXRFZGl0b3JEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL3dpZGdldC1lZGl0b3Ivd2lkZ2V0LWVkaXRvci5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE51aVBpenphZ25hTW9kdWxlIH0gZnJvbSBcIi4vcGl6emFnbmEvcGl6emFnbmEubW9kdWxlXCI7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWxTZXJ2aWNlIH0gZnJvbSBcIi4vcGl6emFnbmEvc2VydmljZXMvY29tcG9uZW50LXBvcnRhbC5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudFJlZ2lzdHJ5U2VydmljZSxcbiAgICBJQ29tcG9uZW50V2l0aExhdGVMb2FkS2V5LFxufSBmcm9tIFwiLi9waXp6YWduYS9zZXJ2aWNlcy9jb21wb25lbnQtcmVnaXN0cnkuc2VydmljZVwiO1xuaW1wb3J0IHsgRXZlbnRSZWdpc3RyeVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9ldmVudC1yZWdpc3RyeS5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIEtwaUZvcm1hdHRlcnNSZWdpc3RyeVNlcnZpY2UsXG4gICAgUmlza1Njb3JlRm9ybWF0dGVyc1JlZ2lzdHJ5U2VydmljZSxcbn0gZnJvbSBcIi4vc2VydmljZXMvdGFibGUtZm9ybWF0dGVyLXJlZ2lzdHJ5LnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICAgREFTSEJPQVJEX0VESVRfTU9ERSxcbiAgICBEQVRBX1NPVVJDRV9CVVNZLFxuICAgIFBSRVZJRVdfRVZFTlQsXG4gICAgUkVGUkVTSCxcbiAgICBTRVRfUFJPUEVSVFlfVkFMVUUsXG4gICAgU0VUX1RJTUVGUkFNRSxcbiAgICBXSURHRVRfQ1JFQVRFLFxuICAgIFdJREdFVF9FRElULFxuICAgIFdJREdFVF9QT1NJVElPTl9DSEFOR0UsXG4gICAgV0lER0VUX1JFQURZLFxuICAgIFdJREdFVF9SRU1PVkUsXG4gICAgV0lER0VUX1JFU0laRSxcbn0gZnJvbSBcIi4vc2VydmljZXMvdHlwZXNcIjtcbmltcG9ydCB7IFdpZGdldFR5cGVzU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL3dpZGdldC10eXBlcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBkcmlsbGRvd24gfSBmcm9tIFwiLi93aWRnZXQtdHlwZXMvZHJpbGxkb3duL2RyaWxsZG93blwiO1xuaW1wb3J0IHsgZW1iZWRkZWRDb250ZW50IH0gZnJvbSBcIi4vd2lkZ2V0LXR5cGVzL2VtYmVkZGVkLWNvbnRlbnQvZW1iZWRkZWQtY29udGVudFwiO1xuaW1wb3J0IHsga3BpIH0gZnJvbSBcIi4vd2lkZ2V0LXR5cGVzL2twaS9rcGlcIjtcbmltcG9ydCB7IERFRkFVTFRfS1BJX0ZPUk1BVFRFUlMgfSBmcm9tIFwiLi93aWRnZXQtdHlwZXMva3BpL2twaS1jb25maWd1cmF0b3JcIjtcbmltcG9ydCB7IHByZXZpZXdQbGFjZWhvbGRlciB9IGZyb20gXCIuL3dpZGdldC10eXBlcy9wcmV2aWV3LXBsYWNlaG9sZGVyXCI7XG5pbXBvcnQgeyBwcm9wb3J0aW9uYWwgfSBmcm9tIFwiLi93aWRnZXQtdHlwZXMvcHJvcG9ydGlvbmFsL3Byb3BvcnRpb25hbFwiO1xuaW1wb3J0IHsgcmlza1Njb3JlIH0gZnJvbSBcIi4vd2lkZ2V0LXR5cGVzL3Jpc2stc2NvcmUvcmlzay1zY29yZVwiO1xuaW1wb3J0IHsgREVGQVVMVF9SSVNLX1NDT1JFX0ZPUk1BVFRFUlMgfSBmcm9tIFwiLi93aWRnZXQtdHlwZXMvcmlzay1zY29yZS9yaXNrLXNjb3JlLWNvbmZpZ3VyYXRvclwiO1xuaW1wb3J0IHsgdGFibGUgfSBmcm9tIFwiLi93aWRnZXQtdHlwZXMvdGFibGUvdGFibGVcIjtcbmltcG9ydCB7IHRpbWVzZXJpZXMgfSBmcm9tIFwiLi93aWRnZXQtdHlwZXMvdGltZXNlcmllcy90aW1lc2VyaWVzXCI7XG5cbmNvbnN0IGRhc2hib2FyZENvbXBvbmVudHMgPSBbXG4gICAgRGFzaGJvYXJkQ29tcG9uZW50LFxuICAgIEVtYmVkZGVkQ29udGVudENvbXBvbmVudCxcbiAgICBHcmlkc3Rlckl0ZW1XaWRnZXRJZERpcmVjdGl2ZSxcbiAgICBLcGlDb21wb25lbnQsXG4gICAgUmlza1Njb3JlVGlsZUNvbXBvbmVudCxcbiAgICBMaW5lQ2hhcnRDb21wb25lbnQsXG4gICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgICBQcm9wb3J0aW9uYWxXaWRnZXRDb21wb25lbnQsXG4gICAgU3RhY2tDb21wb25lbnQsXG4gICAgU3RhY2tlZEFyZWFDaGFydENvbXBvbmVudCxcbiAgICBTdGFja2VkQmFyQ2hhcnRDb21wb25lbnQsXG4gICAgU3RhY2tlZFBlcmNlbnRhZ2VBcmVhQ2hhcnRDb21wb25lbnQsXG4gICAgU3RhdHVzQmFyQ2hhcnRDb21wb25lbnQsXG4gICAgVGFibGVXaWRnZXRDb21wb25lbnQsXG4gICAgRGVsYXllZE1vdXNlUHJlc2VuY2VEZXRlY3Rpb25EaXJlY3RpdmUsXG4gICAgVGVtcGxhdGVMb2FkRXJyb3JDb21wb25lbnQsXG4gICAgVGlsZXNDb21wb25lbnQsXG4gICAgVGltZWZyYW1lU2VsZWN0aW9uQ29tcG9uZW50LFxuICAgIFRpbWVzZXJpZXNXaWRnZXRDb21wb25lbnQsXG4gICAgV2lkZ2V0Qm9keUNvbXBvbmVudCxcbiAgICBXaWRnZXRCb2R5Q29udGVudENvbXBvbmVudCxcbiAgICBXaWRnZXRDb21wb25lbnQsXG4gICAgV2lkZ2V0RWRpdG9yRGlyZWN0aXZlLFxuICAgIFdpZGdldEhlYWRlckNvbXBvbmVudCxcbiAgICBMaXN0V2lkZ2V0Q29tcG9uZW50LFxuICAgIExpc3RMZWFmSXRlbUNvbXBvbmVudCxcbiAgICBMaXN0R3JvdXBJdGVtQ29tcG9uZW50LFxuICAgIExpc3ROYXZpZ2F0aW9uQmFyQ29tcG9uZW50LFxuICAgIFdpZGdldFNlYXJjaENvbXBvbmVudCxcbiAgICBQcm9wb3J0aW9uYWxEb251dENvbnRlbnRDb21wb25lbnQsXG4gICAgVGltZXNlcmllc0luc3BlY3Rpb25NZW51Q29tcG9uZW50LFxuXTtcblxuY29uc3QgZW50cnlDb21wb25lbnRzOiBJQ29tcG9uZW50V2l0aExhdGVMb2FkS2V5W10gPSBbXG4gICAgRW1iZWRkZWRDb250ZW50Q29tcG9uZW50LFxuICAgIEtwaUNvbXBvbmVudCxcbiAgICBSaXNrU2NvcmVUaWxlQ29tcG9uZW50LFxuICAgIExpbmVDaGFydENvbXBvbmVudCxcbiAgICBMb2FkaW5nQ29tcG9uZW50LFxuICAgIFByb3BvcnRpb25hbFdpZGdldENvbXBvbmVudCxcbiAgICBTdGFja0NvbXBvbmVudCxcbiAgICBTdGFja2VkQXJlYUNoYXJ0Q29tcG9uZW50LFxuICAgIFN0YWNrZWRCYXJDaGFydENvbXBvbmVudCxcbiAgICBTdGFja2VkUGVyY2VudGFnZUFyZWFDaGFydENvbXBvbmVudCxcbiAgICBTdGF0dXNCYXJDaGFydENvbXBvbmVudCxcbiAgICBUYWJsZVdpZGdldENvbXBvbmVudCxcbiAgICBUZW1wbGF0ZUxvYWRFcnJvckNvbXBvbmVudCxcbiAgICBUaWxlc0NvbXBvbmVudCxcbiAgICBUaW1lZnJhbWVTZWxlY3Rpb25Db21wb25lbnQsXG4gICAgVGltZXNlcmllc1dpZGdldENvbXBvbmVudCxcbiAgICBXaWRnZXRCb2R5Q29tcG9uZW50LFxuICAgIFdpZGdldEJvZHlDb250ZW50Q29tcG9uZW50LFxuICAgIFdpZGdldEhlYWRlckNvbXBvbmVudCxcbiAgICBXaWRnZXRFcnJvckNvbXBvbmVudCxcbiAgICBMaXN0V2lkZ2V0Q29tcG9uZW50LFxuICAgIExpc3RMZWFmSXRlbUNvbXBvbmVudCxcbiAgICBMaXN0R3JvdXBJdGVtQ29tcG9uZW50LFxuICAgIExpc3ROYXZpZ2F0aW9uQmFyQ29tcG9uZW50LFxuICAgIFdpZGdldFNlYXJjaENvbXBvbmVudCxcbiAgICBQcm9wb3J0aW9uYWxEb251dENvbnRlbnRDb21wb25lbnQsXG5dO1xuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTnVpRGFzaGJvYXJkc0NvbW1vbk1vZHVsZSxcbiAgICAgICAgR3JpZHN0ZXJNb2R1bGUsXG4gICAgICAgIE51aUJ1c3lNb2R1bGUsXG4gICAgICAgIE51aUJ1dHRvbk1vZHVsZSxcbiAgICAgICAgTnVpQ2hhcnRzTW9kdWxlLFxuICAgICAgICBOdWlEYXNoYm9hcmRDb25maWd1cmF0b3JNb2R1bGUsXG4gICAgICAgIE51aUljb25Nb2R1bGUsXG4gICAgICAgIE51aUltYWdlTW9kdWxlLFxuICAgICAgICBOdWlNZW51TW9kdWxlLFxuICAgICAgICBOdWlQaXp6YWduYU1vZHVsZSxcbiAgICAgICAgTnVpUG9wdXBNb2R1bGUsXG4gICAgICAgIE51aVByb2dyZXNzTW9kdWxlLFxuICAgICAgICBOdWlUYWJsZU1vZHVsZSxcbiAgICAgICAgTnVpVGltZUZyYW1lQmFyTW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIE51aVRpbWVGcmFtZVBpY2tlck1vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgTnVpU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgTnVpVG9vbHRpcE1vZHVsZSxcbiAgICAgICAgTnVpU2VhcmNoTW9kdWxlLFxuICAgICAgICBOdWlDb21tb25Nb2R1bGUsXG4gICAgICAgIE51aVJlcGVhdE1vZHVsZSxcbiAgICAgICAgTnVpUmlza1Njb3JlTW9kdWxlLFxuICAgICAgICBOdWlTZWxlY3RNb2R1bGUsXG4gICAgICAgIE51aVBvcG92ZXJNb2R1bGUsXG4gICAgICAgIE51aVBhZ2luYXRvck1vZHVsZSxcbiAgICBdLFxuICAgIGRlY2xhcmF0aW9uczogZGFzaGJvYXJkQ29tcG9uZW50cyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQ29tcG9uZW50UG9ydGFsU2VydmljZSxcbiAgICAgICAgV2lkZ2V0VHlwZXNTZXJ2aWNlLFxuICAgICAgICBEZWNpbWFsUGlwZSxcbiAgICAgICAgUmVmcmVzaGVyU2V0dGluZ3NTZXJ2aWNlLFxuICAgIF0sXG4gICAgZXhwb3J0czogZGFzaGJvYXJkQ29tcG9uZW50cyxcbn0pXG5leHBvcnQgY2xhc3MgTnVpRGFzaGJvYXJkc01vZHVsZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHdpZGdldFR5cGVzU2VydmljZTogV2lkZ2V0VHlwZXNTZXJ2aWNlLFxuICAgICAgICBjb21wb25lbnRSZWdpc3RyeTogQ29tcG9uZW50UmVnaXN0cnlTZXJ2aWNlLFxuICAgICAgICBldmVudFJlZ2lzdHJ5OiBFdmVudFJlZ2lzdHJ5U2VydmljZSxcbiAgICAgICAga3BpRm9ybWF0dGVyc1JlZ2lzdHJ5OiBLcGlGb3JtYXR0ZXJzUmVnaXN0cnlTZXJ2aWNlLFxuICAgICAgICByaXNrU2NvcmVGb3JtYXR0ZXJzUmVnaXN0cnk6IFJpc2tTY29yZUZvcm1hdHRlcnNSZWdpc3RyeVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgd2lkZ2V0VHlwZXNTZXJ2aWNlLnJlZ2lzdGVyV2lkZ2V0VHlwZShcImtwaVwiLCAxLCBrcGkpO1xuICAgICAgICB3aWRnZXRUeXBlc1NlcnZpY2UucmVnaXN0ZXJXaWRnZXRUeXBlKFwicmlzay1zY29yZVwiLCAxLCByaXNrU2NvcmUpO1xuICAgICAgICB3aWRnZXRUeXBlc1NlcnZpY2UucmVnaXN0ZXJXaWRnZXRUeXBlKFwidGFibGVcIiwgMSwgdGFibGUpO1xuICAgICAgICB3aWRnZXRUeXBlc1NlcnZpY2UucmVnaXN0ZXJXaWRnZXRUeXBlKFwicHJvcG9ydGlvbmFsXCIsIDEsIHByb3BvcnRpb25hbCk7XG4gICAgICAgIHdpZGdldFR5cGVzU2VydmljZS5yZWdpc3RlcldpZGdldFR5cGUoXCJ0aW1lc2VyaWVzXCIsIDEsIHRpbWVzZXJpZXMpO1xuICAgICAgICB3aWRnZXRUeXBlc1NlcnZpY2UucmVnaXN0ZXJXaWRnZXRUeXBlKFxuICAgICAgICAgICAgXCJwcmV2aWV3UGxhY2Vob2xkZXJcIixcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBwcmV2aWV3UGxhY2Vob2xkZXJcbiAgICAgICAgKTtcbiAgICAgICAgd2lkZ2V0VHlwZXNTZXJ2aWNlLnJlZ2lzdGVyV2lkZ2V0VHlwZShcbiAgICAgICAgICAgIFwiZW1iZWRkZWQtY29udGVudFwiLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIGVtYmVkZGVkQ29udGVudFxuICAgICAgICApO1xuICAgICAgICB3aWRnZXRUeXBlc1NlcnZpY2UucmVnaXN0ZXJXaWRnZXRUeXBlKFwiZHJpbGxkb3duXCIsIDEsIGRyaWxsZG93bik7XG5cbiAgICAgICAgZm9yIChjb25zdCBlYyBvZiBlbnRyeUNvbXBvbmVudHMuZmlsdGVyKFxuICAgICAgICAgICAgKGM6IElDb21wb25lbnRXaXRoTGF0ZUxvYWRLZXkpID0+IGMubGF0ZUxvYWRLZXlcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgY29tcG9uZW50UmVnaXN0cnkucmVnaXN0ZXJCeUxhdGVMb2FkS2V5KGVjKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50UmVnaXN0cnkucmVnaXN0ZXJFdmVudChSRUZSRVNIKTtcbiAgICAgICAgZXZlbnRSZWdpc3RyeS5yZWdpc3RlckV2ZW50KFdJREdFVF9SRU1PVkUpO1xuICAgICAgICBldmVudFJlZ2lzdHJ5LnJlZ2lzdGVyRXZlbnQoV0lER0VUX1JFQURZKTtcbiAgICAgICAgZXZlbnRSZWdpc3RyeS5yZWdpc3RlckV2ZW50KFdJREdFVF9FRElUKTtcbiAgICAgICAgZXZlbnRSZWdpc3RyeS5yZWdpc3RlckV2ZW50KFdJREdFVF9DUkVBVEUpO1xuICAgICAgICBldmVudFJlZ2lzdHJ5LnJlZ2lzdGVyRXZlbnQoV0lER0VUX1JFU0laRSk7XG4gICAgICAgIGV2ZW50UmVnaXN0cnkucmVnaXN0ZXJFdmVudChXSURHRVRfUE9TSVRJT05fQ0hBTkdFKTtcbiAgICAgICAgZXZlbnRSZWdpc3RyeS5yZWdpc3RlckV2ZW50KFNFVF9QUk9QRVJUWV9WQUxVRSk7XG4gICAgICAgIGV2ZW50UmVnaXN0cnkucmVnaXN0ZXJFdmVudChTRVRfVElNRUZSQU1FKTtcbiAgICAgICAgZXZlbnRSZWdpc3RyeS5yZWdpc3RlckV2ZW50KFBSRVZJRVdfRVZFTlQpO1xuICAgICAgICBldmVudFJlZ2lzdHJ5LnJlZ2lzdGVyRXZlbnQoREFTSEJPQVJEX0VESVRfTU9ERSk7XG4gICAgICAgIGV2ZW50UmVnaXN0cnkucmVnaXN0ZXJFdmVudChEQVRBX1NPVVJDRV9PVVRQVVQpO1xuICAgICAgICBldmVudFJlZ2lzdHJ5LnJlZ2lzdGVyRXZlbnQoREFUQV9TT1VSQ0VfQlVTWSk7XG5cbiAgICAgICAga3BpRm9ybWF0dGVyc1JlZ2lzdHJ5LmFkZEl0ZW1zKERFRkFVTFRfS1BJX0ZPUk1BVFRFUlMpO1xuICAgICAgICByaXNrU2NvcmVGb3JtYXR0ZXJzUmVnaXN0cnkuYWRkSXRlbXMoREVGQVVMVF9SSVNLX1NDT1JFX0ZPUk1BVFRFUlMpO1xuICAgIH1cbn1cbiJdfQ==