@alauda-fe/common
Version:
Alauda frontend team common codes.
146 lines • 20.7 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
import { curveMonotoneX, line, } from 'd3';
import { Subject } from 'rxjs';
import { ContextChartService } from '../../chart.service';
import { defined } from '../../utils';
import * as i0 from "@angular/core";
import * as i1 from "../../chart.service";
import * as i2 from "@angular/common";
import * as i3 from "../../../effect-directive/e2e-attribute-binding.directive";
const _c0 = ["rect"];
const _c1 = ["aclRangeArea", ""];
function RangeAreaComponent__svg_path_4_Template(rf, ctx) { if (rf & 1) {
const _r2 = i0.ɵɵgetCurrentView();
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(0, "path", 4);
i0.ɵɵlistener("mousedown", function RangeAreaComponent__svg_path_4_Template_path_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); const rect_r4 = i0.ɵɵreference(2); return i0.ɵɵresetView(ctx_r2.mouseDown($event, rect_r4)); })("mouseup", function RangeAreaComponent__svg_path_4_Template_path_mouseup_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); const rect_r4 = i0.ɵɵreference(2); return i0.ɵɵresetView(ctx_r2.mouseUp($event, rect_r4)); })("mousemove", function RangeAreaComponent__svg_path_4_Template_path_mousemove_0_listener($event) { const item_r5 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r2 = i0.ɵɵnextContext(); const rect_r4 = i0.ɵɵreference(2); !ctx_r2.context.noData && ctx_r2.mouseMove($event, rect_r4); return i0.ɵɵresetView(ctx_r2.lineOnMouseMove(item_r5)); })("mouseleave", function RangeAreaComponent__svg_path_4_Template_path_mouseleave_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.lineOnMouseLeave($event)); })("click", function RangeAreaComponent__svg_path_4_Template_path_click_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); const rect_r4 = i0.ɵɵreference(2); return i0.ɵɵresetView(ctx_r2.areaClickEvent($event, rect_r4)); });
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r5 = ctx.$implicit;
i0.ɵɵstyleProp("opacity", 0);
i0.ɵɵattribute("d", item_r5.path)("stroke-width", 10)("visibility", item_r5.visibility);
} }
export class RangeAreaComponent {
constructor(context, cdr) {
this.context = context;
this.cdr = cdr;
this.mouseMoveEvent = new EventEmitter();
this.mouseLeaveEvent = new EventEmitter();
this.mouseDownEvent = new EventEmitter();
this.mouseUpEvent = new EventEmitter();
this.clickEvent = new EventEmitter();
this.destroy$$ = new Subject();
this.view = {
width: 0,
height: 0,
};
}
ngOnInit() {
this.context.update$$.subscribe(() => {
this.view = this.context.chartView;
this.cdr.detectChanges();
});
}
mouseDown(e, rectDom) {
this.mouseDownEvent.next({
e,
rectDom,
});
}
mouseUp(e, rectDom) {
this.mouseUpEvent.next({
e,
rectDom,
});
}
mouseMove(e, rectDom) {
this.mouseMoveEvent.next({
e,
rectDom,
});
}
mouseLeave(e) {
if (this.allowLeave(e)) {
this.mouseLeaveEvent.next(e);
this.context.legendActivate$$.next('');
}
}
lineOnMouseMove(line) {
this.context.legendActivate$$.next(line.name);
}
lineOnMouseLeave(e) {
if (this.allowLeave(e)) {
this.mouseLeaveEvent.next(e);
}
this.context.legendActivate$$.next('');
}
areaClickEvent(e, rectDom) {
this.clickEvent.next({
e,
rectDom,
});
}
allowLeave(e) {
const svgE = this.rectEl.nativeElement;
const { left, top } = e.target.getBoundingClientRect();
const { width, height } = svgE.getBoundingClientRect();
const x = e.pageX - left;
const y = e.y - top;
// 判断触发 leave 是移入 line 触发还是 移出 area (只有移出 area 再触发 leave)
return x < 0 || x > width || y > height || y < 0;
}
getLineGenerator() {
const { x, y } = this.context;
return line()
.defined(defined)
.curve(this.curveType || curveMonotoneX)
.x(d => x(d.x))
.y(d => y(d.y) || 0);
}
ngOnDestroy() {
this.destroy$$.next();
}
static { this.ɵfac = function RangeAreaComponent_Factory(t) { return new (t || RangeAreaComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RangeAreaComponent, selectors: [["g", "aclRangeArea", ""]], viewQuery: function RangeAreaComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.rectEl = _t.first);
} }, inputs: { curveType: "curveType" }, outputs: { mouseMoveEvent: "mouseMoveEvent", mouseLeaveEvent: "mouseLeaveEvent", mouseDownEvent: "mouseDownEvent", mouseUpEvent: "mouseUpEvent", clickEvent: "clickEvent" }, attrs: _c1, decls: 6, vars: 6, consts: [["rect", ""], ["y", "0", 1, "zoom-area", 2, "opacity", "0", "cursor", "'auto'", 3, "mousedown", "mouseup", "mousemove", "mouseleave", "click"], [1, "acl-series"], ["class", "line", "stroke", "#999", "fill", "none", 3, "opacity", "mousedown", "mouseup", "mousemove", "mouseleave", "click", 4, "ngFor", "ngForOf"], ["stroke", "#999", "fill", "none", 1, "line", 3, "mousedown", "mouseup", "mousemove", "mouseleave", "click"]], template: function RangeAreaComponent_Template(rf, ctx) { if (rf & 1) {
const _r1 = i0.ɵɵgetCurrentView();
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(0, "g")(1, "rect", 1, 0);
i0.ɵɵlistener("mousedown", function RangeAreaComponent_Template_rect_mousedown_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.mouseDown($event)); })("mouseup", function RangeAreaComponent_Template_rect_mouseup_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.mouseUp($event)); })("mousemove", function RangeAreaComponent_Template_rect_mousemove_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(!ctx.context.noData && ctx.mouseMove($event)); })("mouseleave", function RangeAreaComponent_Template_rect_mouseleave_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.mouseLeave($event)); })("click", function RangeAreaComponent_Template_rect_click_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.areaClickEvent($event)); });
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "g", 2);
i0.ɵɵtemplate(4, RangeAreaComponent__svg_path_4_Template, 1, 5, "path", 3);
i0.ɵɵpipe(5, "async");
i0.ɵɵelementEnd()();
} if (rf & 2) {
i0.ɵɵadvance();
i0.ɵɵattribute("x", 0)("width", ctx.view == null ? null : ctx.view.width)("height", ctx.view == null ? null : ctx.view.height);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(5, 4, ctx.context.seriesData$));
} }, dependencies: [i2.NgForOf, i3.E2eAttributeBindingDirective, i2.AsyncPipe], encapsulation: 2, changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RangeAreaComponent, [{
type: Component,
args: [{ selector: 'g[aclRangeArea]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<svg:g>\n <svg:rect\n #rect\n class=\"zoom-area\"\n [attr.x]=\"0\"\n y=\"0\"\n [attr.width]=\"view?.width\"\n [attr.height]=\"view?.height\"\n style=\"opacity: 0; cursor: 'auto'\"\n (mousedown)=\"mouseDown($event)\"\n (mouseup)=\"mouseUp($event)\"\n (mousemove)=\"!context.noData && mouseMove($event)\"\n (mouseleave)=\"mouseLeave($event)\"\n (click)=\"areaClickEvent($event)\"\n />\n <svg:g class=\"acl-series\">\n <svg:path\n class=\"line\"\n *ngFor=\"let item of context.seriesData$ | async\"\n [attr.d]=\"item.path\"\n stroke=\"#999\"\n fill=\"none\"\n [style.opacity]=\"0\"\n [attr.stroke-width]=\"10\"\n [attr.visibility]=\"item.visibility\"\n (mousedown)=\"mouseDown($event, rect)\"\n (mouseup)=\"mouseUp($event, rect)\"\n (mousemove)=\"\n !context.noData && mouseMove($event, rect); lineOnMouseMove(item)\n \"\n (mouseleave)=\"lineOnMouseLeave($event)\"\n (click)=\"areaClickEvent($event, rect)\"\n ></svg:path>\n </svg:g>\n</svg:g>\n" }]
}], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { rectEl: [{
type: ViewChild,
args: ['rect']
}], curveType: [{
type: Input
}], mouseMoveEvent: [{
type: Output
}], mouseLeaveEvent: [{
type: Output
}], mouseDownEvent: [{
type: Output
}], mouseUpEvent: [{
type: Output
}], clickEvent: [{
type: Output
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RangeAreaComponent, { className: "RangeAreaComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtYXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL3JhbmdlLWFyZWEvcmFuZ2UtYXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL3JhbmdlLWFyZWEvcmFuZ2UtYXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsY0FBYyxFQUNkLElBQUksR0FDTCxNQUFNLElBQUksQ0FBQztBQUNaLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7OztJQ1JsQywrQkFnQkM7SUFEQyxBQURBLEFBSEEsQUFEQSxBQURBLG1PQUFhLGlDQUF1QixLQUFDLGtOQUMxQiwrQkFBcUIsS0FBQyxvUEFFSCxpQ0FBdUIsd0JBQUUsK0JBRTdELEtBRE8scUxBQ2EsK0JBQXdCLEtBQUMsOE1BQzlCLHNDQUE0QixLQUFDO0lBQ3ZDLGlCQUFXOzs7SUFWViw0QkFBbUI7OztBRHFCekIsTUFBTSxPQUFPLGtCQUFrQjtJQXNCN0IsWUFDa0IsT0FBNEIsRUFDM0IsR0FBc0I7UUFEdkIsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFDM0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFuQi9CLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFcEQs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QkFBdkIsTUFBTTtZQUVHLFlBQVk7a0JBQXJCLE1BQU07WUFFRyxVQUFVO2tCQUFuQixNQUFNOztrRkFiSSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEN1cnZlRmFjdG9yeSxcbiAgQ3VydmVGYWN0b3J5TGluZU9ubHksXG4gIFNjYWxlVGltZSxcbiAgY3VydmVNb25vdG9uZVgsXG4gIGxpbmUsXG59IGZyb20gJ2QzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2hhcnREYXRhLCBDaGFydERhdGFJdGVtIH0gZnJvbSAnLi4vLi4vLi4vdmlldy1jaGFydC90eXBlcyc7XG5pbXBvcnQgeyBDb250ZXh0Q2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2hhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBTZXJpZXNEYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGVmaW5lZCB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuaW50ZXJmYWNlIExpbmVEYXRhIGV4dGVuZHMgQ2hhcnREYXRhIHtcbiAgd2lkdGg6IDM7XG4gIHBhdGg6IHN0cmluZztcbiAgdmlzaWJpbGl0eTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyZWFNb3VzZUV2ZW50IHtcbiAgZTogTW91c2VFdmVudDtcbiAgcmVjdERvbT86IEhUTUxFbGVtZW50O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdnW2FjbFJhbmdlQXJlYV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2UtYXJlYS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSYW5nZUFyZWFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ3JlY3QnKSByZWN0RWw6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgY3VydmVUeXBlOiBDdXJ2ZUZhY3RvcnkgfCBDdXJ2ZUZhY3RvcnlMaW5lT25seTtcblxuICBAT3V0cHV0KCkgbW91c2VNb3ZlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEFyZWFNb3VzZUV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKSBtb3VzZUxlYXZlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpIG1vdXNlRG93bkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxBcmVhTW91c2VFdmVudD4oKTtcblxuICBAT3V0cHV0KCkgbW91c2VVcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxBcmVhTW91c2VFdmVudD4oKTtcblxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8QXJlYU1vdXNlRXZlbnQ+KCk7XG5cbiAgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICB2aWV3ID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dENoYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBsaW5lRGF0YTogTGluZURhdGFbXTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbnRleHQudXBkYXRlJCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudmlldyA9IHRoaXMuY29udGV4dC5jaGFydFZpZXc7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBtb3VzZURvd24oZTogTW91c2VFdmVudCwgcmVjdERvbT86IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5tb3VzZURvd25FdmVudC5uZXh0KHtcbiAgICAgIGUsXG4gICAgICByZWN0RG9tLFxuICAgIH0pO1xuICB9XG5cbiAgbW91c2VVcChlOiBNb3VzZUV2ZW50LCByZWN0RG9tPzogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLm1vdXNlVXBFdmVudC5uZXh0KHtcbiAgICAgIGUsXG4gICAgICByZWN0RG9tLFxuICAgIH0pO1xuICB9XG5cbiAgbW91c2VNb3ZlKGU6IE1vdXNlRXZlbnQsIHJlY3REb20/OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMubW91c2VNb3ZlRXZlbnQubmV4dCh7XG4gICAgICBlLFxuICAgICAgcmVjdERvbSxcbiAgICB9KTtcbiAgfVxuXG4gIG1vdXNlTGVhdmUoZTogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmFsbG93TGVhdmUoZSkpIHtcbiAgICAgIHRoaXMubW91c2VMZWF2ZUV2ZW50Lm5leHQoZSk7XG4gICAgICB0aGlzLmNvbnRleHQubGVnZW5kQWN0aXZhdGUkJC5uZXh0KCcnKTtcbiAgICB9XG4gIH1cblxuICBsaW5lT25Nb3VzZU1vdmUobGluZTogU2VyaWVzRGF0YSkge1xuICAgIHRoaXMuY29udGV4dC5sZWdlbmRBY3RpdmF0ZSQkLm5leHQobGluZS5uYW1lKTtcbiAgfVxuXG4gIGxpbmVPbk1vdXNlTGVhdmUoZTogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmFsbG93TGVhdmUoZSkpIHtcbiAgICAgIHRoaXMubW91c2VMZWF2ZUV2ZW50Lm5leHQoZSk7XG4gICAgfVxuICAgIHRoaXMuY29udGV4dC5sZWdlbmRBY3RpdmF0ZSQkLm5leHQoJycpO1xuICB9XG5cbiAgYXJlYUNsaWNrRXZlbnQoZTogTW91c2VFdmVudCwgcmVjdERvbT86IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5jbGlja0V2ZW50Lm5leHQoe1xuICAgICAgZSxcbiAgICAgIHJlY3REb20sXG4gICAgfSk7XG4gIH1cblxuICBhbGxvd0xlYXZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBzdmdFID0gdGhpcy5yZWN0RWwubmF0aXZlRWxlbWVudCBhcyBTVkdSZWN0RWxlbWVudDtcbiAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gKGUudGFyZ2V0IGFzIFNWR1JlY3RFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHN2Z0UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IGUucGFnZVggLSBsZWZ0O1xuICAgIGNvbnN0IHkgPSBlLnkgLSB0b3A7XG4gICAgLy8g5Yik5pat6Kem5Y+RIGxlYXZlIOaYr+enu+WFpSBsaW5lIOinpuWPkei/mOaYryDnp7vlh7ogYXJlYSAo5Y+q5pyJ56e75Ye6IGFyZWEg5YaN6Kem5Y+RIGxlYXZlKVxuICAgIHJldHVybiB4IDwgMCB8fCB4ID4gd2lkdGggfHwgeSA+IGhlaWdodCB8fCB5IDwgMDtcbiAgfVxuXG4gIGdldExpbmVHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgcmV0dXJuIGxpbmU8Q2hhcnREYXRhSXRlbT4oKVxuICAgICAgLmRlZmluZWQoZGVmaW5lZClcbiAgICAgIC5jdXJ2ZSh0aGlzLmN1cnZlVHlwZSB8fCBjdXJ2ZU1vbm90b25lWClcbiAgICAgIC54KGQgPT4gKDxTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXI+PngpKGQueCBhcyBudW1iZXIpKVxuICAgICAgLnkoZCA9PiB5KGQueSkgfHwgMCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gIH1cbn1cbiIsIjxzdmc6Zz5cbiAgPHN2ZzpyZWN0XG4gICAgI3JlY3RcbiAgICBjbGFzcz1cInpvb20tYXJlYVwiXG4gICAgW2F0dHIueF09XCIwXCJcbiAgICB5PVwiMFwiXG4gICAgW2F0dHIud2lkdGhdPVwidmlldz8ud2lkdGhcIlxuICAgIFthdHRyLmhlaWdodF09XCJ2aWV3Py5oZWlnaHRcIlxuICAgIHN0eWxlPVwib3BhY2l0eTogMDsgY3Vyc29yOiAnYXV0bydcIlxuICAgIChtb3VzZWRvd24pPVwibW91c2VEb3duKCRldmVudClcIlxuICAgIChtb3VzZXVwKT1cIm1vdXNlVXAoJGV2ZW50KVwiXG4gICAgKG1vdXNlbW92ZSk9XCIhY29udGV4dC5ub0RhdGEgJiYgbW91c2VNb3ZlKCRldmVudClcIlxuICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoJGV2ZW50KVwiXG4gICAgKGNsaWNrKT1cImFyZWFDbGlja0V2ZW50KCRldmVudClcIlxuICAvPlxuICA8c3ZnOmcgY2xhc3M9XCJhY2wtc2VyaWVzXCI+XG4gICAgPHN2ZzpwYXRoXG4gICAgICBjbGFzcz1cImxpbmVcIlxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29udGV4dC5zZXJpZXNEYXRhJCB8IGFzeW5jXCJcbiAgICAgIFthdHRyLmRdPVwiaXRlbS5wYXRoXCJcbiAgICAgIHN0cm9rZT1cIiM5OTlcIlxuICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgW3N0eWxlLm9wYWNpdHldPVwiMFwiXG4gICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwiMTBcIlxuICAgICAgW2F0dHIudmlzaWJpbGl0eV09XCJpdGVtLnZpc2liaWxpdHlcIlxuICAgICAgKG1vdXNlZG93bik9XCJtb3VzZURvd24oJGV2ZW50LCByZWN0KVwiXG4gICAgICAobW91c2V1cCk9XCJtb3VzZVVwKCRldmVudCwgcmVjdClcIlxuICAgICAgKG1vdXNlbW92ZSk9XCJcbiAgICAgICAgIWNvbnRleHQubm9EYXRhICYmIG1vdXNlTW92ZSgkZXZlbnQsIHJlY3QpOyBsaW5lT25Nb3VzZU1vdmUoaXRlbSlcbiAgICAgIFwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJsaW5lT25Nb3VzZUxlYXZlKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cImFyZWFDbGlja0V2ZW50KCRldmVudCwgcmVjdClcIlxuICAgID48L3N2ZzpwYXRoPlxuICA8L3N2ZzpnPlxuPC9zdmc6Zz5cbiJdfQ==