@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
436 lines (414 loc) • 36.1 kB
JavaScript
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
*/
class FormlyFieldCheckbox extends FieldType {
}
FormlyFieldCheckbox.decorators = [
{ type: Component, args: [{
selector: 'formly-field-checkbox',
template: `
<div class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox"
[class.is-invalid]="showError"
[indeterminate]="to.indeterminate && field.formControl.value === null"
[formControl]="formControl"
[formlyAttributes]="field">
<label class="custom-control-label" [for]="id">
{{ to.label }}
<span *ngIf="to.required && to.hideRequiredMarker !== true">*</span>
</label>
</div>
`
}] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FormlyFieldMultiCheckbox extends FieldType {
/**
* @param {?} model
* @param {?} field
* @return {?}
*/
static createControl(model, field) {
if (field.templateOptions.options instanceof Observable) {
throw new Error(`[Formly Error] You cannot pass an Observable to a multicheckbox yet.`);
}
/** @type {?} */
const controls = field.templateOptions.options.reduce((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: `
<div class="custom-control custom-checkbox" *ngFor="let option of to.options; let i = index;">
<input class="custom-control-input" type="checkbox"
[id]="id + '_' + i"
[value]="option.value"
[formControl]="formControl.get(option.key)"
[formlyAttributes]="field">
<label class="custom-control-label" [for]="id + '_' + i">
{{ option.value }}
</label>
</div>
`
}] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FormlyFieldInput extends FieldType {
/**
* @return {?}
*/
get type() {
return this.to.type || 'text';
}
}
FormlyFieldInput.decorators = [
{ type: Component, args: [{
selector: 'formly-field-input',
template: `
<input *ngIf="type !== 'number' else numberTmp" [type]="type" [formControl]="formControl" class="form-control" [formlyAttributes]="field" [class.is-invalid]="showError">
<ng-template #numberTmp>
<input type="number" [formControl]="formControl" class="form-control" [formlyAttributes]="field" [class.is-invalid]="showError">
</ng-template>
`,
host: {
'[class.d-inline-flex]': 'to.addonLeft || to.addonRight',
'[class.custom-file]': 'to.addonLeft || to.addonRight',
}
}] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FormlyFieldRadio extends FieldType {
}
FormlyFieldRadio.decorators = [
{ type: Component, args: [{
selector: 'formly-field-radio',
template: `
<div [formGroup]="form">
<div class="custom-control custom-radio" *ngFor="let option of to.options | formlySelectOptions:field | async; let i = index;">
<input class="custom-control-input" type="radio"
[id]="id + '_' + i"
[name]="id"
[class.is-invalid]="showError"
[value]="option.value"
[formControl]="formControl"
[formlyAttributes]="field">
<label class="custom-control-label" [for]="id + '_' + i">
{{ option.label }}
</label>
</div>
</div>
`
}] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FormlyFieldTextArea extends FieldType {
}
FormlyFieldTextArea.decorators = [
{ type: Component, args: [{
selector: 'formly-field-textarea',
template: `
<textarea [formControl]="formControl" [cols]="to.cols"
[rows]="to.rows" class="form-control" [class.is-invalid]="showError"
[formlyAttributes]="field">
</textarea>
`
}] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FormlyFieldSelect extends FieldType {
}
FormlyFieldSelect.decorators = [
{ type: Component, args: [{
selector: 'formly-field-select',
template: `
<select *ngIf="to.multiple; else singleSelect" class="form-control"
multiple
[class.custom-select]="to.customSelect"
[formControl]="formControl"
[class.is-invalid]="showError"
[formlyAttributes]="field">
<ng-container *ngFor="let item of to.options | formlySelectOptions:field | async">
<optgroup *ngIf="item.group" label="{{item.label}}">
<option *ngFor="let child of item.group" [value]="child.value" [disabled]="child.disabled">
{{ child.label }}
</option>
</optgroup>
<option *ngIf="!item.group" [value]="item.value" [disabled]="item.disabled">{{ item.label }}</option>
</ng-container>
</select>
<ng-template #singleSelect>
<select class="form-control"
[formControl]="formControl"
[class.custom-select]="to.customSelect"
[class.is-invalid]="showError"
[formlyAttributes]="field">
<option *ngIf="to.placeholder" value="">{{ to.placeholder }}</option>
<ng-container *ngFor="let item of to.options | formlySelectOptions:field | async">
<optgroup *ngIf="item.group" label="{{item.label}}">
<option *ngFor="let child of item.group" [value]="child.value" [disabled]="child.disabled">
{{ child.label }}
</option>
</optgroup>
<option *ngIf="!item.group" [value]="item.value" [disabled]="item.disabled">{{ item.label }}</option>
</ng-container>
</select>
</ng-template>
`
}] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FormlyWrapperFormField extends FieldWrapper {
}
FormlyWrapperFormField.decorators = [
{ type: Component, args: [{
selector: 'formly-wrapper-form-field',
template: `
<div class="form-group" [class.has-error]="showError">
<label *ngIf="to.label && to.hideLabel !== true" [attr.for]="id">
{{ to.label }} <ng-container *ngIf="to.required && to.hideRequiredMarker !== true">*</ng-container>
</label>
<ng-template #fieldComponent></ng-template>
<div *ngIf="showError" class="invalid-feedback" [style.display]="'block'">
<formly-validation-message [field]="field"></formly-validation-message>
</div>
<small *ngIf="to.description" class="form-text text-muted">{{ to.description }}</small>
</div>
`
}] }
];
FormlyWrapperFormField.propDecorators = {
fieldComponent: [{ type: ViewChild, args: ['fieldComponent', { read: ViewContainerRef },] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FormlyWrapperAddons extends FieldWrapper {
/**
* @param {?} $event
* @return {?}
*/
addonRightClick($event) {
if (this.to["addonRight"].onClick) {
this.to["addonRight"].onClick(this.to, this, $event);
}
}
/**
* @param {?} $event
* @return {?}
*/
addonLeftClick($event) {
if (this.to["addonLeft"].onClick) {
this.to["addonLeft"].onClick(this.to, this, $event);
}
}
}
FormlyWrapperAddons.decorators = [
{ type: Component, args: [{
selector: 'formly-wrapper-addons',
template: `
<div class="input-group">
<div class="input-group-prepend"
*ngIf="to.addonLeft"
[ngStyle]="{cursor: to.addonLeft.onClick ? 'pointer' : 'inherit'}"
(click)="addonLeftClick($event)">
<i class="input-group-text" [ngClass]="to.addonLeft.class" *ngIf="to.addonLeft.class"></i>
<span *ngIf="to.addonLeft.text" class="input-group-text">{{ to.addonLeft.text }}</span>
</div>
<ng-template #fieldComponent></ng-template>
<div class="input-group-append"
*ngIf="to.addonRight"
[ngStyle]="{cursor: to.addonRight.onClick ? 'pointer' : 'inherit'}"
(click)="addonRightClick($event)">
<i class="input-group-text" [ngClass]="to.addonRight.class" *ngIf="to.addonRight.class"></i>
<span *ngIf="to.addonRight.text" class="input-group-text">{{ to.addonRight.text }}</span>
</div>
</div>
`,
styles: [`
:host ::ng-deep .input-group>:not(:first-child)> .form-control {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
:host ::ng-deep .input-group>:not(:last-child)> .form-control {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
`]
}] }
];
FormlyWrapperAddons.propDecorators = {
fieldComponent: [{ type: ViewChild, args: ['fieldComponent', { read: ViewContainerRef },] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class TemplateAddons {
/**
* @param {?} fc
* @return {?}
*/
run(fc) {
fc.templateManipulators.postWrapper.push((field) => {
if (field && field.templateOptions && (field.templateOptions["addonLeft"] || field.templateOptions["addonRight"])) {
return 'addons';
}
});
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** @type {?} */
const FIELD_TYPE_COMPONENTS = [
FormlyFieldInput,
FormlyFieldCheckbox,
FormlyFieldRadio,
FormlyFieldSelect,
FormlyFieldTextArea,
FormlyFieldMultiCheckbox,
FormlyWrapperAddons,
FormlyWrapperFormField,
];
/** @type {?} */
const 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
*/
class FormlyBootstrapModule {
}
FormlyBootstrapModule.decorators = [
{ type: NgModule, args: [{
declarations: [
FIELD_TYPE_COMPONENTS,
],
imports: [
CommonModule,
ReactiveFormsModule,
FormlySelectModule,
FormlyModule.forRoot(BOOTSTRAP_FORMLY_CONFIG),
],
},] }
];
/**
* @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+IC5mb3JtLWNvbnRyb2wge1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlXcmFwcGVyQWRkb25zIGV4dGVuZHMgRmllbGRXcmFwcGVyIHtcbiAgQFZpZXdDaGlsZCgnZmllbGRDb21wb25lbnQnLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZn0pIGZpZWxkQ29tcG9uZW50OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIGFkZG9uUmlnaHRDbGljaygkZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnRvLmFkZG9uUmlnaHQub25DbGljaykge1xuICAgICAgdGhpcy50by5hZGRvblJpZ2h0Lm9uQ2xpY2sodGhpcy50bywgdGhpcywgJGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBhZGRvbkxlZnRDbGljaygkZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnRvLmFkZG9uTGVmdC5vbkNsaWNrKSB7XG4gICAgICB0aGlzLnRvLmFkZG9uTGVmdC5vbkNsaWNrKHRoaXMudG8sIHRoaXMsICRldmVudCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBGb3JtbHlDb25maWcgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQWRkb25zIHtcbiAgcnVuKGZjOiBGb3JtbHlDb25maWcpIHtcbiAgICBmYy50ZW1wbGF0ZU1hbmlwdWxhdG9ycy5wb3N0V3JhcHBlci5wdXNoKChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnRlbXBsYXRlT3B0aW9ucyAmJiAoZmllbGQudGVtcGxhdGVPcHRpb25zLmFkZG9uTGVmdCB8fCBmaWVsZC50ZW1wbGF0ZU9wdGlvbnMuYWRkb25SaWdodCkpIHtcbiAgICAgICAgcmV0dXJuICdhZGRvbnMnO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25maWdPcHRpb24gfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IFRlbXBsYXRlQWRkb25zIH0gZnJvbSAnLi9ydW4vYWRkb24nO1xuaW1wb3J0IHtcbiAgRm9ybWx5RmllbGRJbnB1dCxcbiAgRm9ybWx5RmllbGRDaGVja2JveCxcbiAgRm9ybWx5RmllbGRSYWRpbyxcbiAgRm9ybWx5RmllbGRTZWxlY3QsXG4gIEZvcm1seUZpZWxkVGV4dEFyZWEsXG4gIEZvcm1seUZpZWxkTXVsdGlDaGVja2JveCxcbn0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQge1xuICBGb3JtbHlXcmFwcGVyQWRkb25zLFxuICBGb3JtbHlXcmFwcGVyRm9ybUZpZWxkLFxufSBmcm9tICcuL3dyYXBwZXJzL3dyYXBwZXJzJztcblxuZXhwb3J0IGNvbnN0IEZJRUxEX1RZUEVfQ09NUE9ORU5UUyA9IFtcbiAgLy8gdHlwZXNcbiAgRm9ybWx5RmllbGRJbnB1dCxcbiAgRm9ybWx5RmllbGRDaGVja2JveCxcbiAgRm9ybWx5RmllbGRSYWRpbyxcbiAgRm9ybWx5RmllbGRTZWxlY3QsXG4gIEZvcm1seUZpZWxkVGV4dEFyZWEsXG4gIEZvcm1seUZpZWxkTXVsdGlDaGVja2JveCxcblxuICAvLyB3cmFwcGVyc1xuICBGb3JtbHlXcmFwcGVyQWRkb25zLFxuICBGb3JtbHlXcmFwcGVyRm9ybUZpZWxkLFxuXTtcblxuZXhwb3J0IGNvbnN0IEJPT1RTVFJBUF9GT1JNTFlfQ09ORklHOiBDb25maWdPcHRpb24gPSB7XG4gIHR5cGVzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2lucHV0JyxcbiAgICAgIGNvbXBvbmVudDogRm9ybWx5RmllbGRJbnB1dCxcbiAgICAgIHdyYXBwZXJzOiBbJ2Zvcm0tZmllbGQnXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVja2JveCcsXG4gICAgICBjb21wb25lbnQ6IEZvcm1seUZpZWxkQ2hlY2tib3gsXG4gICAgICB3cmFwcGVyczogWydmb3JtLWZpZWxkJ10sXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICB0ZW1wbGF0ZU9wdGlvbnM6IHtcbiAgICAgICAgICBpbmRldGVybWluYXRlOiB0cnVlLFxuICAgICAgICAgIGhpZGVMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAncmFkaW8nLFxuICAgICAgY29tcG9uZW50OiBGb3JtbHlGaWVsZFJhZGlvLFxuICAgICAgd3JhcHBlcnM6IFsnZm9ybS1maWVsZCddLFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICBjb21wb25lbnQ6IEZvcm1seUZpZWxkU2VsZWN0LFxuICAgICAgd3JhcHBlcnM6IFsnZm9ybS1maWVsZCddLFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3RleHRhcmVhJyxcbiAgICAgIGNvbXBvbmVudDogRm9ybWx5RmllbGRUZXh0QXJlYSxcbiAgICAgIHdyYXBwZXJzOiBbJ2Zvcm0tZmllbGQnXSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIGNvbHM6IDEsXG4gICAgICAgICAgcm93czogMSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbXVsdGljaGVja2JveCcsXG4gICAgICBjb21wb25lbnQ6IEZvcm1seUZpZWxkTXVsdGlDaGVja2JveCxcbiAgICAgIHdyYXBwZXJzOiBbJ2Zvcm0tZmllbGQnXSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICB3cmFwcGVyczogW1xuICAgIHtuYW1lOiAnYWRkb25zJywgY29tcG9uZW50OiBGb3JtbHlXcmFwcGVyQWRkb25zfSxcbiAgICB7bmFtZTogJ2Zvcm0tZmllbGQnLCBjb21wb25lbnQ6IEZvcm1seVdyYXBwZXJGb3JtRmllbGR9LFxuICBdLFxuICBtYW5pcHVsYXRvcnM6IFtcbiAgICB7Y2xhc3M6IFRlbXBsYXRlQWRkb25zLCBtZXRob2Q6ICdydW4nfSxcbiAgXSxcbn07XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtbHlNb2R1bGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEZvcm1seVNlbGVjdE1vZHVsZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUvc2VsZWN0JztcbmltcG9ydCB7IEJPT1RTVFJBUF9GT1JNTFlfQ09ORklHLCBGSUVMRF9UWVBFX0NPTVBPTkVOVFMgfSBmcm9tICcuL2Jvb3RzdHJhcC5jb25maWcnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBGSUVMRF9UWVBFX0NPTVBPTkVOVFMsXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3JtbHlTZWxlY3RNb2R1bGUsXG4gICAgRm9ybWx5TW9kdWxlLmZvclJvb3QoQk9PVFNUUkFQX0ZPUk1MWV9DT05GSUcpLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlCb290c3RyYXBNb2R1bGUge1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEseUJBbUJpQyxTQUFRLFNBQVM7OztZQWhCakQsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7O0dBWVQ7YUFDRjs7Ozs7OztBQ2xCRCw4QkFvQnNDLFNBQVEsU0FBUzs7Ozs7O0lBRXJELE9BQU8sYUFBYSxDQUFDLEtBQVUsRUFBRSxLQUF3QjtRQUN2RCxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxZQUFZLFVBQVUsRUFBRTtZQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7U0FDekY7O1FBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU07WUFDaEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUN6RSxPQUFPLEdBQUcsQ0FBQztTQUNaLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxPQUFPLElBQUksU0FBUyxDQUNsQixRQUFRLEVBQ1IsS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxTQUFTLEVBQzFELEtBQUssQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUNyRSxDQUFDO0tBQ0g7OztZQWhDRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDRCQUE0QjtnQkFDdEMs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