UNPKG

ngx-schema-forms

Version:

New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo

282 lines (281 loc) 25.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, ContentChildren, QueryList, ElementRef, EventEmitter } from '@angular/core'; import { merge } from 'rxjs'; import { filter } from 'rxjs/operators'; import { ActionRegistry } from '../../model/actionregistry'; import { SchemaPropertyType } from '../../schema'; import { TemplateSchemaService } from '../template-schema.service'; import { ButtonComponent } from '../button/button.component'; import { FieldParent } from './field-parent'; import { ItemComponent } from './item/item.component'; import { TemplateSchemaElementRegistry } from '../template-schema-element-registry'; export class FieldComponent extends FieldParent { /** * @param {?} elementRef * @param {?} templateSchemaService * @param {?} templateRegistry * @param {?} actionRegistry */ constructor(elementRef, templateSchemaService, templateRegistry, actionRegistry) { super(); this.elementRef = elementRef; this.templateSchemaService = templateSchemaService; this.templateRegistry = templateRegistry; this.actionRegistry = actionRegistry; this.schema = {}; // changes that can be reflected in the widget components without rebuild this.changes = new EventEmitter(); } /** * @return {?} */ getSchema() { const { properties, items, required } = this.getFieldsSchema(this.childFields.filter(field => field !== this)); /** @type {?} */ const oneOf = this.getOneOf(); /** @type {?} */ let type; if (!this.type && properties) { type = SchemaPropertyType.Object; } else if (!this.type) { type = SchemaPropertyType.String; } else { type = this.type; } /** @type {?} */ const schema = /** @type {?} */ ({ type }); if (this.title !== undefined) { schema.title = this.title; } if (properties !== undefined) { schema.properties = properties; } if (items !== undefined) { schema.items = items; } // requried child fields if (required !== undefined) { schema.required = required; } if (oneOf !== undefined) { schema.oneOf = oneOf; } if (this.description !== undefined) { schema.description = this.description; } if (this.placeholder !== undefined) { schema.placeholder = this.placeholder; } if (this.format !== undefined) { schema.format = this.format; } if (this.widget !== undefined) { schema.widget = this.widget; } if (this.readOnly !== undefined) { schema.readOnly = this.readOnly; } /** @type {?} */ const buttons = this.getButtons(); if (buttons.length > 0) { schema.buttons = buttons; } // @Input schema takes precedence return Object.assign(schema, this.schema); } /** * @return {?} */ getValidators() { /** @type {?} */ const childValidators = this.getFieldsValidators(/** @type {?} */ (this.childFields.filter(field => field !== this))); /** @type {?} */ const _validators = childValidators.map(({ path, validators }) => { return { path: this.path + path, validators }; }); if (!this.validators) { return _validators; } _validators.push({ path: this.path, validators: this.validators }); return _validators; } /** * @param {?=} parentFieldPath * @return {?} */ register(parentFieldPath = '') { /** @type {?} */ const path = parentFieldPath + this.path; this.templateRegistry.register(path, this); if (this.childFields.length) { this.childFields.forEach((field) => { if (field === this) { return; } field.register(path); }); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { // TODO check for particular properties change (widget.id, validator, etc.) if (changes["type"] || changes["name"] || changes["format"] || changes["validators"]) { this.templateSchemaService.changed(); } else { // changes that dont need to rebuild the schema if (this.childFields) { /** @type {?} */ const schema = this.getSchema(); delete schema.name; delete schema.format; if (typeof schema.widget === 'string') { delete schema.widget; } else if (schema.widget && schema.width.id) { delete schema.widget.id; } this.changes.emit(schema); } } /* // this is old way to update controls on field input changes, // now we have the to types, changes that need rebuild of schema and the // ones that not rebuilding schema const keys = Object.keys(changes); for (const key of keys) { if (!changes[key].isFirstChange()) { // on any input change, force schema change generation this.templateSchemaService.changed(); break; } } */ } /** * @return {?} */ getOneOf() { if (this.childItems.length === 0) { return; } /** @type {?} */ const items = this.childItems.map(({ value, description }) => { if (!Array.isArray(value)) { return { enum: [value], description }; } return { enum: value, description }; }); if (items.length === 0) { return; } return items; } /** * @return {?} */ setTitleFromContent() { /** @type {?} */ const textContent = this.getTextContent(this.elementRef); // title as @Input takes priority over content text if (textContent && !this.title) { this.title = textContent; } } /** * @return {?} */ ngAfterContentInit() { // cache it this.setTitleFromContent(); merge(this.childFields.changes, this.childItems.changes, this.childButtons.changes) .pipe(filter((value) => Boolean(value))) .subscribe(() => { this.templateSchemaService.changed(); }); } } FieldComponent.decorators = [ { type: Component, args: [{ selector: 'sf-field', template: `<ng-content ></ng-content> ` }] } ]; /** @nocollapse */ FieldComponent.ctorParameters = () => [ { type: ElementRef }, { type: TemplateSchemaService }, { type: TemplateSchemaElementRegistry }, { type: ActionRegistry } ]; FieldComponent.propDecorators = { childFields: [{ type: ContentChildren, args: [FieldComponent,] }], childItems: [{ type: ContentChildren, args: [ItemComponent,] }], childButtons: [{ type: ContentChildren, args: [ButtonComponent,] }], name: [{ type: Input }], type: [{ type: Input }], format: [{ type: Input }], required: [{ type: Input }], readOnly: [{ type: Input }], title: [{ type: Input }], description: [{ type: Input }], placeholder: [{ type: Input }], widget: [{ type: Input }], validators: [{ type: Input }], schema: [{ type: Input }] }; if (false) { /** @type {?} */ FieldComponent.prototype.childFields; /** @type {?} */ FieldComponent.prototype.childItems; /** @type {?} */ FieldComponent.prototype.childButtons; /** @type {?} */ FieldComponent.prototype.name; /** @type {?} */ FieldComponent.prototype.type; /** @type {?} */ FieldComponent.prototype.format; /** @type {?} */ FieldComponent.prototype.required; /** @type {?} */ FieldComponent.prototype.readOnly; /** @type {?} */ FieldComponent.prototype.title; /** @type {?} */ FieldComponent.prototype.description; /** @type {?} */ FieldComponent.prototype.placeholder; /** @type {?} */ FieldComponent.prototype.widget; /** @type {?} */ FieldComponent.prototype.validators; /** @type {?} */ FieldComponent.prototype.schema; /** @type {?} */ FieldComponent.prototype.changes; /** @type {?} */ FieldComponent.prototype.elementRef; /** @type {?} */ FieldComponent.prototype.templateSchemaService; /** @type {?} */ FieldComponent.prototype.templateRegistry; /** @type {?} */ FieldComponent.prototype.actionRegistry; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi90ZW1wbGF0ZS1zY2hlbWEvZmllbGQvZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFJTCxlQUFlLEVBRWYsU0FBUyxFQUNULFVBQVUsRUFLVixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUdsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsNkJBQTZCLEVBQzlCLE1BQU0scUNBQXFDLENBQUM7QUFTN0MsTUFBTSxxQkFBc0IsU0FBUSxXQUFXOzs7Ozs7O0lBZ0Q3QyxZQUNVLFlBQ0EsdUJBQ0UsZ0JBQStDLEVBQy9DLGNBQThCO1FBRXhDLEtBQUssRUFBRSxDQUFDO1FBTEEsZUFBVSxHQUFWLFVBQVU7UUFDViwwQkFBcUIsR0FBckIscUJBQXFCO1FBQ25CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBK0I7UUFDL0MsbUJBQWMsR0FBZCxjQUFjLENBQWdCO3NCQVQ1QixFQUFHOzt1QkFHUCxJQUFJLFlBQVksRUFBRTtLQVMzQjs7OztJQUVELFNBQVM7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Q3BCLFFBQVEsRUFBRTtDQUNYO2FBQ0E7Ozs7WUFoQ0MsVUFBVTtZQWdCSCxxQkFBcUI7WUFPNUIsNkJBQTZCO1lBWHRCLGNBQWM7OzswQkF3QnBCLGVBQWUsU0FBQyxjQUFjO3lCQUc5QixlQUFlLFNBQUMsYUFBYTsyQkFHN0IsZUFBZSxTQUFDLGVBQWU7bUJBRy9CLEtBQUs7bUJBR0wsS0FBSztxQkFHTCxLQUFLO3VCQUdMLEtBQUs7dUJBR0wsS0FBSztvQkFHTCxLQUFLOzBCQUdMLEtBQUs7MEJBR0wsS0FBSztxQkFHTCxLQUFLO3lCQUdMLEtBQUs7cUJBR0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgT25Jbml0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFZpZXdDaGlsZCxcbiAgUXVlcnlMaXN0LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2UsXG4gIE9uQ2hhbmdlcyxcbiAgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9hY3Rpb24nO1xuaW1wb3J0IHsgQWN0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9tb2RlbC9hY3Rpb25yZWdpc3RyeSc7XG5pbXBvcnQgeyBTY2hlbWFQcm9wZXJ0eVR5cGUgfSBmcm9tICcuLi8uLi9zY2hlbWEnO1xuXG5pbXBvcnQgeyBUZW1wbGF0ZVNjaGVtYUVsZW1lbnQgfSBmcm9tICcuLi90ZW1wbGF0ZS1zY2hlbWEtZWxlbWVudCc7XG5pbXBvcnQgeyBUZW1wbGF0ZVNjaGVtYVNlcnZpY2UgfSBmcm9tICcuLi90ZW1wbGF0ZS1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEZpZWxkUGFyZW50IH0gZnJvbSAnLi9maWVsZC1wYXJlbnQnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL2ZpZWxkJztcbmltcG9ydCB7IEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2l0ZW0vaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbn0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hLWVsZW1lbnQtcmVnaXN0cnknO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2YtZmllbGQnLFxuICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50ID48L25nLWNvbnRlbnQ+XG5gXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkQ29tcG9uZW50IGV4dGVuZHMgRmllbGRQYXJlbnRcbmltcGxlbWVudHMgRmllbGQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGaWVsZENvbXBvbmVudClcbiAgY2hpbGRGaWVsZHM6IFF1ZXJ5TGlzdDxGaWVsZENvbXBvbmVudD47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihJdGVtQ29tcG9uZW50KVxuICBjaGlsZEl0ZW1zOiBRdWVyeUxpc3Q8SXRlbUNvbXBvbmVudD47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25Db21wb25lbnQpXG4gIGNoaWxkQnV0dG9uczogUXVlcnlMaXN0PEJ1dHRvbkNvbXBvbmVudD47XG5cbiAgQElucHV0KClcbiAgbmFtZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHR5cGU6IFNjaGVtYVByb3BlcnR5VHlwZTtcblxuICBASW5wdXQoKVxuICBmb3JtYXQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICByZXF1aXJlZDogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICByZWFkT25seTogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICBASW5wdXQoKVxuICB3aWRnZXQ6IHN0cmluZyB8IG9iamVjdDtcblxuICBASW5wdXQoKVxuICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbiB8IFZhbGlkYXRvckZuW107XG5cbiAgQElucHV0KClcbiAgc2NoZW1hOiBhbnkgPSB7IH07XG5cbiAgLy8gY2hhbmdlcyB0aGF0IGNhbiBiZSByZWZsZWN0ZWQgaW4gdGhlIHdpZGdldCBjb21wb25lbnRzIHdpdGhvdXQgcmVidWlsZFxuICBjaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHRlbXBsYXRlU2NoZW1hU2VydmljZTogVGVtcGxhdGVTY2hlbWFTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0ZW1wbGF0ZVJlZ2lzdHJ5OiBUZW1wbGF0ZVNjaGVtYUVsZW1lbnRSZWdpc3RyeSxcbiAgICBwcm90ZWN0ZWQgYWN0aW9uUmVnaXN0cnk6IEFjdGlvblJlZ2lzdHJ5LFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0U2NoZW1hKCk6IGFueSB7XG5cbiAgICBjb25zdCB7IHByb3BlcnRpZXMsIGl0ZW1zLCByZXF1aXJlZCB9ID0gdGhpcy5nZXRGaWVsZHNTY2hlbWEoXG4gICAgICB0aGlzLmNoaWxkRmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZCAhPT0gdGhpcylcbiAgICApO1xuXG4gICAgY29uc3Qgb25lT2YgPSB0aGlzLmdldE9uZU9mKCk7XG5cbiAgICBsZXQgdHlwZTogc3RyaW5nO1xuICAgIGlmICghdGhpcy50eXBlICYmIHByb3BlcnRpZXMpIHtcbiAgICAgIHR5cGUgPSBTY2hlbWFQcm9wZXJ0eVR5cGUuT2JqZWN0O1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudHlwZSkge1xuICAgICAgdHlwZSA9IFNjaGVtYVByb3BlcnR5VHlwZS5TdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gPGFueT57XG4gICAgICB0eXBlXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS50aXRsZSA9IHRoaXMudGl0bGU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIGlmIChpdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuaXRlbXMgPSBpdGVtcztcbiAgICB9XG5cbiAgICAvLyByZXF1cmllZCBjaGlsZCBmaWVsZHNcbiAgICBpZiAocmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnJlcXVpcmVkID0gcmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgaWYgKG9uZU9mICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5vbmVPZiA9IG9uZU9mO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5kZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb3JtYXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLmZvcm1hdCA9IHRoaXMuZm9ybWF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpZGdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEud2lkZ2V0ID0gdGhpcy53aWRnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZE9ubHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnJlYWRPbmx5ID0gdGhpcy5yZWFkT25seTtcbiAgICB9XG5cbiAgICBjb25zdCBidXR0b25zID0gdGhpcy5nZXRCdXR0b25zKCk7XG4gICAgaWYgKGJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgc2NoZW1hLmJ1dHRvbnMgPSBidXR0b25zO1xuICAgIH1cblxuICAgIC8vIEBJbnB1dCBzY2hlbWEgdGFrZXMgcHJlY2VkZW5jZVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHNjaGVtYSwgdGhpcy5zY2hlbWEpO1xuXG4gIH1cblxuICBnZXRWYWxpZGF0b3JzKCk6IHsgcGF0aDogc3RyaW5nLCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbiB8IFZhbGlkYXRvckZuW10gfVtdIHtcblxuICAgIC8vIHJlZ2lzdGVyaW5nIHZhbGlkYXRvciBoZXJlIGlzIG5vdCBwb3NzaWJsZSBzaW5jZSBwcm9wIGZ1bGwgcGF0aCBpcyBuZWVkZWRcbiAgICBjb25zdCBjaGlsZFZhbGlkYXRvcnMgPSB0aGlzLmdldEZpZWxkc1ZhbGlkYXRvcnMoXG4gICAgICA8RmllbGRbXT50aGlzLmNoaWxkRmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZCAhPT0gdGhpcylcbiAgICApO1xuICAgIGNvbnN0IF92YWxpZGF0b3JzID0gY2hpbGRWYWxpZGF0b3JzLm1hcCgoeyBwYXRoLCB2YWxpZGF0b3JzIH0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHRoaXMucGF0aCArIHBhdGgsXG4gICAgICAgIHZhbGlkYXRvcnNcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdG9ycykge1xuICAgICAgcmV0dXJuIF92YWxpZGF0b3JzO1xuICAgIH1cblxuICAgIF92YWxpZGF0b3JzLnB1c2goeyBwYXRoOiB0aGlzLnBhdGgsIHZhbGlkYXRvcnM6IHRoaXMudmFsaWRhdG9ycyB9KTtcbiAgICByZXR1cm4gX3ZhbGlkYXRvcnM7XG4gIH1cblxuICByZWdpc3RlcihwYXJlbnRGaWVsZFBhdGggPSAnJykge1xuICAgIGNvbnN0IHBhdGggPSBwYXJlbnRGaWVsZFBhdGggKyB0aGlzLnBhdGg7XG4gICAgdGhpcy50ZW1wbGF0ZVJlZ2lzdHJ5LnJlZ2lzdGVyKHBhdGgsIHRoaXMpO1xuICAgIGlmICh0aGlzLmNoaWxkRmllbGRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGlsZEZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICBpZiAoZmllbGQgPT09IHRoaXMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZC5yZWdpc3RlcihwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblxuICAgIC8vIFRPRE8gY2hlY2sgZm9yIHBhcnRpY3VsYXIgcHJvcGVydGllcyBjaGFuZ2UgKHdpZGdldC5pZCwgdmFsaWRhdG9yLCBldGMuKVxuICAgIGlmIChjaGFuZ2VzLnR5cGUgfHwgY2hhbmdlcy5uYW1lIHx8IGNoYW5nZXMuZm9ybWF0IHx8IGNoYW5nZXMudmFsaWRhdG9ycykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVNjaGVtYVNlcnZpY2UuY2hhbmdlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjaGFuZ2VzIHRoYXQgZG9udCBuZWVkIHRvIHJlYnVpbGQgdGhlIHNjaGVtYVxuICAgICAgaWYgKHRoaXMuY2hpbGRGaWVsZHMpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoKTtcbiAgICAgICAgZGVsZXRlIHNjaGVtYS5uYW1lO1xuICAgICAgICBkZWxldGUgc2NoZW1hLmZvcm1hdDtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEud2lkZ2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlbGV0ZSBzY2hlbWEud2lkZ2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS53aWRnZXQgJiYgc2NoZW1hLndpZHRoLmlkKSB7XG4gICAgICAgICAgZGVsZXRlIHNjaGVtYS53aWRnZXQuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoc2NoZW1hKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgIC8vIHRoaXMgaXMgb2xkIHdheSB0byB1cGRhdGUgY29udHJvbHMgb24gZmllbGQgaW5wdXQgY2hhbmdlcyxcbiAgICAvLyBub3cgd2UgaGF2ZSB0aGUgdG8gdHlwZXMsIGNoYW5nZXMgdGhhdCBuZWVkIHJlYnVpbGQgb2Ygc2NoZW1hIGFuZCB0aGVcbiAgICAvLyBvbmVzIHRoYXQgbm90IHJlYnVpbGRpbmcgc2NoZW1hXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNoYW5nZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICghY2hhbmdlc1trZXldLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICAvLyBvbiBhbnkgaW5wdXQgY2hhbmdlLCBmb3JjZSBzY2hlbWEgY2hhbmdlIGdlbmVyYXRpb25cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVNjaGVtYVNlcnZpY2UuY2hhbmdlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgICovXG5cblxuICB9XG5cblxuICBwcml2YXRlIGdldE9uZU9mKCkge1xuXG4gICAgaWYgKHRoaXMuY2hpbGRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuY2hpbGRJdGVtcy5tYXAoKHsgdmFsdWUsIGRlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgZW51bTogW3ZhbHVlXSwgZGVzY3JpcHRpb24gfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZW51bTogdmFsdWUsIGRlc2NyaXB0aW9uIH07XG4gICAgfSk7XG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cblxuICBwcml2YXRlIHNldFRpdGxlRnJvbUNvbnRlbnQoKSB7XG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSB0aGlzLmdldFRleHRDb250ZW50KHRoaXMuZWxlbWVudFJlZik7XG5cbiAgICAvLyAgdGl0bGUgYXMgQElucHV0IHRha2VzIHByaW9yaXR5IG92ZXIgY29udGVudCB0ZXh0XG4gICAgaWYgKHRleHRDb250ZW50ICYmICF0aGlzLnRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuXG4gICAgLy8gY2FjaGUgaXRcbiAgICB0aGlzLnNldFRpdGxlRnJvbUNvbnRlbnQoKTtcblxuICAgIG1lcmdlKFxuICAgICAgdGhpcy5jaGlsZEZpZWxkcy5jaGFuZ2VzLFxuICAgICAgdGhpcy5jaGlsZEl0ZW1zLmNoYW5nZXMsXG4gICAgICB0aGlzLmNoaWxkQnV0dG9ucy5jaGFuZ2VzXG4gICAgKVxuICAgIC5waXBlKGZpbHRlcigodmFsdWUpID0+IEJvb2xlYW4odmFsdWUpKSlcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudGVtcGxhdGVTY2hlbWFTZXJ2aWNlLmNoYW5nZWQoKTtcbiAgICB9KTtcbiAgfVxuXG59XG4iXX0=