@ngx-formly/bootstrap
Version:
ngx-formly is an Angular 2 module which has a Components to help customize and render JavaScript/JSON configured forms. The formly-form Component and the FormlyConfig service are very powerful and bring unmatched maintainability to your application's form
381 lines (363 loc) • 39.5 kB
JavaScript
import { __extends } from 'tslib';
import { Component, ViewChild, ViewContainerRef, NgModule } from '@angular/core';
import { FieldType, FieldWrapper, FormlyModule } from '@ngx-formly/core';
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
import { Observable } from 'rxjs';
import { CommonModule } from '@angular/common';
import { FormlySelectModule } from '@ngx-formly/core/select';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyFieldCheckbox = /** @class */ (function (_super) {
__extends(FormlyFieldCheckbox, _super);
function FormlyFieldCheckbox() {
return _super !== null && _super.apply(this, arguments) || this;
}
FormlyFieldCheckbox.decorators = [
{ type: Component, args: [{
selector: 'formly-field-checkbox',
template: "\n <div class=\"custom-control custom-checkbox\">\n <input class=\"custom-control-input\" type=\"checkbox\"\n [class.is-invalid]=\"showError\"\n [indeterminate]=\"to.indeterminate && field.formControl.value === null\"\n [formControl]=\"formControl\"\n [formlyAttributes]=\"field\">\n <label class=\"custom-control-label\" [for]=\"id\">\n {{ to.label }}\n <span *ngIf=\"to.required && to.hideRequiredMarker !== true\">*</span>\n </label>\n </div>\n "
}] }
];
return FormlyFieldCheckbox;
}(FieldType));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyFieldMultiCheckbox = /** @class */ (function (_super) {
__extends(FormlyFieldMultiCheckbox, _super);
function FormlyFieldMultiCheckbox() {
return _super !== null && _super.apply(this, arguments) || this;
}
/**
* @param {?} model
* @param {?} field
* @return {?}
*/
FormlyFieldMultiCheckbox.createControl = /**
* @param {?} model
* @param {?} field
* @return {?}
*/
function (model, field) {
if (field.templateOptions.options instanceof Observable) {
throw new Error("[Formly Error] You cannot pass an Observable to a multicheckbox yet.");
}
/** @type {?} */
var controls = field.templateOptions.options.reduce(function (obj, option) {
obj[option.key] = new FormControl(model ? model[option.key] : undefined);
return obj;
}, {});
return new FormGroup(controls, field.validators ? field.validators.validation : undefined, field.asyncValidators ? field.asyncValidators.validation : undefined);
};
FormlyFieldMultiCheckbox.decorators = [
{ type: Component, args: [{
selector: 'formly-field-multicheckbox',
template: "\n <div class=\"custom-control custom-checkbox\" *ngFor=\"let option of to.options; let i = index;\">\n <input class=\"custom-control-input\" type=\"checkbox\"\n [id]=\"id + '_' + i\"\n [value]=\"option.value\"\n [formControl]=\"formControl.get(option.key)\"\n [formlyAttributes]=\"field\">\n <label class=\"custom-control-label\" [for]=\"id + '_' + i\">\n {{ option.value }}\n </label>\n </div>\n "
}] }
];
return FormlyFieldMultiCheckbox;
}(FieldType));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyFieldInput = /** @class */ (function (_super) {
__extends(FormlyFieldInput, _super);
function FormlyFieldInput() {
return _super !== null && _super.apply(this, arguments) || this;
}
Object.defineProperty(FormlyFieldInput.prototype, "type", {
get: /**
* @return {?}
*/
function () {
return this.to.type || 'text';
},
enumerable: true,
configurable: true
});
FormlyFieldInput.decorators = [
{ type: Component, args: [{
selector: 'formly-field-input',
template: "\n <input *ngIf=\"type !== 'number' else numberTmp\" [type]=\"type\" [formControl]=\"formControl\" class=\"form-control\" [formlyAttributes]=\"field\" [class.is-invalid]=\"showError\">\n <ng-template #numberTmp>\n <input type=\"number\" [formControl]=\"formControl\" class=\"form-control\" [formlyAttributes]=\"field\" [class.is-invalid]=\"showError\">\n </ng-template>\n ",
host: {
'[class.d-inline-flex]': 'to.addonLeft || to.addonRight',
'[class.custom-file]': 'to.addonLeft || to.addonRight',
}
}] }
];
return FormlyFieldInput;
}(FieldType));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyFieldRadio = /** @class */ (function (_super) {
__extends(FormlyFieldRadio, _super);
function FormlyFieldRadio() {
return _super !== null && _super.apply(this, arguments) || this;
}
FormlyFieldRadio.decorators = [
{ type: Component, args: [{
selector: 'formly-field-radio',
template: "\n <div [formGroup]=\"form\">\n <div class=\"custom-control custom-radio\" *ngFor=\"let option of to.options | formlySelectOptions:field | async; let i = index;\">\n <input class=\"custom-control-input\" type=\"radio\"\n [id]=\"id + '_' + i\"\n [name]=\"id\"\n [class.is-invalid]=\"showError\"\n [value]=\"option.value\"\n [formControl]=\"formControl\"\n [formlyAttributes]=\"field\">\n <label class=\"custom-control-label\" [for]=\"id + '_' + i\">\n {{ option.label }}\n </label>\n </div>\n </div>\n "
}] }
];
return FormlyFieldRadio;
}(FieldType));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyFieldTextArea = /** @class */ (function (_super) {
__extends(FormlyFieldTextArea, _super);
function FormlyFieldTextArea() {
return _super !== null && _super.apply(this, arguments) || this;
}
FormlyFieldTextArea.decorators = [
{ type: Component, args: [{
selector: 'formly-field-textarea',
template: "\n <textarea [formControl]=\"formControl\" [cols]=\"to.cols\"\n [rows]=\"to.rows\" class=\"form-control\" [class.is-invalid]=\"showError\"\n [formlyAttributes]=\"field\">\n </textarea>\n "
}] }
];
return FormlyFieldTextArea;
}(FieldType));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyFieldSelect = /** @class */ (function (_super) {
__extends(FormlyFieldSelect, _super);
function FormlyFieldSelect() {
return _super !== null && _super.apply(this, arguments) || this;
}
FormlyFieldSelect.decorators = [
{ type: Component, args: [{
selector: 'formly-field-select',
template: "\n <select *ngIf=\"to.multiple; else singleSelect\" class=\"form-control\"\n multiple\n [class.custom-select]=\"to.customSelect\"\n [formControl]=\"formControl\"\n [class.is-invalid]=\"showError\"\n [formlyAttributes]=\"field\">\n <ng-container *ngFor=\"let item of to.options | formlySelectOptions:field | async\">\n <optgroup *ngIf=\"item.group\" label=\"{{item.label}}\">\n <option *ngFor=\"let child of item.group\" [value]=\"child.value\" [disabled]=\"child.disabled\">\n {{ child.label }}\n </option>\n </optgroup>\n <option *ngIf=\"!item.group\" [value]=\"item.value\" [disabled]=\"item.disabled\">{{ item.label }}</option>\n </ng-container>\n </select>\n\n <ng-template #singleSelect>\n <select class=\"form-control\"\n [formControl]=\"formControl\"\n [class.custom-select]=\"to.customSelect\"\n [class.is-invalid]=\"showError\"\n [formlyAttributes]=\"field\">\n <option *ngIf=\"to.placeholder\" value=\"\">{{ to.placeholder }}</option>\n <ng-container *ngFor=\"let item of to.options | formlySelectOptions:field | async\">\n <optgroup *ngIf=\"item.group\" label=\"{{item.label}}\">\n <option *ngFor=\"let child of item.group\" [value]=\"child.value\" [disabled]=\"child.disabled\">\n {{ child.label }}\n </option>\n </optgroup>\n <option *ngIf=\"!item.group\" [value]=\"item.value\" [disabled]=\"item.disabled\">{{ item.label }}</option>\n </ng-container>\n </select>\n </ng-template>\n "
}] }
];
return FormlyFieldSelect;
}(FieldType));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyWrapperFormField = /** @class */ (function (_super) {
__extends(FormlyWrapperFormField, _super);
function FormlyWrapperFormField() {
return _super !== null && _super.apply(this, arguments) || this;
}
FormlyWrapperFormField.decorators = [
{ type: Component, args: [{
selector: 'formly-wrapper-form-field',
template: "\n <div class=\"form-group\" [class.has-error]=\"showError\">\n <label *ngIf=\"to.label && to.hideLabel !== true\" [attr.for]=\"id\">\n {{ to.label }} <ng-container *ngIf=\"to.required && to.hideRequiredMarker !== true\">*</ng-container>\n </label>\n\n <ng-template #fieldComponent></ng-template>\n\n <div *ngIf=\"showError\" class=\"invalid-feedback\" [style.display]=\"'block'\">\n <formly-validation-message [field]=\"field\"></formly-validation-message>\n </div>\n\n <small *ngIf=\"to.description\" class=\"form-text text-muted\">{{ to.description }}</small>\n </div>\n "
}] }
];
FormlyWrapperFormField.propDecorators = {
fieldComponent: [{ type: ViewChild, args: ['fieldComponent', { read: ViewContainerRef },] }]
};
return FormlyWrapperFormField;
}(FieldWrapper));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyWrapperAddons = /** @class */ (function (_super) {
__extends(FormlyWrapperAddons, _super);
function FormlyWrapperAddons() {
return _super !== null && _super.apply(this, arguments) || this;
}
/**
* @param {?} $event
* @return {?}
*/
FormlyWrapperAddons.prototype.addonRightClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.to["addonRight"].onClick) {
this.to["addonRight"].onClick(this.to, this, $event);
}
};
/**
* @param {?} $event
* @return {?}
*/
FormlyWrapperAddons.prototype.addonLeftClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.to["addonLeft"].onClick) {
this.to["addonLeft"].onClick(this.to, this, $event);
}
};
FormlyWrapperAddons.decorators = [
{ type: Component, args: [{
selector: 'formly-wrapper-addons',
template: "\n <div class=\"input-group\">\n <div class=\"input-group-prepend\"\n *ngIf=\"to.addonLeft\"\n [ngStyle]=\"{cursor: to.addonLeft.onClick ? 'pointer' : 'inherit'}\"\n (click)=\"addonLeftClick($event)\">\n <i class=\"input-group-text\" [ngClass]=\"to.addonLeft.class\" *ngIf=\"to.addonLeft.class\"></i>\n <span *ngIf=\"to.addonLeft.text\" class=\"input-group-text\">{{ to.addonLeft.text }}</span>\n </div>\n <ng-template #fieldComponent></ng-template>\n <div class=\"input-group-append\"\n *ngIf=\"to.addonRight\"\n [ngStyle]=\"{cursor: to.addonRight.onClick ? 'pointer' : 'inherit'}\"\n (click)=\"addonRightClick($event)\">\n <i class=\"input-group-text\" [ngClass]=\"to.addonRight.class\" *ngIf=\"to.addonRight.class\"></i>\n <span *ngIf=\"to.addonRight.text\" class=\"input-group-text\">{{ to.addonRight.text }}</span>\n </div>\n </div>\n ",
styles: ["\n :host ::ng-deep .input-group>:not(:first-child)> .form-control {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n :host ::ng-deep .input-group>:not(:last-child)> .form-control {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n "]
}] }
];
FormlyWrapperAddons.propDecorators = {
fieldComponent: [{ type: ViewChild, args: ['fieldComponent', { read: ViewContainerRef },] }]
};
return FormlyWrapperAddons;
}(FieldWrapper));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var TemplateAddons = /** @class */ (function () {
function TemplateAddons() {
}
/**
* @param {?} fc
* @return {?}
*/
TemplateAddons.prototype.run = /**
* @param {?} fc
* @return {?}
*/
function (fc) {
fc.templateManipulators.postWrapper.push(function (field) {
if (field && field.templateOptions && (field.templateOptions["addonLeft"] || field.templateOptions["addonRight"])) {
return 'addons';
}
});
};
return TemplateAddons;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** @type {?} */
var FIELD_TYPE_COMPONENTS = [
FormlyFieldInput,
FormlyFieldCheckbox,
FormlyFieldRadio,
FormlyFieldSelect,
FormlyFieldTextArea,
FormlyFieldMultiCheckbox,
FormlyWrapperAddons,
FormlyWrapperFormField,
];
/** @type {?} */
var BOOTSTRAP_FORMLY_CONFIG = {
types: [
{
name: 'input',
component: FormlyFieldInput,
wrappers: ['form-field'],
},
{
name: 'checkbox',
component: FormlyFieldCheckbox,
wrappers: ['form-field'],
defaultOptions: {
templateOptions: {
indeterminate: true,
hideLabel: true,
},
},
},
{
name: 'radio',
component: FormlyFieldRadio,
wrappers: ['form-field'],
defaultOptions: {
templateOptions: {
options: [],
},
},
},
{
name: 'select',
component: FormlyFieldSelect,
wrappers: ['form-field'],
defaultOptions: {
templateOptions: {
options: [],
},
},
},
{
name: 'textarea',
component: FormlyFieldTextArea,
wrappers: ['form-field'],
defaultOptions: {
templateOptions: {
cols: 1,
rows: 1,
},
},
},
{
name: 'multicheckbox',
component: FormlyFieldMultiCheckbox,
wrappers: ['form-field'],
defaultOptions: {
templateOptions: {
options: [],
},
},
},
],
wrappers: [
{ name: 'addons', component: FormlyWrapperAddons },
{ name: 'form-field', component: FormlyWrapperFormField },
],
manipulators: [
{ class: TemplateAddons, method: 'run' },
],
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var FormlyBootstrapModule = /** @class */ (function () {
function FormlyBootstrapModule() {
}
FormlyBootstrapModule.decorators = [
{ type: NgModule, args: [{
declarations: [
FIELD_TYPE_COMPONENTS,
],
imports: [
CommonModule,
ReactiveFormsModule,
FormlySelectModule,
FormlyModule.forRoot(BOOTSTRAP_FORMLY_CONFIG),
],
},] }
];
return FormlyBootstrapModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { FormlyBootstrapModule, FormlyFieldCheckbox, FormlyFieldMultiCheckbox, FormlyFieldInput, FormlyFieldRadio, FormlyFieldTextArea, FormlyFieldSelect, FormlyWrapperFormField, FormlyWrapperAddons, BOOTSTRAP_FORMLY_CONFIG as ɵb, FIELD_TYPE_COMPONENTS as ɵa, TemplateAddons as ɵc };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZvcm1seS1ib290c3RyYXAuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BuZ3gtZm9ybWx5L2Jvb3RzdHJhcC9saWIvdHlwZXMvY2hlY2tib3gudHMiLCJuZzovL0BuZ3gtZm9ybWx5L2Jvb3RzdHJhcC9saWIvdHlwZXMvbXVsdGljaGVja2JveC50cyIsIm5nOi8vQG5neC1mb3JtbHkvYm9vdHN0cmFwL2xpYi90eXBlcy9pbnB1dC50cyIsIm5nOi8vQG5neC1mb3JtbHkvYm9vdHN0cmFwL2xpYi90eXBlcy9yYWRpby50cyIsIm5nOi8vQG5neC1mb3JtbHkvYm9vdHN0cmFwL2xpYi90eXBlcy90ZXh0YXJlYS50cyIsIm5nOi8vQG5neC1mb3JtbHkvYm9vdHN0cmFwL2xpYi90eXBlcy9zZWxlY3QudHMiLCJuZzovL0BuZ3gtZm9ybWx5L2Jvb3RzdHJhcC9saWIvd3JhcHBlcnMvZm9ybS1maWVsZC53cmFwcGVyLnRzIiwibmc6Ly9Abmd4LWZvcm1seS9ib290c3RyYXAvbGliL3dyYXBwZXJzL2FkZG9ucy50cyIsIm5nOi8vQG5neC1mb3JtbHkvYm9vdHN0cmFwL2xpYi9ydW4vYWRkb24udHMiLCJuZzovL0BuZ3gtZm9ybWx5L2Jvb3RzdHJhcC9saWIvYm9vdHN0cmFwLmNvbmZpZy50cyIsIm5nOi8vQG5neC1mb3JtbHkvYm9vdHN0cmFwL2xpYi9ib290c3RyYXAubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zvcm1seS1maWVsZC1jaGVja2JveCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgPGlucHV0IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJzaG93RXJyb3JcIlxuICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJ0by5pbmRldGVybWluYXRlICYmIGZpZWxkLmZvcm1Db250cm9sLnZhbHVlID09PSBudWxsXCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jb250cm9sLWxhYmVsXCIgW2Zvcl09XCJpZFwiPlxuICAgICAgICB7eyB0by5sYWJlbCB9fVxuICAgICAgICA8c3BhbiAqbmdJZj1cInRvLnJlcXVpcmVkICYmIHRvLmhpZGVSZXF1aXJlZE1hcmtlciAhPT0gdHJ1ZVwiPio8L3NwYW4+XG4gICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlGaWVsZENoZWNrYm94IGV4dGVuZHMgRmllbGRUeXBlIHsgfVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUsIEZvcm1seUZpZWxkQ29uZmlnIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zvcm1seS1maWVsZC1tdWx0aWNoZWNrYm94JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLWNoZWNrYm94XCIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiB0by5vcHRpb25zOyBsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgPGlucHV0IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICBbaWRdPVwiaWQgKyAnXycgKyBpXCJcbiAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbC5nZXQob3B0aW9uLmtleSlcIlxuICAgICAgICBbZm9ybWx5QXR0cmlidXRlc109XCJmaWVsZFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtbGFiZWxcIiBbZm9yXT1cImlkICsgJ18nICsgaVwiPlxuICAgICAgICB7eyBvcHRpb24udmFsdWUgfX1cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seUZpZWxkTXVsdGlDaGVja2JveCBleHRlbmRzIEZpZWxkVHlwZSB7XG5cbiAgc3RhdGljIGNyZWF0ZUNvbnRyb2wobW9kZWw6IGFueSwgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICBpZiAoZmllbGQudGVtcGxhdGVPcHRpb25zLm9wdGlvbnMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGb3JtbHkgRXJyb3JdIFlvdSBjYW5ub3QgcGFzcyBhbiBPYnNlcnZhYmxlIHRvIGEgbXVsdGljaGVja2JveCB5ZXQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbHMgPSBmaWVsZC50ZW1wbGF0ZU9wdGlvbnMub3B0aW9ucy5yZWR1Y2UoKG9iaiwgb3B0aW9uKSA9PiB7XG4gICAgICBvYmpbb3B0aW9uLmtleV0gPSBuZXcgRm9ybUNvbnRyb2wobW9kZWwgPyBtb2RlbFtvcHRpb24ua2V5XSA6IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sIHt9KTtcblxuICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKFxuICAgICAgY29udHJvbHMsXG4gICAgICBmaWVsZC52YWxpZGF0b3JzID8gZmllbGQudmFsaWRhdG9ycy52YWxpZGF0aW9uIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGQuYXN5bmNWYWxpZGF0b3JzID8gZmllbGQuYXN5bmNWYWxpZGF0b3JzLnZhbGlkYXRpb24gOiB1bmRlZmluZWQsXG4gICAgKTtcbiAgfVxuXG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmb3JtbHktZmllbGQtaW5wdXQnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpbnB1dCAqbmdJZj1cInR5cGUgIT09ICdudW1iZXInIGVsc2UgbnVtYmVyVG1wXCIgW3R5cGVdPVwidHlwZVwiIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJzaG93RXJyb3JcIj5cbiAgICA8bmctdGVtcGxhdGUgI251bWJlclRtcD5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZm9ybWx5QXR0cmlidXRlc109XCJmaWVsZFwiIFtjbGFzcy5pcy1pbnZhbGlkXT1cInNob3dFcnJvclwiPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmQtaW5saW5lLWZsZXhdJzogJ3RvLmFkZG9uTGVmdCB8fCB0by5hZGRvblJpZ2h0JyxcbiAgICAnW2NsYXNzLmN1c3RvbS1maWxlXSc6ICd0by5hZGRvbkxlZnQgfHwgdG8uYWRkb25SaWdodCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seUZpZWxkSW5wdXQgZXh0ZW5kcyBGaWVsZFR5cGUge1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy50by50eXBlIHx8ICd0ZXh0JztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZm9ybWx5LWZpZWxkLXJhZGlvJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1yYWRpb1wiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgdG8ub3B0aW9ucyB8IGZvcm1seVNlbGVjdE9wdGlvbnM6ZmllbGQgfCBhc3luYzsgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgIFtpZF09XCJpZCArICdfJyArIGlcIlxuICAgICAgICAgIFtuYW1lXT1cImlkXCJcbiAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJzaG93RXJyb3JcIlxuICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtbGFiZWxcIiBbZm9yXT1cImlkICsgJ18nICsgaVwiPlxuICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seUZpZWxkUmFkaW8gZXh0ZW5kcyBGaWVsZFR5cGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zvcm1seS1maWVsZC10ZXh0YXJlYScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHRleHRhcmVhIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiIFtjb2xzXT1cInRvLmNvbHNcIlxuICAgICAgW3Jvd3NdPVwidG8ucm93c1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgIFtmb3JtbHlBdHRyaWJ1dGVzXT1cImZpZWxkXCI+XG4gICAgPC90ZXh0YXJlYT5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybWx5RmllbGRUZXh0QXJlYSBleHRlbmRzIEZpZWxkVHlwZSB7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmb3JtbHktZmllbGQtc2VsZWN0JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c2VsZWN0ICpuZ0lmPVwidG8ubXVsdGlwbGU7IGVsc2Ugc2luZ2xlU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgbXVsdGlwbGVcbiAgICAgIFtjbGFzcy5jdXN0b20tc2VsZWN0XT1cInRvLmN1c3RvbVNlbGVjdFwiXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgIFtmb3JtbHlBdHRyaWJ1dGVzXT1cImZpZWxkXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdG8ub3B0aW9ucyB8IGZvcm1seVNlbGVjdE9wdGlvbnM6ZmllbGQgfCBhc3luY1wiPlxuICAgICAgICAgPG9wdGdyb3VwICpuZ0lmPVwiaXRlbS5ncm91cFwiIGxhYmVsPVwie3tpdGVtLmxhYmVsfX1cIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNoaWxkIG9mIGl0ZW0uZ3JvdXBcIiBbdmFsdWVdPVwiY2hpbGQudmFsdWVcIiBbZGlzYWJsZWRdPVwiY2hpbGQuZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAge3sgY2hpbGQubGFiZWwgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgPG9wdGlvbiAqbmdJZj1cIiFpdGVtLmdyb3VwXCIgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiPnt7IGl0ZW0ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9zZWxlY3Q+XG5cbiAgICA8bmctdGVtcGxhdGUgI3NpbmdsZVNlbGVjdD5cbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICBbY2xhc3MuY3VzdG9tLXNlbGVjdF09XCJ0by5jdXN0b21TZWxlY3RcIlxuICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJzaG93RXJyb3JcIlxuICAgICAgICBbZm9ybWx5QXR0cmlidXRlc109XCJmaWVsZFwiPlxuICAgICAgICA8b3B0aW9uICpuZ0lmPVwidG8ucGxhY2Vob2xkZXJcIiB2YWx1ZT1cIlwiPnt7IHRvLnBsYWNlaG9sZGVyIH19PC9vcHRpb24+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdG8ub3B0aW9ucyB8IGZvcm1seVNlbGVjdE9wdGlvbnM6ZmllbGQgfCBhc3luY1wiPlxuICAgICAgICAgIDxvcHRncm91cCAqbmdJZj1cIml0ZW0uZ3JvdXBcIiBsYWJlbD1cInt7aXRlbS5sYWJlbH19XCI+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBpdGVtLmdyb3VwXCIgW3ZhbHVlXT1cImNoaWxkLnZhbHVlXCIgW2Rpc2FibGVkXT1cImNoaWxkLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgIHt7IGNoaWxkLmxhYmVsIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCIhaXRlbS5ncm91cFwiIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj57eyBpdGVtLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybWx5RmllbGRTZWxlY3QgZXh0ZW5kcyBGaWVsZFR5cGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZFdyYXBwZXIgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZm9ybWx5LXdyYXBwZXItZm9ybS1maWVsZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBbY2xhc3MuaGFzLWVycm9yXT1cInNob3dFcnJvclwiPlxuICAgICAgPGxhYmVsICpuZ0lmPVwidG8ubGFiZWwgJiYgdG8uaGlkZUxhYmVsICE9PSB0cnVlXCIgW2F0dHIuZm9yXT1cImlkXCI+XG4gICAgICAgIHt7IHRvLmxhYmVsIH19IDxuZy1jb250YWluZXIgKm5nSWY9XCJ0by5yZXF1aXJlZCAmJiB0by5oaWRlUmVxdWlyZWRNYXJrZXIgIT09IHRydWVcIj4qPC9uZy1jb250YWluZXI+XG4gICAgICA8L2xhYmVsPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI2ZpZWxkQ29tcG9uZW50PjwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93RXJyb3JcIiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiBbc3R5bGUuZGlzcGxheV09XCInYmxvY2snXCI+XG4gICAgICAgIDxmb3JtbHktdmFsaWRhdGlvbi1tZXNzYWdlIFtmaWVsZF09XCJmaWVsZFwiPjwvZm9ybWx5LXZhbGlkYXRpb24tbWVzc2FnZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8c21hbGwgKm5nSWY9XCJ0by5kZXNjcmlwdGlvblwiIGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtbXV0ZWRcIj57eyB0by5kZXNjcmlwdGlvbiB9fTwvc21hbGw+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seVdyYXBwZXJGb3JtRmllbGQgZXh0ZW5kcyBGaWVsZFdyYXBwZXIge1xuICBAVmlld0NoaWxkKCdmaWVsZENvbXBvbmVudCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBmaWVsZENvbXBvbmVudDogVmlld0NvbnRhaW5lclJlZjtcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZFdyYXBwZXIgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZm9ybWx5LXdyYXBwZXItYWRkb25zJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1wcmVwZW5kXCJcbiAgICAgICAgKm5nSWY9XCJ0by5hZGRvbkxlZnRcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7Y3Vyc29yOiB0by5hZGRvbkxlZnQub25DbGljayA/ICdwb2ludGVyJyA6ICdpbmhlcml0J31cIlxuICAgICAgICAoY2xpY2spPVwiYWRkb25MZWZ0Q2xpY2soJGV2ZW50KVwiPlxuICAgICAgICA8aSBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBbbmdDbGFzc109XCJ0by5hZGRvbkxlZnQuY2xhc3NcIiAqbmdJZj1cInRvLmFkZG9uTGVmdC5jbGFzc1wiPjwvaT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJ0by5hZGRvbkxlZnQudGV4dFwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPnt7IHRvLmFkZG9uTGVmdC50ZXh0IH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctdGVtcGxhdGUgI2ZpZWxkQ29tcG9uZW50PjwvbmctdGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCJcbiAgICAgICAgKm5nSWY9XCJ0by5hZGRvblJpZ2h0XCJcbiAgICAgICAgW25nU3R5bGVdPVwie2N1cnNvcjogdG8uYWRkb25SaWdodC5vbkNsaWNrID8gJ3BvaW50ZXInIDogJ2luaGVyaXQnfVwiXG4gICAgICAgIChjbGljayk9XCJhZGRvblJpZ2h0Q2xpY2soJGV2ZW50KVwiPlxuICAgICAgICA8aSBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBbbmdDbGFzc109XCJ0by5hZGRvblJpZ2h0LmNsYXNzXCIgKm5nSWY9XCJ0by5hZGRvblJpZ2h0LmNsYXNzXCI+PC9pPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInRvLmFkZG9uUmlnaHQudGV4dFwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPnt7IHRvLmFkZG9uUmlnaHQudGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgOjpuZy1kZWVwIC5pbnB1dC1ncm91cD46bm90KDpmaXJzdC1jaGlsZCk+IC5mb3JtLWNvbnRyb2wge1xuICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gICAgfVxuICAgIDpob3N0IDo6bmctZGVlcCAuaW5wdXQtZ3JvdXA+Om5vdCg6bGFzdC1jaGlsZCk+IC5mb3JtLWNvbnRyb2wge1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlXcmFwcGVyQWRkb25zIGV4dGVuZHMgRmllbGRXcmFwcGVyIHtcbiAgQFZpZXdDaGlsZCgnZmllbGRDb21wb25lbnQnLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZn0pIGZpZWxkQ29tcG9uZW50OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIGFkZG9uUmlnaHRDbGljaygkZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnRvLmFkZG9uUmlnaHQub25DbGljaykge1xuICAgICAgdGhpcy50by5hZGRvblJpZ2h0Lm9uQ2xpY2sodGhpcy50bywgdGhpcywgJGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBhZGRvbkxlZnRDbGljaygkZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnRvLmFkZG9uTGVmdC5vbkNsaWNrKSB7XG4gICAgICB0aGlzLnRvLmFkZG9uTGVmdC5vbkNsaWNrKHRoaXMudG8sIHRoaXMsICRldmVudCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBGb3JtbHlDb25maWcgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQWRkb25zIHtcbiAgcnVuKGZjOiBGb3JtbHlDb25maWcpIHtcbiAgICBmYy50ZW1wbGF0ZU1hbmlwdWxhdG9ycy5wb3N0V3JhcHBlci5wdXNoKChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnRlbXBsYXRlT3B0aW9ucyAmJiAoZmllbGQudGVtcGxhdGVPcHRpb25zLmFkZG9uTGVmdCB8fCBmaWVsZC50ZW1wbGF0ZU9wdGlvbnMuYWRkb25SaWdodCkpIHtcbiAgICAgICAgcmV0dXJuICdhZGRvbnMnO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25maWdPcHRpb24gfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IFRlbXBsYXRlQWRkb25zIH0gZnJvbSAnLi9ydW4vYWRkb24nO1xuaW1wb3J0IHtcbiAgRm9ybWx5RmllbGRJbnB1dCxcbiAgRm9ybWx5RmllbGRDaGVja2JveCxcbiAgRm9ybWx5RmllbGRSYWRpbyxcbiAgRm9ybWx5RmllbGRTZWxlY3QsXG4gIEZvcm1seUZpZWxkVGV4dEFyZWEsXG4gIEZvcm1seUZpZWxkTXVsdGlDaGVja2JveCxcbn0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQge1xuICBGb3JtbHlXcmFwcGVyQWRkb25zLFxuICBGb3JtbHlXcmFwcGVyRm9ybUZpZWxkLFxufSBmcm9tICcuL3dyYXBwZXJzL3dyYXBwZXJzJztcblxuZXhwb3J0IGNvbnN0IEZJRUxEX1RZUEVfQ09NUE9ORU5UUyA9IFtcbiAgLy8gdHlwZXNcbiAgRm9ybWx5RmllbGRJbnB1dCxcbiAgRm9ybWx5RmllbGRDaGVja2JveCxcbiAgRm9ybWx5RmllbGRSYWRpbyxcbiAgRm9ybWx5RmllbGRTZWxlY3QsXG4gIEZvcm1seUZpZWxkVGV4dEFyZWEsXG4gIEZvcm1seUZpZWxkTXVsdGlDaGVja2JveCxcblxuICAvLyB3cmFwcGVyc1xuICBGb3JtbHlXcmFwcGVyQWRkb25zLFxuICBGb3JtbHlXcmFwcGVyRm9ybUZpZWxkLFxuXTtcblxuZXhwb3J0IGNvbnN0IEJPT1RTVFJBUF9GT1JNTFlfQ09ORklHOiBDb25maWdPcHRpb24gPSB7XG4gIHR5cGVzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2lucHV0JyxcbiAgICAgIGNvbXBvbmVudDogRm9ybWx5RmllbGRJbnB1dCxcbiAgICAgIHdyYXBwZXJzOiBbJ2Zvcm0tZmllbGQnXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVja2JveCcsXG4gICAgICBjb21wb25lbnQ6IEZvcm1seUZpZWxkQ2hlY2tib3gsXG4gICAgICB3cmFwcGVyczogWydmb3JtLWZpZWxkJ10sXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICB0ZW1wbGF0ZU9wdGlvbnM6IHtcbiAgICAgICAgICBpbmRldGVybWluYXRlOiB0cnVlLFxuICAgICAgICAgIGhpZGVMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAncmFkaW8nLFxuICAgICAgY29tcG9uZW50OiBGb3JtbHlGaWVsZFJhZGlvLFxuICAgICAgd3JhcHBlcnM6IFsnZm9ybS1maWVsZCddLFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICBjb21wb25lbnQ6IEZvcm1seUZpZWxkU2VsZWN0LFxuICAgICAgd3JhcHBlcnM6IFsnZm9ybS1maWVsZCddLFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3RleHRhcmVhJyxcbiAgICAgIGNvbXBvbmVudDogRm9ybWx5RmllbGRUZXh0QXJlYSxcbiAgICAgIHdyYXBwZXJzOiBbJ2Zvcm0tZmllbGQnXSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIGNvbHM6IDEsXG4gICAgICAgICAgcm93czogMSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbXVsdGljaGVja2JveCcsXG4gICAgICBjb21wb25lbnQ6IEZvcm1seUZpZWxkTXVsdGlDaGVja2JveCxcbiAgICAgIHdyYXBwZXJzOiBbJ2Zvcm0tZmllbGQnXSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICB3cmFwcGVyczogW1xuICAgIHtuYW1lOiAnYWRkb25zJywgY29tcG9uZW50OiBGb3JtbHlXcmFwcGVyQWRkb25zfSxcbiAgICB7bmFtZTogJ2Zvcm0tZmllbGQnLCBjb21wb25lbnQ6IEZvcm1seVdyYXBwZXJGb3JtRmllbGR9LFxuICBdLFxuICBtYW5pcHVsYXRvcnM6IFtcbiAgICB7Y2xhc3M6IFRlbXBsYXRlQWRkb25zLCBtZXRob2Q6ICdydW4nfSxcbiAgXSxcbn07XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtbHlNb2R1bGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEZvcm1seVNlbGVjdE1vZHVsZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUvc2VsZWN0JztcbmltcG9ydCB7IEJPT1RTVFJBUF9GT1JNTFlfQ09ORklHLCBGSUVMRF9UWVBFX0NPTVBPTkVOVFMgfSBmcm9tICcuL2Jvb3RzdHJhcC5jb25maWcnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBGSUVMRF9UWVBFX0NPTVBPTkVOVFMsXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3JtbHlTZWxlY3RNb2R1bGUsXG4gICAgRm9ybWx5TW9kdWxlLmZvclJvb3QoQk9PVFNUUkFQX0ZPUk1MWV9DT05GSUcpLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlCb290c3RyYXBNb2R1bGUge1xufVxuIl0sIm5hbWVzIjpbInRzbGliXzEuX19leHRlbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0lBbUJ5Q0EsdUNBQVM7Ozs7O2dCQWhCakQsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFFBQVEsRUFBRSxrZ0JBWVQ7aUJBQ0Y7OzhCQWxCRDtFQW1CeUMsU0FBUzs7Ozs7OztJQ0NKQSw0Q0FBUzs7Ozs7Ozs7O0lBRTlDLHNDQUFhOzs7OztJQUFwQixVQUFxQixLQUFVLEVBQUUsS0FBd0I7UUFDdkQsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sWUFBWSxVQUFVLEVBQUU7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1NBQ3pGOztRQUVELElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxNQUFNO1lBQ2hFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDekUsT0FBTyxHQUFHLENBQUM7U0FDWixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRVAsT0FBTyxJQUFJLFNBQVMsQ0FDbEIsUUFBUSxFQUNSLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsU0FBUyxFQUMxRCxLQUFLLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FDckUsQ0FBQztLQUNIOztnQkFoQ0YsU0FBUyxTQUFDO29CQUNU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