ngx-gem-spaas
Version:
This library contains services, components, images and styles to provide a unified look and way-of-working throughout GEM SPaaS.
263 lines • 45.1 kB
JavaScript
import * as am4charts from '@amcharts/amcharts4/charts';
import * as am4core from '@amcharts/amcharts4/core';
import { Tooltip } from '@amcharts/amcharts4/core';
import { Injectable } from '@angular/core';
import { Subject } from "rxjs";
import { takeUntil } from "rxjs/operators";
import * as i0 from "@angular/core";
import * as i1 from "ngx-gem-spaas";
am4core.addLicense('CH222128706');
export class AmchartsService {
constructor(themeService) {
this.themeService = themeService;
this.theme = null;
this.onDestroy$ = new Subject();
this.onNewTheme();
}
ngOnDestroy() {
this.onDestroy$.next();
this.onDestroy$.complete();
}
onNewTheme() {
this.themeService.onNewActiveTheme()
.pipe(takeUntil(this.onDestroy$))
.subscribe((theme) => {
this.theme = theme;
});
}
// create xy chart
createChartXY(chartDiv, withLegend = true) {
const chart = am4core.create(chartDiv, am4charts.XYChart);
chart.paddingBottom = 5;
chart.paddingRight = 4;
chart.paddingLeft = 18;
// @ts-ignore
chart.preloader.background.fill = am4core.color(this.theme?.getRgb('bg'));
chart.zoomOutButton.background.fill = am4core.color(this.theme?.getRgb('color'));
chart.zoomOutButton.icon.stroke = am4core.color(this.theme?.getRgb('bg'));
chart.zoomOutButton.icon.strokeWidth = 2;
chart.zoomOutButton.parent = chart.tooltipContainer;
chart.zoomOutButton.background.cornerRadius(4, 4, 4, 4);
chart.zoomOutButton.padding(0, 6, 0, 6);
// @ts-ignore
chart.zoomOutButton.background.states.getKey('hover').properties.fill = am4core.color(this.theme?.getRgb('primary'));
// @ts-ignore
chart.zoomOutButton.background.states.getKey('down').properties.fill = am4core.color(this.theme?.getRgb('primary'));
chart.cursor = new am4charts.XYCursor();
chart.cursor.behavior = 'zoomX';
chart.cursor.lineX.fill = am4core.color(this.theme?.getRgb('color'));
chart.cursor.lineX.stroke = am4core.color(this.theme?.getRgb('color'));
chart.cursor.lineY.disabled = true;
if (withLegend) {
chart.legend = new am4charts.Legend();
chart.legend.position = 'top';
const markerTemplate = chart.legend.markers.template;
markerTemplate.width = 10;
markerTemplate.height = 10;
chart.legend.labels.template.fill = am4core.color(this.theme?.getRgb('color'));
chart.legend.valueLabels.template.fill = am4core.color(this.theme?.getRgb('color'));
chart.legend.labels.template.textDecoration = 'none';
chart.legend.valueLabels.template.textDecoration = 'none';
chart.legend.fontSize = '85%';
const as = chart.legend.labels.template.states.getKey('active');
// @ts-ignore
as.properties.textDecoration = 'line-through';
// @ts-ignore
as.properties.fill = am4core.color(this.theme?.getRgb('color', 0.4));
const as2 = chart.legend.valueLabels.template.states.getKey('active');
// @ts-ignore
as2.properties.textDecoration = 'line-through';
// @ts-ignore
as2.properties.fill = am4core.color(this.theme?.getRgb('color', 0.4));
}
return chart;
}
// create pie chart
createChartPie(chartDiv, innerRadius = 0, startAngle = 0, endAngle = 360) {
const chart = am4core.create(chartDiv, am4charts.PieChart);
chart.innerRadius = innerRadius;
chart.startAngle = startAngle;
chart.endAngle = endAngle;
return chart;
}
destroyChart(chart) {
if (chart) {
chart.dispose();
}
}
// AXES
addCategoryAxis(chart, xOrY, category, withTooltip, withGrid, withLabels) {
const axes = xOrY === 'x' ? chart.xAxes : chart.yAxes;
const axis = axes.push(new am4charts.CategoryAxis());
this.setAxisTooltip(axis, withTooltip);
this.setGenericAxisProps(axis, withGrid, withLabels);
axis.dataFields.category = category;
axis.renderer.minGridDistance = 1;
axis.renderer.labels.template.location = 0.5; // 0 & 1 IS ON TICK, 0.5 CENTERS BETWEEN TICKS
return axis;
}
addDateAxis(chart, xOrY, date, withTooltip = true, withGrid = false, withLabels = true) {
const axes = xOrY === 'x' ? chart.xAxes : chart.yAxes;
const axis = axes.push(new am4charts.DateAxis());
this.setAxisTooltip(axis, withTooltip);
this.setGenericAxisProps(axis, withGrid, withLabels);
// axis.baseInterval = {'timeUnit': 'hour', 'count': 1};
axis.dataFields.date = date;
axis.renderer.labels.template.location = 0; // 0.5 CENTERS BETWEEN TICKS
axis.renderer.minGridDistance = 40;
return axis;
}
addValueAxis(chart, xOrY, title = '', withTooltip = false, withGrid = true, withLabels = true) {
const axes = xOrY === 'x' ? chart.xAxes : chart.yAxes;
const axis = axes.push(new am4charts.ValueAxis());
this.setAxisTooltip(axis, withTooltip);
this.setGenericAxisProps(axis, withGrid, withLabels);
axis.extraMax = .0;
axis.extraMin = .0;
axis.title.text = title;
return axis;
}
setAxisTooltip(axis, withToolTip, dy = 5) {
axis.tooltip.disabled = !withToolTip;
if (withToolTip) {
const axisTooltip = axis.tooltip;
axisTooltip.background.fill = am4core.color(this.theme?.getRgb('primary'));
axisTooltip.label.fill = am4core.color(this.theme?.getRgb('bg'));
axisTooltip.background.strokeWidth = 0;
axisTooltip.background.cornerRadius = 4;
axisTooltip.dy = dy;
}
}
setGenericAxisProps(axis, withGrid, withLabels) {
axis.cursorTooltipEnabled = true;
axis.renderer.fontSize = '0.7em';
axis.renderer.grid.template.disabled = !withGrid;
axis.renderer.grid.template.location = 1; // THIS ALSO IMPACTS TOOLTIP LOCATION !!
axis.renderer.grid.template.stroke = am4core.color(this.theme?.getRgb('color'));
axis.renderer.labels.template.disabled = !withLabels;
axis.renderer.labels.template.fill = am4core.color(this.theme?.getRgb('color'));
axis.renderer.minWidth = 10; // IMPACTS SPACE FOR Y-AXIS LABELS
axis.title.fill = am4core.color(this.theme?.getRgb('color'));
}
// SERIES
addSeriesXY(chart, type, dataType, name, valueX, valueY, openValueY, stacked = false, color = '', defToolTipColor = false, tooltipText = '', strokeWidth = 2) {
let series;
switch (type) {
case 'line':
series = new am4charts.LineSeries();
break;
case 'bar':
series = new am4charts.ColumnSeries();
break;
case 'stepline':
series = new am4charts.StepLineSeries();
break;
}
series.name = name;
switch (dataType) {
case 'category':
series.dataFields.categoryX = valueX;
break;
case 'date':
series.dataFields.dateX = valueX;
if (!(series instanceof am4charts.ColumnSeries)) {
series.dataItems.template.locations['dateX'] = 0;
}
break;
case 'value':
series.dataFields.valueX = valueX;
break;
}
series.dataFields.valueY = valueY;
if (!(series instanceof am4charts.ColumnSeries)) {
series.connect = false;
}
series.stacked = stacked;
if (openValueY) {
// RANGE SERIES: UPPER AND LOWER BAND WITH FILL
series.dataFields.openValueY = openValueY;
series.strokeWidth = 0;
if (color) {
series.fill = am4core.color(color);
series.stroke = am4core.color(color);
}
series.sequencedInterpolation = false;
series.fillOpacity = 0.1;
if (!(series instanceof am4charts.ColumnSeries)) {
series.tensionX = 5;
}
series.tooltipText = tooltipText || '[bold]' + name + ': [/]{openValueY.value} to {valueY}';
}
else {
// NORMAL SERIES
if (color) {
series.fill = am4core.color(color);
series.stroke = am4core.color(color);
}
series.strokeWidth = strokeWidth;
if (series instanceof am4charts.ColumnSeries) {
series.fillOpacity = 0.4;
series.strokeWidth = 1; // keep this default of 1 ? Under evaluation
}
series.tooltipText = tooltipText || '[bold]' + name + ':[/] {valueY}';
}
// TOOLTIP STUFF
series.tooltip = new Tooltip();
series.tooltip.background.filters.clear(); // NO SHADOW
series.tooltip.background.stroke = am4core.color(this.theme?.getRgb('bg'));
if (defToolTipColor) {
series.tooltip.getFillFromObject = false;
series.tooltip.background.fill = am4core.color(this.theme?.getRgb('color'));
series.tooltip.label.fill = am4core.color(this.theme?.getRgb('bg'));
}
chart.series.push(series);
return series;
}
addSeriesPie(chart, cat, value, colorAttr = '', color = '', withLabels = true, tooltipText = '') {
const series = new am4charts.PieSeries();
series.dataFields.category = cat;
series.dataFields.value = value;
series.slices.template.stroke = am4core.color(this.theme?.getRgb('bg'));
series.slices.template.strokeWidth = 2;
series.slices.template.strokeOpacity = 1;
series.labels.template.disabled = !withLabels;
series.labels.template.text = tooltipText || '[bold]{category}:[/] {value.percent.formatNumber(\'#\')}% ';
series.labels.template.fill = am4core.color(this.theme?.getRgb('color'));
series.ticks.template.stroke = am4core.color(this.theme?.getRgb('color'));
series.ticks.template.strokeWidth = 2;
// disable sliding out of slices
// @ts-ignore
series.slices.template.states.getKey('hover').properties.shiftRadius = 0;
// @ts-ignore
series.slices.template.states.getKey('hover').properties.scale = 1;
if (colorAttr) {
series.slices.template.propertyFields.fill = colorAttr;
}
if (color) {
series.slices.template.fill = am4core.color(color);
const cs = series.colors;
cs.list = [am4core.color(new am4core.ColorSet().getIndex(0))];
cs.stepOptions = {
lightness: -0.05,
hue: 0
};
cs.wrap = false;
}
// TOOLTIP STUFF
series.slices.template.tooltipText = tooltipText || '[bold]{category}:[/] {value.percent.formatNumber(\'#\')}% ';
series.tooltip = new Tooltip();
series.tooltip.background.filters.clear(); // NO SHADOW
series.tooltip.background.stroke = am4core.color(this.theme?.getRgb('bg'));
chart.series.push(series);
return series;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AmchartsService, deps: [{ token: i1.ThemeService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AmchartsService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AmchartsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.ThemeService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1jaGFydHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1nZW0tc3BhYXMvY2hhcnRzL3NyYy9fc2VydmljZXMvYW1jaGFydHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssU0FBUyxNQUFNLDRCQUE0QixDQUFDO0FBRXhELE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7OztBQUV6QyxPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBS2xDLE1BQU0sT0FBTyxlQUFlO0lBSzFCLFlBQ1UsWUFBMEI7UUFBMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFKNUIsVUFBSyxHQUFzQixJQUFJLENBQUM7UUFDaEMsZUFBVSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBS3RELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO2FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hDLFNBQVMsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUss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QUUsQ0FBQztRQUMvQixNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxZQUFZO1FBQ3ZELE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFM0UsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzsrR0F0VlUsZUFBZTttSEFBZixlQUFlLGNBRmQsTUFBTTs7NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhbTRjaGFydHMgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNC9jaGFydHMnO1xyXG5pbXBvcnQge1BpZUNoYXJ0fSBmcm9tICdAYW1jaGFydHMvYW1jaGFydHM0L2NoYXJ0cyc7XHJcbmltcG9ydCAqIGFzIGFtNGNvcmUgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNC9jb3JlJztcclxuaW1wb3J0IHtUb29sdGlwfSBmcm9tICdAYW1jaGFydHMvYW1jaGFydHM0L2NvcmUnO1xyXG5pbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7VGhlbWVNb2RlbCwgVGhlbWVTZXJ2aWNlfSBmcm9tIFwibmd4LWdlbS1zcGFhc1wiO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7dGFrZVVudGlsfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbmFtNGNvcmUuYWRkTGljZW5zZSgnQ0gyMjIxMjg3MDYnKTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFtY2hhcnRzU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHByaXZhdGUgdGhlbWU6IFRoZW1lTW9kZWwgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIG9uRGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uTmV3VGhlbWUoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5vbkRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMub25EZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk5ld1RoZW1lKCk6IHZvaWQge1xyXG4gICAgdGhpcy50aGVtZVNlcnZpY2Uub25OZXdBY3RpdmVUaGVtZSgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh0aGVtZTogVGhlbWVNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50aGVtZSA9IHRoZW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8vIGNyZWF0ZSB4eSBjaGFydFxyXG4gIGNyZWF0ZUNoYXJ0WFkoY2hhcnREaXY6IHN0cmluZywgd2l0aExlZ2VuZCA9IHRydWUpOiBhbTRjaGFydHMuWFlDaGFydCB7XHJcblxyXG4gICAgY29uc3QgY2hhcnQgPSBhbTRjb3JlLmNyZWF0ZShjaGFydERpdiwgYW00Y2hhcnRzLlhZQ2hhcnQpO1xyXG5cclxuICAgIGNoYXJ0LnBhZGRpbmdCb3R0b20gPSA1O1xyXG4gICAgY2hhcnQucGFkZGluZ1JpZ2h0ID0gNDtcclxuICAgIGNoYXJ0LnBhZGRpbmdMZWZ0ID0gMTg7XHJcblxyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgY2hhcnQucHJlbG9hZGVyLmJhY2tncm91bmQuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdiZycpKTtcclxuXHJcbiAgICBjaGFydC56b29tT3V0QnV0dG9uLmJhY2tncm91bmQuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdjb2xvcicpKTtcclxuICAgIGNoYXJ0Lnpvb21PdXRCdXR0b24uaWNvbi5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignYmcnKSk7XHJcbiAgICBjaGFydC56b29tT3V0QnV0dG9uLmljb24uc3Ryb2tlV2lkdGggPSAyO1xyXG4gICAgY2hhcnQuem9vbU91dEJ1dHRvbi5wYXJlbnQgPSBjaGFydC50b29sdGlwQ29udGFpbmVyO1xyXG4gICAgY2hhcnQuem9vbU91dEJ1dHRvbi5iYWNrZ3JvdW5kLmNvcm5lclJhZGl1cyg0LCA0LCA0LCA0KTtcclxuICAgIGNoYXJ0Lnpvb21PdXRCdXR0b24ucGFkZGluZygwLCA2LCAwLCA2KTtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIGNoYXJ0Lnpvb21PdXRCdXR0b24uYmFja2dyb3VuZC5zdGF0ZXMuZ2V0S2V5KCdob3ZlcicpLnByb3BlcnRpZXMuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdwcmltYXJ5JykpO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgY2hhcnQuem9vbU91dEJ1dHRvbi5iYWNrZ3JvdW5kLnN0YXRlcy5nZXRLZXkoJ2Rvd24nKS5wcm9wZXJ0aWVzLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYigncHJpbWFyeScpKTtcclxuXHJcbiAgICBjaGFydC5jdXJzb3IgPSBuZXcgYW00Y2hhcnRzLlhZQ3Vyc29yKCk7XHJcbiAgICBjaGFydC5jdXJzb3IuYmVoYXZpb3IgPSAnem9vbVgnO1xyXG4gICAgY2hhcnQuY3Vyc29yLmxpbmVYLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICBjaGFydC5jdXJzb3IubGluZVguc3Ryb2tlID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJykpO1xyXG4gICAgY2hhcnQuY3Vyc29yLmxpbmVZLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAod2l0aExlZ2VuZCkge1xyXG4gICAgICBjaGFydC5sZWdlbmQgPSBuZXcgYW00Y2hhcnRzLkxlZ2VuZCgpO1xyXG4gICAgICBjaGFydC5sZWdlbmQucG9zaXRpb24gPSAndG9wJztcclxuICAgICAgY29uc3QgbWFya2VyVGVtcGxhdGUgPSBjaGFydC5sZWdlbmQubWFya2Vycy50ZW1wbGF0ZTtcclxuICAgICAgbWFya2VyVGVtcGxhdGUud2lkdGggPSAxMDtcclxuICAgICAgbWFya2VyVGVtcGxhdGUuaGVpZ2h0ID0gMTA7XHJcblxyXG4gICAgICBjaGFydC5sZWdlbmQubGFiZWxzLnRlbXBsYXRlLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICAgIGNoYXJ0LmxlZ2VuZC52YWx1ZUxhYmVscy50ZW1wbGF0ZS5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJykpO1xyXG5cclxuICAgICAgY2hhcnQubGVnZW5kLmxhYmVscy50ZW1wbGF0ZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcclxuICAgICAgY2hhcnQubGVnZW5kLnZhbHVlTGFiZWxzLnRlbXBsYXRlLnRleHREZWNvcmF0aW9uID0gJ25vbmUnO1xyXG4gICAgICBjaGFydC5sZWdlbmQuZm9udFNpemUgPSAnODUlJztcclxuXHJcbiAgICAgIGNvbnN0IGFzID0gY2hhcnQubGVnZW5kLmxhYmVscy50ZW1wbGF0ZS5zdGF0ZXMuZ2V0S2V5KCdhY3RpdmUnKTtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBhcy5wcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uID0gJ2xpbmUtdGhyb3VnaCc7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgYXMucHJvcGVydGllcy5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJywgMC40KSk7XHJcblxyXG4gICAgICBjb25zdCBhczIgPSBjaGFydC5sZWdlbmQudmFsdWVMYWJlbHMudGVtcGxhdGUuc3RhdGVzLmdldEtleSgnYWN0aXZlJyk7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgYXMyLnByb3BlcnRpZXMudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoJztcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBhczIucHJvcGVydGllcy5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJywgMC40KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNoYXJ0O1xyXG4gIH1cclxuXHJcbiAgLy8gY3JlYXRlIHBpZSBjaGFydFxyXG4gIGNyZWF0ZUNoYXJ0UGllKFxyXG4gICAgY2hhcnREaXY6IHN0cmluZyxcclxuICAgIGlubmVyUmFkaXVzOiBudW1iZXIgPSAwLFxyXG4gICAgc3RhcnRBbmdsZTogbnVtYmVyID0gMCxcclxuICAgIGVuZEFuZ2xlOiBudW1iZXIgPSAzNjBcclxuICApOiBhbTRjaGFydHMuUGllQ2hhcnQge1xyXG4gICAgY29uc3QgY2hhcnQgPSBhbTRjb3JlLmNyZWF0ZShjaGFydERpdiwgYW00Y2hhcnRzLlBpZUNoYXJ0KTtcclxuXHJcbiAgICBjaGFydC5pbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzO1xyXG4gICAgY2hhcnQuc3RhcnRBbmdsZSA9IHN0YXJ0QW5nbGU7XHJcbiAgICBjaGFydC5lbmRBbmdsZSA9IGVuZEFuZ2xlO1xyXG5cclxuICAgIHJldHVybiBjaGFydDtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3lDaGFydChjaGFydDogYW00Y2hhcnRzLlhZQ2hhcnQgfCBhbTRjaGFydHMuUGllQ2hhcnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIGlmIChjaGFydCkge1xyXG4gICAgICBjaGFydC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBBWEVTXHJcblxyXG4gIGFkZENhdGVnb3J5QXhpcyhcclxuICAgIGNoYXJ0OiBhbTRjaGFydHMuWFlDaGFydCxcclxuICAgIHhPclk6ICd4JyB8ICd5JyxcclxuICAgIGNhdGVnb3J5OiBzdHJpbmcsXHJcbiAgICB3aXRoVG9vbHRpcDogYm9vbGVhbixcclxuICAgIHdpdGhHcmlkOiBib29sZWFuLFxyXG4gICAgd2l0aExhYmVsczogYm9vbGVhbixcclxuICApOiBhbTRjaGFydHMuQ2F0ZWdvcnlBeGlzIHtcclxuICAgIGNvbnN0IGF4ZXMgPSB4T3JZID09PSAneCcgPyBjaGFydC54QXhlcyA6IGNoYXJ0LnlBeGVzO1xyXG4gICAgY29uc3QgYXhpcyA9IGF4ZXMucHVzaChuZXcgYW00Y2hhcnRzLkNhdGVnb3J5QXhpcygpKTtcclxuICAgIHRoaXMuc2V0QXhpc1Rvb2x0aXAoYXhpcywgd2l0aFRvb2x0aXApO1xyXG4gICAgdGhpcy5zZXRHZW5lcmljQXhpc1Byb3BzKGF4aXMsIHdpdGhHcmlkLCB3aXRoTGFiZWxzKTtcclxuICAgIGF4aXMuZGF0YUZpZWxkcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xyXG4gICAgYXhpcy5yZW5kZXJlci5taW5HcmlkRGlzdGFuY2UgPSAxO1xyXG4gICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUubG9jYXRpb24gPSAwLjU7IC8vIDAgJiAxIElTIE9OIFRJQ0ssIDAuNSBDRU5URVJTIEJFVFdFRU4gVElDS1NcclxuICAgIHJldHVybiBheGlzO1xyXG4gIH1cclxuXHJcbiAgYWRkRGF0ZUF4aXMoXHJcbiAgICBjaGFydDogYW00Y2hhcnRzLlhZQ2hhcnQsXHJcbiAgICB4T3JZOiAneCcgfCAneScsXHJcbiAgICBkYXRlOiBzdHJpbmcsXHJcbiAgICB3aXRoVG9vbHRpcDogYm9vbGVhbiA9IHRydWUsXHJcbiAgICB3aXRoR3JpZDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgd2l0aExhYmVsczogYm9vbGVhbiA9IHRydWUsXHJcbiAgKTogYW00Y2hhcnRzLkRhdGVBeGlzIHtcclxuICAgIGNvbnN0IGF4ZXMgPSB4T3JZID09PSAneCcgPyBjaGFydC54QXhlcyA6IGNoYXJ0LnlBeGVzO1xyXG4gICAgY29uc3QgYXhpcyA9IGF4ZXMucHVzaChuZXcgYW00Y2hhcnRzLkRhdGVBeGlzKCkpO1xyXG4gICAgdGhpcy5zZXRBeGlzVG9vbHRpcChheGlzLCB3aXRoVG9vbHRpcCk7XHJcbiAgICB0aGlzLnNldEdlbmVyaWNBeGlzUHJvcHMoYXhpcywgd2l0aEdyaWQsIHdpdGhMYWJlbHMpO1xyXG4gICAgLy8gYXhpcy5iYXNlSW50ZXJ2YWwgPSB7J3RpbWVVbml0JzogJ2hvdXInLCAnY291bnQnOiAxfTtcclxuICAgIGF4aXMuZGF0YUZpZWxkcy5kYXRlID0gZGF0ZTtcclxuICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLmxvY2F0aW9uID0gMDsgLy8gMC41IENFTlRFUlMgQkVUV0VFTiBUSUNLU1xyXG4gICAgYXhpcy5yZW5kZXJlci5taW5HcmlkRGlzdGFuY2UgPSA0MDtcclxuICAgIHJldHVybiBheGlzO1xyXG4gIH1cclxuXHJcbiAgYWRkVmFsdWVBeGlzKFxyXG4gICAgY2hhcnQ6IGFtNGNoYXJ0cy5YWUNoYXJ0LFxyXG4gICAgeE9yWTogJ3gnIHwgJ3knLFxyXG4gICAgdGl0bGU6IHN0cmluZyA9ICcnLFxyXG4gICAgd2l0aFRvb2x0aXA6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIHdpdGhHcmlkOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIHdpdGhMYWJlbHM6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICk6IGFtNGNoYXJ0cy5WYWx1ZUF4aXMge1xyXG4gICAgY29uc3QgYXhlcyA9IHhPclkgPT09ICd4JyA/IGNoYXJ0LnhBeGVzIDogY2hhcnQueUF4ZXM7XHJcbiAgICBjb25zdCBheGlzID0gYXhlcy5wdXNoKG5ldyBhbTRjaGFydHMuVmFsdWVBeGlzKCkpO1xyXG4gICAgdGhpcy5zZXRBeGlzVG9vbHRpcChheGlzLCB3aXRoVG9vbHRpcCk7XHJcbiAgICB0aGlzLnNldEdlbmVyaWNBeGlzUHJvcHMoYXhpcywgd2l0aEdyaWQsIHdpdGhMYWJlbHMpO1xyXG4gICAgYXhpcy5leHRyYU1heCA9IC4wO1xyXG4gICAgYXhpcy5leHRyYU1pbiA9IC4wO1xyXG4gICAgYXhpcy50aXRsZS50ZXh0ID0gdGl0bGU7XHJcbiAgICByZXR1cm4gYXhpcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0QXhpc1Rvb2x0aXAoYXhpczogYW55LCB3aXRoVG9vbFRpcDogYm9vbGVhbiwgZHk6IG51bWJlciA9IDUpOiB2b2lkIHtcclxuICAgIGF4aXMudG9vbHRpcC5kaXNhYmxlZCA9ICF3aXRoVG9vbFRpcDtcclxuICAgIGlmICh3aXRoVG9vbFRpcCkge1xyXG4gICAgICBjb25zdCBheGlzVG9vbHRpcCA9IGF4aXMudG9vbHRpcDtcclxuICAgICAgYXhpc1Rvb2x0aXAuYmFja2dyb3VuZC5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ3ByaW1hcnknKSk7XHJcbiAgICAgIGF4aXNUb29sdGlwLmxhYmVsLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignYmcnKSk7XHJcbiAgICAgIGF4aXNUb29sdGlwLmJhY2tncm91bmQuc3Ryb2tlV2lkdGggPSAwO1xyXG4gICAgICBheGlzVG9vbHRpcC5iYWNrZ3JvdW5kLmNvcm5lclJhZGl1cyA9IDQ7XHJcbiAgICAgIGF4aXNUb29sdGlwLmR5ID0gZHk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEdlbmVyaWNBeGlzUHJvcHMoXHJcbiAgICBheGlzOiBhbTRjaGFydHMuQ2F0ZWdvcnlBeGlzIHwgYW00Y2hhcnRzLlZhbHVlQXhpcyB8IGFtNGNoYXJ0cy5EYXRlQXhpcyxcclxuICAgIHdpdGhHcmlkOiBib29sZWFuLFxyXG4gICAgd2l0aExhYmVsczogYm9vbGVhblxyXG4gICk6IHZvaWQge1xyXG4gICAgYXhpcy5jdXJzb3JUb29sdGlwRW5hYmxlZCA9IHRydWU7XHJcbiAgICBheGlzLnJlbmRlcmVyLmZvbnRTaXplID0gJzAuN2VtJztcclxuICAgIGF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5kaXNhYmxlZCA9ICF3aXRoR3JpZDtcclxuICAgIGF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5sb2NhdGlvbiA9IDE7IC8vIFRISVMgQUxTTyBJTVBBQ1RTIFRPT0xUSVAgTE9DQVRJT04gISFcclxuICAgIGF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5kaXNhYmxlZCA9ICF3aXRoTGFiZWxzO1xyXG4gICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdjb2xvcicpKTtcclxuICAgIGF4aXMucmVuZGVyZXIubWluV2lkdGggPSAxMDsgLy8gSU1QQUNUUyBTUEFDRSBGT1IgWS1BWElTIExBQkVMU1xyXG4gICAgYXhpcy50aXRsZS5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJykpO1xyXG4gIH1cclxuXHJcbiAgLy8gU0VSSUVTXHJcblxyXG4gIGFkZFNlcmllc1hZKFxyXG4gICAgY2hhcnQ6IGFtNGNoYXJ0cy5YWUNoYXJ0LFxyXG4gICAgdHlwZTogJ2xpbmUnIHwgJ2JhcicgfCAnc3RlcGxpbmUnLFxyXG4gICAgZGF0YVR5cGU6ICdjYXRlZ29yeScgfCAnZGF0ZScgfCAndmFsdWUnLFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgdmFsdWVYOiBzdHJpbmcsXHJcbiAgICB2YWx1ZVk6IHN0cmluZyxcclxuICAgIG9wZW5WYWx1ZVk6IHN0cmluZyxcclxuICAgIHN0YWNrZWQ6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIGNvbG9yOiBzdHJpbmcgPSAnJyxcclxuICAgIGRlZlRvb2xUaXBDb2xvcjogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgdG9vbHRpcFRleHQ6IHN0cmluZyA9ICcnLFxyXG4gICAgc3Ryb2tlV2lkdGg6IG51bWJlciA9IDIsXHJcbiAgKTogYW00Y2hhcnRzLkxpbmVTZXJpZXMgfCBhbTRjaGFydHMuQ29sdW1uU2VyaWVzIHwgYW00Y2hhcnRzLlN0ZXBMaW5lU2VyaWVzIHtcclxuXHJcbiAgICBsZXQgc2VyaWVzO1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2xpbmUnOlxyXG4gICAgICAgIHNlcmllcyA9IG5ldyBhbTRjaGFydHMuTGluZVNlcmllcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdiYXInOlxyXG4gICAgICAgIHNlcmllcyA9IG5ldyBhbTRjaGFydHMuQ29sdW1uU2VyaWVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3N0ZXBsaW5lJzpcclxuICAgICAgICBzZXJpZXMgPSBuZXcgYW00Y2hhcnRzLlN0ZXBMaW5lU2VyaWVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWVzLm5hbWUgPSBuYW1lO1xyXG5cclxuICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcclxuICAgICAgY2FzZSAnY2F0ZWdvcnknOlxyXG4gICAgICAgIHNlcmllcy5kYXRhRmllbGRzLmNhdGVnb3J5WCA9IHZhbHVlWDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgc2VyaWVzLmRhdGFGaWVsZHMuZGF0ZVggPSB2YWx1ZVg7XHJcbiAgICAgICAgaWYgKCEoc2VyaWVzIGluc3RhbmNlb2YgYW00Y2hhcnRzLkNvbHVtblNlcmllcykpIHtcclxuICAgICAgICAgIHNlcmllcy5kYXRhSXRlbXMudGVtcGxhdGUubG9jYXRpb25zWydkYXRlWCddID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3ZhbHVlJzpcclxuICAgICAgICBzZXJpZXMuZGF0YUZpZWxkcy52YWx1ZVggPSB2YWx1ZVg7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWVzLmRhdGFGaWVsZHMudmFsdWVZID0gdmFsdWVZO1xyXG4gICAgaWYgKCEoc2VyaWVzIGluc3RhbmNlb2YgYW00Y2hhcnRzLkNvbHVtblNlcmllcykpIHtcclxuICAgICAgc2VyaWVzLmNvbm5lY3QgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHNlcmllcy5zdGFja2VkID0gc3RhY2tlZDtcclxuXHJcbiAgICBpZiAob3BlblZhbHVlWSkge1xyXG5cclxuICAgICAgLy8gUkFOR0UgU0VSSUVTOiBVUFBFUiBBTkQgTE9XRVIgQkFORCBXSVRIIEZJTExcclxuICAgICAgc2VyaWVzLmRhdGFGaWVsZHMub3BlblZhbHVlWSA9IG9wZW5WYWx1ZVk7XHJcbiAgICAgIHNlcmllcy5zdHJva2VXaWR0aCA9IDA7XHJcbiAgICAgIGlmIChjb2xvcikge1xyXG4gICAgICAgIHNlcmllcy5maWxsID0gYW00Y29yZS5jb2xvcihjb2xvcik7XHJcbiAgICAgICAgc2VyaWVzLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IoY29sb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHNlcmllcy5zZXF1ZW5jZWRJbnRlcnBvbGF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHNlcmllcy5maWxsT3BhY2l0eSA9IDAuMTtcclxuICAgICAgaWYgKCEoc2VyaWVzIGluc3RhbmNlb2YgYW00Y2hhcnRzLkNvbHVtblNlcmllcykpIHtcclxuICAgICAgICBzZXJpZXMudGVuc2lvblggPSA1O1xyXG4gICAgICB9XHJcbiAgICAgIHNlcmllcy50b29sdGlwVGV4dCA9IHRvb2x0aXBUZXh0IHx8ICdbYm9sZF0nICsgbmFtZSArICc6IFsvXXtvcGVuVmFsdWVZLnZhbHVlfSB0byB7dmFsdWVZfSc7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIE5PUk1BTCBTRVJJRVNcclxuICAgICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgICAgc2VyaWVzLmZpbGwgPSBhbTRjb3JlLmNvbG9yKGNvbG9yKTtcclxuICAgICAgICBzZXJpZXMuc3Ryb2tlID0gYW00Y29yZS5jb2xvcihjb2xvcik7XHJcbiAgICAgIH1cclxuICAgICAgc2VyaWVzLnN0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGg7XHJcbiAgICAgIGlmIChzZXJpZXMgaW5zdGFuY2VvZiBhbTRjaGFydHMuQ29sdW1uU2VyaWVzKSB7XHJcbiAgICAgICAgc2VyaWVzLmZpbGxPcGFjaXR5ID0gMC40O1xyXG4gICAgICAgIHNlcmllcy5zdHJva2VXaWR0aCA9IDE7IC8vIGtlZXAgdGhpcyBkZWZhdWx0IG9mIDEgPyBVbmRlciBldmFsdWF0aW9uXHJcbiAgICAgIH1cclxuICAgICAgc2VyaWVzLnRvb2x0aXBUZXh0ID0gdG9vbHRpcFRleHQgfHwgJ1tib2xkXScgKyBuYW1lICsgJzpbL10ge3ZhbHVlWX0nO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPT0xUSVAgU1RVRkZcclxuICAgIHNlcmllcy50b29sdGlwID0gbmV3IFRvb2x0aXAoKTtcclxuICAgIHNlcmllcy50b29sdGlwLmJhY2tncm91bmQuZmlsdGVycy5jbGVhcigpOyAvLyBOTyBTSEFET1dcclxuICAgIHNlcmllcy50b29sdGlwLmJhY2tncm91bmQuc3Ryb2tlID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2JnJykpO1xyXG4gICAgaWYgKGRlZlRvb2xUaXBDb2xvcikge1xyXG4gICAgICBzZXJpZXMudG9vbHRpcC5nZXRGaWxsRnJvbU9iamVjdCA9IGZhbHNlO1xyXG4gICAgICBzZXJpZXMudG9vbHRpcC5iYWNrZ3JvdW5kLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICAgIHNlcmllcy50b29sdGlwLmxhYmVsLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignYmcnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhcnQuc2VyaWVzLnB1c2goc2VyaWVzKTtcclxuICAgIHJldHVybiBzZXJpZXM7XHJcblxyXG4gIH1cclxuXHJcbiAgYWRkU2VyaWVzUGllKFxyXG4gICAgY2hhcnQ6IFBpZUNoYXJ0LFxyXG4gICAgY2F0OiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogc3RyaW5nLFxyXG4gICAgY29sb3JBdHRyOiBzdHJpbmcgPSAnJyxcclxuICAgIGNvbG9yOiBzdHJpbmcgPSAnJyxcclxuICAgIHdpdGhMYWJlbHM6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgdG9vbHRpcFRleHQ6IHN0cmluZyA9ICcnLFxyXG4gICk6IGFtNGNoYXJ0cy5QaWVTZXJpZXMge1xyXG4gICAgY29uc3Qgc2VyaWVzID0gbmV3IGFtNGNoYXJ0cy5QaWVTZXJpZXMoKTtcclxuICAgIHNlcmllcy5kYXRhRmllbGRzLmNhdGVnb3J5ID0gY2F0O1xyXG4gICAgc2VyaWVzLmRhdGFGaWVsZHMudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdiZycpKTtcclxuICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUuc3Ryb2tlV2lkdGggPSAyO1xyXG4gICAgc2VyaWVzLnNsaWNlcy50ZW1wbGF0ZS5zdHJva2VPcGFjaXR5ID0gMTtcclxuXHJcbiAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLmRpc2FibGVkID0gIXdpdGhMYWJlbHM7XHJcbiAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLnRleHQgPSB0b29sdGlwVGV4dCB8fCAnW2JvbGRde2NhdGVnb3J5fTpbL10ge3ZhbHVlLnBlcmNlbnQuZm9ybWF0TnVtYmVyKFxcJyNcXCcpfSUgJztcclxuICAgIHNlcmllcy5sYWJlbHMudGVtcGxhdGUuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdjb2xvcicpKTtcclxuICAgIHNlcmllcy50aWNrcy50ZW1wbGF0ZS5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICBzZXJpZXMudGlja3MudGVtcGxhdGUuc3Ryb2tlV2lkdGggPSAyO1xyXG5cclxuICAgIC8vIGRpc2FibGUgc2xpZGluZyBvdXQgb2Ygc2xpY2VzXHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0YXRlcy5nZXRLZXkoJ2hvdmVyJykucHJvcGVydGllcy5zaGlmdFJhZGl1cyA9IDA7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0YXRlcy5nZXRLZXkoJ2hvdmVyJykucHJvcGVydGllcy5zY2FsZSA9IDE7XHJcblxyXG4gICAgaWYgKGNvbG9yQXR0cikge1xyXG4gICAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnByb3BlcnR5RmllbGRzLmZpbGwgPSBjb2xvckF0dHI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUuZmlsbCA9IGFtNGNvcmUuY29sb3IoY29sb3IpO1xyXG4gICAgICBjb25zdCBjcyA9IHNlcmllcy5jb2xvcnM7XHJcbiAgICAgIGNzLmxpc3QgPSBbYW00Y29yZS5jb2xvcihuZXcgYW00Y29yZS5Db2xvclNldCgpLmdldEluZGV4KDApKV07XHJcbiAgICAgIGNzLnN0ZXBPcHRpb25zID0ge1xyXG4gICAgICAgIGxpZ2h0bmVzczogLTAuMDUsXHJcbiAgICAgICAgaHVlOiAwXHJcbiAgICAgIH07XHJcbiAgICAgIGNzLndyYXAgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT09MVElQIFNUVUZGXHJcbiAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gdG9vbHRpcFRleHQgfHwgJ1tib2xkXXtjYXRlZ29yeX06Wy9dIHt2YWx1ZS5wZXJjZW50LmZvcm1hdE51bWJlcihcXCcjXFwnKX0lICc7XHJcbiAgICBzZXJpZXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKCk7XHJcbiAgICBzZXJpZXMudG9vbHRpcC5iYWNrZ3JvdW5kLmZpbHRlcnMuY2xlYXIoKTsgLy8gTk8gU0hBRE9XXHJcbiAgICBzZXJpZXMudG9vbHRpcC5iYWNrZ3JvdW5kLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdiZycpKTtcclxuXHJcbiAgICBjaGFydC5zZXJpZXMucHVzaChzZXJpZXMpO1xyXG4gICAgcmV0dXJuIHNlcmllcztcclxuICB9XHJcblxyXG59XHJcbiJdfQ==