@junte/ui
Version:
Quality Angular UI components kit
204 lines • 21 kB
JavaScript
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=