UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

158 lines 20.4 kB
import { __decorate, __metadata } from "tslib"; /** * @packageDocumentation * @module utils */ import { FormItemControlDirective } from '@alauda/ui'; import { CdkPortalOutlet, ComponentPortal, TemplatePortal, } from '@angular/cdk/portal'; import { ChangeDetectionStrategy, Component, ComponentFactoryResolver, Directive, HostBinding, Input, Optional, Self, TemplateRef, ViewContainerRef, } from '@angular/core'; import { NgControl, } from '@angular/forms'; import { Observable, Subject, combineLatest, distinctUntilChanged, filter, map, startWith, takeUntil, } from 'rxjs'; import { ObservableInput } from '../utils/decorators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@alauda/ui"; import * as i3 from "../pipes/field-not-available.pipe"; export class ReadonlyFieldDirective { get isHidden() { return this.hidden || this.aclReadonlyField; } constructor(control, // eslint-disable-next-line sonar/deprecation cfr, viewContainerRef, // 仅考虑当前control,子control无法知晓父FormItemControl元素 ,包裹了多少个control,以及各自处于什么状态,该情况自行处理 controlDirective) { this.control = control; this.cfr = cfr; this.viewContainerRef = viewContainerRef; this.controlDirective = controlDirective; this.isControlRequired = false; this.templateContext = {}; this.destroy$ = new Subject(); } setValue(value) { if (this.template) { Object.assign(this.templateContext, { $implicit: value, ...this.context, }); } else { this.spanComponentRef.instance.setData(value); } } ngOnInit() { const controlEntity = this.control.control; // formControl will compose multi validators to 1, no matter defined in template nor FormBuilder const { validator, asyncValidator } = controlEntity; this.isControlRequired = this.controlDirective?.required || false; const portalOutlet = new CdkPortalOutlet(this.cfr, this.viewContainerRef); const portal = this.template ? new TemplatePortal(this.template, this.viewContainerRef, this.templateContext) : new ComponentPortal(SpanComponent, this.viewContainerRef); const containerAttached$ = this.aclReadonlyField$.pipe(distinctUntilChanged(), map(isUpdate => { if (!isUpdate) { // 重置 if (this.controlDirective) { this.controlDirective.required = this.isControlRequired; } if (portalOutlet.hasAttached()) { portalOutlet.detach(); } this.applyValidators(controlEntity, validator, asyncValidator); return false; } if (this.controlDirective) { this.controlDirective.required = false; } const attachPoint = portalOutlet.attach(portal); if (!this.template) { this.spanComponentRef = attachPoint; } this.clearValidators(controlEntity); return true; })); const sourceValue$ = this.control.valueChanges.pipe(startWith(this.control.value)); combineLatest([sourceValue$, containerAttached$]) .pipe(takeUntil(this.destroy$), filter(([, attached]) => !!attached)) .subscribe(([value]) => { this.setValue(value); }); } applyValidators(control, rawValidator, rawAsyncValidator) { if (control.validator === rawValidator && control.asyncValidator === rawAsyncValidator) { return; } control.setValidators(rawValidator); control.setAsyncValidators(rawAsyncValidator); control.updateValueAndValidity(); } clearValidators(control) { // delay checking validators for ngModel requestAnimationFrame(() => { if (!control.validator && !control.asyncValidator) { return; } control.clearValidators(); control.clearAsyncValidators(); control.updateValueAndValidity(); }); } ngOnDestroy() { this.destroy$.next(); } static { this.ɵfac = function ReadonlyFieldDirective_Factory(t) { return new (t || ReadonlyFieldDirective)(i0.ɵɵdirectiveInject(i1.NgControl), i0.ɵɵdirectiveInject(i0.ComponentFactoryResolver), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i2.FormItemControlDirective, 10)); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ReadonlyFieldDirective, selectors: [["", "aclReadonlyField", ""]], hostVars: 1, hostBindings: function ReadonlyFieldDirective_HostBindings(rf, ctx) { if (rf & 2) { i0.ɵɵhostProperty("hidden", ctx.isHidden); } }, inputs: { aclReadonlyField: "aclReadonlyField", hidden: "hidden", template: [0, "aclReadonlyFieldTemplate", "template"], context: [0, "aclReadonlyFieldTemplateContext", "context"] }, standalone: true }); } } __decorate([ ObservableInput(), __metadata("design:type", Observable) ], ReadonlyFieldDirective.prototype, "aclReadonlyField$", void 0); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ReadonlyFieldDirective, [{ type: Directive, args: [{ selector: '[aclReadonlyField]', standalone: true, }] }], () => [{ type: i1.NgControl }, { type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }, { type: i2.FormItemControlDirective, decorators: [{ type: Self }, { type: Optional }] }], { aclReadonlyField: [{ type: Input }], aclReadonlyField$: [], hidden: [{ type: Input }], template: [{ type: Input, args: ['aclReadonlyFieldTemplate'] }], context: [{ type: Input, args: ['aclReadonlyFieldTemplateContext'] }], isHidden: [{ type: HostBinding, args: ['hidden'] }] }); })(); export class SpanComponent { setData(value) { this.data = value; } static { this.ɵfac = function SpanComponent_Factory(t) { return new (t || SpanComponent)(); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SpanComponent, selectors: [["ng-component"]], decls: 3, vars: 3, template: function SpanComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span"); i0.ɵɵtext(1); i0.ɵɵpipe(2, "aclFieldNotAvailable"); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵadvance(); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, ctx.data)); } }, dependencies: [i3.FieldNotAvailablePipe], styles: ["span[_ngcontent-%COMP%]{word-break:break-all}"] }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SpanComponent, [{ type: Component, args: [{ template: `<span>{{ data | aclFieldNotAvailable }}</span>`, changeDetection: ChangeDetectionStrategy.Default, styles: ["span{word-break:break-all}\n"] }] }], null, null); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SpanComponent, { className: "SpanComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHktZmllbGQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvcmUvZGlyZWN0aXZlcy9yZWFkb25seS1maWVsZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGVBQWUsRUFDZixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFdBQVcsRUFDWCxLQUFLLEVBR0wsUUFBUSxFQUNSLElBQUksRUFDSixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxTQUFTLEdBRVYsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsVUFBVSxFQUNWLE9BQU8sRUFDUCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBQ0gsU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFNdEQsTUFBTSxPQUFPLHNCQUFzQjtJQTJCakMsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQsWUFDbUIsT0FBa0I7SUFDbkMsNkNBQTZDO0lBQzVCLEdBQTZCLEVBQzdCLGdCQUFrQztJQUNuRCxnRkFBZ0Y7SUFHL0QsZ0JBQTBDO1FBUDFDLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFFbEIsUUFBRyxHQUFILEdBQUcsQ0FBMEI7UUFDN0IscUJBQWdCLEdBQWhCLGdC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QXRCLHlDQUFzQjs7O0FBS2pDO0lBREMsZUFBZSxFQUFFOzhCQUNDLFVBQVU7aUVBQVU7aUZBTDVCLHNCQUFzQjtjQUpsQyxTQUFTO2VBQUM7Z0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsVUFBVSxFQUFFLElBQUk7YUFDakI7O3NCQXVDSSxJQUFJOztzQkFDSixRQUFRO3FCQXJDWCxnQkFBZ0I7a0JBRGYsS0FBSztZQUlOLGlCQUFpQixNQUdqQixNQUFNO2tCQURMLEtBQUs7WUFhTixRQUFRO2tCQURQLEtBQUs7bUJBQUMsMEJBQTBCO1lBTWpDLE9BQU87a0JBRE4sS0FBSzttQkFBQyxpQ0FBaUM7WUFJcEMsUUFBUTtrQkFEWCxXQUFXO21CQUFDLFFBQVE7O0FBK0h2QixNQUFNLE9BQU8sYUFBYTtJQUd4QixPQUFPLENBQUMsS0FBUTtRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLENBQUM7OEVBTFUsYUFBYTtvRUFBYixhQUFhO1lBWGIsNEJBQU07WUFBQSxZQUFpQzs7WUFBQSxpQkFBTzs7WUFBeEMsY0FBaUM7WUFBakMsb0RBQWlDOzs7aUZBV3ZDLGFBQWE7Y0FaekIsU0FBUzsyQkFDRSxnREFBZ0QsbUJBU3pDLHVCQUF1QixDQUFDLE9BQU87O2tGQUVyQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgdXRpbHNcbiAqL1xuXG5pbXBvcnQgeyBGb3JtSXRlbUNvbnRyb2xEaXJlY3RpdmUgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIENka1BvcnRhbE91dGxldCxcbiAgQ29tcG9uZW50UG9ydGFsLFxuICBUZW1wbGF0ZVBvcnRhbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbXBvbmVudFJlZixcbiAgRGlyZWN0aXZlLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBBc3luY1ZhbGlkYXRvckZuLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvckZuLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHN0YXJ0V2l0aCxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZUlucHV0IH0gZnJvbSAnLi4vdXRpbHMvZGVjb3JhdG9ycyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thY2xSZWFkb25seUZpZWxkXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFJlYWRvbmx5RmllbGREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIGFjbFJlYWRvbmx5RmllbGQ6IGJvb2xlYW47XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGFjbFJlYWRvbmx5RmllbGQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIEBJbnB1dCgpXG4gIGhpZGRlbjogYm9vbGVhbjtcblxuICBwcml2YXRlIGlzQ29udHJvbFJlcXVpcmVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBzcGFuQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8U3BhbkNvbXBvbmVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZUNvbnRleHQgPSB7fTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyDoh6rlrprkuYnmqKHmnb9cbiAgQElucHV0KCdhY2xSZWFkb25seUZpZWxkVGVtcGxhdGUnKVxuICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyDoh6rlrprkuYnmqKHmnb9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdhY2xSZWFkb25seUZpZWxkVGVtcGxhdGVDb250ZXh0JylcbiAgY29udGV4dDogb2JqZWN0O1xuXG4gIEBIb3N0QmluZGluZygnaGlkZGVuJylcbiAgZ2V0IGlzSGlkZGVuKCkge1xuICAgIHJldHVybiB0aGlzLmhpZGRlbiB8fCB0aGlzLmFjbFJlYWRvbmx5RmllbGQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXIvZGVwcmVjYXRpb25cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNmcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAvLyDku4XogIPomZHlvZPliY1jb250cm9s77yM5a2QY29udHJvbOaXoOazleefpeaZk+eItkZvcm1JdGVtQ29udHJvbOWFg+e0oCDvvIzljIXoo7nkuoblpJrlsJHkuKpjb250cm9s77yM5Lul5Y+K5ZCE6Ieq5aSE5LqO5LuA5LmI54q25oCB77yM6K+l5oOF5Ya16Ieq6KGM5aSE55CGXG4gICAgQFNlbGYoKVxuICAgIEBPcHRpb25hbCgpXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sRGlyZWN0aXZlOiBGb3JtSXRlbUNvbnRyb2xEaXJlY3RpdmUsXG4gICkge31cblxuICBwcml2YXRlIHNldFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy50ZW1wbGF0ZUNvbnRleHQsIHtcbiAgICAgICAgJGltcGxpY2l0OiB2YWx1ZSxcbiAgICAgICAgLi4udGhpcy5jb250ZXh0LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3BhbkNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXREYXRhKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBjb250cm9sRW50aXR5ID0gdGhpcy5jb250cm9sLmNvbnRyb2w7XG4gICAgLy8gZm9ybUNvbnRyb2wgd2lsbCBjb21wb3NlIG11bHRpIHZhbGlkYXRvcnMgdG8gMSwgbm8gbWF0dGVyIGRlZmluZWQgaW4gdGVtcGxhdGUgbm9yIEZvcm1CdWlsZGVyXG4gICAgY29uc3QgeyB2YWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yIH0gPSBjb250cm9sRW50aXR5O1xuICAgIHRoaXMuaXNDb250cm9sUmVxdWlyZWQgPSB0aGlzLmNvbnRyb2xEaXJlY3RpdmU/LnJlcXVpcmVkIHx8IGZhbHNlO1xuICAgIGNvbnN0IHBvcnRhbE91dGxldCA9IG5ldyBDZGtQb3J0YWxPdXRsZXQodGhpcy5jZnIsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XG4gICAgY29uc3QgcG9ydGFsID0gdGhpcy50ZW1wbGF0ZVxuICAgICAgPyBuZXcgVGVtcGxhdGVQb3J0YWwoXG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZSxcbiAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZUNvbnRleHQsXG4gICAgICAgIClcbiAgICAgIDogbmV3IENvbXBvbmVudFBvcnRhbChTcGFuQ29tcG9uZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuXG4gICAgY29uc3QgY29udGFpbmVyQXR0YWNoZWQkID0gdGhpcy5hY2xSZWFkb25seUZpZWxkJC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcChpc1VwZGF0ZSA9PiB7XG4gICAgICAgIGlmICghaXNVcGRhdGUpIHtcbiAgICAgICAgICAvLyDph43nva5cbiAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xEaXJlY3RpdmUucmVxdWlyZWQgPSB0aGlzLmlzQ29udHJvbFJlcXVpcmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgICAgICAgIHBvcnRhbE91dGxldC5kZXRhY2goKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hcHBseVZhbGlkYXRvcnMoY29udHJvbEVudGl0eSwgdmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29udHJvbERpcmVjdGl2ZSkge1xuICAgICAgICAgIHRoaXMuY29udHJvbERpcmVjdGl2ZS5yZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF0dGFjaFBvaW50ID0gcG9ydGFsT3V0bGV0LmF0dGFjaChwb3J0YWwpO1xuICAgICAgICBpZiAoIXRoaXMudGVtcGxhdGUpIHtcbiAgICAgICAgICB0aGlzLnNwYW5Db21wb25lbnRSZWYgPSBhdHRhY2hQb2ludCBhcyBDb21wb25lbnRSZWY8U3BhbkNvbXBvbmVudD47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhclZhbGlkYXRvcnMoY29udHJvbEVudGl0eSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IHNvdXJjZVZhbHVlJCA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIHN0YXJ0V2l0aCh0aGlzLmNvbnRyb2wudmFsdWUpLFxuICAgICk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFtzb3VyY2VWYWx1ZSQsIGNvbnRhaW5lckF0dGFjaGVkJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKFssIGF0dGFjaGVkXSkgPT4gISFhdHRhY2hlZCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbdmFsdWVdKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VmFsaWRhdG9ycyhcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gICAgcmF3VmFsaWRhdG9yPzogVmFsaWRhdG9yRm4sXG4gICAgcmF3QXN5bmNWYWxpZGF0b3I/OiBBc3luY1ZhbGlkYXRvckZuLFxuICApIHtcbiAgICBpZiAoXG4gICAgICBjb250cm9sLnZhbGlkYXRvciA9PT0gcmF3VmFsaWRhdG9yICYmXG4gICAgICBjb250cm9sLmFzeW5jVmFsaWRhdG9yID09PSByYXdBc3luY1ZhbGlkYXRvclxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250cm9sLnNldFZhbGlkYXRvcnMocmF3VmFsaWRhdG9yKTtcbiAgICBjb250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhyYXdBc3luY1ZhbGlkYXRvcik7XG4gICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyVmFsaWRhdG9ycyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICAvLyBkZWxheSBjaGVja2luZyB2YWxpZGF0b3JzIGZvciBuZ01vZGVsXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGlmICghY29udHJvbC52YWxpZGF0b3IgJiYgIWNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgIGNvbnRyb2wuY2xlYXJBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiBgPHNwYW4+e3sgZGF0YSB8IGFjbEZpZWxkTm90QXZhaWxhYmxlIH19PC9zcGFuPmAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIHNwYW4ge1xuICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9wcmVmZXItb24tcHVzaC1jb21wb25lbnQtY2hhbmdlLWRldGVjdGlvblxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQsXG59KVxuZXhwb3J0IGNsYXNzIFNwYW5Db21wb25lbnQ8VCA9IHVua25vd24+IHtcbiAgZGF0YTogVDtcblxuICBzZXREYXRhKHZhbHVlOiBUKSB7XG4gICAgdGhpcy5kYXRhID0gdmFsdWU7XG4gIH1cbn1cbiJdfQ==