UNPKG

ngx-mat-dynamic-form-builder

Version:

Build dynamic forms in Angular Material using Reactive forms.

149 lines 21.2 kB
import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core'; import { FormControl, Validators } from '@angular/forms'; import { map, startWith } from 'rxjs/operators'; import { isString } from 'lodash'; export class ChipSelectorComponent { constructor() { this.options = []; this.hint = ""; this.appearance = 'standard'; this.disabled = false; this.customChip = false; this.output = new EventEmitter(); this.visible = true; this.selectable = true; this.separatorKeysCodes = [ENTER, COMMA]; this.selectedObjects = []; } ngOnInit() { this.setupValidators(); } ngOnChanges(changes) { if (changes.options && this.options) { if (!this.formControl) this.setupValidators(); this.filteredObjects = this.formControl.valueChanges.pipe(startWith([]), map((obj) => { return obj ? this._filter(obj) : this.options.slice(); })); if (this.defaultOptions && this.defaultOptionsKey) { this.addDefaultSelected(this.defaultOptions); } } } setupValidators() { if (this.formControl) return; if (this.validators) { let isRequired = false; this.validators.forEach(vd => { if (vd.name === 'required') isRequired = true; }); if (isRequired) { this.formControl = new FormControl(this.selectedObjects, [Validators.required, this.valueSelected()]); } else { this.formControl = new FormControl(this.selectedObjects, [this.valueSelected()]); } } else if (!this.customChip) { this.formControl = new FormControl(this.selectedObjects, [this.valueSelected()]); } else { this.formControl = new FormControl(); } } add(event) { // Add fruit only when MatAutocomplete is not open // To make sure this does not conflict with OptionSelected Event if (!this.matAutocomplete.isOpen) { const input = event.input; const value = event.value; if (this.customChip && (value || '').trim()) { this.selectedObjects.push({ [this.displayKey]: value.trim() }); this.output.emit(this.selectedObjects); } // Reset the input value if (input) { input.value = ''; } } this.formControl.setValue(this.selectedObjects); this.formControl.updateValueAndValidity(); } remove(item) { this.updateFilteredObjects(); const index = this.selectedObjects.indexOf(item); if (index >= 0) { this.selectedObjects.splice(index, 1); this.output.emit(this.selectedObjects); } this.formControl.updateValueAndValidity(); } updateFilteredObjects() { this.filteredObjects = this.filteredObjects.pipe(map(data => data.filter(obj => !this.selectedObjects.includes(obj)))); } selected(event) { this.selectedObjects.push(event.option.value); this.output.emit(this.selectedObjects); this.updateFilteredObjects(); this.formInput.nativeElement.value = ''; this.formInput.nativeElement.blur(); this.formControl.setValue(this.selectedObjects); } addDefaultSelected(values) { if (!Array.isArray(values)) { console.error('Default values not an array'); return; } this.selectedObjects = this.options.filter(i => values.some(t => t === i[this.defaultOptionsKey])); this.output.emit(this.selectedObjects); this.updateFilteredObjects(); this.formControl.setValue(this.selectedObjects); } _filter(value) { if (isString(value) && value.length >= 1) { let filterValue = value.toLowerCase(); return this.options.filter(obj => obj[this.filterKey ? this.filterKey : this.displayKey]. toLowerCase().includes(filterValue)); } return this.options; } valueSelected() { return (c) => { // if value is set and it is not an object, valid option not selected if (c.value && typeof c.value !== 'object') { return { match: true }; } else { return null; } }; } } ChipSelectorComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-mat-chip-selector', template: "<mat-form-field [appearance]=\"appearance\" fxFlex>\r\n <mat-label>{{label}}</mat-label>\r\n <mat-chip-list #chipList>\r\n <mat-chip *ngFor=\"let obj of selectedObjects\" [selectable]=\"selectable\" [removable]=\"!disabled\"\r\n (removed)=\"remove(obj)\">\r\n {{obj[displayKey]}}\r\n <mat-icon matChipRemove *ngIf=\"!disabled\">cancel</mat-icon>\r\n </mat-chip>\r\n <input [placeholder]=\"placeholder\" [readonly]=\"disabled\" #formInput [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n (matChipInputTokenEnd)=\"add($event)\" [formControl]=\"formControl\">\r\n <mat-error *ngIf=\"!formControl.valid && formControl.touched\">Select valid option</mat-error>\r\n </mat-chip-list>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n <mat-option *ngFor=\"let obj of filteredObjects | async\" [value]=\"obj\">\r\n {{obj[displayKey]}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-hint>{{hint}} </mat-hint>\r\n</mat-form-field>", styles: [""] },] } ]; ChipSelectorComponent.propDecorators = { options: [{ type: Input }], defaultOptions: [{ type: Input }], defaultOptionsKey: [{ type: Input }], label: [{ type: Input }], placeholder: [{ type: Input }], displayKey: [{ type: Input }], filterKey: [{ type: Input }], hint: [{ type: Input }], appearance: [{ type: Input }], disabled: [{ type: Input }], customChip: [{ type: Input }], validators: [{ type: Input }], output: [{ type: Output }], formInput: [{ type: ViewChild, args: ['formInput',] }], matAutocomplete: [{ type: ViewChild, args: ['auto',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0LWR5bmFtaWMtZm9ybS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jaGlwLXNlbGVjdG9yL2NoaXAtc2VsZWN0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBYyxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxXQUFXLEVBQWUsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBSXZGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU9sQyxNQUFNLE9BQU8scUJBQXFCO0lBTGxDO1FBT1csWUFBTyxHQUFVLEVBQUUsQ0FBQztRQVNwQixTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLGVBQVUsR0FBVyxVQUFVLENBQUM7UUFDaEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBSTNCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBTzdDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHVCQUFrQixHQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRzlDLG9CQUFlLEdBQVUsRUFBRSxDQUFDO0lBK0g5QixDQUFDO0lBN0hDLFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVcsQ0FBQyxP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Q0FBQztJQUVPLGFBQWE7UUFDbkIsT0FBTyxDQUFDLENBQWtCLEVBQXFDLEVBQUU7WUFDL0QscUVBQXFFO1lBQ3JFLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLE9BQU8sSUFBSSxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDOzs7WUFqS0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLDhrQ0FBNkM7O2FBRTlDOzs7c0JBR0UsS0FBSzs2QkFFTCxLQUFLO2dDQUNMLEtBQUs7b0JBQ0wsS0FBSzswQkFDTCxLQUFLO3lCQUNMLEtBQUs7d0JBRUwsS0FBSzttQkFDTCxLQUFLO3lCQUNMLEtBQUs7dUJBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUVMLEtBQUs7cUJBRUwsTUFBTTt3QkFJTixTQUFTLFNBQUMsV0FBVzs4QkFDckIsU0FBUyxTQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT01NQSwgRU5URVIgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnbG9kYXNoJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LW1hdC1jaGlwLXNlbGVjdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2hpcC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hpcC1zZWxlY3Rvci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENoaXBTZWxlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQElucHV0KCkgb3B0aW9uczogYW55W10gPSBbXTtcclxuICAvLyBEZWZhdWx0IHNlbGVjdGVkIG9wdGlvbnMgKGFycmF5IG9mIHNlbGVjdGlvbiBrZXlzKVxyXG4gIEBJbnB1dCgpIGRlZmF1bHRPcHRpb25zOiBhbnlbXTtcclxuICBASW5wdXQoKSBkZWZhdWx0T3B0aW9uc0tleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNwbGF5S2V5OiBzdHJpbmc7XHJcbiAgLy8gSWYgZmlsdGVyS2V5IG5vdCBzcGVjaWZpZWQgZGVmYXVsdHMgdG8gZGlzcGxheUtleSB2YWx1ZVxyXG4gIEBJbnB1dCgpIGZpbHRlcktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGhpbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogc3RyaW5nID0gJ3N0YW5kYXJkJztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoaXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXTtcclxuXHJcbiAgQE91dHB1dCgpIG91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcblxyXG4gIGZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZm9ybUlucHV0JykgZm9ybUlucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2F1dG8nKSBtYXRBdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcclxuXHJcbiAgdmlzaWJsZSA9IHRydWU7XHJcbiAgc2VsZWN0YWJsZSA9IHRydWU7XHJcbiAgc2VwYXJhdG9yS2V5c0NvZGVzOiBudW1iZXJbXSA9IFtFTlRFUiwgQ09NTUFdO1xyXG5cclxuICBmaWx0ZXJlZE9iamVjdHM6IE9ic2VydmFibGU8YW55W10+O1xyXG4gIHNlbGVjdGVkT2JqZWN0czogYW55W10gPSBbXTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldHVwVmFsaWRhdG9ycygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMpIHtcclxuICAgICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKVxyXG4gICAgICAgIHRoaXMuc2V0dXBWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcclxuICAgICAgICBtYXAoKG9iajogc3RyaW5nIHwgbnVsbCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG9iaiA/IHRoaXMuX2ZpbHRlcihvYmopIDogdGhpcy5vcHRpb25zLnNsaWNlKClcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodGhpcy5kZWZhdWx0T3B0aW9ucyAmJiB0aGlzLmRlZmF1bHRPcHRpb25zS2V5KSB7XHJcbiAgICAgICAgdGhpcy5hZGREZWZhdWx0U2VsZWN0ZWQodGhpcy5kZWZhdWx0T3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldHVwVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm1Db250cm9sKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBpZiAodGhpcy52YWxpZGF0b3JzKSB7XHJcbiAgICAgIGxldCBpc1JlcXVpcmVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudmFsaWRhdG9ycy5mb3JFYWNoKHZkID0+IHtcclxuICAgICAgICBpZiAodmQubmFtZSA9PT0gJ3JlcXVpcmVkJylcclxuICAgICAgICAgIGlzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHRoaXMuc2VsZWN0ZWRPYmplY3RzLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy52YWx1ZVNlbGVjdGVkKCldKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHRoaXMuc2VsZWN0ZWRPYmplY3RzLCBbdGhpcy52YWx1ZVNlbGVjdGVkKCldKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICghdGhpcy5jdXN0b21DaGlwKSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5zZWxlY3RlZE9iamVjdHMsIFt0aGlzLnZhbHVlU2VsZWN0ZWQoKV0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gQWRkIGZydWl0IG9ubHkgd2hlbiBNYXRBdXRvY29tcGxldGUgaXMgbm90IG9wZW5cclxuICAgIC8vIFRvIG1ha2Ugc3VyZSB0aGlzIGRvZXMgbm90IGNvbmZsaWN0IHdpdGggT3B0aW9uU2VsZWN0ZWQgRXZlbnRcclxuICAgIGlmICghdGhpcy5tYXRBdXRvY29tcGxldGUuaXNPcGVuKSB7XHJcbiAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQuaW5wdXQ7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5jdXN0b21DaGlwICYmICh2YWx1ZSB8fCAnJykudHJpbSgpKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMucHVzaCh7IFt0aGlzLmRpc3BsYXlLZXldOiB2YWx1ZS50cmltKCkgfSk7XHJcbiAgICAgICAgdGhpcy5vdXRwdXQuZW1pdCh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJlc2V0IHRoZSBpbnB1dCB2YWx1ZVxyXG4gICAgICBpZiAoaW5wdXQpIHtcclxuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRPYmplY3RzKTtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKGl0ZW06IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJlZE9iamVjdHMoKTtcclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRPYmplY3RzLmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgdGhpcy5vdXRwdXQuZW1pdCh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaWx0ZXJlZE9iamVjdHMoKSB7XHJcbiAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHRoaXMuZmlsdGVyZWRPYmplY3RzLnBpcGUoXHJcbiAgICAgIG1hcChkYXRhID0+XHJcbiAgICAgICAgZGF0YS5maWx0ZXIob2JqID0+ICF0aGlzLnNlbGVjdGVkT2JqZWN0cy5pbmNsdWRlcyhvYmopKVxyXG4gICAgICApXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdHMucHVzaChldmVudC5vcHRpb24udmFsdWUpO1xyXG4gICAgdGhpcy5vdXRwdXQuZW1pdCh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJlZE9iamVjdHMoKTtcclxuICAgIHRoaXMuZm9ybUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIHRoaXMuZm9ybUlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgfVxyXG5cclxuICBhZGREZWZhdWx0U2VsZWN0ZWQodmFsdWVzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRGVmYXVsdCB2YWx1ZXMgbm90IGFuIGFycmF5Jyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzID0gdGhpcy5vcHRpb25zLmZpbHRlcihpID0+IHZhbHVlcy5zb21lKHQgPT4gdCA9PT0gaVt0aGlzLmRlZmF1bHRPcHRpb25zS2V5XSkpO1xyXG4gICAgdGhpcy5vdXRwdXQuZW1pdCh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkT2JqZWN0cygpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9maWx0ZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID49IDEpIHtcclxuICAgICAgbGV0IGZpbHRlclZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmlsdGVyKG9iaiA9PiBvYmpbdGhpcy5maWx0ZXJLZXkgPyB0aGlzLmZpbHRlcktleSA6IHRoaXMuZGlzcGxheUtleV0uXHJcbiAgICAgICAgdG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsdWVTZWxlY3RlZCgpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICByZXR1cm4gKGM6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHwgbnVsbCA9PiB7XHJcbiAgICAgIC8vIGlmIHZhbHVlIGlzIHNldCBhbmQgaXQgaXMgbm90IGFuIG9iamVjdCwgdmFsaWQgb3B0aW9uIG5vdCBzZWxlY3RlZFxyXG4gICAgICBpZiAoYy52YWx1ZSAmJiB0eXBlb2YgYy52YWx1ZSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4geyBtYXRjaDogdHJ1ZSB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=