UNPKG

@junte/ui

Version:

Quality Angular UI components kit

211 lines 22.1 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'; var FormComponent = /** @class */ (function () { function FormComponent(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(); } Object.defineProperty(FormComponent.prototype, "height", { set: function (height) { this._height = height || Height.default; }, enumerable: true, configurable: true }); FormComponent.prototype.success = function () { var _this = this; this._state.success = true; setTimeout(function () { return _this._state.success = false; }, 2100); }; FormComponent.prototype.ngOnInit = function () { var _this = this; if (!!this.form) { this.form.statusChanges.subscribe(function () { _this.render(); _this.checked.emit(_this.check(_this.form)); }); } }; FormComponent.prototype.render = function () { this.logger.debug('render form'); if (!!this.controls) { this.controls.filter(function (component) { return !!component.name && !!component.messages.length; }) .forEach(function (component) { return component.check(); }); } }; FormComponent.prototype.check = function (form) { this.logger.debug('check form'); var errors = []; for (var key in form.controls) { var 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(function (e) { return e.name; })); return errors; }; /** * @deprecated please use submit() instead */ FormComponent.prototype.onSubmit = function () { this.submit(); }; FormComponent.prototype.submit = function () { this.logger.debug('submit form'); if (!!this.form) { this.validate(this.form); if (this.form.valid) { this.submitted.emit(); this.refresh(this.form); } } }; FormComponent.prototype.validate = function (form) { this.logger.debug('validate form'); for (var key in form.controls) { var 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)); }; FormComponent.prototype.refresh = function (form) { this.logger.debug('refresh form'); for (var key in form.controls) { var control = form.controls[key]; if (control instanceof FormGroup || control instanceof FormArray) { this.refresh(control); } else { control.markAsPristine(); } } }; FormComponent.ctorParameters = function () { return [ { 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); return FormComponent; }()); export { FormComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AanVudGUvdWkvIiwic291cmNlcyI6WyJsaWIvZm9ybXMvZm9ybS9mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTZCeEU7SUFpRUUsdUJBQW9CLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFNLENBQVc7UUE5RDVCLFNBQUksR0FBRyxlQUFlLENBQUM7UUFFaEMsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVSLFdBQU0sR0FBRyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQztRQUcxQixZQUFPLEdBQVcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQTRDakMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7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LEVBQUUsSUFBSSxFQUFDLENBQUM7a0NBQ2pELFNBQVM7bURBQXVCO0lBRzFDO1FBREMsTUFBTSxFQUFFOztvREFDc0I7SUFHL0I7UUFEQyxNQUFNLEVBQUU7O2tEQUN1QztJQUdoRDtRQURDLFNBQVMsQ0FBQyxFQUFDLFdBQVcsRUFBRSx3QkFBd0IsRUFBQyxDQUFDOzs7O2dEQUlsRDtJQWdERDtRQURDLFlBQVksQ0FBQyxRQUFRLENBQUM7Ozs7K0NBV3RCO0lBekhVLGFBQWE7UUEzQnpCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxVQUFVO1lBQ3BCLHNwQ0FBdUM7WUFDdkMsVUFBVSxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxTQUFTLEVBQUU7b0JBQ2YsS0FBSyxDQUNILE1BQU0sRUFDTixLQUFLLENBQUM7d0JBQ0osT0FBTyxFQUFFLENBQUM7cUJBQ1gsQ0FBQyxDQUNIO29CQUNELEtBQUssQ0FDSCxHQUFHLEVBQ0gsS0FBSyxDQUFDO3dCQUNKLE9BQU8sRUFBRSxDQUFDO3FCQUNYLENBQUMsQ0FDSDtvQkFDRCxVQUFVLENBQ1IsWUFBWSxFQUNaO3dCQUNFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztxQkFDM0IsQ0FDRjtpQkFDRixDQUNGO2FBQ0Y7U0FDRixDQUFDO3lDQWtFNEIsU0FBUztPQWpFMUIsYUFBYSxDQXdKekI7SUFBRCxvQkFBQztDQUFBLEFBeEpELElBd0pDO1NBeEpZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5HWExvZ2dlciB9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHsgTWV0aG9kQXBpLCBQcm9wZXJ0eUFwaSB9IGZyb20gJy4uLy4uL2NvcmUvZGVjb3JhdG9ycy9hcGknO1xuaW1wb3J0IHsgSGVpZ2h0IH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9oZWlnaHQnO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL3N0YXRlJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy91aSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbENvbXBvbmVudCB9IGZyb20gJy4vY29udHJvbC9mb3JtLWNvbnRyb2wuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5lbmNhcHN1bGF0ZWQuaHRtbCcsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdzdWNjZXNzJywgW1xuICAgICAgICBzdGF0ZShcbiAgICAgICAgICAndm9pZCcsXG4gICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHN0YXRlKFxuICAgICAgICAgICcqJyxcbiAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgdHJhbnNpdGlvbihcbiAgICAgICAgICAndm9pZCA8PT4gKicsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgYW5pbWF0ZSgnLjNzIGVhc2UtaW4tb3V0JylcbiAgICAgICAgICBdXG4gICAgICAgICksXG4gICAgICBdXG4gICAgKSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaG9zdCcpXG4gIHJlYWRvbmx5IGhvc3QgPSAnam50LWZvcm0taG9zdCc7XG5cbiAgdWkgPSBVSTtcblxuICBfc3RhdGUgPSB7c3VjY2VzczogZmFsc2V9O1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWhlaWdodCcpXG4gIF9oZWlnaHQ6IEhlaWdodCA9IEhlaWdodC5kZWZhdWx0O1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdOYW1lIGZvcm0gZ3JvdXAnLFxuICAgIHR5cGU6ICdGb3JtR3JvdXAnLFxuICB9KVxuICBASW5wdXQoJ2Zvcm1Hcm91cCcpXG4gIGZvcm06IEZvcm1Hcm91cDtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnVGl0bGUgZm9yIGZvcm0nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9KVxuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTdGF0ZSBvZiBmb3JtJyxcbiAgICBwYXRoOiAndWkuc3RhdGUnLFxuICAgIG9wdGlvbnM6IFtTdGF0ZS5lcnJvciwgU3RhdGUubG9hZGluZ11cbiAgfSlcbiAgQElucHV0KClcbiAgc3RhdGU6IFN0YXRlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdIZWlnaHQgb2YgZm9ybScsXG4gICAgcGF0aDogJ3VpLmhlaWdodCcsXG4gICAgb3B0aW9uczogW0hlaWdodC5kZWZhdWx0LCBIZWlnaHQuZmx1aWRdLFxuICAgIGRlZmF1bHQ6IEhlaWdodC5kZWZhdWx0XG4gIH0pXG4gIEBJbnB1dCgpIHNldCBoZWlnaHQoaGVpZ2h0OiBIZWlnaHQpIHtcbiAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQgfHwgSGVpZ2h0LmRlZmF1bHQ7XG4gIH1cblxuICBAQ29udGVudENoaWxkKCdmb3JtVGl0bGVUZW1wbGF0ZScpXG4gIHRpdGxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZCgnZm9ybUZvb3RlclRlbXBsYXRlJylcbiAgZm9vdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGb3JtQ29udHJvbENvbXBvbmVudCwge2Rlc2NlbmRhbnRzOiB0cnVlfSlcbiAgY29udHJvbHM6IFF1ZXJ5TGlzdDxGb3JtQ29udHJvbENvbXBvbmVudD47XG5cbiAgQE91dHB1dCgpXG4gIHN1Ym1pdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgY2hlY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWJzdHJhY3RDb250cm9sW10+KCk7XG5cbiAgQE1ldGhvZEFwaSh7ZGVzY3JpcHRpb246ICdzaG93IHN1Y2Nlc3MgYW5pbWF0aW9uJ30pXG4gIHN1Y2Nlc3MoKSB7XG4gICAgdGhpcy5fc3RhdGUuc3VjY2VzcyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zdGF0ZS5zdWNjZXNzID0gZmFsc2UsIDIxMDApO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IE5HWExvZ2dlcikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCEhdGhpcy5mb3JtKSB7XG4gICAgICB0aGlzLmZvcm0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLmNoZWNrZWQuZW1pdCh0aGlzLmNoZWNrKHRoaXMuZm9ybSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdyZW5kZXIgZm9ybScpO1xuICAgIGlmICghIXRoaXMuY29udHJvbHMpIHtcbiAgICAgIHRoaXMuY29udHJvbHMuZmlsdGVyKGNvbXBvbmVudCA9PiAhIWNvbXBvbmVudC5uYW1lICYmICEhY29tcG9uZW50Lm1lc3NhZ2VzLmxlbmd0aClcbiAgICAgICAgLmZvckVhY2goY29tcG9uZW50ID0+IGNvbXBvbmVudC5jaGVjaygpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrKGZvcm06IEZvcm1Hcm91cCB8IEZvcm1BcnJheSk6IEFic3RyYWN0Q29udHJvbFtdIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY2hlY2sgZm9ybScpO1xuICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1trZXldO1xuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodGhpcy5jaGVjayhjb250cm9sKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoISFjb250cm9sLmVycm9ycyAmJiBjb250cm9sLmRpcnR5KSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ2NvbnRyb2xzIGhhdmUgZXJyb3JzID0gJywgZXJyb3JzLm1hcChlID0+IGUubmFtZSkpO1xuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBzdWJtaXQoKSBpbnN0ZWFkXG4gICAqL1xuICBvblN1Ym1pdCgpIHtcbiAgICB0aGlzLnN1Ym1pdCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignc3VibWl0JylcbiAgc3VibWl0KCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdzdWJtaXQgZm9ybScpO1xuICAgIGlmICghIXRoaXMuZm9ybSkge1xuICAgICAgdGhpcy52YWxpZGF0ZSh0aGlzLmZvcm0pO1xuXG4gICAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKHRoaXMuZm9ybSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZShmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXkpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygndmFsaWRhdGUgZm9ybScpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm0uY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmNvbnRyb2xzW2tleV07XG5cbiAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZShjb250cm9sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICB0aGlzLmNoZWNrZWQuZW1pdCh0aGlzLmNoZWNrKHRoaXMuZm9ybSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoKGZvcm06IEZvcm1Hcm91cCB8IEZvcm1BcnJheSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdyZWZyZXNoIGZvcm0nKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1trZXldO1xuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIHRoaXMucmVmcmVzaChjb250cm9sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==