@alauda-fe/common
Version:
Alauda frontend team common codes.
198 lines • 27.2 kB
JavaScript
import { coerceAttrBoolean } from '@alauda/ui';
import { ChangeDetectorRef, Directive, inject, Input, QueryList, ViewChildren, } from '@angular/core';
import { FormGroupDirective, NgControl, NgForm, } from '@angular/forms';
import { assocPath, identity, mergeDeepRight, path } from 'ramda';
import { ReplaySubject, startWith, switchMap, Subject, takeUntil, debounceTime, merge, combineLatest, filter, map, tap, take, of, } from 'rxjs';
import * as i0 from "@angular/core";
export function createNestedFormControl({ autoEmitChange = false, asyncValidator = false, } = {}) {
return class NestedFormControl extends BaseNestedFormControl {
constructor() {
super(...arguments);
this.autoEmitChange = autoEmitChange;
this.asyncValidator = asyncValidator;
}
};
}
export class BaseNestedFormControl {
get disabled() {
return this._disabled;
}
set disabled(val) {
this._disabled = coerceAttrBoolean(val);
}
constructor() {
this._disabled = false;
this.model = null;
this.submitted = false;
this.autoEmitChange = false;
this.asyncValidator = false;
this.cdr = inject(ChangeDetectorRef);
this.destroy$$ = new Subject();
this.hostForm = inject(NgForm, { optional: true }) ??
inject(FormGroupDirective, { optional: true });
if (this.hostForm) {
this.hostForm.ngSubmit.pipe(takeUntil(this.destroy$$)).subscribe(() => {
this.submitted = this.hostForm.submitted;
this.onSubmitted?.();
this.cdr.markForCheck();
});
}
}
ngAfterViewInit() {
this.controls.changes
.pipe(startWith(this.controls), switchMap((controls) => controls.length
? merge(...controls.toArray().map(control => control.statusChanges)).pipe(startWith(null))
: of(null)), debounceTime(0))
.subscribe(() => {
this.onValidatorChange?.();
});
if (this.autoEmitChange) {
this.controls.changes
.pipe(startWith(this.controls), switchMap((controls) => merge(...controls.toArray().map(control => control.valueChanges))))
.pipe(debounceTime(0))
.subscribe(() => {
this.emitModel(this.model);
});
}
}
ngOnDestroy() {
this.destroy$$.next();
this.destroy$$.complete();
}
registerOnValidatorChange(fn) {
this.onValidatorChange = fn;
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
this.cdr.markForCheck();
}
writeValue(value) {
this.model = this.valueIn(value);
this.cdr.markForCheck();
}
validate(_control) {
const getErrors = () => {
const errors = this.controls?.reduce((acc, control) => {
if (control.errors) {
return mergeDeepRight(acc, control.name ? { [control.name]: control.errors } : control.errors);
}
return acc;
}, {});
return errors && Object.keys(errors).length ? errors : null;
};
return this.asyncValidator
? combineLatest((this.controls?.toArray() ?? []).map(control => control.statusChanges.pipe(startWith(control.status)))).pipe(debounceTime(0), filter(statuses => statuses.includes('INVALID') || !statuses.includes('PENDING')), take(1), map(() => getErrors()), tap(() => {
this.cdr.markForCheck();
}))
: getErrors();
}
emitModel(model = this.model) {
this.model = model;
this.emitValue(this.modelOut(this.model));
}
emitValue(value) {
if (this.onChange) {
this.onChange(value);
}
}
valueIn(value) {
return value;
}
modelOut(model) {
return model;
}
static { this.ɵfac = function BaseNestedFormControl_Factory(t) { return new (t || BaseNestedFormControl)(); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseNestedFormControl, viewQuery: function BaseNestedFormControl_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(NgControl, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.controls = _t);
} }, inputs: { disabled: "disabled" } }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedFormControl, [{
type: Directive
}], () => [], { controls: [{
type: ViewChildren,
args: [NgControl]
}], disabled: [{
type: Input
}] }); })();
/**
* @deprecated use {@link BaseNestedFormControl} instead.
*/
export class BaseNestedFormControlPure extends BaseNestedFormControl {
constructor() {
super();
this.model$ = new ReplaySubject(1);
this.model$.subscribe(model => {
this.model = model;
this.cdr.markForCheck();
});
}
writeValue(value) {
this.model$.next(this.valueIn(value));
}
emitValue(value) {
if (this.onChange) {
this.onChange(value);
this.writeValue(value);
}
}
static { this.ɵfac = function BaseNestedFormControlPure_Factory(t) { return new (t || BaseNestedFormControlPure)(); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseNestedFormControlPure, features: [i0.ɵɵInheritDefinitionFeature] }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedFormControlPure, [{
type: Directive
}], () => [], null); })();
function collectPaths(mapper, parent) {
return Object.entries(mapper).reduce((acc, [key, value]) => {
const path = typeof value === 'string' ? value.split('.') : value;
if (Array.isArray(path)) {
acc.push([parent.concat(key), path]);
return acc;
}
return acc.concat(collectPaths(path, parent.concat(key)));
}, []);
}
export function dataTransfer(mapper) {
const tuples = collectPaths(mapper, []);
let _source;
let _target = {};
return [
source => {
_source = source;
return tuples.reduce((acc, [left, right]) => {
const newValue = path(right, source);
if (path(left, acc) === newValue) {
return acc;
}
return (_target = assocPath(left, newValue, acc));
}, _target);
},
target => {
_target = target;
return tuples.reduce((acc, [left, right]) => {
const newValue = path(left, target);
if (path(right, acc) === newValue) {
return acc;
}
return (_source = assocPath(right, newValue, acc));
}, _source);
},
];
}
function parsePath(path) {
return typeof path === 'string' ? path.split('.') : path;
}
export function copyValue(from, to, mapper = identity) {
const fromPath = parsePath(from);
const toPath = parsePath(to);
return (object) => assocPath(toPath, mapper(path(fromPath, object)), object);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1uZXN0ZWQtZm9ybS1jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvcmUvYWJzdHJhY3QvYmFzZS1uZXN0ZWQtZm9ybS1jb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMvQyxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxFQUVMLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixTQUFTLEVBQ1QsTUFBTSxHQUVQLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNsRSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsRUFDVCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLGFBQWEsRUFDYixNQUFNLEVBQ04sR0FBRyxFQUNILEdBQUcsRUFDSCxJQUFJLEVBQ0osRUFBRSxHQUNILE1BQU0sTUFBTSxDQUFDOztBQUVkLE1BQU0sVUFBVSx1QkFBdUIsQ0FBVyxFQUNoRCxjQUFjLEdBQUcsS0FBSyxFQUN0QixjQUFjLEdBQUcsS0FBSyxNQUlwQixFQUFFO0lBRUosT0FBTyxNQUFNLGlCQUFrQixTQUFRLHFCQUEyQjtRQUEzRDs7WUFDYyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztZQUNoQyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUNyRCxDQUFDO0tBQUEsQ0FBQztBQUNKLENBQUM7QUFHRCxNQUFNLE9BQU8scUJBQXFCO0lBTWhDLElBQ0ksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lB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b250ZW50IjpbImltcG9ydCB7IGNvZXJjZUF0dHJCb29sZWFuIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgTmdDb250cm9sLFxuICBOZ0Zvcm0sXG4gIFZhbGlkYXRpb25FcnJvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGFzc29jUGF0aCwgaWRlbnRpdHksIG1lcmdlRGVlcFJpZ2h0LCBwYXRoIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtcbiAgUmVwbGF5U3ViamVjdCxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbiAgZGVib3VuY2VUaW1lLFxuICBtZXJnZSxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHRhcCxcbiAgdGFrZSxcbiAgb2YsXG59IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmVzdGVkRm9ybUNvbnRyb2w8ViwgTSA9IFY+KHtcbiAgYXV0b0VtaXRDaGFuZ2UgPSBmYWxzZSxcbiAgYXN5bmNWYWxpZGF0b3IgPSBmYWxzZSxcbn06IHtcbiAgYXV0b0VtaXRDaGFuZ2U/OiBib29sZWFuO1xuICBhc3luY1ZhbGlkYXRvcj86IGJvb2xlYW47XG59ID0ge30pOiAvLyB3b3JrYXJvdW5kOiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMwMzU1XG5uZXcgKCkgPT4gQmFzZU5lc3RlZEZvcm1Db250cm9sPFYsIE0+IHtcbiAgcmV0dXJuIGNsYXNzIE5lc3RlZEZvcm1Db250cm9sIGV4dGVuZHMgQmFzZU5lc3RlZEZvcm1Db250cm9sPFYsIE0+IHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXV0b0VtaXRDaGFuZ2UgPSBhdXRvRW1pdENoYW5nZTtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmNWYWxpZGF0b3IgPSBhc3luY1ZhbGlkYXRvcjtcbiAgfTtcbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgQmFzZU5lc3RlZEZvcm1Db250cm9sPFYsIE0gPSBWPlxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3JcbntcbiAgQFZpZXdDaGlsZHJlbihOZ0NvbnRyb2wpXG4gIHByb3RlY3RlZCBjb250cm9sczogUXVlcnlMaXN0PE5nQ29udHJvbD47XG5cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIHNldCBkaXNhYmxlZCh2YWw6IGJvb2xlYW4gfCAnJykge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQXR0ckJvb2xlYW4odmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgb25WYWxpZGF0b3JDaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIG9uQ2hhbmdlOiAoXzogVikgPT4gdm9pZDtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuICBvblN1Ym1pdHRlZDogKCkgPT4gdm9pZDtcblxuICBtb2RlbDogTSA9IG51bGw7XG4gIHN1Ym1pdHRlZCA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBhdXRvRW1pdENoYW5nZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgYXN5bmNWYWxpZGF0b3IgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgaG9zdEZvcm0gPVxuICAgIGluamVjdChOZ0Zvcm0sIHsgb3B0aW9uYWw6IHRydWUgfSkgPz9cbiAgICBpbmplY3QoRm9ybUdyb3VwRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmhvc3RGb3JtKSB7XG4gICAgICB0aGlzLmhvc3RGb3JtLm5nU3VibWl0LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0aGlzLmhvc3RGb3JtLnN1Ym1pdHRlZDtcbiAgICAgICAgdGhpcy5vblN1Ym1pdHRlZD8uKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY29udHJvbHMuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLmNvbnRyb2xzKSxcbiAgICAgICAgc3dpdGNoTWFwKChjb250cm9sczogUXVlcnlMaXN0PE5nQ29udHJvbD4pID0+XG4gICAgICAgICAgY29udHJvbHMubGVuZ3RoXG4gICAgICAgICAgICA/IG1lcmdlKFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2xzLnRvQXJyYXkoKS5tYXAoY29udHJvbCA9PiBjb250cm9sLnN0YXR1c0NoYW5nZXMpLFxuICAgICAgICAgICAgICApLnBpcGUoc3RhcnRXaXRoKG51bGwpKVxuICAgICAgICAgICAgOiBvZihudWxsKSxcbiAgICAgICAgKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2U/LigpO1xuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5hdXRvRW1pdENoYW5nZSkge1xuICAgICAgdGhpcy5jb250cm9scy5jaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aCh0aGlzLmNvbnRyb2xzKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKGNvbnRyb2xzOiBRdWVyeUxpc3Q8TmdDb250cm9sPikgPT5cbiAgICAgICAgICAgIG1lcmdlKC4uLmNvbnRyb2xzLnRvQXJyYXkoKS5tYXAoY29udHJvbCA9PiBjb250cm9sLnZhbHVlQ2hhbmdlcykpLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDApKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXRNb2RlbCh0aGlzLm1vZGVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IFYpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IFYpIHtcbiAgICB0aGlzLm1vZGVsID0gdGhpcy52YWx1ZUluKHZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIF9jb250cm9sPzogQWJzdHJhY3RDb250cm9sLFxuICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB8IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICBjb25zdCBnZXRFcnJvcnMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmNvbnRyb2xzPy5yZWR1Y2UoKGFjYywgY29udHJvbCkgPT4ge1xuICAgICAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgICAgICByZXR1cm4gbWVyZ2VEZWVwUmlnaHQoXG4gICAgICAgICAgICBhY2MsXG4gICAgICAgICAgICBjb250cm9sLm5hbWUgPyB7IFtjb250cm9sLm5hbWVdOiBjb250cm9sLmVycm9ycyB9IDogY29udHJvbC5lcnJvcnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgVmFsaWRhdGlvbkVycm9ycyk7XG5cbiAgICAgIHJldHVybiBlcnJvcnMgJiYgT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5hc3luY1ZhbGlkYXRvclxuICAgICAgPyBjb21iaW5lTGF0ZXN0KFxuICAgICAgICAgICh0aGlzLmNvbnRyb2xzPy50b0FycmF5KCkgPz8gW10pLm1hcChjb250cm9sID0+XG4gICAgICAgICAgICBjb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgoY29udHJvbC5zdGF0dXMpKSxcbiAgICAgICAgICApLFxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIHN0YXR1c2VzID0+XG4gICAgICAgICAgICAgIHN0YXR1c2VzLmluY2x1ZGVzKCdJTlZBTElEJykgfHwgIXN0YXR1c2VzLmluY2x1ZGVzKCdQRU5ESU5HJyksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgIG1hcCgoKSA9PiBnZXRFcnJvcnMoKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IGdldEVycm9ycygpO1xuICB9XG5cbiAgZW1pdE1vZGVsKG1vZGVsOiBNID0gdGhpcy5tb2RlbCkge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmVtaXRWYWx1ZSh0aGlzLm1vZGVsT3V0KHRoaXMubW9kZWwpKTtcbiAgfVxuXG4gIGVtaXRWYWx1ZSh2YWx1ZTogVikge1xuICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsdWVJbih2YWx1ZTogVik6IE0ge1xuICAgIHJldHVybiB2YWx1ZSBhcyBhbnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW9kZWxPdXQobW9kZWw6IE0pOiBWIHtcbiAgICByZXR1cm4gbW9kZWwgYXMgYW55O1xuICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBCYXNlTmVzdGVkRm9ybUNvbnRyb2x9IGluc3RlYWQuXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIEJhc2VOZXN0ZWRGb3JtQ29udHJvbFB1cmU8ViwgTSA9IFY+IGV4dGVuZHMgQmFzZU5lc3RlZEZvcm1Db250cm9sPFxuICBWLFxuICBNXG4+IHtcbiAgbW9kZWwkID0gbmV3IFJlcGxheVN1YmplY3Q8TT4oMSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubW9kZWwkLnN1YnNjcmliZShtb2RlbCA9PiB7XG4gICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUodmFsdWU6IFYpIHtcbiAgICB0aGlzLm1vZGVsJC5uZXh0KHRoaXMudmFsdWVJbih2YWx1ZSkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZW1pdFZhbHVlKHZhbHVlOiBWKSB7XG4gICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudHlwZSBQYXRoID0gc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcblxuaW50ZXJmYWNlIE1hcHBlciB7XG4gIFt4OiBzdHJpbmddOiBNYXBwZXIgfCBQYXRoO1xufVxuXG50eXBlIFBhdGhUdXBsZSA9IFtzdHJpbmdbXSwgc3RyaW5nW11dO1xuXG5mdW5jdGlvbiBjb2xsZWN0UGF0aHMobWFwcGVyOiBNYXBwZXIsIHBhcmVudDogc3RyaW5nW10pOiBQYXRoVHVwbGVbXSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBwYXRoID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnNwbGl0KCcuJykgOiB2YWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgYWNjLnB1c2goW3BhcmVudC5jb25jYXQoa2V5KSwgcGF0aF0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoY29sbGVjdFBhdGhzKHBhdGgsIHBhcmVudC5jb25jYXQoa2V5KSkpO1xuICB9LCBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVHJhbnNmZXI8XG4gIFMgZXh0ZW5kcyBvYmplY3QsXG4gIFQgZXh0ZW5kcyBvYmplY3QsXG4gIE0gZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgVCwgUGF0aCB8IE1hcHBlcj4gPSBSZWNvcmQ8a2V5b2YgVCwgUGF0aCB8IE1hcHBlcj4sXG4+KG1hcHBlcjogTSk6IFsoc291cmNlOiBTKSA9PiBULCAodGFyZ2V0OiBUKSA9PiBTXSB7XG4gIGNvbnN0IHR1cGxlcyA9IGNvbGxlY3RQYXRocyhtYXBwZXIsIFtdKTtcbiAgbGV0IF9zb3VyY2U6IFM7XG4gIGxldCBfdGFyZ2V0OiBUID0ge30gYXMgVDtcbiAgcmV0dXJuIFtcbiAgICBzb3VyY2UgPT4ge1xuICAgICAgX3NvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHJldHVybiB0dXBsZXMucmVkdWNlKChhY2MsIFtsZWZ0LCByaWdodF0pID0+IHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwYXRoPHVua25vd24+KHJpZ2h0LCBzb3VyY2UpO1xuXG4gICAgICAgIGlmIChwYXRoKGxlZnQsIGFjYykgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoX3RhcmdldCA9IGFzc29jUGF0aDx1bmtub3duLCBUPihsZWZ0LCBuZXdWYWx1ZSwgYWNjKSk7XG4gICAgICB9LCBfdGFyZ2V0KTtcbiAgICB9LFxuICAgIHRhcmdldCA9PiB7XG4gICAgICBfdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgcmV0dXJuIHR1cGxlcy5yZWR1Y2UoKGFjYywgW2xlZnQsIHJpZ2h0XSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHBhdGg8dW5rbm93bj4obGVmdCwgdGFyZ2V0KTtcblxuICAgICAgICBpZiAocGF0aChyaWdodCwgYWNjKSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChfc291cmNlID0gYXNzb2NQYXRoPHVua25vd24sIFM+KHJpZ2h0LCBuZXdWYWx1ZSwgYWNjKSk7XG4gICAgICB9LCBfc291cmNlKTtcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogUGF0aCk6IEFycmF5PHN0cmluZyB8IG51bWJlcj4ge1xuICByZXR1cm4gdHlwZW9mIHBhdGggPT09ICdzdHJpbmcnID8gcGF0aC5zcGxpdCgnLicpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgZnJvbTogUGF0aCxcbiAgdG86IFBhdGgsXG4gIG1hcHBlcjogKHY6IGFueSkgPT4gYW55ID0gaWRlbnRpdHksXG4pIHtcbiAgY29uc3QgZnJvbVBhdGggPSBwYXJzZVBhdGgoZnJvbSk7XG4gIGNvbnN0IHRvUGF0aCA9IHBhcnNlUGF0aCh0byk7XG4gIHJldHVybiAob2JqZWN0OiBUKSA9PlxuICAgIGFzc29jUGF0aCh0b1BhdGgsIG1hcHBlcihwYXRoKGZyb21QYXRoLCBvYmplY3QpKSwgb2JqZWN0KTtcbn1cbiJdfQ==