@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
126 lines • 21 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 { Injectable } from "@angular/core";
import { barAccessors, barGrid, BarRenderer, barScales, BarSeriesHighlightStrategy, PieRenderer, radial, RadialAccessors, radialGrid, RadialRenderer, radialScales, } from "@nova-ui/charts";
import { ProportionalWidgetChartTypes } from "../components/proportional-widget/types";
import * as i0 from "@angular/core";
export class CategoryChartUtilService {
/**
* Combines each of IDataSeries with accessors, renderer and scales provided
*
* @param data
* @param accessors
* @param renderer
* @param scales
*
* @returns resulting set of IChartAssistSeries
*/
static buildChartSeries(data, accessors, renderer, scales) {
const result = (data || []).map((s) => ({
...s,
accessors,
renderer,
scales,
}));
return result;
}
static getChartAttributes(chartType, colors, markers) {
const t = CategoryChartUtilService.getChartTools(chartType);
const result = {
grid: t.gridFunction(),
accessors: t.accessorFunction(colors, markers),
renderer: t.rendererFunction(),
scales: t.scaleFunction(),
};
if (t.preprocessor) {
result.preprocessor =
t.preprocessor;
}
return result;
}
static getChartTools(chartType) {
const radialChartAccessors = (colors) => {
const accessors = new RadialAccessors(colors);
accessors.series.color = (seriesId, series) => series.color ?? colors.get(seriesId);
return accessors;
};
function barChartAccessors(colors, markers) {
// TODO: Refactor to accept config reference from arguments not from outer context
// @ts-ignore: TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.;
// An outer value of 'this' is shadowed by this container.
const accessors = barAccessors(this.config, colors, markers);
accessors.series.color = (seriesId, series) => series.color ?? colors?.get(seriesId);
// TODO: Remove custom accessor after fixing NUI-3688 in charts
accessors.data.value = (d) => Number.isFinite(d) ? d : d.value;
return accessors;
}
const chartTools = {
[ProportionalWidgetChartTypes.DonutChart]: {
preprocessor: radial,
gridFunction: radialGrid,
rendererFunction: () => new RadialRenderer(),
// TODO: replace with correct type
accessorFunction: radialChartAccessors,
scaleFunction: radialScales,
},
[ProportionalWidgetChartTypes.PieChart]: {
preprocessor: radial,
gridFunction: radialGrid,
rendererFunction: () => new PieRenderer(),
// TODO: replace with correct type
accessorFunction: radialChartAccessors,
scaleFunction: radialScales,
},
[ProportionalWidgetChartTypes.HorizontalBarChart]: {
config: { horizontal: true },
gridFunction() {
return barGrid(this.config);
},
rendererFunction: () => new BarRenderer({
highlightStrategy: new BarSeriesHighlightStrategy("y"),
}),
accessorFunction: barChartAccessors,
scaleFunction() {
return barScales(this.config);
},
},
[ProportionalWidgetChartTypes.VerticalBarChart]: {
config: { horizontal: false },
gridFunction() {
return barGrid(this.config);
},
rendererFunction: () => new BarRenderer({
highlightStrategy: new BarSeriesHighlightStrategy("x"),
}),
accessorFunction: barChartAccessors,
scaleFunction() {
return barScales(this.config);
},
},
};
return chartTools[chartType];
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CategoryChartUtilService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CategoryChartUtilService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CategoryChartUtilService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnktY2hhcnQtdXRpbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9jYXRlZ29yeS1jaGFydC11dGlsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUNILFlBQVksRUFDWixPQUFPLEVBQ1AsV0FBVyxFQUNYLFNBQVMsRUFDVCwwQkFBMEIsRUFVMUIsV0FBVyxFQUNYLE1BQU0sRUFDTixlQUFlLEVBQ2YsVUFBVSxFQUNWLGNBQWMsRUFDZCxZQUFZLEdBR2YsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUE0QnZGLE1BQU0sT0FBTyx3QkFBd0I7SUFDakM7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUMxQixJQUErQixFQUMvQixTQUFxQixFQUNyQixRQUE4QixFQUM5QixNQUFjO1FBRWQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQztZQUNKLFNBQVM7WUFDVCxRQUFRO1lBQ1IsTUFBTTtTQUNULENBQUMsQ0FBQyxD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Z0JBQ0QsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQ25CLElBQUksV0FBVyxDQUFDO29CQUNaLGlCQUFpQixFQUFFLElBQUksMEJBQTBCLENBQUMsR0FBRyxDQUFDO2lCQUN6RCxDQUFDO2dCQUNOLGdCQUFnQixFQUFFLGlCQUFpQjtnQkFDbkMsYUFBYTtvQkFDVCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7YUFDSjtZQUNELENBQUMsNEJBQTRCLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtnQkFDN0MsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtnQkFDN0IsWUFBWTtvQkFDUixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQ25CLElBQUksV0FBVyxDQUFDO29CQUNaLGlCQUFpQixFQUFFLElBQUksMEJBQTBCLENBQUMsR0FBRyxDQUFDO2lCQUN6RCxDQUFDO2dCQUNOLGdCQUFnQixFQUFFLGlCQUFpQjtnQkFDbkMsYUFBYTtvQkFDVCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7YUFDSjtTQUNKLENBQUM7UUFFRixPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqQyxDQUFDO2tJQXBJUSx3QkFBd0I7c0lBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHtcbiAgICBiYXJBY2Nlc3NvcnMsXG4gICAgYmFyR3JpZCxcbiAgICBCYXJSZW5kZXJlcixcbiAgICBiYXJTY2FsZXMsXG4gICAgQmFyU2VyaWVzSGlnaGxpZ2h0U3RyYXRlZ3ksXG4gICAgQ2hhcnRBc3Npc3QsXG4gICAgSUFjY2Vzc29ycyxcbiAgICBJQmFyQ2hhcnRDb25maWcsXG4gICAgSUNoYXJ0QXNzaXN0U2VyaWVzLFxuICAgIElDaGFydE1hcmtlcixcbiAgICBJRGF0YVNlcmllcyxcbiAgICBJR3JpZCxcbiAgICBJUmFkaWFsQWNjZXNzb3JzLFxuICAgIElWYWx1ZVByb3ZpZGVyLFxuICAgIFBpZVJlbmRlcmVyLFxuICAgIHJhZGlhbCxcbiAgICBSYWRpYWxBY2Nlc3NvcnMsXG4gICAgcmFkaWFsR3JpZCxcbiAgICBSYWRpYWxSZW5kZXJlcixcbiAgICByYWRpYWxTY2FsZXMsXG4gICAgUmVuZGVyZXIsXG4gICAgU2NhbGVzLFxufSBmcm9tIFwiQG5vdmEtdWkvY2hhcnRzXCI7XG5cbmltcG9ydCB7IFByb3BvcnRpb25hbFdpZGdldENoYXJ0VHlwZXMgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9wcm9wb3J0aW9uYWwtd2lkZ2V0L3R5cGVzXCI7XG5cbnR5cGUgUHJlcHJvY2Vzc29yVHlwZTxUIGV4dGVuZHMgSUFjY2Vzc29ycz4gPSAoXG4gICAgdGhpczogQ2hhcnRBc3Npc3QsXG4gICAgc2VyaWVzOiBJQ2hhcnRBc3Npc3RTZXJpZXM8VD5bXVxuKSA9PiBJQ2hhcnRBc3Npc3RTZXJpZXM8VD5bXTtcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhcnRBdHRyaWJ1dGVzPFQgZXh0ZW5kcyBJQWNjZXNzb3JzID0gSUFjY2Vzc29ycz4ge1xuICAgIGdyaWQ6IElHcmlkO1xuICAgIGFjY2Vzc29yczogSUFjY2Vzc29ycztcbiAgICByZW5kZXJlcjogUmVuZGVyZXI8SUFjY2Vzc29ycz47XG4gICAgc2NhbGVzOiBTY2FsZXM7XG4gICAgcHJlcHJvY2Vzc29yPzogUHJlcHJvY2Vzc29yVHlwZTxUPjtcbn1cblxuaW50ZXJmYWNlIElDaGFydFRvb2xzPFQgZXh0ZW5kcyBJQWNjZXNzb3JzID0gSUFjY2Vzc29ycz4ge1xuICAgIGNvbmZpZz86IElCYXJDaGFydENvbmZpZztcbiAgICBwcmVwcm9jZXNzb3I/OiBQcmVwcm9jZXNzb3JUeXBlPFQ+O1xuICAgIGdyaWRGdW5jdGlvbjogKCkgPT4gSUdyaWQ7XG4gICAgcmVuZGVyZXJGdW5jdGlvbjogKCkgPT4gUmVuZGVyZXI8SUFjY2Vzc29ycz47XG4gICAgYWNjZXNzb3JGdW5jdGlvbjogKFxuICAgICAgICBjb2xvcnM/OiBJVmFsdWVQcm92aWRlcjxzdHJpbmc+LFxuICAgICAgICBtYXJrZXJzPzogSVZhbHVlUHJvdmlkZXI8SUNoYXJ0TWFya2VyPlxuICAgICkgPT4gSUFjY2Vzc29ycztcbiAgICBzY2FsZUZ1bmN0aW9uOiAoKSA9PiBTY2FsZXM7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYXRlZ29yeUNoYXJ0VXRpbFNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqICBDb21iaW5lcyBlYWNoIG9mIElEYXRhU2VyaWVzIHdpdGggYWNjZXNzb3JzLCByZW5kZXJlciBhbmQgc2NhbGVzIHByb3ZpZGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqIEBwYXJhbSBhY2Nlc3NvcnNcbiAgICAgKiBAcGFyYW0gcmVuZGVyZXJcbiAgICAgKiBAcGFyYW0gc2NhbGVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyByZXN1bHRpbmcgc2V0IG9mIElDaGFydEFzc2lzdFNlcmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYnVpbGRDaGFydFNlcmllcyhcbiAgICAgICAgZGF0YTogSURhdGFTZXJpZXM8SUFjY2Vzc29ycz5bXSxcbiAgICAgICAgYWNjZXNzb3JzOiBJQWNjZXNzb3JzLFxuICAgICAgICByZW5kZXJlcjogUmVuZGVyZXI8SUFjY2Vzc29ycz4sXG4gICAgICAgIHNjYWxlczogU2NhbGVzXG4gICAgKTogSUNoYXJ0QXNzaXN0U2VyaWVzPElBY2Nlc3NvcnM+W10ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoZGF0YSB8fCBbXSkubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgLi4ucyxcbiAgICAgICAgICAgIGFjY2Vzc29ycyxcbiAgICAgICAgICAgIHJlbmRlcmVyLFxuICAgICAgICAgICAgc2NhbGVzLFxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGFydEF0dHJpYnV0ZXMoXG4gICAgICAgIGNoYXJ0VHlwZTogUHJvcG9ydGlvbmFsV2lkZ2V0Q2hhcnRUeXBlcyxcbiAgICAgICAgY29sb3JzPzogSVZhbHVlUHJvdmlkZXI8c3RyaW5nPixcbiAgICAgICAgbWFya2Vycz86IElWYWx1ZVByb3ZpZGVyPElDaGFydE1hcmtlcj5cbiAgICApOiBJQ2hhcnRBdHRyaWJ1dGVzIHwgSUNoYXJ0QXR0cmlidXRlczxJUmFkaWFsQWNjZXNzb3JzPiB7XG4gICAgICAgIGNvbnN0IHQ6IElDaGFydFRvb2xzIHwgSUNoYXJ0VG9vbHM8SVJhZGlhbEFjY2Vzc29ycz4gPVxuICAgICAgICAgICAgQ2F0ZWdvcnlDaGFydFV0aWxTZXJ2aWNlLmdldENoYXJ0VG9vbHMoY2hhcnRUeXBlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJQ2hhcnRBdHRyaWJ1dGVzIHwgSUNoYXJ0QXR0cmlidXRlczxJUmFkaWFsQWNjZXNzb3JzPiA9IHtcbiAgICAgICAgICAgIGdyaWQ6IHQuZ3JpZEZ1bmN0aW9uKCksXG4gICAgICAgICAgICBhY2Nlc3NvcnM6IHQuYWNjZXNzb3JGdW5jdGlvbihjb2xvcnMsIG1hcmtlcnMpLFxuICAgICAgICAgICAgcmVuZGVyZXI6IHQucmVuZGVyZXJGdW5jdGlvbigpLFxuICAgICAgICAgICAgc2NhbGVzOiB0LnNjYWxlRnVuY3Rpb24oKSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodC5wcmVwcm9jZXNzb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wcmVwcm9jZXNzb3IgPVxuICAgICAgICAgICAgICAgIHQucHJlcHJvY2Vzc29yIGFzIFByZXByb2Nlc3NvclR5cGU8SVJhZGlhbEFjY2Vzc29ycz47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRDaGFydFRvb2xzKFxuICAgICAgICBjaGFydFR5cGU6IFByb3BvcnRpb25hbFdpZGdldENoYXJ0VHlwZXNcbiAgICApOiBJQ2hhcnRUb29scyB8IElDaGFydFRvb2xzPElSYWRpYWxBY2Nlc3NvcnM+IHtcbiAgICAgICAgY29uc3QgcmFkaWFsQ2hhcnRBY2Nlc3NvcnMgPSAoY29sb3JzOiBJVmFsdWVQcm92aWRlcjxzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY2Nlc3NvcnMgPSBuZXcgUmFkaWFsQWNjZXNzb3JzKGNvbG9ycyk7XG4gICAgICAgICAgICBhY2Nlc3NvcnMuc2VyaWVzLmNvbG9yID0gKHNlcmllc0lkOiBhbnksIHNlcmllczogYW55KSA9PlxuICAgICAgICAgICAgICAgIHNlcmllcy5jb2xvciA/PyBjb2xvcnMuZ2V0KHNlcmllc0lkKTtcbiAgICAgICAgICAgIHJldHVybiBhY2Nlc3NvcnM7XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gYmFyQ2hhcnRBY2Nlc3NvcnMoXG4gICAgICAgICAgICBjb2xvcnM/OiBJVmFsdWVQcm92aWRlcjxzdHJpbmc+LFxuICAgICAgICAgICAgbWFya2Vycz86IElWYWx1ZVByb3ZpZGVyPElDaGFydE1hcmtlcj5cbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciB0byBhY2NlcHQgY29uZmlnIHJlZmVyZW5jZSBmcm9tIGFyZ3VtZW50cyBub3QgZnJvbSBvdXRlciBjb250ZXh0XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBUUzI2ODM6ICd0aGlzJyBpbXBsaWNpdGx5IGhhcyB0eXBlICdhbnknIGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSBhIHR5cGUgYW5ub3RhdGlvbi47XG4gICAgICAgICAgICAvLyBBbiBvdXRlciB2YWx1ZSBvZiAndGhpcycgaXMgc2hhZG93ZWQgYnkgdGhpcyBjb250YWluZXIuXG4gICAgICAgICAgICBjb25zdCBhY2Nlc3NvcnMgPSBiYXJBY2Nlc3NvcnModGhpcy5jb25maWcsIGNvbG9ycywgbWFya2Vycyk7XG4gICAgICAgICAgICBhY2Nlc3NvcnMuc2VyaWVzLmNvbG9yID0gKFxuICAgICAgICAgICAgICAgIHNlcmllc0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgc2VyaWVzOiBJRGF0YVNlcmllczxJQWNjZXNzb3JzPlxuICAgICAgICAgICAgKSA9PiBzZXJpZXMuY29sb3IgPz8gY29sb3JzPy5nZXQoc2VyaWVzSWQpO1xuICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGN1c3RvbSBhY2Nlc3NvciBhZnRlciBmaXhpbmcgTlVJLTM2ODggaW4gY2hhcnRzXG4gICAgICAgICAgICBhY2Nlc3NvcnMuZGF0YS52YWx1ZSA9IChkOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgTnVtYmVyLmlzRmluaXRlKGQpID8gZCA6IGQudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gYWNjZXNzb3JzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhcnRUb29sczogUmVjb3JkPFxuICAgICAgICAgICAgUHJvcG9ydGlvbmFsV2lkZ2V0Q2hhcnRUeXBlcyxcbiAgICAgICAgICAgIElDaGFydFRvb2xzPElSYWRpYWxBY2Nlc3NvcnM+IHwgSUNoYXJ0VG9vbHNcbiAgICAgICAgPiA9IHtcbiAgICAgICAgICAgIFtQcm9wb3J0aW9uYWxXaWRnZXRDaGFydFR5cGVzLkRvbnV0Q2hhcnRdOiB7XG4gICAgICAgICAgICAgICAgcHJlcHJvY2Vzc29yOiByYWRpYWwsXG4gICAgICAgICAgICAgICAgZ3JpZEZ1bmN0aW9uOiByYWRpYWxHcmlkLFxuICAgICAgICAgICAgICAgIHJlbmRlcmVyRnVuY3Rpb246ICgpID0+IG5ldyBSYWRpYWxSZW5kZXJlcigpLFxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCBjb3JyZWN0IHR5cGVcbiAgICAgICAgICAgICAgICBhY2Nlc3NvckZ1bmN0aW9uOiByYWRpYWxDaGFydEFjY2Vzc29ycyBhcyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbG9ycz86IElWYWx1ZVByb3ZpZGVyPHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlcnM/OiBJVmFsdWVQcm92aWRlcjxJQ2hhcnRNYXJrZXI+XG4gICAgICAgICAgICAgICAgKSA9PiBJQWNjZXNzb3JzLFxuICAgICAgICAgICAgICAgIHNjYWxlRnVuY3Rpb246IHJhZGlhbFNjYWxlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbUHJvcG9ydGlvbmFsV2lkZ2V0Q2hhcnRUeXBlcy5QaWVDaGFydF06IHtcbiAgICAgICAgICAgICAgICBwcmVwcm9jZXNzb3I6IHJhZGlhbCxcbiAgICAgICAgICAgICAgICBncmlkRnVuY3Rpb246IHJhZGlhbEdyaWQsXG4gICAgICAgICAgICAgICAgcmVuZGVyZXJGdW5jdGlvbjogKCkgPT4gbmV3IFBpZVJlbmRlcmVyKCksXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmVwbGFjZSB3aXRoIGNvcnJlY3QgdHlwZVxuICAgICAgICAgICAgICAgIGFjY2Vzc29yRnVuY3Rpb246IHJhZGlhbENoYXJ0QWNjZXNzb3JzIGFzIChcbiAgICAgICAgICAgICAgICAgICAgY29sb3JzPzogSVZhbHVlUHJvdmlkZXI8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgbWFya2Vycz86IElWYWx1ZVByb3ZpZGVyPElDaGFydE1hcmtlcj5cbiAgICAgICAgICAgICAgICApID0+IElBY2Nlc3NvcnMsXG4gICAgICAgICAgICAgICAgc2NhbGVGdW5jdGlvbjogcmFkaWFsU2NhbGVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtQcm9wb3J0aW9uYWxXaWRnZXRDaGFydFR5cGVzLkhvcml6b250YWxCYXJDaGFydF06IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IHsgaG9yaXpvbnRhbDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyaWRGdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhckdyaWQodGhpcy5jb25maWcpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVuZGVyZXJGdW5jdGlvbjogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IEJhclJlbmRlcmVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodFN0cmF0ZWd5OiBuZXcgQmFyU2VyaWVzSGlnaGxpZ2h0U3RyYXRlZ3koXCJ5XCIpLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvckZ1bmN0aW9uOiBiYXJDaGFydEFjY2Vzc29ycyxcbiAgICAgICAgICAgICAgICBzY2FsZUZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFyU2NhbGVzKHRoaXMuY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtQcm9wb3J0aW9uYWxXaWRnZXRDaGFydFR5cGVzLlZlcnRpY2FsQmFyQ2hhcnRdOiB7XG4gICAgICAgICAgICAgICAgY29uZmlnOiB7IGhvcml6b250YWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgZ3JpZEZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFyR3JpZCh0aGlzLmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW5kZXJlckZ1bmN0aW9uOiAoKSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgQmFyUmVuZGVyZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0U3RyYXRlZ3k6IG5ldyBCYXJTZXJpZXNIaWdobGlnaHRTdHJhdGVneShcInhcIiksXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGFjY2Vzc29yRnVuY3Rpb246IGJhckNoYXJ0QWNjZXNzb3JzLFxuICAgICAgICAgICAgICAgIHNjYWxlRnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXJTY2FsZXModGhpcy5jb25maWcpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBjaGFydFRvb2xzW2NoYXJ0VHlwZV07XG4gICAgfVxufVxuIl19