UNPKG

@junte/ui

Version:

Quality Angular UI components kit

204 lines 21 kB
import { __decorate, __metadata } from "tslib"; import { animate, state, style, transition, trigger } from '@angular/animations'; import { Component, ContentChild, ContentChildren, EventEmitter, HostBinding, HostListener, Input, Output, QueryList, TemplateRef } from '@angular/core'; import { FormArray, FormGroup } from '@angular/forms'; import { NGXLogger } from 'ngx-logger'; import { MethodApi, PropertyApi } from '../../core/decorators/api'; import { Height } from '../../core/enums/height'; import { State } from '../../core/enums/state'; import { UI } from '../../core/enums/ui'; import { FormControlComponent } from './control/form-control.component'; let FormComponent = class FormComponent { constructor(logger) { this.logger = logger; this.host = 'jnt-form-host'; this.ui = UI; this._state = { success: false }; this._height = Height.default; this.submitted = new EventEmitter(); this.checked = new EventEmitter(); } set height(height) { this._height = height || Height.default; } success() { this._state.success = true; setTimeout(() => this._state.success = false, 2100); } ngOnInit() { if (!!this.form) { this.form.statusChanges.subscribe(() => { this.render(); this.checked.emit(this.check(this.form)); }); } } render() { this.logger.debug('render form'); if (!!this.controls) { this.controls.filter(component => !!component.name && !!component.messages.length) .forEach(component => component.check()); } } check(form) { this.logger.debug('check form'); let errors = []; for (const key in form.controls) { const control = form.controls[key]; if (control instanceof FormGroup || control instanceof FormArray) { errors = errors.concat(this.check(control)); } else { if (!!control.errors && control.dirty) { errors.push(control); } } } this.logger.debug('controls have errors = ', errors.map(e => e.name)); return errors; } /** * @deprecated please use submit() instead */ onSubmit() { this.submit(); } submit() { this.logger.debug('submit form'); if (!!this.form) { this.validate(this.form); if (this.form.valid) { this.submitted.emit(); this.refresh(this.form); } } } validate(form) { this.logger.debug('validate form'); for (const key in form.controls) { const control = form.controls[key]; if (control instanceof FormGroup || control instanceof FormArray) { this.validate(control); } else { control.markAsDirty(); control.updateValueAndValidity({ emitEvent: false }); } } this.render(); this.checked.emit(this.check(this.form)); } refresh(form) { this.logger.debug('refresh form'); for (const key in form.controls) { const control = form.controls[key]; if (control instanceof FormGroup || control instanceof FormArray) { this.refresh(control); } else { control.markAsPristine(); } } } }; FormComponent.ctorParameters = () => [ { type: NGXLogger } ]; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], FormComponent.prototype, "host", void 0); __decorate([ HostBinding('attr.data-height'), __metadata("design:type", String) ], FormComponent.prototype, "_height", void 0); __decorate([ PropertyApi({ description: 'Name form group', type: 'FormGroup', }), Input('formGroup'), __metadata("design:type", FormGroup) ], FormComponent.prototype, "form", void 0); __decorate([ PropertyApi({ description: 'Title for form', type: 'string', }), Input(), __metadata("design:type", String) ], FormComponent.prototype, "title", void 0); __decorate([ PropertyApi({ description: 'State of form', path: 'ui.state', options: [State.error, State.loading] }), Input(), __metadata("design:type", String) ], FormComponent.prototype, "state", void 0); __decorate([ PropertyApi({ description: 'Height of form', path: 'ui.height', options: [Height.default, Height.fluid], default: Height.default }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], FormComponent.prototype, "height", null); __decorate([ ContentChild('formTitleTemplate'), __metadata("design:type", TemplateRef) ], FormComponent.prototype, "titleTemplate", void 0); __decorate([ ContentChild('formFooterTemplate'), __metadata("design:type", TemplateRef) ], FormComponent.prototype, "footerTemplate", void 0); __decorate([ ContentChildren(FormControlComponent, { descendants: true }), __metadata("design:type", QueryList) ], FormComponent.prototype, "controls", void 0); __decorate([ Output(), __metadata("design:type", Object) ], FormComponent.prototype, "submitted", void 0); __decorate([ Output(), __metadata("design:type", Object) ], FormComponent.prototype, "checked", void 0); __decorate([ MethodApi({ description: 'show success animation' }), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], FormComponent.prototype, "success", null); __decorate([ HostListener('submit'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], FormComponent.prototype, "submit", null); FormComponent = __decorate([ Component({ selector: 'jnt-form', template: "<form child-of=\"jnt-form-host\" >\n <header child-of=\"jnt-form-host\" *ngIf=\"!!title || !!titleTemplate\">\n <h3 child-of=\"jnt-form-host\" *ngIf=\"!!title && !titleTemplate\">{{title}}</h3>\n <ng-container *ngIf=\"!!titleTemplate\">\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n </ng-container>\n </header>\n\n <div child-of=\"jnt-form-host\" data-content>\n <ng-content></ng-content>\n </div>\n\n <footer child-of=\"jnt-form-host\" *ngIf=\"!!footerTemplate\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </footer>\n\n <div child-of=\"jnt-form-host\" data-loading *ngIf=\"state === ui.state.loading\">\n <jnt-spinner child-of=\"jnt-form-host\" [size]=\"ui.size.large\"></jnt-spinner>\n </div>\n <div child-of=\"jnt-form-host\" data-error *ngIf=\"state === ui.state.error\">\n <jnt-icon child-of=\"jnt-form-host\" [icon]=\"ui.icons.sad\"></jnt-icon>\n </div>\n <div child-of=\"jnt-form-host\" data-success *ngIf=\"_state.success\" [@success]=\"_state.success\">\n <jnt-icon child-of=\"jnt-form-host\" [icon]=\"ui.icons.animated.success\"></jnt-icon>\n </div>\n</form>", animations: [ trigger('success', [ state('void', style({ opacity: 0 })), state('*', style({ opacity: 1 })), transition('void <=> *', [ animate('.3s ease-in-out') ]), ]), ] }), __metadata("design:paramtypes", [NGXLogger]) ], FormComponent); export { FormComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AanVudGUvdWkvIiwic291cmNlcyI6WyJsaWIvZm9ybXMvZm9ybS9mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTZCeEUsSUFBYSxhQUFhLEdBQTFCLE1BQWEsYUFBYTtJQWlFeEIsWUFBb0IsTUFBaUI7UUFBakIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQTlENUIsU0FBSSxHQUFHLGVBQWUsQ0FBQztRQUVoQyxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBRVIsV0FBTSxHQUFHLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFDO1FBRzFCLFlBQU8sR0FBVyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBNENqQyxjQUFT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TSxFQUFFOzs4Q0FDdUM7QUFHaEQ7SUFEQyxTQUFTLENBQUMsRUFBQyxXQUFXLEVBQUUsd0JBQXdCLEVBQUMsQ0FBQzs7Ozs0Q0FJbEQ7QUFnREQ7SUFEQyxZQUFZLENBQUMsUUFBUSxDQUFDOzs7OzJDQVd0QjtBQXpIVSxhQUFhO0lBM0J6QixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsVUFBVTtRQUNwQixzcENBQXVDO1FBQ3ZDLFVBQVUsRUFBRTtZQUNWLE9BQU8sQ0FBQyxTQUFTLEVBQUU7Z0JBQ2YsS0FBSyxDQUNILE1BQU0sRUFDTixLQUFLLENBQUM7b0JBQ0osT0FBTyxFQUFFLENBQUM7aUJBQ1gsQ0FBQyxDQUNIO2dCQUNELEtBQUssQ0FDSCxHQUFHLEVBQ0gsS0FBSyxDQUFDO29CQUNKLE9BQU8sRUFBRSxDQUFDO2lCQUNYLENBQUMsQ0FDSDtnQkFDRCxVQUFVLENBQ1IsWUFBWSxFQUNaO29CQUNFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztpQkFDM0IsQ0FDRjthQUNGLENBQ0Y7U0FDRjtLQUNGLENBQUM7cUNBa0U0QixTQUFTO0dBakUxQixhQUFhLENBd0p6QjtTQXhKWSxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICduZ3gtbG9nZ2VyJztcbmltcG9ydCB7IE1ldGhvZEFwaSwgUHJvcGVydHlBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2RlY29yYXRvcnMvYXBpJztcbmltcG9ydCB7IEhlaWdodCB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvaGVpZ2h0JztcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9zdGF0ZSc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvdWknO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xDb21wb25lbnQgfSBmcm9tICcuL2NvbnRyb2wvZm9ybS1jb250cm9sLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2pudC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uZW5jYXBzdWxhdGVkLmh0bWwnLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignc3VjY2VzcycsIFtcbiAgICAgICAgc3RhdGUoXG4gICAgICAgICAgJ3ZvaWQnLFxuICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICBzdGF0ZShcbiAgICAgICAgICAnKicsXG4gICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHRyYW5zaXRpb24oXG4gICAgICAgICAgJ3ZvaWQgPD0+IConLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGFuaW1hdGUoJy4zcyBlYXNlLWluLW91dCcpXG4gICAgICAgICAgXVxuICAgICAgICApLFxuICAgICAgXVxuICAgICksXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKVxuICByZWFkb25seSBob3N0ID0gJ2pudC1mb3JtLWhvc3QnO1xuXG4gIHVpID0gVUk7XG5cbiAgX3N0YXRlID0ge3N1Y2Nlc3M6IGZhbHNlfTtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1oZWlnaHQnKVxuICBfaGVpZ2h0OiBIZWlnaHQgPSBIZWlnaHQuZGVmYXVsdDtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnTmFtZSBmb3JtIGdyb3VwJyxcbiAgICB0eXBlOiAnRm9ybUdyb3VwJyxcbiAgfSlcbiAgQElucHV0KCdmb3JtR3JvdXAnKVxuICBmb3JtOiBGb3JtR3JvdXA7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBmb3JtJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSlcbiAgQElucHV0KClcbiAgdGl0bGU6IHN0cmluZztcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhdGUgb2YgZm9ybScsXG4gICAgcGF0aDogJ3VpLnN0YXRlJyxcbiAgICBvcHRpb25zOiBbU3RhdGUuZXJyb3IsIFN0YXRlLmxvYWRpbmddXG4gIH0pXG4gIEBJbnB1dCgpXG4gIHN0YXRlOiBTdGF0ZTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnSGVpZ2h0IG9mIGZvcm0nLFxuICAgIHBhdGg6ICd1aS5oZWlnaHQnLFxuICAgIG9wdGlvbnM6IFtIZWlnaHQuZGVmYXVsdCwgSGVpZ2h0LmZsdWlkXSxcbiAgICBkZWZhdWx0OiBIZWlnaHQuZGVmYXVsdFxuICB9KVxuICBASW5wdXQoKSBzZXQgaGVpZ2h0KGhlaWdodDogSGVpZ2h0KSB7XG4gICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0IHx8IEhlaWdodC5kZWZhdWx0O1xuICB9XG5cbiAgQENvbnRlbnRDaGlsZCgnZm9ybVRpdGxlVGVtcGxhdGUnKVxuICB0aXRsZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2Zvcm1Gb290ZXJUZW1wbGF0ZScpXG4gIGZvb3RlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oRm9ybUNvbnRyb2xDb21wb25lbnQsIHtkZXNjZW5kYW50czogdHJ1ZX0pXG4gIGNvbnRyb2xzOiBRdWVyeUxpc3Q8Rm9ybUNvbnRyb2xDb21wb25lbnQ+O1xuXG4gIEBPdXRwdXQoKVxuICBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIGNoZWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEFic3RyYWN0Q29udHJvbFtdPigpO1xuXG4gIEBNZXRob2RBcGkoe2Rlc2NyaXB0aW9uOiAnc2hvdyBzdWNjZXNzIGFuaW1hdGlvbid9KVxuICBzdWNjZXNzKCkge1xuICAgIHRoaXMuX3N0YXRlLnN1Y2Nlc3MgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fc3RhdGUuc3VjY2VzcyA9IGZhbHNlLCAyMTAwKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghIXRoaXMuZm9ybSkge1xuICAgICAgdGhpcy5mb3JtLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5jaGVja2VkLmVtaXQodGhpcy5jaGVjayh0aGlzLmZvcm0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygncmVuZGVyIGZvcm0nKTtcbiAgICBpZiAoISF0aGlzLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmZpbHRlcihjb21wb25lbnQgPT4gISFjb21wb25lbnQubmFtZSAmJiAhIWNvbXBvbmVudC5tZXNzYWdlcy5sZW5ndGgpXG4gICAgICAgIC5mb3JFYWNoKGNvbXBvbmVudCA9PiBjb21wb25lbnQuY2hlY2soKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVjayhmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXkpOiBBYnN0cmFjdENvbnRyb2xbXSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ2NoZWNrIGZvcm0nKTtcbiAgICBsZXQgZXJyb3JzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybS5jb250cm9scykge1xuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm0uY29udHJvbHNba2V5XTtcblxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuY2hlY2soY29udHJvbCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEhY29udHJvbC5lcnJvcnMgJiYgY29udHJvbC5kaXJ0eSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdjb250cm9scyBoYXZlIGVycm9ycyA9ICcsIGVycm9ycy5tYXAoZSA9PiBlLm5hbWUpKTtcbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2Ugc3VibWl0KCkgaW5zdGVhZFxuICAgKi9cbiAgb25TdWJtaXQoKSB7XG4gICAgdGhpcy5zdWJtaXQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3N1Ym1pdCcpXG4gIHN1Ym1pdCgpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Zygnc3VibWl0IGZvcm0nKTtcbiAgICBpZiAoISF0aGlzLmZvcm0pIHtcbiAgICAgIHRoaXMudmFsaWRhdGUodGhpcy5mb3JtKTtcblxuICAgICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KCk7XG4gICAgICAgIHRoaXMucmVmcmVzaCh0aGlzLmZvcm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGUoZm9ybTogRm9ybUdyb3VwIHwgRm9ybUFycmF5KSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ3ZhbGlkYXRlIGZvcm0nKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1trZXldO1xuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGUoY29udHJvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5jaGVja2VkLmVtaXQodGhpcy5jaGVjayh0aGlzLmZvcm0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaChmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXkpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygncmVmcmVzaCBmb3JtJyk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybS5jb250cm9scykge1xuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm0uY29udHJvbHNba2V5XTtcblxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICB0aGlzLnJlZnJlc2goY29udHJvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=