@alauda-fe/common
Version:
Alauda frontend team common codes.
265 lines • 34.8 kB
JavaScript
import { isTemplateRef } from '@alauda/ui';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
import { ContextChartService } from '../../chart.service';
import * as i0 from "@angular/core";
import * as i1 from "../../chart.service";
const _c0 = a0 => ({ context: a0 });
const _c1 = a0 => [a0, "label-symbol"];
function ChartLegendComponent_div_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 5);
i0.ɵɵelementContainer(1, 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("ngTemplateOutlet", ctx_r0.leftOperation);
} }
function ChartLegendComponent_div_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementContainer(1, 6);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
i0.ɵɵnextContext(2);
const legendTemplate_r2 = i0.ɵɵreference(4);
i0.ɵɵadvance();
i0.ɵɵproperty("ngTemplateOutlet", legendTemplate_r2);
} }
function ChartLegendComponent_div_1_ng_template_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementContainer(1, 9);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext(3);
i0.ɵɵadvance();
i0.ɵɵproperty("ngTemplateOutlet", ctx_r0.template)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, ctx_r0.legendEntries));
} }
function ChartLegendComponent_div_1_ng_template_2_ng_template_1_acl_dropdown_legend_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-dropdown-legend", 12);
i0.ɵɵpipe(1, "async");
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext(4);
const legendTemplate_r2 = i0.ɵɵreference(4);
i0.ɵɵproperty("data", ctx_r0.legendEntries)("noData", i0.ɵɵpipeBind1(1, 4, ctx_r0.context.noData$))("legendTemplate", legendTemplate_r2)("isCard", ctx_r0.mode === "card");
} }
function ChartLegendComponent_div_1_ng_template_2_ng_template_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0, 10);
i0.ɵɵtemplate(1, ChartLegendComponent_div_1_ng_template_2_ng_template_1_acl_dropdown_legend_1_Template, 2, 6, "acl-dropdown-legend", 11);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("ngSwitch", ctx_r0.template);
i0.ɵɵadvance();
i0.ɵɵproperty("ngSwitchCase", "dropdown");
} }
function ChartLegendComponent_div_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, ChartLegendComponent_div_1_ng_template_2_ng_container_0_Template, 2, 4, "ng-container", 8)(1, ChartLegendComponent_div_1_ng_template_2_ng_template_1_Template, 2, 2, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
const builtinTemplate_r3 = i0.ɵɵreference(2);
const ctx_r0 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("ngIf", ctx_r0.isTemplateRef(ctx_r0.template))("ngIfElse", builtinTemplate_r3);
} }
function ChartLegendComponent_div_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 7);
i0.ɵɵtemplate(1, ChartLegendComponent_div_1_ng_container_1_Template, 2, 1, "ng-container", 8)(2, ChartLegendComponent_div_1_ng_template_2_Template, 3, 2, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
i0.ɵɵelementEnd();
} if (rf & 2) {
const custom_r4 = i0.ɵɵreference(3);
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", !ctx_r0.template)("ngIfElse", custom_r4);
} }
function ChartLegendComponent_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 5);
i0.ɵɵelementContainer(1, 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("ngTemplateOutlet", ctx_r0.rightOperation);
} }
function ChartLegendComponent_ng_template_3_li_1_Template(rf, ctx) { if (rf & 1) {
const _r5 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "li", 16)(1, "aui-checkbox", 17);
i0.ɵɵtwoWayListener("ngModelChange", function ChartLegendComponent_ng_template_3_li_1_Template_aui_checkbox_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.allSelected, $event) || (ctx_r0.allSelected = $event); return i0.ɵɵresetView($event); });
i0.ɵɵlistener("ngModelChange", function ChartLegendComponent_ng_template_3_li_1_Template_aui_checkbox_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.allSelect($event)); });
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.allSelected);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", ctx_r0.selectAllName || i0.ɵɵpipeBind1(3, 2, "select_all"), " ");
} }
function ChartLegendComponent_ng_template_3_li_3_Template(rf, ctx) { if (rf & 1) {
const _r6 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "li", 18);
i0.ɵɵpipe(1, "async");
i0.ɵɵpipe(2, "async");
i0.ɵɵlistener("click", function ChartLegendComponent_ng_template_3_li_3_Template_li_click_0_listener() { const legend_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.selected(legend_r7)); })("mouseenter", function ChartLegendComponent_ng_template_3_li_3_Template_li_mouseenter_0_listener() { const legend_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.mouseenter(legend_r7)); })("mouseleave", function ChartLegendComponent_ng_template_3_li_3_Template_li_mouseleave_0_listener() { const legend_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.mouseleave(legend_r7)); });
i0.ɵɵelement(3, "span", 19);
i0.ɵɵelementStart(4, "span", 20);
i0.ɵɵtext(5);
i0.ɵɵpipe(6, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const legend_r7 = ctx.$implicit;
const ctx_r0 = i0.ɵɵnextContext(2);
i0.ɵɵclassProp("disable", !legend_r7.activate || i0.ɵɵpipeBind1(1, 10, ctx_r0.context.noData$))("forbid", i0.ɵɵpipeBind1(2, 12, ctx_r0.context.noData$))("hover", legend_r7.activate && legend_r7.hover);
i0.ɵɵadvance(3);
i0.ɵɵstyleProp("background", legend_r7.color);
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(16, _c1, ctx_r0.symbolName));
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r0.translation ? i0.ɵɵpipeBind1(6, 14, legend_r7.name) : legend_r7.name);
} }
function ChartLegendComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "ul", 13);
i0.ɵɵtemplate(1, ChartLegendComponent_ng_template_3_li_1_Template, 4, 4, "li", 14);
i0.ɵɵpipe(2, "async");
i0.ɵɵtemplate(3, ChartLegendComponent_ng_template_3_li_3_Template, 7, 18, "li", 15);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", !i0.ɵɵpipeBind1(2, 2, ctx_r0.context.noData$) && ctx_r0.selectAllOperation && ctx_r0.template === "dropdown");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", ctx_r0.legendEntries);
} }
export class LegendPayload {
}
export class ChartLegendComponent {
get symbolName() {
return `symbol-${this.symbol}`;
}
constructor(context, cdr) {
this.context = context;
this.cdr = cdr;
this.symbol = 'line';
this.mode = 'default';
this.translation = true;
this.selectAllOperation = false;
this.labelClick = new EventEmitter();
this.labelActivate = new EventEmitter();
this.labelDeactivate = new EventEmitter();
this.isTemplateRef = isTemplateRef;
this.allSelected = true;
}
ngOnInit() {
this.context.seriesData$.subscribe(() => {
this.legendEntries = this.context.barOptions.isBand
? this.context.chartData
.flatMap(item => item.values)
.reduce((pre, cur) => [
...pre,
...(pre.some(d => d.name === cur.x)
? []
: [
{
name: cur.x,
color: cur.color ||
this.context.getChartDefaultColor(pre.length),
activate: !this.context.disabledLegend.has(cur.x),
hover: false,
},
]),
], [])
: this.context.noData
? []
: this.context.chartData.map(d => ({
name: d.name,
color: d.color,
activate: !this.context.disabledLegend.has(d.name),
hover: false,
}));
this.cdr.detectChanges();
});
}
selected(legend) {
if (this.context.noData) {
return;
}
const legendItem = this.legendEntries.find(item => item.name === legend.name);
legendItem.activate = !legend.activate;
const payload = {
legendItem,
legends: this.legendEntries,
};
this.labelClick.next(payload);
if (legend.activate) {
this.labelActivate.next(legend);
this.context.selectedLegend(payload);
}
else {
this.labelDeactivate.next(legend);
legend.hover = false;
this.context.deactivateLegend(payload);
}
this.cdr.detectChanges();
}
mouseenter(legend) {
if (legend.activate && !this.context.noData) {
legend.hover = true;
this.context.legendActivate$$.next(legend.name);
}
this.cdr.detectChanges();
}
mouseleave(legend) {
this.context.legendActivate$$.next('');
legend.hover = false;
this.cdr.detectChanges();
}
allSelect(select) {
this.legendEntries = this.legendEntries.map(d => ({
...d,
activate: select,
}));
select
? this.context.selectedAllLegend()
: this.context.unselectAllLegend(this.legendEntries.map(d => d.name));
this.labelClick.next({
legendItem: null,
legends: this.legendEntries,
});
}
static { this.ɵfac = function ChartLegendComponent_Factory(t) { return new (t || ChartLegendComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ChartLegendComponent, selectors: [["acl-legend"]], inputs: { symbol: "symbol", template: "template", mode: "mode", translation: "translation", leftOperation: "leftOperation", rightOperation: "rightOperation", hideLegend: "hideLegend", selectAllOperation: "selectAllOperation", selectAllName: "selectAllName" }, outputs: { labelClick: "labelClick", labelActivate: "labelActivate", labelDeactivate: "labelDeactivate" }, decls: 5, vars: 3, consts: [["legendTemplate", ""], ["custom", ""], ["builtinTemplate", ""], ["class", "operation", 4, "ngIf"], ["class", "legend-wrap", 4, "ngIf"], [1, "operation"], [3, "ngTemplateOutlet"], [1, "legend-wrap"], [4, "ngIf", "ngIfElse"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [3, "ngSwitch"], ["class", "legend-vertical", 3, "data", "noData", "legendTemplate", "isCard", 4, "ngSwitchCase"], [1, "legend-vertical", 3, "data", "noData", "legendTemplate", "isCard"], [1, "legend-labels"], ["class", "select-all", 4, "ngIf"], ["class", "legend-label", 3, "disable", "forbid", "hover", "click", "mouseenter", "mouseleave", 4, "ngFor", "ngForOf"], [1, "select-all"], [3, "ngModelChange", "ngModel"], [1, "legend-label", 3, "click", "mouseenter", "mouseleave"], [3, "ngClass"], [1, "label-name"]], template: function ChartLegendComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, ChartLegendComponent_div_0_Template, 2, 1, "div", 3)(1, ChartLegendComponent_div_1_Template, 4, 2, "div", 4)(2, ChartLegendComponent_div_2_Template, 2, 1, "div", 3)(3, ChartLegendComponent_ng_template_3_Template, 4, 4, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
i0.ɵɵproperty("ngIf", ctx.isTemplateRef(ctx.leftOperation));
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", !ctx.hideLegend);
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", ctx.isTemplateRef(ctx.rightOperation));
} }, styles: [".legend-wrap[_ngcontent-%COMP%]{display:inline-block}.legend-wrap[_ngcontent-%COMP%] ul[_ngcontent-%COMP%], .legend-wrap[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{padding:0;margin:0;list-style:none}.legend-wrap[_ngcontent-%COMP%] .legend-labels[_ngcontent-%COMP%]{display:flex}.legend-wrap[_ngcontent-%COMP%] .legend-label[_ngcontent-%COMP%]{display:flex;align-items:center;cursor:pointer;justify-content:center}.legend-wrap[_ngcontent-%COMP%] .legend-label[_ngcontent-%COMP%]:not(:last-child){margin-right:20px}.legend-wrap[_ngcontent-%COMP%] .forbid[_ngcontent-%COMP%]{cursor:no-drop}.legend-wrap[_ngcontent-%COMP%] .label-name[_ngcontent-%COMP%]{font-size:12px;color:rgb(var(--aui-color-secondary-text))}.legend-wrap[_ngcontent-%COMP%] .label-symbol[_ngcontent-%COMP%]{margin-right:4px}.disable[_ngcontent-%COMP%] .label-symbol[_ngcontent-%COMP%]{background:rgb(var(--aui-color-n-6))!important}.disable[_ngcontent-%COMP%] .label-name[_ngcontent-%COMP%]{color:rgb(var(--aui-color-n-6))}.hover[_ngcontent-%COMP%] .label-name[_ngcontent-%COMP%]{color:rgb(var(--aui-color-n-1))}.symbol-square[_ngcontent-%COMP%]{width:12px;height:12px;display:inline-block}.symbol-line[_ngcontent-%COMP%]{width:12px;height:2px;display:inline-block}.symbol-circle[_ngcontent-%COMP%]{width:12px;height:12px;border-radius:50%;display:inline-block}.operation[_ngcontent-%COMP%]{display:flex;justify-content:center}.select-all[_ngcontent-%COMP%] .aui-checkbox{font-size:12px;line-height:16px;margin-bottom:8px}"], changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ChartLegendComponent, [{
type: Component,
args: [{ selector: 'acl-legend', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"operation\"\n *ngIf=\"isTemplateRef(leftOperation)\"\n>\n <ng-container [ngTemplateOutlet]=\"leftOperation\"></ng-container>\n</div>\n\n<div\n class=\"legend-wrap\"\n *ngIf=\"!hideLegend\"\n>\n <ng-container *ngIf=\"!template; else custom\">\n <ng-container [ngTemplateOutlet]=\"legendTemplate\"></ng-container>\n </ng-container>\n <ng-template #custom>\n <ng-container *ngIf=\"isTemplateRef(template); else builtinTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"$any(template)\"\n [ngTemplateOutletContext]=\"{ context: legendEntries }\"\n ></ng-container>\n </ng-container>\n <ng-template #builtinTemplate>\n <ng-container [ngSwitch]=\"template\">\n <acl-dropdown-legend\n class=\"legend-vertical\"\n *ngSwitchCase=\"'dropdown'\"\n [data]=\"legendEntries\"\n [noData]=\"context.noData$ | async\"\n [legendTemplate]=\"legendTemplate\"\n [isCard]=\"mode === 'card'\"\n >\n </acl-dropdown-legend>\n </ng-container>\n </ng-template>\n </ng-template>\n</div>\n\n<div\n class=\"operation\"\n *ngIf=\"isTemplateRef(rightOperation)\"\n>\n <ng-container [ngTemplateOutlet]=\"rightOperation\"></ng-container>\n</div>\n\n<ng-template #legendTemplate>\n <ul class=\"legend-labels\">\n <li\n class=\"select-all\"\n *ngIf=\"\n !(context.noData$ | async) &&\n selectAllOperation &&\n template === 'dropdown'\n \"\n >\n <aui-checkbox\n [(ngModel)]=\"allSelected\"\n (ngModelChange)=\"allSelect($event)\"\n >\n {{ selectAllName || ('select_all' | translate) }}\n </aui-checkbox>\n </li>\n <li\n class=\"legend-label\"\n [class.disable]=\"!legend.activate || (context.noData$ | async)\"\n [class.forbid]=\"context.noData$ | async\"\n *ngFor=\"let legend of legendEntries\"\n (click)=\"selected(legend)\"\n [class.hover]=\"legend.activate && legend.hover\"\n (mouseenter)=\"mouseenter(legend)\"\n (mouseleave)=\"mouseleave(legend)\"\n >\n <span\n [ngClass]=\"[symbolName, 'label-symbol']\"\n [style.background]=\"legend.color\"\n >\n </span>\n <span class=\"label-name\">{{\n translation ? (legend.name | translate) : legend.name\n }}</span>\n </li>\n </ul>\n</ng-template>\n", styles: [".legend-wrap{display:inline-block}.legend-wrap ul,.legend-wrap li{padding:0;margin:0;list-style:none}.legend-wrap .legend-labels{display:flex}.legend-wrap .legend-label{display:flex;align-items:center;cursor:pointer;justify-content:center}.legend-wrap .legend-label:not(:last-child){margin-right:20px}.legend-wrap .forbid{cursor:no-drop}.legend-wrap .label-name{font-size:12px;color:rgb(var(--aui-color-secondary-text))}.legend-wrap .label-symbol{margin-right:4px}.disable .label-symbol{background:rgb(var(--aui-color-n-6))!important}.disable .label-name{color:rgb(var(--aui-color-n-6))}.hover .label-name{color:rgb(var(--aui-color-n-1))}.symbol-square{width:12px;height:12px;display:inline-block}.symbol-line{width:12px;height:2px;display:inline-block}.symbol-circle{width:12px;height:12px;border-radius:50%;display:inline-block}.operation{display:flex;justify-content:center}.select-all ::ng-deep .aui-checkbox{font-size:12px;line-height:16px;margin-bottom:8px}\n"] }]
}], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { symbol: [{
type: Input
}], template: [{
type: Input
}], mode: [{
type: Input
}], translation: [{
type: Input
}], leftOperation: [{
type: Input
}], rightOperation: [{
type: Input
}], hideLegend: [{
type: Input
}], selectAllOperation: [{
type: Input
}], selectAllName: [{
type: Input
}], labelClick: [{
type: Output
}], labelActivate: [{
type: Output
}], labelDeactivate: [{
type: Output
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChartLegendComponent, { className: "ChartLegendComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnZW5kLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jb21tb24vbGVnZW5kL2xlZ2VuZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL2xlZ2VuZC9sZWdlbmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7SUNiMUQsOEJBR0M7SUFDQywyQkFBZ0U7SUFDbEUsaUJBQU07OztJQURVLGNBQWtDO0lBQWxDLHVEQUFrQzs7O0lBT2hELDZCQUE2QztJQUMzQywyQkFBaUU7Ozs7O0lBQW5ELGNBQW1DO0lBQW5DLG9EQUFtQzs7O0lBR2pELDZCQUFvRTtJQUNsRSwyQkFHZ0I7Ozs7SUFGZCxjQUFtQztJQUNuQyxBQURBLGtEQUFtQyw2RUFDbUI7OztJQUt0RCwwQ0FRc0I7Ozs7O0lBRnBCLEFBREEsQUFEQSxBQURBLDJDQUFzQix3REFDWSxxQ0FDRCxrQ0FDUDs7O0lBUDlCLGlDQUFvQztJQUNsQyx3SUFPQzs7OztJQVJXLDBDQUFxQjtJQUc5QixjQUF3QjtJQUF4Qix5Q0FBd0I7OztJQUovQixBQU5BLDJHQUFvRSw2SEFNdEM7Ozs7SUFOZ0IsQUFBL0IsNERBQStCLGdDQUFvQjs7O0lBUnRFLDhCQUdDO0lBSUMsQUFIQSw2RkFBNkMsK0dBR3hCO0lBcUJ2QixpQkFBTTs7OztJQXhCVyxjQUFpQjtJQUFBLEFBQWpC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QWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNuQixVQUFVLEVBQUUsSUFBSTtZQUNoQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztxRkFoSVUsb0JBQW9CO29FQUFwQixvQkFBb0I7WUNZakMsQUFQQSxBQTlCQSxBQVBBLHFFQUdDLHdEQU9BLHdEQThCQSx5R0FJNEI7O1lBMUMxQiwyREFBa0M7WUFPbEMsY0FBaUI7WUFBakIsc0NBQWlCO1lBOEJqQixjQUFtQztZQUFuQyw0REFBbUM7OztpRkRQekIsb0JBQW9CO2NBTmhDLFNBQVM7MkJBQ0UsWUFBWSxtQkFHTCx1QkFBdUIsQ0FBQyxNQUFNO29GQUt0QyxNQUFNO2tCQUFkLEtBQUs7WUFFRyxRQUFRO2tCQUFoQixLQUFLO1lBRUcsSUFBSTtrQkFBWixLQUFLO1lBRUcsV0FBVztrQkFBbkIsS0FBSztZQUVHLGFBQWE7a0JBQXJCLEtBQUs7WUFFRyxjQUFjO2tCQUF0QixLQUFLO1lBRUcsVUFBVTtrQkFBbEIsS0FBSztZQUVHLGtCQUFrQjtrQkFBMUIsS0FBSztZQUVHLGFBQWE7a0JBQXJCLEtBQUs7WUFFSSxVQUFVO2tCQUFuQixNQUFNO1lBRUcsYUFBYTtrQkFBdEIsTUFBTTtZQUVHLGVBQWU7a0JBQXhCLE1BQU07O2tGQXpCSSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1RlbXBsYXRlUmVmIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2hhcnREYXRhSXRlbSB9IGZyb20gJy4uLy4uLy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgQ29udGV4dENoYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NoYXJ0LnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExlZ2VuZEl0ZW0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbG9yOiBzdHJpbmc7XG4gIGFjdGl2YXRlPzogYm9vbGVhbjtcbiAgaG92ZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgTGVnZW5kUGF5bG9hZCB7XG4gIGxlZ2VuZEl0ZW06IExlZ2VuZEl0ZW07XG4gIGxlZ2VuZHM6IExlZ2VuZEl0ZW1bXTtcbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1sZWdlbmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGVnZW5kLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGVnZW5kLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydExlZ2VuZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxlZ2VuZEVudHJpZXM6IExlZ2VuZEl0ZW1bXTtcblxuICBASW5wdXQoKSBzeW1ib2w6ICdjaXJjbGUnIHwgJ3NxdWFyZScgfCAnbGluZScgPSAnbGluZSc7XG5cbiAgQElucHV0KCkgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgc3RyaW5nIHwgJ2Ryb3Bkb3duJztcblxuICBASW5wdXQoKSBtb2RlOiAnY2FyZCcgfCAnZGVmYXVsdCcgPSAnZGVmYXVsdCc7XG5cbiAgQElucHV0KCkgdHJhbnNsYXRpb24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGxlZnRPcGVyYXRpb246IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBJbnB1dCgpIHJpZ2h0T3BlcmF0aW9uOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBASW5wdXQoKSBoaWRlTGVnZW5kOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHNlbGVjdEFsbE9wZXJhdGlvbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNlbGVjdEFsbE5hbWU6IHN0cmluZztcblxuICBAT3V0cHV0KCkgbGFiZWxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8TGVnZW5kUGF5bG9hZD4oKTtcblxuICBAT3V0cHV0KCkgbGFiZWxBY3RpdmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TGVnZW5kSXRlbT4oKTtcblxuICBAT3V0cHV0KCkgbGFiZWxEZWFjdGl2YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxMZWdlbmRJdGVtPigpO1xuXG4gIGlzVGVtcGxhdGVSZWYgPSBpc1RlbXBsYXRlUmVmO1xuXG4gIGFsbFNlbGVjdGVkID0gdHJ1ZTtcblxuICBnZXQgc3ltYm9sTmFtZSgpIHtcbiAgICByZXR1cm4gYHN5bWJvbC0ke3RoaXMuc3ltYm9sfWA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dENoYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHQuc2VyaWVzRGF0YSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubGVnZW5kRW50cmllcyA9IHRoaXMuY29udGV4dC5iYXJPcHRpb25zLmlzQmFuZFxuICAgICAgICA/IHRoaXMuY29udGV4dC5jaGFydERhdGFcbiAgICAgICAgICAgIC5mbGF0TWFwKGl0ZW0gPT4gaXRlbS52YWx1ZXMpXG4gICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgcHJlLFxuICAgICAgICAgICAgICAgIGN1cjogQ2hhcnREYXRhSXRlbTx7IHg6IHN0cmluZzsgeTogbnVtYmVyOyBjb2xvcj86IHN0cmluZyB9PixcbiAgICAgICAgICAgICAgKSA9PiBbXG4gICAgICAgICAgICAgICAgLi4ucHJlLFxuICAgICAgICAgICAgICAgIC4uLihwcmUuc29tZShkID0+IGQubmFtZSA9PT0gY3VyLngpXG4gICAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjdXIueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIuY29sb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldENoYXJ0RGVmYXVsdENvbG9yKHByZS5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGU6ICF0aGlzLmNvbnRleHQuZGlzYWJsZWRMZWdlbmQuaGFzKGN1ci54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICApXG4gICAgICAgIDogdGhpcy5jb250ZXh0Lm5vRGF0YVxuICAgICAgICA/IFtdXG4gICAgICAgIDogdGhpcy5jb250ZXh0LmNoYXJ0RGF0YS5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogZC5uYW1lLFxuICAgICAgICAgICAgY29sb3I6IGQuY29sb3IsXG4gICAgICAgICAgICBhY3RpdmF0ZTogIXRoaXMuY29udGV4dC5kaXNhYmxlZExlZ2VuZC5oYXMoZC5uYW1lKSxcbiAgICAgICAgICAgIGhvdmVyOiBmYWxzZSxcbiAgICAgICAgICB9KSk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RlZChsZWdlbmQ6IExlZ2VuZEl0ZW0pIHtcbiAgICBpZiAodGhpcy5jb250ZXh0Lm5vRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsZWdlbmRJdGVtID0gdGhpcy5sZWdlbmRFbnRyaWVzLmZpbmQoXG4gICAgICBpdGVtID0+IGl0ZW0ubmFtZSA9PT0gbGVnZW5kLm5hbWUsXG4gICAgKTtcbiAgICBsZWdlbmRJdGVtLmFjdGl2YXRlID0gIWxlZ2VuZC5hY3RpdmF0ZTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgbGVnZW5kSXRlbSxcbiAgICAgIGxlZ2VuZHM6IHRoaXMubGVnZW5kRW50cmllcyxcbiAgICB9O1xuICAgIHRoaXMubGFiZWxDbGljay5uZXh0KHBheWxvYWQpO1xuICAgIGlmIChsZWdlbmQuYWN0aXZhdGUpIHtcbiAgICAgIHRoaXMubGFiZWxBY3RpdmF0ZS5uZXh0KGxlZ2VuZCk7XG4gICAgICB0aGlzLmNvbnRleHQuc2VsZWN0ZWRMZWdlbmQocGF5bG9hZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFiZWxEZWFjdGl2YXRlLm5leHQobGVnZW5kKTtcbiAgICAgIGxlZ2VuZC5ob3ZlciA9IGZhbHNlO1xuICAgICAgdGhpcy5jb250ZXh0LmRlYWN0aXZhdGVMZWdlbmQocGF5bG9hZCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG1vdXNlZW50ZXIobGVnZW5kOiBMZWdlbmRJdGVtKSB7XG4gICAgaWYgKGxlZ2VuZC5hY3RpdmF0ZSAmJiAhdGhpcy5jb250ZXh0Lm5vRGF0YSkge1xuICAgICAgbGVnZW5kLmhvdmVyID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29udGV4dC5sZWdlbmRBY3RpdmF0ZSQkLm5leHQobGVnZW5kLm5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBtb3VzZWxlYXZlKGxlZ2VuZDogTGVnZW5kSXRlbSkge1xuICAgIHRoaXMuY29udGV4dC5sZWdlbmRBY3RpdmF0ZSQkLm5leHQoJycpO1xuICAgIGxlZ2VuZC5ob3ZlciA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGFsbFNlbGVjdChzZWxlY3Q6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmxlZ2VuZEVudHJpZXMgPSB0aGlzLmxlZ2VuZEVudHJpZXMubWFwKGQgPT4gKHtcbiAgICAgIC4uLmQsXG4gICAgICBhY3RpdmF0ZTogc2VsZWN0LFxuICAgIH0pKTtcbiAgICBzZWxlY3RcbiAgICAgID8gdGhpcy5jb250ZXh0LnNlbGVjdGVkQWxsTGVnZW5kKClcbiAgICAgIDogdGhpcy5jb250ZXh0LnVuc2VsZWN0QWxsTGVnZW5kKHRoaXMubGVnZW5kRW50cmllcy5tYXAoZCA9PiBkLm5hbWUpKTtcbiAgICB0aGlzLmxhYmVsQ2xpY2submV4dCh7XG4gICAgICBsZWdlbmRJdGVtOiBudWxsLFxuICAgICAgbGVnZW5kczogdGhpcy5sZWdlbmRFbnRyaWVzLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwib3BlcmF0aW9uXCJcbiAgKm5nSWY9XCJpc1RlbXBsYXRlUmVmKGxlZnRPcGVyYXRpb24pXCJcbj5cbiAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsZWZ0T3BlcmF0aW9uXCI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGRpdlxuICBjbGFzcz1cImxlZ2VuZC13cmFwXCJcbiAgKm5nSWY9XCIhaGlkZUxlZ2VuZFwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGVtcGxhdGU7IGVsc2UgY3VzdG9tXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsZWdlbmRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNjdXN0b20+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVGVtcGxhdGVSZWYodGVtcGxhdGUpOyBlbHNlIGJ1aWx0aW5UZW1wbGF0ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KHRlbXBsYXRlKVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbnRleHQ6IGxlZ2VuZEVudHJpZXMgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNidWlsdGluVGVtcGxhdGU+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0ZW1wbGF0ZVwiPlxuICAgICAgICA8YWNsLWRyb3Bkb3duLWxlZ2VuZFxuICAgICAgICAgIGNsYXNzPVwibGVnZW5kLXZlcnRpY2FsXCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiXG4gICAgICAgICAgW2RhdGFdPVwibGVnZW5kRW50cmllc1wiXG4gICAgICAgICAgW25vRGF0YV09XCJjb250ZXh0Lm5vRGF0YSQgfCBhc3luY1wiXG4gICAgICAgICAgW2xlZ2VuZFRlbXBsYXRlXT1cImxlZ2VuZFRlbXBsYXRlXCJcbiAgICAgICAgICBbaXNDYXJkXT1cIm1vZGUgPT09ICdjYXJkJ1wiXG4gICAgICAgID5cbiAgICAgICAgPC9hY2wtZHJvcGRvd24tbGVnZW5kPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuXG48ZGl2XG4gIGNsYXNzPVwib3BlcmF0aW9uXCJcbiAgKm5nSWY9XCJpc1RlbXBsYXRlUmVmKHJpZ2h0T3BlcmF0aW9uKVwiXG4+XG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmlnaHRPcGVyYXRpb25cIj48L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2xlZ2VuZFRlbXBsYXRlPlxuICA8dWwgY2xhc3M9XCJsZWdlbmQtbGFiZWxzXCI+XG4gICAgPGxpXG4gICAgICBjbGFzcz1cInNlbGVjdC1hbGxcIlxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgIShjb250ZXh0Lm5vRGF0YSQgfCBhc3luYykgJiZcbiAgICAgICAgc2VsZWN0QWxsT3BlcmF0aW9uICYmXG4gICAgICAgIHRlbXBsYXRlID09PSAnZHJvcGRvd24nXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxhdWktY2hlY2tib3hcbiAgICAgICAgWyhuZ01vZGVsKV09XCJhbGxTZWxlY3RlZFwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImFsbFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAge3sgc2VsZWN0QWxsTmFtZSB8fCAoJ3NlbGVjdF9hbGwnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgPC9hdWktY2hlY2tib3g+XG4gICAgPC9saT5cbiAgICA8bGlcbiAgICAgIGNsYXNzPVwibGVnZW5kLWxhYmVsXCJcbiAgICAgIFtjbGFzcy5kaXNhYmxlXT1cIiFsZWdlbmQuYWN0aXZhdGUgfHwgKGNvbnRleHQubm9EYXRhJCB8IGFzeW5jKVwiXG4gICAgICBbY2xhc3MuZm9yYmlkXT1cImNvbnRleHQubm9EYXRhJCB8IGFzeW5jXCJcbiAgICAgICpuZ0Zvcj1cImxldCBsZWdlbmQgb2YgbGVnZW5kRW50cmllc1wiXG4gICAgICAoY2xpY2spPVwic2VsZWN0ZWQobGVnZW5kKVwiXG4gICAgICBbY2xhc3MuaG92ZXJdPVwibGVnZW5kLmFjdGl2YXRlICYmIGxlZ2VuZC5ob3ZlclwiXG4gICAgICAobW91c2VlbnRlcik9XCJtb3VzZWVudGVyKGxlZ2VuZClcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwibW91c2VsZWF2ZShsZWdlbmQpXCJcbiAgICA+XG4gICAgICA8c3BhblxuICAgICAgICBbbmdDbGFzc109XCJbc3ltYm9sTmFtZSwgJ2xhYmVsLXN5bWJvbCddXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwibGVnZW5kLmNvbG9yXCJcbiAgICAgID5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtbmFtZVwiPnt7XG4gICAgICAgIHRyYW5zbGF0aW9uID8gKGxlZ2VuZC5uYW1lIHwgdHJhbnNsYXRlKSA6IGxlZ2VuZC5uYW1lXG4gICAgICB9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICA8L3VsPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==