UNPKG

@angular-redux/form

Version:
322 lines 26.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, forwardRef, Host, Inject, Input, Optional, Self, SkipSelf, TemplateRef, ViewContainerRef, } from '@angular/core'; import { ControlContainer, FormArray, FormControl, FormGroup, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NgModelGroup, Validators, } from '@angular/forms'; import { ConnectBase } from '../connect/connect-base'; import { FormStore } from '../form-store'; import { controlPath } from '../shims'; import { State } from '../state'; import { ConnectArrayTemplate } from './connect-array-template'; export class ConnectArrayDirective extends ControlContainer { /** * @param {?} parent * @param {?} rawValidators * @param {?} rawAsyncValidators * @param {?} connection * @param {?} templateRef * @param {?} viewContainerRef * @param {?} store */ constructor(parent, rawValidators, rawAsyncValidators, connection, templateRef, viewContainerRef, store) { super(); this.parent = parent; this.rawValidators = rawValidators; this.rawAsyncValidators = rawAsyncValidators; this.connection = connection; this.templateRef = templateRef; this.viewContainerRef = viewContainerRef; this.store = store; this.array = new FormArray([]); this.stateSubscription = this.store.subscribe(state => this.resetState(state)); this.registerInternals(this.array); } /** * @param {?} collection * @return {?} */ set connectArrayOf(collection) { this.key = collection; this.resetState(this.store.getState()); } /** * @return {?} */ ngOnInit() { this.formDirective.addControl((/** @type {?} */ (this))); } /** * @return {?} */ get name() { return this.key || ''; } /** * @return {?} */ get control() { return this.array; } /** * @return {?} */ get formDirective() { return (/** @type {?} */ (this.parent.formDirective)); } /** * @return {?} */ get path() { return this.key ? controlPath(this.key, this.parent) : []; } /** * @return {?} */ get validator() { return Validators.compose(this.rawValidators); } /** * @return {?} */ get asyncValidator() { return Validators.composeAsync(this.rawAsyncValidators); } /** * @return {?} */ updateValueAndValidity() { // stub? } /** * @return {?} */ ngOnDestroy() { this.viewContainerRef.clear(); if (this.key) { this.formDirective.form.removeControl(this.key); } this.stateSubscription(); } /** * @private * @param {?} state * @return {?} */ resetState(state) { if (this.key == null || this.key.length === 0) { return; // no state to retreive if no key is set } /** @type {?} */ const iterable = State.get(state, this.connection.path.concat(this.path)); /** @type {?} */ let index = 0; for (const value of iterable) { /** @type {?} */ const viewRef = this.viewContainerRef.length > index ? ((/** @type {?} */ (this.viewContainerRef.get(index)))) : null; if (viewRef == null) { /** @type {?} */ const embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef, new ConnectArrayTemplate(index, index, value), index); this.patchDescendantControls(embeddedViewRef); this.array.insert(index, this.transform(this.array, embeddedViewRef.context.item)); } else { Object.assign(viewRef.context, new ConnectArrayTemplate(index, index, value)); } ++index; } while (this.viewContainerRef.length > index) { this.viewContainerRef.remove(this.viewContainerRef.length - 1); } } /** * @private * @param {?} array * @return {?} */ registerInternals(array) { array.registerControl = () => undefined; array.registerOnChange = () => undefined; Object.defineProperties(this, { _rawValidators: { value: this.rawValidators || [], }, _rawAsyncValidators: { value: this.rawAsyncValidators || [], }, }); } /** * @private * @param {?} viewRef * @return {?} */ patchDescendantControls(viewRef) { /** @type {?} */ const groups = Object.keys(viewRef._view) .map(k => viewRef._view[k]) .filter(c => c instanceof NgModelGroup); groups.forEach(c => { Object.defineProperties(c, { _parent: { value: this, }, _checkParentType: { value: () => undefined, }, }); }); } /** * @private * @param {?} parent * @param {?} reference * @return {?} */ transform(parent, reference) { /** @type {?} */ const emptyControl = () => { /** @type {?} */ const control = new FormControl(null); control.setParent(parent); return control; }; if (reference == null) { return emptyControl(); } if (typeof reference.toJS === 'function') { reference = reference.toJS(); } switch (typeof reference) { case 'string': case 'number': case 'boolean': return emptyControl(); } /** @type {?} */ const iterate = (iterable) => { /** @type {?} */ const array = new FormArray([]); this.registerInternals(array); for (let i = array.length; i > 0; i--) { array.removeAt(i); } for (const value of iterable) { /** @type {?} */ const transformed = this.transform(array, value); if (transformed) { array.push(transformed); } } return array; }; /** @type {?} */ const associate = (value) => { /** @type {?} */ const group = new FormGroup({}); group.setParent(parent); for (const key of Object.keys(value)) { /** @type {?} */ const transformed = this.transform(group, value[key]); if (transformed) { group.addControl(key, transformed); } } return group; }; if (Array.isArray(reference)) { return iterate((/** @type {?} */ (reference))); } else if (reference instanceof Set) { return iterate((/** @type {?} */ (reference))); } else if (reference instanceof Map) { return associate((/** @type {?} */ (reference))); } else if (reference instanceof Object) { return associate(reference); } else { throw new Error(`Cannot convert object of type ${typeof reference} / ${reference.toString()} to form element`); } } } ConnectArrayDirective.decorators = [ { type: Directive, args: [{ selector: '[connectArray]', providers: [ { provide: ControlContainer, useExisting: forwardRef(() => ConnectArrayDirective), }, ], },] } ]; /** @nocollapse */ ConnectArrayDirective.ctorParameters = () => [ { type: ControlContainer, decorators: [{ type: Optional }, { type: Host }, { type: SkipSelf }] }, { type: Array, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NG_VALIDATORS,] }] }, { type: Array, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NG_ASYNC_VALIDATORS,] }] }, { type: ConnectBase }, { type: TemplateRef }, { type: ViewContainerRef }, { type: FormStore } ]; ConnectArrayDirective.propDecorators = { connectArrayOf: [{ type: Input }] }; if (false) { /** * @type {?} * @private */ ConnectArrayDirective.prototype.stateSubscription; /** * @type {?} * @private */ ConnectArrayDirective.prototype.array; /** * @type {?} * @private */ ConnectArrayDirective.prototype.key; /** * @type {?} * @private */ ConnectArrayDirective.prototype.parent; /** * @type {?} * @private */ ConnectArrayDirective.prototype.rawValidators; /** * @type {?} * @private */ ConnectArrayDirective.prototype.rawAsyncValidators; /** * @type {?} * @private */ ConnectArrayDirective.prototype.connection; /** * @type {?} * @private */ ConnectArrayDirective.prototype.templateRef; /** * @type {?} * @private */ ConnectArrayDirective.prototype.viewContainerRef; /** * @type {?} * @private */ ConnectArrayDirective.prototype.store; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdC1hcnJheS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYW5ndWxhci1yZWR1eC9mb3JtLyIsInNvdXJjZXMiOlsiY29ubmVjdC1hcnJheS9jb25uZWN0LWFycmF5LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxVQUFVLEVBQ1YsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLElBQUksRUFDSixRQUFRLEVBQ1IsV0FBVyxFQUNYLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUVULG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsWUFBWSxFQUVaLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVdoRSxNQUFNLE9BQU8scUJBQXNCLFNBQVEsZ0JBQWdCOzs7Ozs7Ozs7O0lBUXpELFlBSVUsTUFBd0IsRUFJeEIsYUFBb0IsRUFJcEIsa0JBQXlCLEVBQ3pCLFVBQXVCLEVBQ3ZCLFdBQTZCLEVBQzdCLGdCQUFrQyxFQUNsQyxLQUFnQjtRQUV4QixLQUFLLEVBQUUsQ0FBQztRQWRBLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBSXhCLGtCQUFhLEdBQWIsYUFBYSxDQUFPO1FBSXBCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBTztRQUN6QixlQUFVLEdBQVYsVUFBVSxDQUFh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QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRW1iZWRkZWRWaWV3UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0LFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFNlbGYsXG4gIFNraXBTZWxmLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEFzeW5jVmFsaWRhdG9yRm4sXG4gIENvbnRyb2xDb250YWluZXIsXG4gIEZvcm1BcnJheSxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICBOR19BU1lOQ19WQUxJREFUT1JTLFxuICBOR19WQUxJREFUT1JTLFxuICBOZ01vZGVsR3JvdXAsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVbnN1YnNjcmliZSB9IGZyb20gJ3JlZHV4JztcblxuaW1wb3J0IHsgQ29ubmVjdEJhc2UgfSBmcm9tICcuLi9jb25uZWN0L2Nvbm5lY3QtYmFzZSc7XG5pbXBvcnQgeyBGb3JtU3RvcmUgfSBmcm9tICcuLi9mb3JtLXN0b3JlJztcbmltcG9ydCB7IGNvbnRyb2xQYXRoIH0gZnJvbSAnLi4vc2hpbXMnO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuLi9zdGF0ZSc7XG5pbXBvcnQgeyBDb25uZWN0QXJyYXlUZW1wbGF0ZSB9IGZyb20gJy4vY29ubmVjdC1hcnJheS10ZW1wbGF0ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjb25uZWN0QXJyYXldJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbm5lY3RBcnJheURpcmVjdGl2ZSksXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29ubmVjdEFycmF5RGlyZWN0aXZlIGV4dGVuZHMgQ29udHJvbENvbnRhaW5lclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdGF0ZVN1YnNjcmlwdGlvbjogVW5zdWJzY3JpYmU7XG5cbiAgcHJpdmF0ZSBhcnJheSA9IG5ldyBGb3JtQXJyYXkoW10pO1xuXG4gIHByaXZhdGUga2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEhvc3QoKVxuICAgIEBTa2lwU2VsZigpXG4gICAgcHJpdmF0ZSBwYXJlbnQ6IENvbnRyb2xDb250YWluZXIsXG4gICAgQE9wdGlvbmFsKClcbiAgICBAU2VsZigpXG4gICAgQEluamVjdChOR19WQUxJREFUT1JTKVxuICAgIHByaXZhdGUgcmF3VmFsaWRhdG9yczogYW55W10sXG4gICAgQE9wdGlvbmFsKClcbiAgICBAU2VsZigpXG4gICAgQEluamVjdChOR19BU1lOQ19WQUxJREFUT1JTKVxuICAgIHByaXZhdGUgcmF3QXN5bmNWYWxpZGF0b3JzOiBhbnlbXSxcbiAgICBwcml2YXRlIGNvbm5lY3Rpb246IENvbm5lY3RCYXNlLFxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgc3RvcmU6IEZvcm1TdG9yZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnN0b3JlLnN1YnNjcmliZShzdGF0ZSA9PlxuICAgICAgdGhpcy5yZXNldFN0YXRlKHN0YXRlKSxcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlckludGVybmFscyh0aGlzLmFycmF5KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBjb25uZWN0QXJyYXlPZihjb2xsZWN0aW9uOiBhbnkpIHtcbiAgICB0aGlzLmtleSA9IGNvbGxlY3Rpb247XG5cbiAgICB0aGlzLnJlc2V0U3RhdGUodGhpcy5zdG9yZS5nZXRTdGF0ZSgpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5hZGRDb250cm9sKHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua2V5IHx8ICcnO1xuICB9XG5cbiAgZ2V0IGNvbnRyb2woKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5hcnJheTtcbiAgfVxuXG4gIGdldCBmb3JtRGlyZWN0aXZlKCk6IEZvcm1Hcm91cERpcmVjdGl2ZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmZvcm1EaXJlY3RpdmUgYXMgRm9ybUdyb3VwRGlyZWN0aXZlO1xuICB9XG5cbiAgZ2V0IHBhdGgoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmtleSA/IGNvbnRyb2xQYXRoKHRoaXMua2V5LCB0aGlzLnBhcmVudCkgOiBbXTtcbiAgfVxuXG4gIGdldCB2YWxpZGF0b3IoKTogVmFsaWRhdG9yRm4gfCBudWxsIHtcbiAgICByZXR1cm4gVmFsaWRhdG9ycy5jb21wb3NlKHRoaXMucmF3VmFsaWRhdG9ycyk7XG4gIH1cblxuICBnZXQgYXN5bmNWYWxpZGF0b3IoKTogQXN5bmNWYWxpZGF0b3JGbiB8IG51bGwge1xuICAgIHJldHVybiBWYWxpZGF0b3JzLmNvbXBvc2VBc3luYyh0aGlzLnJhd0FzeW5jVmFsaWRhdG9ycyk7XG4gIH1cblxuICB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCkge1xuICAgIC8vIHN0dWI/XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcblxuICAgIGlmICh0aGlzLmtleSkge1xuICAgICAgdGhpcy5mb3JtRGlyZWN0aXZlLmZvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLmtleSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFN0YXRlKHN0YXRlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5rZXkgPT0gbnVsbCB8fCB0aGlzLmtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjsgLy8gbm8gc3RhdGUgdG8gcmV0cmVpdmUgaWYgbm8ga2V5IGlzIHNldFxuICAgIH1cblxuICAgIGNvbnN0IGl0ZXJhYmxlID0gU3RhdGUuZ2V0KHN0YXRlLCB0aGlzLmNvbm5lY3Rpb24ucGF0aC5jb25jYXQodGhpcy5wYXRoKSk7XG5cbiAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgY29uc3Qgdmlld1JlZiA9XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5sZW5ndGggPiBpbmRleFxuICAgICAgICAgID8gKHRoaXMudmlld0NvbnRhaW5lclJlZi5nZXQoaW5kZXgpIGFzIEVtYmVkZGVkVmlld1JlZjxcbiAgICAgICAgICAgICAgQ29ubmVjdEFycmF5VGVtcGxhdGVcbiAgICAgICAgICAgID4pXG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgICBpZiAodmlld1JlZiA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVtYmVkZGVkVmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXc8XG4gICAgICAgICAgQ29ubmVjdEFycmF5VGVtcGxhdGVcbiAgICAgICAgPihcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlUmVmLFxuICAgICAgICAgIG5ldyBDb25uZWN0QXJyYXlUZW1wbGF0ZShpbmRleCwgaW5kZXgsIHZhbHVlKSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnBhdGNoRGVzY2VuZGFudENvbnRyb2xzKGVtYmVkZGVkVmlld1JlZik7XG5cbiAgICAgICAgdGhpcy5hcnJheS5pbnNlcnQoXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5hcnJheSwgZW1iZWRkZWRWaWV3UmVmLmNvbnRleHQuaXRlbSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHZpZXdSZWYuY29udGV4dCxcbiAgICAgICAgICBuZXcgQ29ubmVjdEFycmF5VGVtcGxhdGUoaW5kZXgsIGluZGV4LCB2YWx1ZSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgICsraW5kZXg7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMudmlld0NvbnRhaW5lclJlZi5sZW5ndGggPiBpbmRleCkge1xuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLnJlbW92ZSh0aGlzLnZpZXdDb250YWluZXJSZWYubGVuZ3RoIC0gMSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckludGVybmFscyhhcnJheTogYW55KSB7XG4gICAgYXJyYXkucmVnaXN0ZXJDb250cm9sID0gKCkgPT4gdW5kZWZpbmVkO1xuICAgIGFycmF5LnJlZ2lzdGVyT25DaGFuZ2UgPSAoKSA9PiB1bmRlZmluZWQ7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICBfcmF3VmFsaWRhdG9yczoge1xuICAgICAgICB2YWx1ZTogdGhpcy5yYXdWYWxpZGF0b3JzIHx8IFtdLFxuICAgICAgfSxcbiAgICAgIF9yYXdBc3luY1ZhbGlkYXRvcnM6IHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmF3QXN5bmNWYWxpZGF0b3JzIHx8IFtdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2hEZXNjZW5kYW50Q29udHJvbHModmlld1JlZjogYW55KSB7XG4gICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0LmtleXModmlld1JlZi5fdmlldylcbiAgICAgIC5tYXAoayA9PiB2aWV3UmVmLl92aWV3W2tdKVxuICAgICAgLmZpbHRlcihjID0+IGMgaW5zdGFuY2VvZiBOZ01vZGVsR3JvdXApO1xuXG4gICAgZ3JvdXBzLmZvckVhY2goYyA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjLCB7XG4gICAgICAgIF9wYXJlbnQ6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcyxcbiAgICAgICAgfSxcbiAgICAgICAgX2NoZWNrUGFyZW50VHlwZToge1xuICAgICAgICAgIHZhbHVlOiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtKFxuICAgIHBhcmVudDogRm9ybUdyb3VwIHwgRm9ybUFycmF5LFxuICAgIHJlZmVyZW5jZTogYW55LFxuICApOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIGNvbnN0IGVtcHR5Q29udHJvbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wobnVsbCk7XG4gICAgICBjb250cm9sLnNldFBhcmVudChwYXJlbnQpO1xuICAgICAgcmV0dXJuIGNvbnRyb2w7XG4gICAgfTtcblxuICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVtcHR5Q29udHJvbCgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlLnRvSlMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlZmVyZW5jZSA9IHJlZmVyZW5jZS50b0pTKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlb2YgcmVmZXJlbmNlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gZW1wdHlDb250cm9sKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlcmF0ZSA9IChpdGVyYWJsZTogYW55KTogRm9ybUFycmF5ID0+IHtcbiAgICAgIGNvbnN0IGFycmF5ID0gbmV3IEZvcm1BcnJheShbXSk7XG5cbiAgICAgIHRoaXMucmVnaXN0ZXJJbnRlcm5hbHMoYXJyYXkpO1xuXG4gICAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGFycmF5LnJlbW92ZUF0KGkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gdGhpcy50cmFuc2Zvcm0oYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkKSB7XG4gICAgICAgICAgYXJyYXkucHVzaCh0cmFuc2Zvcm1lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH07XG5cbiAgICBjb25zdCBhc3NvY2lhdGUgPSAodmFsdWU6IGFueSk6IEZvcm1Hcm91cCA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgICAgZ3JvdXAuc2V0UGFyZW50KHBhcmVudCk7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHRoaXMudHJhbnNmb3JtKGdyb3VwLCB2YWx1ZVtrZXldKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkKSB7XG4gICAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIHRyYW5zZm9ybWVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlZmVyZW5jZSkpIHtcbiAgICAgIHJldHVybiBpdGVyYXRlKHJlZmVyZW5jZSBhcyBhbnlbXSk7XG4gICAgfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIHJldHVybiBpdGVyYXRlKHJlZmVyZW5jZSBhcyBTZXQ8YW55Pik7XG4gICAgfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIHJldHVybiBhc3NvY2lhdGUocmVmZXJlbmNlIGFzIE1hcDxzdHJpbmcsIGFueT4pO1xuICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICByZXR1cm4gYXNzb2NpYXRlKHJlZmVyZW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlICR7dHlwZW9mIHJlZmVyZW5jZX0gLyAke3JlZmVyZW5jZS50b1N0cmluZygpfSB0byBmb3JtIGVsZW1lbnRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==