@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
308 lines • 37.3 kB
JavaScript
import { ChangeDetectorRef, Component, Injector, Input, ViewChild } from '@angular/core';
import { ChartComponent } from '../chart/chart.component';
import { CoreBaseComponent } from '../common/base.component';
import { LegendPosition } from './legend-position';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../chart/chart.component";
import * as i3 from "../legend/legend.component";
import * as i4 from "../tooltip/tooltip.directive";
import * as i5 from "../tooltip/tooltip-zone.directive";
const _c0 = ["chart"];
function DoughnutChartComponent_div_2_span_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 9);
} if (rf & 2) {
const ctx_r6 = i0.ɵɵnextContext(2);
const _r0 = i0.ɵɵreference(1);
i0.ɵɵproperty("title", ctx_r6.tooltipTitle)("tooltipZone", _r0);
} }
function DoughnutChartComponent_div_2_div_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 10);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r7 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r7.strings.MsftSmeShell.Angular.DoughnutChart.Aria.RefreshInterval.format(ctx_r7.refreshIntervalString));
} }
function DoughnutChartComponent_div_2_div_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 10);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r8 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r8.stateString);
} }
function DoughnutChartComponent_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 5)(1, "div", 6);
i0.ɵɵtext(2);
i0.ɵɵtemplate(3, DoughnutChartComponent_div_2_span_3_Template, 1, 2, "span", 7);
i0.ɵɵtemplate(4, DoughnutChartComponent_div_2_div_4_Template, 2, 1, "div", 8);
i0.ɵɵtemplate(5, DoughnutChartComponent_div_2_div_5_Template, 2, 1, "div", 8);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", ctx_r1.chartTitle, " ");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.tooltipTitle);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.refreshIntervalString);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.stateString);
} }
function DoughnutChartComponent_div_3_ng_container_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function DoughnutChartComponent_div_3_div_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵelement(1, "sme-legend", 13);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r10 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵproperty("legendData", ctx_r10.legendData);
} }
const _c1 = function (a0) { return { "width": a0 }; };
function DoughnutChartComponent_div_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 5)(1, "div", 11);
i0.ɵɵtemplate(2, DoughnutChartComponent_div_3_ng_container_2_Template, 1, 0, "ng-container", 12);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(3, DoughnutChartComponent_div_3_div_3_Template, 2, 1, "div", 3);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
const _r4 = i0.ɵɵreference(6);
i0.ɵɵadvance(1);
i0.ɵɵclassProp("sme-margin-top-sm", ctx_r2.legendData.length === 0);
i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(5, _c1, ctx_r2.width));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r4);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r2.legendData.length > 0);
} }
function DoughnutChartComponent_div_4_div_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵelement(1, "sme-legend", 15);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r11 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵproperty("legendData", ctx_r11.legendData);
} }
function DoughnutChartComponent_div_4_ng_container_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function DoughnutChartComponent_div_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵtemplate(1, DoughnutChartComponent_div_4_div_1_Template, 2, 1, "div", 3);
i0.ɵɵelementStart(2, "div", 14);
i0.ɵɵtemplate(3, DoughnutChartComponent_div_4_ng_container_3_Template, 1, 0, "ng-container", 12);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext();
const _r4 = i0.ɵɵreference(6);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r3.legendData.length > 0);
i0.ɵɵadvance(1);
i0.ɵɵclassProp("sme-margin-top-sm", ctx_r3.legendData.length === 0);
i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(5, _c1, ctx_r3.width));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r4);
} }
function DoughnutChartComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-chart", 16, 17);
i0.ɵɵelementStart(2, "div", 18)(3, "div", 10);
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "p", 19);
i0.ɵɵtext(6);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(7, "div", 20);
i0.ɵɵtext(8);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r5 = i0.ɵɵnextContext();
i0.ɵɵproperty("data", ctx_r5.data)("options", ctx_r5.options);
i0.ɵɵadvance(2);
i0.ɵɵproperty("id", ctx_r5.idBag.chartCenterText);
i0.ɵɵattribute("aria-labelledby", ctx_r5.idBag.chartCenterText);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r5.strings.MsftSmeShell.Angular.DoughnutChart.Aria.CenterText);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r5.centerChartText);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r5.centerChartSubtext);
} }
export class DoughnutChartComponent extends CoreBaseComponent {
constructor(changeDetectorRef, injector) {
super(injector);
this.changeDetectorRef = changeDetectorRef;
/**
* The legend data to put into the legend
* If legend is not specified, it will automatically be generated
*/
this.legendData = [];
/**
* List of data to be shown on the chart
*/
this.doughnutChartData = [];
/**
* Whether to display the chart title
* Defaults to true
*/
this.showTitle = true;
this.legendIsGenerated = false;
this.showLegend = true;
// TODO: cleanup
this.width = '180px';
this.legendPosition = LegendPosition.Top;
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'DoughnutChartComponent';
}
validateLegendPosition() {
if (LegendPosition.fromBindableType(this.legendPosition) !== LegendPosition.Top &&
LegendPosition.fromBindableType(this.legendPosition) !== LegendPosition.Right) {
throw new Error('Currently accepted doughnut chart legendPosition input values are "top" and "right"');
}
}
ngOnInit() {
this.validateLegendPosition();
this.options = {
animation: false,
cutoutPercentage: 87.5,
tooltips: {
enabled: false
},
maintainAspectRatio: true,
responsive: true,
title: {
display: false
},
legend: {
display: false
}
};
this.updateChartData();
}
updateChartData() {
const labels = [];
const values = [];
const colors = [];
const borderwidth = [];
// Check doughnutChartData is defined and contains elements avoid TypeError: Cannot read property 'foreach' of undefined
if (this.doughnutChartData && this.doughnutChartData.length > 0) {
this.doughnutChartData.forEach(chartData => {
labels.push(chartData.label);
values.push(chartData.value);
colors.push(chartData.color);
borderwidth.push(0);
});
this.data = {
labels: labels,
datasets: [
{
backgroundColor: colors,
borderWidth: borderwidth,
data: values
}
]
};
}
// automatically set legend data if showLegend is true
if (this.showLegend && (this.legendData.length === 0 || this.legendIsGenerated)) {
this.legendData = [];
for (let i = 0; i < this.doughnutChartData.length; i++) {
const data = this.doughnutChartData[i];
if (data.showLegend) {
this.legendData.push({
label: data.label,
displayValue: data.displayValue || data.value,
color: data.color
});
}
}
this.legendIsGenerated = true;
}
}
/**
* refreshed the chart data
*/
refresh() {
this.updateChartData();
// TODO: figure out if there is a way to reliably refresh without detect changes
this.changeDetectorRef.detectChanges();
this.chart.refresh();
}
ngOnDestroy() {
this.changeDetectorRef.detach();
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
chartCenterText: ''
};
}
}
/** @nocollapse */ DoughnutChartComponent.ɵfac = function DoughnutChartComponent_Factory(t) { return new (t || DoughnutChartComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ DoughnutChartComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DoughnutChartComponent, selectors: [["sme-doughnut-chart"]], viewQuery: function DoughnutChartComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.chart = _t.first);
} }, inputs: { showLegend: "showLegend", legendData: "legendData", doughnutChartData: "doughnutChartData", chartTitle: "chartTitle", showTitle: "showTitle", centerChartText: "centerChartText", centerChartSubtext: "centerChartSubtext", tooltipTitle: "tooltipTitle", width: "width", refreshIntervalString: "refreshIntervalString", stateString: "stateString", legendPosition: "legendPosition" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 4, consts: [["tabindex", "0", "smeTooltipZone", "", 1, "sme-focus-zone", "sme-position-flex-auto", "sme-arrange-stack-v"], ["zone", "smeTooltipZone"], ["class", "sme-arrange-stack-h", 4, "ngIf"], [4, "ngIf"], ["chartTemplate", ""], [1, "sme-arrange-stack-h"], [1, "sme-font-family-bold", "sme-layout-float-left"], ["class", "sme-icon sme-icon-info sme-info-bubble sme-margin-left-xs", "tabindex", "0", 3, "title", "tooltipZone", 4, "ngIf"], ["class", "sme-screen-reader", 4, "ngIf"], ["tabindex", "0", 1, "sme-icon", "sme-icon-info", "sme-info-bubble", "sme-margin-left-xs", 3, "title", "tooltipZone"], [1, "sme-screen-reader"], [1, "sme-layout-relative", "sme-margin-inset-lg", 3, "ngStyle"], [4, "ngTemplateOutlet"], [1, "sme-margin-top-lg", 3, "legendData"], [1, "sme-layout-relative", "sme-margin-bottom-sm", "sme-margin-horizontal-lg", 3, "ngStyle"], [3, "legendData"], ["type", "doughnut", 1, "sme-position-flex-auto", 3, "data", "options"], ["chart", ""], ["tabindex", "0", 1, "sme-layout-absolute", "sme-position-center", 3, "id"], [1, "sme-position-center-h-inline", "sme-font-h2"], [1, "sme-margin-top-xxs", "sme-color-base-40", "sme-position-center-h-inline"]], template: function DoughnutChartComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "figure", 0, 1);
i0.ɵɵtemplate(2, DoughnutChartComponent_div_2_Template, 6, 4, "div", 2);
i0.ɵɵtemplate(3, DoughnutChartComponent_div_3_Template, 4, 7, "div", 2);
i0.ɵɵtemplate(4, DoughnutChartComponent_div_4_Template, 4, 7, "div", 3);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(5, DoughnutChartComponent_ng_template_5_Template, 9, 7, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
i0.ɵɵattribute("aria-label", ctx.chartTitle);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx.chartTitle && ctx.showTitle);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.legendPosition === "right");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.legendPosition === "top");
} }, dependencies: [i1.NgIf, i1.NgTemplateOutlet, i1.NgStyle, i2.ChartComponent, i3.LegendComponent, i4.TooltipDirective, i5.TooltipZoneDirective], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DoughnutChartComponent, [{
type: Component,
args: [{ selector: 'sme-doughnut-chart', template: "<figure class=\"sme-focus-zone sme-position-flex-auto sme-arrange-stack-v\" tabindex=\"0\" [attr.aria-label]=\"chartTitle\" #zone=\"smeTooltipZone\" smeTooltipZone>\r\n <div *ngIf=\"chartTitle && showTitle\" class=\"sme-arrange-stack-h\">\r\n <div class=\"sme-font-family-bold sme-layout-float-left\">\r\n {{ chartTitle }}\r\n <span *ngIf=\"tooltipTitle\" class=\"sme-icon sme-icon-info sme-info-bubble sme-margin-left-xs\"\r\n [title]=\"tooltipTitle\" [tooltipZone]=\"zone\" tabindex=\"0\"></span>\r\n <div *ngIf=\"refreshIntervalString\" class=\"sme-screen-reader\">{{\r\n strings.MsftSmeShell.Angular.DoughnutChart.Aria.RefreshInterval.format(refreshIntervalString) }}</div>\r\n <div *ngIf=\"stateString\" class=\"sme-screen-reader\">{{ stateString }}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"legendPosition === 'right'\" class=\"sme-arrange-stack-h\">\r\n <div class=\"sme-layout-relative sme-margin-inset-lg\" [ngStyle]=\"{'width': width}\"\r\n [class.sme-margin-top-sm]=\"legendData.length === 0\">\r\n <ng-container *ngTemplateOutlet=\"chartTemplate\"></ng-container>\r\n </div>\r\n <div *ngIf=\"legendData.length > 0\">\r\n <sme-legend class=\"sme-margin-top-lg\" [legendData]=\"legendData\"></sme-legend>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"legendPosition === 'top'\">\r\n <div *ngIf=\"legendData.length > 0\">\r\n <sme-legend [legendData]=\"legendData\"></sme-legend>\r\n </div>\r\n <div class=\"sme-layout-relative sme-margin-bottom-sm sme-margin-horizontal-lg\" [ngStyle]=\"{'width': width}\"\r\n [class.sme-margin-top-sm]=\"legendData.length === 0\">\r\n <ng-container *ngTemplateOutlet=\"chartTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n</figure>\r\n\r\n<ng-template #chartTemplate>\r\n <sme-chart class=\"sme-position-flex-auto\" #chart type=\"doughnut\" [data]=\"data\" [options]=\"options\"></sme-chart>\r\n <div [id]=\"idBag.chartCenterText\" tabindex=\"0\" class=\"sme-layout-absolute sme-position-center\"\r\n [attr.aria-labelledby]=\"idBag.chartCenterText\">\r\n <div class=\"sme-screen-reader\">{{ strings.MsftSmeShell.Angular.DoughnutChart.Aria.CenterText }}</div>\r\n <p class=\"sme-position-center-h-inline sme-font-h2\">{{ centerChartText }}</p>\r\n <div class=\"sme-margin-top-xxs sme-color-base-40 sme-position-center-h-inline\">{{ centerChartSubtext }}</div>\r\n </div>\r\n</ng-template>\r\n" }]
}], function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }]; }, { showLegend: [{
type: Input
}], legendData: [{
type: Input
}], doughnutChartData: [{
type: Input
}], chartTitle: [{
type: Input
}], showTitle: [{
type: Input
}], centerChartText: [{
type: Input
}], centerChartSubtext: [{
type: Input
}], tooltipTitle: [{
type: Input
}], width: [{
type: Input
}], refreshIntervalString: [{
type: Input
}], stateString: [{
type: Input
}], legendPosition: [{
type: Input
}], chart: [{
type: ViewChild,
args: ['chart']
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91Z2hudXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZG91Z2hudXQtY2hhcnQvZG91Z2hudXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZG91Z2hudXQtY2hhcnQvZG91Z2hudXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7O0lDRDdDLDBCQUNrRTs7OztJQUFoRSwyQ0FBc0Isb0JBQUE7OztJQUN4QiwrQkFBNkQ7SUFBQSxZQUNxQztJQUFBLGlCQUFNOzs7SUFEM0MsZUFDcUM7SUFEckMsaUlBQ3FDOzs7SUFDbEcsK0JBQW1EO0lBQUEsWUFBaUI7SUFBQSxpQkFBTTs7O0lBQXZCLGVBQWlCO0lBQWpCLHdDQUFpQjs7O0lBUHhFLDhCQUFpRSxhQUFBO0lBRTdELFlBQ0E7SUFBQSwrRUFDa0U7SUFDbEUsNkVBQ3dHO0lBQ3hHLDZFQUEwRTtJQUM1RSxpQkFBTSxFQUFBOzs7SUFOSixlQUNBO0lBREEsa0RBQ0E7SUFBTyxlQUFrQjtJQUFsQiwwQ0FBa0I7SUFFbkIsZUFBMkI7SUFBM0IsbURBQTJCO0lBRTNCLGVBQWlCO0lBQWpCLHlDQUFpQjs7O0lBT3ZCLHdCQUErRDs7O0lBRWpFLDJCQUFtQztJQUNqQyxpQ0FBNkU7SUFDL0Us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a0JBQTlCLEtBQUs7WUFLVSxrQkFBa0I7a0JBQWpDLEtBQUs7WUFLVSxZQUFZO2tCQUEzQixLQUFLO1lBS1UsS0FBSztrQkFBcEIsS0FBSztZQU9VLHFCQUFxQjtrQkFBcEMsS0FBSztZQU9VLFdBQVc7a0JBQTFCLEtBQUs7WUFLVSxjQUFjO2tCQUE3QixLQUFLO1lBRXFCLEtBQUs7a0JBQS9CLFNBQVM7bUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFydERhdGEgfSBmcm9tICdjaGFydC5qcyc7XHJcbmltcG9ydCB7IENoYXJ0Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hhcnQvY2hhcnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMZWdlbmRFbnRyeURhdGEgfSBmcm9tICcuLi9sZWdlbmQvbGVnZW5kLWVudHJ5L2xlZ2VuZC1lbnRyeS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMZWdlbmRQb3NpdGlvbiB9IGZyb20gJy4vbGVnZW5kLXBvc2l0aW9uJztcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAc21lRG9jIHtAbGFiZWwgRG91Z2hudXQgQ2hhcnQgQGlkIHNtZS1kb3VnaG51dC1jaGFydC1jb21wb25lbnR9XHJcbiAqXHJcbiAqIEBvdmVydmlld1xyXG4gKiBAZmlsZSB7QGZpbGVwYXRoIC4vZXhhbXBsZXMvZG91Z2hudXQtY2hhcnQtb3ZlcnZpZXcubWR9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgRG91Z2hudXQgQ2hhcnQgQGlkIGRvdWdobnV0LWNoYXJ0fVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2RvdWdobnV0LWNoYXJ0LWV4YW1wbGUuY29tcG9uZW50Lmh0bWx9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50LnRzIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2RvdWdobnV0LWNoYXJ0LWV4YW1wbGUuY29tcG9uZW50LnRzfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIENhcGFjaXR5IERvdWdobnV0IENoYXJ0IEBpZCBjYXBhY2l0eS1kb3VnaG51dC1jaGFydH1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9jYXBhY2l0eS1kb3VnaG51dC1jaGFydC1leGFtcGxlLmNvbXBvbmVudC5odG1sfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC50cyBAZmlsZXBhdGggLi9leGFtcGxlcy9kb3VnaG51dC1jaGFydC1leGFtcGxlLmNvbXBvbmVudC50c31cclxuICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERvdWdobnV0Q2hhcnREYXRhIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxhYmVsIGZvciB0aGUgZGF0YSBzZWdtZW50XHJcbiAgICAgKi9cclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGRhdGEgc2VnbWVudFxyXG4gICAgICovXHJcbiAgICB2YWx1ZTogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRpc3BsYXkgdmFsdWUgdG8gc2hvdyBpbiBsZWdlbmRzIGFuZCB0b29sIHRpcHNcclxuICAgICAqIGV4YW1wbGU6IHZhbHVlID0gODAgYnV0IGRpc3BsYXlWYWx1ZSA9IFwiODAlXCJcclxuICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHZhbHVlIGZpZWxkIHdpbGwgYmUgdXNlZCBmb3IgbGFiZWxpbmdcclxuICAgICAqL1xyXG4gICAgZGlzcGxheVZhbHVlPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNvbG9yIHRvIHVzZSBmb3IgdGhlIGRhdGEgc2VnbWVudFxyXG4gICAgICovXHJcbiAgICBjb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJ1ZSB0byBzaG93IGxlZ2VuZFxyXG4gICAgICovXHJcbiAgICBzaG93TGVnZW5kPzogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1kb3VnaG51dC1jaGFydCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZG91Z2hudXQtY2hhcnQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEb3VnaG51dENoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0RvdWdobnV0Q2hhcnRDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciBvciBub3QgdG8gdXNlIGEgZ2VuZXJhdGVkIGxlZ2VuZFxyXG4gICAgICogSWYgbGVnZW5kRGF0YSBpcyBzcGVjaWZpZWQsIGEgbGVnZW5kIHdpbGwgYmUgc2hvd24gcmVnYXJkbGVzcyBvZiBzaG93TGVnZW5kIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93TGVnZW5kOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxlZ2VuZCBkYXRhIHRvIHB1dCBpbnRvIHRoZSBsZWdlbmRcclxuICAgICAqIElmIGxlZ2VuZCBpcyBub3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZ2VuZXJhdGVkXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsZWdlbmREYXRhOiBMZWdlbmRFbnRyeURhdGFbXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdCBvZiBkYXRhIHRvIGJlIHNob3duIG9uIHRoZSBjaGFydFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZG91Z2hudXRDaGFydERhdGE6IERvdWdobnV0Q2hhcnREYXRhW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRpdGxlIHNob3duIGZvciB0aGUgY2hhcnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNoYXJ0VGl0bGU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgY2hhcnQgdGl0bGVcclxuICAgICAqIERlZmF1bHRzIHRvIHRydWVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dUaXRsZSA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXh0IGluIHRoZSBjZW50ZXIgb2YgdGhlIGRvdWdobnV0IGNoYXJ0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjZW50ZXJDaGFydFRleHQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnRleHQgaW4gdGhlIGNlbnRlciBvZiB0aGUgZG91Z2hudXQgY2hhcnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNlbnRlckNoYXJ0U3VidGV4dDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBnaXZlIGFkZGl0aW9uYWwgb3B0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRvdWdobnV0IGNoYXJ0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0b29sdGlwVGl0bGU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBjaGFydC4gQ2FuIGJlIGFueSB2YWxpZCBjc3Mgd2lkdGggdmFsdWUuIERlZmF1bHRzIHRvIDE4MHB4XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB3aWR0aDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzdHJpbmcgZXhwbGFpbmluZyB0aGUgaG93IG9mdGVuIHRoZSBjaGFydCByZWZyZXNoZXMsIGlmIGFwcGxpY2FibGVcclxuICAgICAqIEV4cGVjdCBzdHJpbmdzIGxpa2UgXCIzIG1pbnV0ZXNcIiBhbmQgXCIzMCBzZWNvbmRzXCJcclxuICAgICAqIFVzZWQgZm9yIGFyaWEtbGFiZWwgb2YgY2hhcnQgaW4gc2VudGVuY2UgXCJDaGFydCByZWZyZXNoZXMgZXZlcnkgPHJlZnJlc2hJbnRlcnZhbFN0cmluZz5cIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVmcmVzaEludGVydmFsU3RyaW5nPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzdHJpbmcgZXhwbGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY2hhcnQsIGlmIGFwcGxpY2FibGVcclxuICAgICAqIEV4cGVjdCBzdHJpbmdzIGxpa2UgXCJDcml0aWNhbCBTdGF0ZVwiIGFuZCBcIldhcm5pbmcgU3RhdGVcIlxyXG4gICAgICogVXNlZCBmb3IgYXJpYS1sYWJlbCBvZiBjaGFydCB0byBkZXNjcmliZSBzdGF0ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc3RhdGVTdHJpbmc/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGxlZ2VuZCByZWxhdGl2ZSB0byB0aGUgY2hhcnQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsZWdlbmRQb3NpdGlvbj86IExlZ2VuZFBvc2l0aW9uLkJpbmRhYmxlO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NoYXJ0JykgcHVibGljIGNoYXJ0OiBDaGFydENvbXBvbmVudDtcclxuICAgIHB1YmxpYyBvcHRpb25zOiBhbnk7XHJcbiAgICBwdWJsaWMgZGF0YTogQ2hhcnREYXRhO1xyXG4gICAgcHVibGljIGxlZ2VuZElzR2VuZXJhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnNob3dMZWdlbmQgPSB0cnVlO1xyXG4gICAgICAgIC8vIFRPRE86IGNsZWFudXBcclxuICAgICAgICB0aGlzLndpZHRoID0gJzE4MHB4JztcclxuICAgICAgICB0aGlzLmxlZ2VuZFBvc2l0aW9uID0gTGVnZW5kUG9zaXRpb24uVG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdmFsaWRhdGVMZWdlbmRQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBpZiAoTGVnZW5kUG9zaXRpb24uZnJvbUJpbmRhYmxlVHlwZSh0aGlzLmxlZ2VuZFBvc2l0aW9uKSAhPT0gTGVnZW5kUG9zaXRpb24uVG9wICYmXHJcbiAgICAgICAgICAgIExlZ2VuZFBvc2l0aW9uLmZyb21CaW5kYWJsZVR5cGUodGhpcy5sZWdlbmRQb3NpdGlvbikgIT09IExlZ2VuZFBvc2l0aW9uLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ3VycmVudGx5IGFjY2VwdGVkIGRvdWdobnV0IGNoYXJ0IGxlZ2VuZFBvc2l0aW9uIGlucHV0IHZhbHVlcyBhcmUgXCJ0b3BcIiBhbmQgXCJyaWdodFwiJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnZhbGlkYXRlTGVnZW5kUG9zaXRpb24oKTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGN1dG91dFBlcmNlbnRhZ2U6IDg3LjUsIC8vIHBlcmNlbnQgb2YgY2lyY2xlIHRvIHJlbW92ZSBpbiBjZW50ZXIgKGFmZmVjdHMgbGluZSB0aGlja25lc3MpXHJcbiAgICAgICAgICAgIHRvb2x0aXBzOiB7XHJcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICB0aXRsZToge1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbGVnZW5kOiB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVDaGFydERhdGEoKSB7XHJcbiAgICAgICAgY29uc3QgbGFiZWxzID0gW107XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW107XHJcbiAgICAgICAgY29uc3QgY29sb3JzID0gW107XHJcbiAgICAgICAgY29uc3QgYm9yZGVyd2lkdGggPSBbXTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgZG91Z2hudXRDaGFydERhdGEgaXMgZGVmaW5lZCBhbmQgY29udGFpbnMgZWxlbWVudHMgYXZvaWQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0eSAnZm9yZWFjaCcgb2YgdW5kZWZpbmVkXHJcbiAgICAgICAgaWYgKHRoaXMuZG91Z2hudXRDaGFydERhdGEgJiYgdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZG91Z2hudXRDaGFydERhdGEuZm9yRWFjaChjaGFydERhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2goY2hhcnREYXRhLmxhYmVsKTtcclxuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKGNoYXJ0RGF0YS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb2xvcnMucHVzaChjaGFydERhdGEuY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgYm9yZGVyd2lkdGgucHVzaCgwKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGxhYmVsczogbGFiZWxzLFxyXG4gICAgICAgICAgICAgICAgZGF0YXNldHM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogY29sb3JzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyd2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgc2V0IGxlZ2VuZCBkYXRhIGlmIHNob3dMZWdlbmQgaXMgdHJ1ZVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dMZWdlbmQgJiYgKHRoaXMubGVnZW5kRGF0YS5sZW5ndGggPT09IDAgfHwgdGhpcy5sZWdlbmRJc0dlbmVyYXRlZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sZWdlbmREYXRhID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZG91Z2hudXRDaGFydERhdGFbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zaG93TGVnZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWdlbmREYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZGF0YS5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlOiBkYXRhLmRpc3BsYXlWYWx1ZSB8fCBkYXRhLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZGF0YS5jb2xvclxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGVnZW5kSXNHZW5lcmF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJlZnJlc2hlZCB0aGUgY2hhcnQgZGF0YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVmcmVzaCgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0RGF0YSgpO1xyXG4gICAgICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaWYgdGhlcmUgaXMgYSB3YXkgdG8gcmVsaWFibHkgcmVmcmVzaCB3aXRob3V0IGRldGVjdCBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5jaGFydC5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqIGlkIHZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIGJlIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgc3VwZXIgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjaGFydENlbnRlclRleHQ6ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGZpZ3VyZSBjbGFzcz1cInNtZS1mb2N1cy16b25lIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG8gc21lLWFycmFuZ2Utc3RhY2stdlwiIHRhYmluZGV4PVwiMFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiY2hhcnRUaXRsZVwiICN6b25lPVwic21lVG9vbHRpcFpvbmVcIiBzbWVUb29sdGlwWm9uZT5cclxuICA8ZGl2ICpuZ0lmPVwiY2hhcnRUaXRsZSAmJiBzaG93VGl0bGVcIiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLWhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtZm9udC1mYW1pbHktYm9sZCBzbWUtbGF5b3V0LWZsb2F0LWxlZnRcIj5cclxuICAgICAge3sgY2hhcnRUaXRsZSB9fVxyXG4gICAgICA8c3BhbiAqbmdJZj1cInRvb2x0aXBUaXRsZVwiIGNsYXNzPVwic21lLWljb24gc21lLWljb24taW5mbyBzbWUtaW5mby1idWJibGUgc21lLW1hcmdpbi1sZWZ0LXhzXCJcclxuICAgICAgICBbdGl0bGVdPVwidG9vbHRpcFRpdGxlXCIgW3Rvb2x0aXBab25lXT1cInpvbmVcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJyZWZyZXNoSW50ZXJ2YWxTdHJpbmdcIiBjbGFzcz1cInNtZS1zY3JlZW4tcmVhZGVyXCI+e3tcclxuICAgICAgICBzdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRvdWdobnV0Q2hhcnQuQXJpYS5SZWZyZXNoSW50ZXJ2YWwuZm9ybWF0KHJlZnJlc2hJbnRlcnZhbFN0cmluZykgfX08L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cInN0YXRlU3RyaW5nXCIgY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlclwiPnt7IHN0YXRlU3RyaW5nIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImxlZ2VuZFBvc2l0aW9uID09PSAncmlnaHQnXCIgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLWxheW91dC1yZWxhdGl2ZSBzbWUtbWFyZ2luLWluc2V0LWxnXCIgW25nU3R5bGVdPVwieyd3aWR0aCc6IHdpZHRofVwiXHJcbiAgICAgIFtjbGFzcy5zbWUtbWFyZ2luLXRvcC1zbV09XCJsZWdlbmREYXRhLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hhcnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwibGVnZW5kRGF0YS5sZW5ndGggPiAwXCI+XHJcbiAgICAgIDxzbWUtbGVnZW5kIGNsYXNzPVwic21lLW1hcmdpbi10b3AtbGdcIiBbbGVnZW5kRGF0YV09XCJsZWdlbmREYXRhXCI+PC9zbWUtbGVnZW5kPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcCdcIj5cclxuICAgIDxkaXYgKm5nSWY9XCJsZWdlbmREYXRhLmxlbmd0aCA+IDBcIj5cclxuICAgICAgPHNtZS1sZWdlbmQgW2xlZ2VuZERhdGFdPVwibGVnZW5kRGF0YVwiPjwvc21lLWxlZ2VuZD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtcmVsYXRpdmUgc21lLW1hcmdpbi1ib3R0b20tc20gc21lLW1hcmdpbi1ob3Jpem9udGFsLWxnXCIgW25nU3R5bGVdPVwieyd3aWR0aCc6IHdpZHRofVwiXHJcbiAgICAgIFtjbGFzcy5zbWUtbWFyZ2luLXRvcC1zbV09XCJsZWdlbmREYXRhLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hhcnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZmlndXJlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNjaGFydFRlbXBsYXRlPlxyXG4gIDxzbWUtY2hhcnQgY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1hdXRvXCIgI2NoYXJ0IHR5cGU9XCJkb3VnaG51dFwiIFtkYXRhXT1cImRhdGFcIiBbb3B0aW9uc109XCJvcHRpb25zXCI+PC9zbWUtY2hhcnQ+XHJcbiAgPGRpdiBbaWRdPVwiaWRCYWcuY2hhcnRDZW50ZXJUZXh0XCIgdGFiaW5kZXg9XCIwXCIgY2xhc3M9XCJzbWUtbGF5b3V0LWFic29sdXRlIHNtZS1wb3NpdGlvbi1jZW50ZXJcIlxyXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmNoYXJ0Q2VudGVyVGV4dFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1zY3JlZW4tcmVhZGVyXCI+e3sgc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Eb3VnaG51dENoYXJ0LkFyaWEuQ2VudGVyVGV4dCB9fTwvZGl2PlxyXG4gICAgPHAgY2xhc3M9XCJzbWUtcG9zaXRpb24tY2VudGVyLWgtaW5saW5lIHNtZS1mb250LWgyXCI+e3sgY2VudGVyQ2hhcnRUZXh0IH19PC9wPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1tYXJnaW4tdG9wLXh4cyBzbWUtY29sb3ItYmFzZS00MCBzbWUtcG9zaXRpb24tY2VudGVyLWgtaW5saW5lXCI+e3sgY2VudGVyQ2hhcnRTdWJ0ZXh0IH19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==