UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

235 lines (234 loc) 19.4 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core'; import { Subject, merge, map, takeUntil } from 'rxjs'; import { ContextChartService } from '../../chart.service'; import { Orientation } from '../../types'; import * as i0 from "@angular/core"; import * as i1 from "../../chart.service"; import * as i2 from "@angular/common"; import * as i3 from "../../../core/pipes/pure.pipe"; const _c0 = ["aclYAxisTicks", ""]; function YAxisTicksComponent_ng_container_0__svg_g_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "g")(1, "text", 4); i0.ɵɵtext(2); i0.ɵɵpipe(3, "pure"); i0.ɵɵelementEnd(); i0.ɵɵelement(4, "line", 5)(5, "line", 6); i0.ɵɵelementEnd(); } if (rf & 2) { const tick_r1 = ctx.$implicit; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵattribute("y", tick_r1.y); i0.ɵɵadvance(); i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind2(3, 8, tick_r1.value, ctx_r1.conversionMaximum), "", ctx_r1.suffix, " "); i0.ɵɵadvance(2); i0.ɵɵattribute("y1", tick_r1.y)("y2", tick_r1.y); i0.ɵɵadvance(); i0.ɵɵattribute("x2", ctx_r1.context == null ? null : ctx_r1.context.chartView == null ? null : ctx_r1.context.chartView.width)("y1", tick_r1.y)("y2", tick_r1.y); } } function YAxisTicksComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, YAxisTicksComponent_ng_container_0__svg_g_1_Template, 6, 11, "g", 2); i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(2, "g"); i0.ɵɵelement(3, "path", 3); i0.ɵɵelementEnd(); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("ngForOf", ctx_r1.ticks); i0.ɵɵadvance(2); i0.ɵɵattribute("d", ctx_r1.yAxisLine); } } function YAxisTicksComponent_ng_template_1__svg_g_0__svg_line_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelement(0, "line", 9); } if (rf & 2) { const tick_r3 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵattribute("x1", tick_r3.x)("x2", tick_r3.x)("y1", 0)("y2", -(ctx_r1.context == null ? null : ctx_r1.context.chartView == null ? null : ctx_r1.context.chartView.height)); } } function YAxisTicksComponent_ng_template_1__svg_g_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "g")(1, "text", 7); i0.ɵɵtext(2); i0.ɵɵpipe(3, "pure"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(4, YAxisTicksComponent_ng_template_1__svg_g_0__svg_line_4_Template, 1, 4, "line", 8); i0.ɵɵelementEnd(); } if (rf & 2) { const tick_r3 = ctx.$implicit; const i_r4 = ctx.index; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵattribute("x", i_r4 === 0 && ctx_r1.suffix ? tick_r3.x - 5 : tick_r3.x)("y", tick_r3.y + 16)("text-anchor", ctx_r1.textAnchor); i0.ɵɵadvance(); i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind2(3, 6, tick_r3.value, ctx_r1.conversionMaximum), "", ctx_r1.suffix, " "); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", i_r4 !== ctx_r1.ticks.length - 1); } } function YAxisTicksComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, YAxisTicksComponent_ng_template_1__svg_g_0_Template, 5, 9, "g", 2); i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(1, "g"); i0.ɵɵelement(2, "path", 3); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵproperty("ngForOf", ctx_r1.ticks); i0.ɵɵadvance(2); i0.ɵɵattribute("d", ctx_r1.xAxisLine); } } export class YAxisTicksComponent { get yAxisLine() { return `M${0} ${0}L${0} ${this.context.chartView.height}Z`; } get xAxisLine() { const { width } = this.context.chartView; return `M0 0L${width} 0Z`; } getTicks() { const ticks = this.context.y.ticks(this.getMaxTicks(this.intervalWidth)); return ticks.map(value => { const res = this.context.y(value); return { value, y: this.context.horizontal ? 0 : res, x: res, }; }); } getMaxTicks(tickHeight) { const height = this.context.horizontal ? this.context.chartView.width : this.context.chartView.height; return Math.floor(height / tickHeight); } constructor(context, cd) { this.context = context; this.cd = cd; this.intervalWidth = 40; this.orientation = Orientation; this.textAnchor = 'middle'; this.destroy$$ = new Subject(); } ngOnInit() { this.ticks = this.getTicks(); this.cd.detectChanges(); merge(this.context.seriesData$, this.context.legendChange$$) .pipe(takeUntil(this.destroy$$), map(() => this.getTicks())) .subscribe(res => { this.ticks = res; this.cd.detectChanges(); }); } conversionMaximum(value) { const unit = 'k'; if (value >= 1000) { const num = +(value / 1000).toFixed(2); return `${num}${unit}`; } return value; } ngOnDestroy() { this.destroy$$.next(); } static { this.ɵfac = function YAxisTicksComponent_Factory(t) { return new (t || YAxisTicksComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: YAxisTicksComponent, selectors: [["g", "aclYAxisTicks", ""]], inputs: { intervalWidth: "intervalWidth", suffix: "suffix" }, attrs: _c0, decls: 3, vars: 2, consts: [["elseTemplate", ""], [4, "ngIf", "ngIfElse"], [4, "ngFor", "ngForOf"], ["stroke", "#ccd6eb", "fill", "none"], ["x", "-8", "fill", "#666", "text-anchor", "end", "font-size", "11", "alignment-baseline", "middle"], ["x1", "-4", "x2", "0", "stroke-width", "1", "stroke", "#ccd6eb"], ["x1", "0", "stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8"], ["fill", "#666", "font-size", "11"], ["stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8", 4, "ngIf"], ["stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8"]], template: function YAxisTicksComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, YAxisTicksComponent_ng_container_0_Template, 4, 2, "ng-container", 1)(1, YAxisTicksComponent_ng_template_1_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor); } if (rf & 2) { const elseTemplate_r5 = i0.ɵɵreference(2); i0.ɵɵproperty("ngIf", ctx.context.barOptions.orientation === ctx.orientation.VERTICAL)("ngIfElse", elseTemplate_r5); } }, dependencies: [i2.NgForOf, i2.NgIf, i3.PurePipe], encapsulation: 2, changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(YAxisTicksComponent, [{ type: Component, args: [{ // eslint-disable-next-line @angular-eslint/component-selector selector: 'g[aclYAxisTicks]', template: ` <ng-container *ngIf=" context.barOptions.orientation === orientation.VERTICAL; else elseTemplate " > <svg:g *ngFor="let tick of ticks"> <text x="-8" [attr.y]="tick.y" fill="#666" text-anchor="end" font-size="11" alignment-baseline="middle" > {{ tick.value | pure: conversionMaximum }}{{ suffix }} </text> <line x1="-4" x2="0" [attr.y1]="tick.y" [attr.y2]="tick.y" stroke-width="1" stroke="#ccd6eb" ></line> <line x1="0" [attr.x2]="context?.chartView?.width" [attr.y1]="tick.y" [attr.y2]="tick.y" stroke-width="1" stroke-dasharray="4 1" stroke="#e8e8e8" ></line> </svg:g> <svg:g> <path [attr.d]="yAxisLine" stroke="#ccd6eb" fill="none" /> </svg:g> </ng-container> <ng-template #elseTemplate> <svg:g *ngFor="let tick of ticks; let i = index"> <text [attr.x]="i === 0 && suffix ? tick.x - 5 : tick.x" [attr.y]="tick.y + 16" fill="#666" [attr.text-anchor]="textAnchor" font-size="11" > {{ tick.value | pure: conversionMaximum }}{{ suffix }} </text> <line *ngIf="i !== ticks.length - 1" [attr.x1]="tick.x" [attr.x2]="tick.x" [attr.y1]="0" [attr.y2]="-context?.chartView?.height" stroke-width="1" stroke-dasharray="4 1" stroke="#e8e8e8" ></line> </svg:g> <svg:g> <path [attr.d]="xAxisLine" stroke="#ccd6eb" fill="none" /> </svg:g> </ng-template> `, changeDetection: ChangeDetectionStrategy.OnPush, }] }], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { intervalWidth: [{ type: Input }], suffix: [{ type: Input }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(YAxisTicksComponent, { className: "YAxisTicksComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieS1heGlzLXRpY2tzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jb21tb24vYXhpcy95LWF4aXMtdGlja3MuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEdBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7OztJQWFsQyxBQURGLHlCQUFrQyxjQVEvQjtJQUNDLFlBQ0Y7O0lBQUEsaUJBQU87SUFTUCxBQVJBLDBCQU9RLGNBU0E7SUFDVixpQkFBUTs7OztJQXpCSixjQUFpQjs7SUFNakIsY0FDRjtJQURFLGlIQUNGO0lBSUUsZUFBa0I7O0lBT2xCLGNBQXFDOzs7O0lBM0IzQyw2QkFLQztJQUNDLHFGQUFrQzs7SUE2QmxDLHlCQUFPO0lBQ0wsMEJBSUU7SUFDSixpQkFBUTs7OztJQW5DZ0IsY0FBUTtJQUFSLHNDQUFRO0lBK0I1QixlQUFvQjs7Ozs7SUFrQnRCLDBCQVNROzs7Ozs7OztJQWxCUixBQURGLHlCQUFpRCxjQU85QztJQUNDLFlBQ0Y7O0lBQUEsaUJBQU87SUFDUCxrR0FTQztJQUNILGlCQUFROzs7OztJQWxCSixjQUFrRDs7SUFNbEQsY0FDRjtJQURFLGlIQUNGO0lBRUcsZUFBNEI7SUFBNUIsdURBQTRCOzs7SUFYakMsbUZBQWlEOztJQXFCakQseUJBQU87SUFDTCwwQkFJRTtJQUNKLGlCQUFROzs7SUEzQmdCLHNDQUFVO0lBdUI5QixlQUFvQjs7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SSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO29GQXJFVSxtQkFBbUI7b0VBQW5CLG1CQUFtQjtZQWpDNUIsQUE1Q0Esc0ZBS0Msd0dBdUMwQjs7O1lBekNkLEFBRlYsc0ZBRVUsNkJBRWpCOzs7aUZBd0VhLG1CQUFtQjtjQWpGL0IsU0FBUztlQUFDO2dCQUNULDhEQUE4RDtnQkFDOUQsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyRVQ7Z0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07YUFDaEQ7b0ZBRVUsYUFBYTtrQkFBckIsS0FBSztZQUVHLE1BQU07a0JBQWQsS0FBSzs7a0ZBSEssbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBtZXJnZSwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ29udGV4dENoYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JpZW50YXRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2dbYWNsWUF4aXNUaWNrc10nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGNvbnRleHQuYmFyT3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gb3JpZW50YXRpb24uVkVSVElDQUw7XG4gICAgICAgIGVsc2UgZWxzZVRlbXBsYXRlXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxzdmc6ZyAqbmdGb3I9XCJsZXQgdGljayBvZiB0aWNrc1wiPlxuICAgICAgICA8dGV4dFxuICAgICAgICAgIHg9XCItOFwiXG4gICAgICAgICAgW2F0dHIueV09XCJ0aWNrLnlcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2XCJcbiAgICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTFcIlxuICAgICAgICAgIGFsaWdubWVudC1iYXNlbGluZT1cIm1pZGRsZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0aWNrLnZhbHVlIHwgcHVyZTogY29udmVyc2lvbk1heGltdW0gfX17eyBzdWZmaXggfX1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICA8bGluZVxuICAgICAgICAgIHgxPVwiLTRcIlxuICAgICAgICAgIHgyPVwiMFwiXG4gICAgICAgICAgW2F0dHIueTFdPVwidGljay55XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJ0aWNrLnlcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgIHN0cm9rZT1cIiNjY2Q2ZWJcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIHgxPVwiMFwiXG4gICAgICAgICAgW2F0dHIueDJdPVwiY29udGV4dD8uY2hhcnRWaWV3Py53aWR0aFwiXG4gICAgICAgICAgW2F0dHIueTFdPVwidGljay55XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJ0aWNrLnlcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI0IDFcIlxuICAgICAgICAgIHN0cm9rZT1cIiNlOGU4ZThcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9zdmc6Zz5cbiAgICAgIDxzdmc6Zz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBbYXR0ci5kXT1cInlBeGlzTGluZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI2NjZDZlYlwiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc6Zz5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRlbXBsYXRlPlxuICAgICAgPHN2ZzpnICpuZ0Zvcj1cImxldCB0aWNrIG9mIHRpY2tzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgW2F0dHIueF09XCJpID09PSAwICYmIHN1ZmZpeCA/IHRpY2sueCAtIDUgOiB0aWNrLnhcIlxuICAgICAgICAgIFthdHRyLnldPVwidGljay55ICsgMTZcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2XCJcbiAgICAgICAgICBbYXR0ci50ZXh0LWFuY2hvcl09XCJ0ZXh0QW5jaG9yXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0aWNrLnZhbHVlIHwgcHVyZTogY29udmVyc2lvbk1heGltdW0gfX17eyBzdWZmaXggfX1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICA8bGluZVxuICAgICAgICAgICpuZ0lmPVwiaSAhPT0gdGlja3MubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgW2F0dHIueDFdPVwidGljay54XCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJ0aWNrLnhcIlxuICAgICAgICAgIFthdHRyLnkxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkyXT1cIi1jb250ZXh0Py5jaGFydFZpZXc/LmhlaWdodFwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjQgMVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI2U4ZThlOFwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3N2ZzpnPlxuICAgICAgPHN2ZzpnPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIFthdHRyLmRdPVwieEF4aXNMaW5lXCJcbiAgICAgICAgICBzdHJva2U9XCIjY2NkNmViXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgIC8+XG4gICAgICA8L3N2ZzpnPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBZQXhpc1RpY2tzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBpbnRlcnZhbFdpZHRoID0gNDA7XG5cbiAgQElucHV0KCkgc3VmZml4OiBzdHJpbmc7XG5cbiAgdGlja3M6IEFycmF5PHsgdmFsdWU6IG51bWJlcjsgeTogbnVtYmVyOyB4OiBudW1iZXIgfT47XG4gIG9yaWVudGF0aW9uID0gT3JpZW50YXRpb247XG4gIHRleHRBbmNob3IgPSAnbWlkZGxlJztcblxuICBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGdldCB5QXhpc0xpbmUoKSB7XG4gICAgcmV0dXJuIGBNJHswfSAkezB9TCR7MH0gJHt0aGlzLmNvbnRleHQuY2hhcnRWaWV3LmhlaWdodH1aYDtcbiAgfVxuXG4gIGdldCB4QXhpc0xpbmUoKSB7XG4gICAgY29uc3QgeyB3aWR0aCB9ID0gdGhpcy5jb250ZXh0LmNoYXJ0VmlldztcbiAgICByZXR1cm4gYE0wIDBMJHt3aWR0aH0gMFpgO1xuICB9XG5cbiAgZ2V0VGlja3MoKSB7XG4gICAgY29uc3QgdGlja3MgPSB0aGlzLmNvbnRleHQueS50aWNrcyh0aGlzLmdldE1heFRpY2tzKHRoaXMuaW50ZXJ2YWxXaWR0aCkpO1xuICAgIHJldHVybiB0aWNrcy5tYXAodmFsdWUgPT4ge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy5jb250ZXh0LnkodmFsdWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHk6IHRoaXMuY29udGV4dC5ob3Jpem9udGFsID8gMCA6IHJlcyxcbiAgICAgICAgeDogcmVzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE1heFRpY2tzKHRpY2tIZWlnaHQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jb250ZXh0Lmhvcml6b250YWxcbiAgICAgID8gdGhpcy5jb250ZXh0LmNoYXJ0Vmlldy53aWR0aFxuICAgICAgOiB0aGlzLmNvbnRleHQuY2hhcnRWaWV3LmhlaWdodDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihoZWlnaHQgLyB0aWNrSGVpZ2h0KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjb250ZXh0OiBDb250ZXh0Q2hhcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy50aWNrcyA9IHRoaXMuZ2V0VGlja3MoKTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICBtZXJnZSh0aGlzLmNvbnRleHQuc2VyaWVzRGF0YSQsIHRoaXMuY29udGV4dC5sZWdlbmRDaGFuZ2UkJClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpLFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5nZXRUaWNrcygpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy50aWNrcyA9IHJlcztcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNvbnZlcnNpb25NYXhpbXVtKHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCB1bml0ID0gJ2snO1xuICAgIGlmICh2YWx1ZSA+PSAxMDAwKSB7XG4gICAgICBjb25zdCBudW0gPSArKHZhbHVlIC8gMTAwMCkudG9GaXhlZCgyKTtcbiAgICAgIHJldHVybiBgJHtudW19JHt1bml0fWA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQkLm5leHQoKTtcbiAgfVxufVxuIl19