UNPKG

@ngneat/reactive-forms

Version:

(Angular Reactive) Forms with Benefits

119 lines 20.8 kB
import { UntypedFormGroup, } from '@angular/forms'; import { isObservable, Subject } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; import { controlDisabledWhile, controlEnabledWhile, controlErrorChanges$, controlStatus$, controlValueChanges$, disableControl, enableControl, hasErrorAnd, markAllDirty, mergeErrors, removeError, selectControlValue$, } from './core'; export class FormGroup extends UntypedFormGroup { constructor(controls, validatorOrOpts, asyncValidator) { super(controls, validatorOrOpts, asyncValidator); this.controls = controls; this.touchChanges = new Subject(); this.dirtyChanges = new Subject(); this.errorsSubject = new Subject(); this.touch$ = this.touchChanges .asObservable() .pipe(distinctUntilChanged()); this.dirty$ = this.dirtyChanges .asObservable() .pipe(distinctUntilChanged()); this.value$ = controlValueChanges$(this); this.disabled$ = controlStatus$(this, 'disabled'); this.enabled$ = controlStatus$(this, 'enabled'); this.invalid$ = controlStatus$(this, 'invalid'); this.valid$ = controlStatus$(this, 'valid'); this.status$ = controlStatus$(this, 'status'); this.errors$ = controlErrorChanges$(this, this.errorsSubject.asObservable()); } select(mapFn) { return selectControlValue$(this, mapFn); } get(key) { return super.get(key); } setValue(valueOrObservable, options) { if (isObservable(valueOrObservable)) { return valueOrObservable.subscribe((value) => super.setValue(value, options)); } super.setValue(valueOrObservable, options); } patchValue(valueOrObservable, options) { if (isObservable(valueOrObservable)) { return valueOrObservable.subscribe((value) => super.patchValue(value, options)); } super.patchValue(valueOrObservable, options); } getRawValue() { return super.getRawValue(); } markAsTouched(...opts) { super.markAsTouched(...opts); this.touchChanges.next(true); } markAsUntouched(...opts) { super.markAsUntouched(...opts); this.touchChanges.next(false); } markAsPristine(...opts) { super.markAsPristine(...opts); this.dirtyChanges.next(false); } markAsDirty(...opts) { super.markAsDirty(...opts); this.dirtyChanges.next(true); } markAllAsDirty() { markAllDirty(this); } setEnable(enable = true, opts) { enableControl(this, enable, opts); } setDisable(disable = true, opts) { disableControl(this, disable, opts); } disabledWhile(observable, options) { return controlDisabledWhile(this, observable, options); } enabledWhile(observable, options) { return controlEnabledWhile(this, observable, options); } reset(formState, options) { super.reset(formState, options); } setValidators(newValidators, options) { super.setValidators(newValidators); super.updateValueAndValidity(options); } setAsyncValidators(newValidator, options) { super.setAsyncValidators(newValidator); super.updateValueAndValidity(options); } getError(...params) { return super.getError(...params); } setErrors(...opts) { /** * @description * Use an elvis operator to avoid a throw when the control is used with an async validator * Which will be instantly resolved (like with `of(null)`) * In such case, Angular will call this method instantly before even instancing the properties causing the throw * Can be easily reproduced with a step-by-step debug once compiled when checking the stack trace of the constructor * * Issue: https://github.com/ngneat/reactive-forms/issues/91 * Reproduction: https://codesandbox.io/embed/github/C0ZEN/ngneat-reactive-forms-error-issue-cs/tree/main/?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&theme=dark */ this.errorsSubject?.next(opts[0]); return super.setErrors(...opts); } mergeErrors(errors, opts) { this.setErrors(mergeErrors(this.errors, errors), opts); } removeError(key, opts) { this.setErrors(removeError(this.errors, key), opts); } hasErrorAndTouched(error, path) { return hasErrorAnd('touched', this, error, path); } hasErrorAndDirty(error, path) { return hasErrorAnd('dirty', this, error, path); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcmVhY3RpdmUtZm9ybXMvc3JjL2xpYi9mb3JtLWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsR0FFakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsWUFBWSxFQUNaLFdBQVcsRUFDWCxXQUFXLEVBQ1gsbUJBQW1CLEdBQ3BCLE1BQU0sUUFBUSxDQUFDO0FBR2hCLE1BQU0sT0FBTyxTQUF5QyxTQUFRLGdCQUFnQjtJQXlCNUUsWUFDUyxRQUFXLEVBQ2xCLGVBQW1FLEVBQ25FLGNBQWtFO1FBRWxFLEtBQUssQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBSjFDLGFBQVEsR0FBUixRQUFRLENBQUc7UUF0QlosaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ3RDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN0QyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUEyQixDQUFDO1FBRXRELFdBQU0sR0FBRyxJQUFJLENBQUMsWUFBWTthQUNoQyxZQUFZLEVBQUU7YUFDZCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLFdBQU0sR0FBRyxJQUFJLENBQUMsWUFBWTthQUNoQyxZQUFZLEVBQUU7YUFDZCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLFdBQU0sR0FB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QUM7SUFFRCxXQUFXLENBQ1QsTUFBK0IsRUFDL0IsSUFBa0Q7UUFFbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsV0FBVyxDQUNULEdBQVcsRUFDWCxJQUFrRDtRQUVsRCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxrQkFBa0IsQ0FDaEIsS0FBYSxFQUNiLElBQWlEO1FBRWpELE9BQU8sV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxnQkFBZ0IsQ0FDZCxLQUFhLEVBQ2IsSUFBaUQ7UUFFakQsT0FBTyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc09ic2VydmFibGUsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBjb250cm9sRGlzYWJsZWRXaGlsZSxcbiAgY29udHJvbEVuYWJsZWRXaGlsZSxcbiAgY29udHJvbEVycm9yQ2hhbmdlcyQsXG4gIGNvbnRyb2xTdGF0dXMkLFxuICBjb250cm9sVmFsdWVDaGFuZ2VzJCxcbiAgZGlzYWJsZUNvbnRyb2wsXG4gIGVuYWJsZUNvbnRyb2wsXG4gIGhhc0Vycm9yQW5kLFxuICBtYXJrQWxsRGlydHksXG4gIG1lcmdlRXJyb3JzLFxuICByZW1vdmVFcnJvcixcbiAgc2VsZWN0Q29udHJvbFZhbHVlJCxcbn0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsLCBWYWx1ZXNPZiB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiBleHRlbmRzIFVudHlwZWRGb3JtR3JvdXAge1xuICByZWFkb25seSB2YWx1ZSE6IFZhbHVlc09mPFQ+O1xuICByZWFkb25seSB2YWx1ZUNoYW5nZXMhOiBPYnNlcnZhYmxlPFZhbHVlc09mPFQ+PjtcblxuICBwcml2YXRlIHRvdWNoQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgZGlydHlDaGFuZ2VzID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSBlcnJvcnNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KCk7XG5cbiAgcmVhZG9ubHkgdG91Y2gkID0gdGhpcy50b3VjaENoYW5nZXNcbiAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgcmVhZG9ubHkgZGlydHkkID0gdGhpcy5kaXJ0eUNoYW5nZXNcbiAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgcmVhZG9ubHkgdmFsdWUkID0gY29udHJvbFZhbHVlQ2hhbmdlcyQ8VmFsdWVzT2Y8VD4+KHRoaXMpO1xuICByZWFkb25seSBkaXNhYmxlZCQgPSBjb250cm9sU3RhdHVzJCh0aGlzLCAnZGlzYWJsZWQnKTtcbiAgcmVhZG9ubHkgZW5hYmxlZCQgPSBjb250cm9sU3RhdHVzJCh0aGlzLCAnZW5hYmxlZCcpO1xuICByZWFkb25seSBpbnZhbGlkJCA9IGNvbnRyb2xTdGF0dXMkKHRoaXMsICdpbnZhbGlkJyk7XG4gIHJlYWRvbmx5IHZhbGlkJCA9IGNvbnRyb2xTdGF0dXMkKHRoaXMsICd2YWxpZCcpO1xuICByZWFkb25seSBzdGF0dXMkID0gY29udHJvbFN0YXR1cyQodGhpcywgJ3N0YXR1cycpO1xuICByZWFkb25seSBlcnJvcnMkID0gY29udHJvbEVycm9yQ2hhbmdlcyQoXG4gICAgdGhpcyxcbiAgICB0aGlzLmVycm9yc1N1YmplY3QuYXNPYnNlcnZhYmxlKClcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29udHJvbHM6IFQsXG4gICAgdmFsaWRhdG9yT3JPcHRzPzogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBVbnR5cGVkRm9ybUdyb3VwPlsxXSxcbiAgICBhc3luY1ZhbGlkYXRvcj86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgVW50eXBlZEZvcm1Hcm91cD5bMl1cbiAgKSB7XG4gICAgc3VwZXIoY29udHJvbHMsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpO1xuICB9XG5cbiAgc2VsZWN0PFI+KG1hcEZuOiAoc3RhdGU6IFZhbHVlc09mPFQ+KSA9PiBSKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgcmV0dXJuIHNlbGVjdENvbnRyb2xWYWx1ZSQodGhpcywgbWFwRm4pO1xuICB9XG5cbiAgZ2V0PFxuICAgIEsgZXh0ZW5kcyBrZXlvZiBWYWx1ZXNPZjxUPixcbiAgICBLMSBleHRlbmRzIGtleW9mIFZhbHVlc09mPFQ+W0tdLFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVmFsdWVzT2Y8VD5bS11bSzFdLFxuICAgIEZpcnN0TGV2ZWwgPSBHcm91cFBhdGg8VFtLXSwgSzEgJiBzdHJpbmc+LFxuICAgIFNlY29uZExldmVsID0gR3JvdXBQYXRoPEZpcnN0TGV2ZWwsIEsyICYgc3RyaW5nPlxuICA+KGtleXM6IFtLLCBLMSwgSzJdKTogU2Vjb25kTGV2ZWw7XG4gIGdldDxLIGV4dGVuZHMga2V5b2YgVmFsdWVzT2Y8VD4sIEsxIGV4dGVuZHMga2V5b2YgVmFsdWVzT2Y8VD5bS10+KFxuICAgIGtleXM6IFtLLCBLMV1cbiAgKTogR3JvdXBQYXRoPFRbS10sIEsxICYgc3RyaW5nPjtcblxuICBnZXQ8SyBleHRlbmRzIGtleW9mIFZhbHVlc09mPFQ+PihrZXlzOiBbS10pOiBUW0tdO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGdldDxcbiAgICBLIGV4dGVuZHMgc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBQID0gSyBleHRlbmRzIGAke2luZmVyIEtleX0uJHtpbmZlciBSZXN0fWAgPyB1bmtub3duIDogS1xuICA+KGtleTogSyk6IHVua25vd24gZXh0ZW5kcyBQID8gQWJzdHJhY3RDb250cm9sIDogVFtLXTtcbiAgZ2V0KGtleTogc3RyaW5nIHwgc3RyaW5nW10pOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiBzdXBlci5nZXQoa2V5KSBhcyBBYnN0cmFjdENvbnRyb2w7XG4gIH1cblxuICBzZXRWYWx1ZShcbiAgICB2YWx1ZU9yT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxWYWx1ZXNPZjxUPj4sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRWYWx1ZSddPlsxXVxuICApOiBTdWJzY3JpcHRpb247XG4gIHNldFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBWYWx1ZXNPZjxUPixcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ3NldFZhbHVlJ10+WzFdXG4gICk6IHZvaWQ7XG4gIHNldFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBhbnksXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRWYWx1ZSddPlsxXVxuICApOiBhbnkge1xuICAgIGlmIChpc09ic2VydmFibGUodmFsdWVPck9ic2VydmFibGUpKSB7XG4gICAgICByZXR1cm4gdmFsdWVPck9ic2VydmFibGUuc3Vic2NyaWJlKCh2YWx1ZSkgPT5cbiAgICAgICAgc3VwZXIuc2V0VmFsdWUodmFsdWUgYXMgVmFsdWVzT2Y8VD4sIG9wdGlvbnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIHN1cGVyLnNldFZhbHVlKHZhbHVlT3JPYnNlcnZhYmxlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHBhdGNoVmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IE9ic2VydmFibGU8RGVlcFBhcnRpYWw8VmFsdWVzT2Y8VD4+PixcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ3BhdGNoVmFsdWUnXT5bMV1cbiAgKTogU3Vic2NyaXB0aW9uO1xuICBwYXRjaFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBEZWVwUGFydGlhbDxWYWx1ZXNPZjxUPj4sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydwYXRjaFZhbHVlJ10+WzFdXG4gICk6IHZvaWQ7XG4gIHBhdGNoVmFsdWUodmFsdWVPck9ic2VydmFibGU6IGFueSwgb3B0aW9ucz86IGFueSk6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZU9yT2JzZXJ2YWJsZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZU9yT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKHZhbHVlKSA9PlxuICAgICAgICBzdXBlci5wYXRjaFZhbHVlKHZhbHVlIGFzIERlZXBQYXJ0aWFsPFZhbHVlc09mPFQ+Piwgb3B0aW9ucylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3VwZXIucGF0Y2hWYWx1ZSh2YWx1ZU9yT2JzZXJ2YWJsZSwgb3B0aW9ucyk7XG4gIH1cblxuICBnZXRSYXdWYWx1ZSgpOiBWYWx1ZXNPZjxUPiB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFJhd1ZhbHVlKCk7XG4gIH1cblxuICBtYXJrQXNUb3VjaGVkKFxuICAgIC4uLm9wdHM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydtYXJrQXNUb3VjaGVkJ10+XG4gICk6IFJldHVyblR5cGU8QWJzdHJhY3RDb250cm9sWydtYXJrQXNUb3VjaGVkJ10+IHtcbiAgICBzdXBlci5tYXJrQXNUb3VjaGVkKC4uLm9wdHMpO1xuICAgIHRoaXMudG91Y2hDaGFuZ2VzLm5leHQodHJ1ZSk7XG4gIH1cblxuICBtYXJrQXNVbnRvdWNoZWQoXG4gICAgLi4ub3B0czogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ21hcmtBc1VudG91Y2hlZCddPlxuICApOiBSZXR1cm5UeXBlPEFic3RyYWN0Q29udHJvbFsnbWFya0FzVW50b3VjaGVkJ10+IHtcbiAgICBzdXBlci5tYXJrQXNVbnRvdWNoZWQoLi4ub3B0cyk7XG4gICAgdGhpcy50b3VjaENoYW5nZXMubmV4dChmYWxzZSk7XG4gIH1cblxuICBtYXJrQXNQcmlzdGluZShcbiAgICAuLi5vcHRzOiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnbWFya0FzUHJpc3RpbmUnXT5cbiAgKTogUmV0dXJuVHlwZTxBYnN0cmFjdENvbnRyb2xbJ21hcmtBc1ByaXN0aW5lJ10+IHtcbiAgICBzdXBlci5tYXJrQXNQcmlzdGluZSguLi5vcHRzKTtcbiAgICB0aGlzLmRpcnR5Q2hhbmdlcy5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIG1hcmtBc0RpcnR5KFxuICAgIC4uLm9wdHM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydtYXJrQXNEaXJ0eSddPlxuICApOiBSZXR1cm5UeXBlPEFic3RyYWN0Q29udHJvbFsnbWFya0FzRGlydHknXT4ge1xuICAgIHN1cGVyLm1hcmtBc0RpcnR5KC4uLm9wdHMpO1xuICAgIHRoaXMuZGlydHlDaGFuZ2VzLm5leHQodHJ1ZSk7XG4gIH1cblxuICBtYXJrQWxsQXNEaXJ0eSgpOiB2b2lkIHtcbiAgICBtYXJrQWxsRGlydHkodGhpcyk7XG4gIH1cblxuICBzZXRFbmFibGUoZW5hYmxlID0gdHJ1ZSwgb3B0cz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydlbmFibGUnXT5bMF0pIHtcbiAgICBlbmFibGVDb250cm9sKHRoaXMsIGVuYWJsZSwgb3B0cyk7XG4gIH1cblxuICBzZXREaXNhYmxlKGRpc2FibGUgPSB0cnVlLCBvcHRzPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ2Rpc2FibGUnXT5bMF0pIHtcbiAgICBkaXNhYmxlQ29udHJvbCh0aGlzLCBkaXNhYmxlLCBvcHRzKTtcbiAgfVxuXG4gIGRpc2FibGVkV2hpbGUoXG4gICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ2Rpc2FibGUnXT5bMF1cbiAgKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xEaXNhYmxlZFdoaWxlKHRoaXMsIG9ic2VydmFibGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZW5hYmxlZFdoaWxlKFxuICAgIG9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydlbmFibGUnXT5bMF1cbiAgKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xFbmFibGVkV2hpbGUodGhpcywgb2JzZXJ2YWJsZSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXNldChcbiAgICBmb3JtU3RhdGU/OiBWYWx1ZXNPZjxUPixcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ3Jlc2V0J10+WzFdXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlc2V0KGZvcm1TdGF0ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBzZXRWYWxpZGF0b3JzKFxuICAgIG5ld1ZhbGlkYXRvcnM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRWYWxpZGF0b3JzJ10+WzBdLFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsndXBkYXRlVmFsdWVBbmRWYWxpZGl0eSddPlswXVxuICApIHtcbiAgICBzdXBlci5zZXRWYWxpZGF0b3JzKG5ld1ZhbGlkYXRvcnMpO1xuICAgIHN1cGVyLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0aW9ucyk7XG4gIH1cblxuICBzZXRBc3luY1ZhbGlkYXRvcnMoXG4gICAgbmV3VmFsaWRhdG9yOiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnc2V0QXN5bmNWYWxpZGF0b3JzJ10+WzBdLFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsndXBkYXRlVmFsdWVBbmRWYWxpZGl0eSddPlswXVxuICApIHtcbiAgICBzdXBlci5zZXRBc3luY1ZhbGlkYXRvcnMobmV3VmFsaWRhdG9yKTtcbiAgICBzdXBlci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0RXJyb3I8RT4oLi4ucGFyYW1zOiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnZ2V0RXJyb3InXT4pOiBFIHwgbnVsbCB7XG4gICAgcmV0dXJuIHN1cGVyLmdldEVycm9yKC4uLnBhcmFtcyk7XG4gIH1cblxuICBzZXRFcnJvcnMoLi4ub3B0czogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ3NldEVycm9ycyddPikge1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFVzZSBhbiBlbHZpcyBvcGVyYXRvciB0byBhdm9pZCBhIHRocm93IHdoZW4gdGhlIGNvbnRyb2wgaXMgdXNlZCB3aXRoIGFuIGFzeW5jIHZhbGlkYXRvclxuICAgICAqIFdoaWNoIHdpbGwgYmUgaW5zdGFudGx5IHJlc29sdmVkIChsaWtlIHdpdGggYG9mKG51bGwpYClcbiAgICAgKiBJbiBzdWNoIGNhc2UsIEFuZ3VsYXIgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIGluc3RhbnRseSBiZWZvcmUgZXZlbiBpbnN0YW5jaW5nIHRoZSBwcm9wZXJ0aWVzIGNhdXNpbmcgdGhlIHRocm93XG4gICAgICogQ2FuIGJlIGVhc2lseSByZXByb2R1Y2VkIHdpdGggYSBzdGVwLWJ5LXN0ZXAgZGVidWcgb25jZSBjb21waWxlZCB3aGVuIGNoZWNraW5nIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgY29uc3RydWN0b3JcbiAgICAgKlxuICAgICAqIElzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vbmduZWF0L3JlYWN0aXZlLWZvcm1zL2lzc3Vlcy85MVxuICAgICAqIFJlcHJvZHVjdGlvbjogaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9lbWJlZC9naXRodWIvQzBaRU4vbmduZWF0LXJlYWN0aXZlLWZvcm1zLWVycm9yLWlzc3VlLWNzL3RyZWUvbWFpbi8/YXV0b3Jlc2l6ZT0xJmV4cGFuZGRldnRvb2xzPTEmZm9udHNpemU9MTQmaGlkZW5hdmlnYXRpb249MSZ0aGVtZT1kYXJrXG4gICAgICovXG4gICAgdGhpcy5lcnJvcnNTdWJqZWN0Py5uZXh0KG9wdHNbMF0pO1xuICAgIHJldHVybiBzdXBlci5zZXRFcnJvcnMoLi4ub3B0cyk7XG4gIH1cblxuICBtZXJnZUVycm9ycyhcbiAgICBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsLFxuICAgIG9wdHM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnc2V0RXJyb3JzJ10+WzFdXG4gICkge1xuICAgIHRoaXMuc2V0RXJyb3JzKG1lcmdlRXJyb3JzKHRoaXMuZXJyb3JzLCBlcnJvcnMpLCBvcHRzKTtcbiAgfVxuXG4gIHJlbW92ZUVycm9yKFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9wdHM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnc2V0RXJyb3JzJ10+WzFdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc2V0RXJyb3JzKHJlbW92ZUVycm9yKHRoaXMuZXJyb3JzLCBrZXkpLCBvcHRzKTtcbiAgfVxuXG4gIGhhc0Vycm9yQW5kVG91Y2hlZChcbiAgICBlcnJvcjogc3RyaW5nLFxuICAgIHBhdGg/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnaGFzRXJyb3InXT5bMV1cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhhc0Vycm9yQW5kKCd0b3VjaGVkJywgdGhpcywgZXJyb3IsIHBhdGgpO1xuICB9XG5cbiAgaGFzRXJyb3JBbmREaXJ0eShcbiAgICBlcnJvcjogc3RyaW5nLFxuICAgIHBhdGg/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnaGFzRXJyb3InXT5bMV1cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhhc0Vycm9yQW5kKCdkaXJ0eScsIHRoaXMsIGVycm9yLCBwYXRoKTtcbiAgfVxufVxuXG50eXBlIEdyb3VwUGF0aDxULCBLIGV4dGVuZHMgc3RyaW5nPiA9IFQgZXh0ZW5kcyBGb3JtR3JvdXA8aW5mZXIgVT5cbiAgPyBVW0sgJiBzdHJpbmddXG4gIDogbmV2ZXI7XG4iXX0=