@ng-dynamic-forms/ui-ng-bootstrap
Version:
NG Bootstrap UI package for NG Dynamic Forms
39 lines • 23.4 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core";
import { ReactiveFormsModule } from "@angular/forms";
import { DynamicFormControlComponent, DynamicFormsCoreModule } from "@ng-dynamic-forms/core";
import { NgxMaskDirective } from "ngx-mask";
import { NgIf, NgClass, NgFor, AsyncPipe } from "@angular/common";
import * as i0 from "@angular/core";
import * as i1 from "@ng-dynamic-forms/core";
import * as i2 from "@angular/forms";
export class DynamicNGBootstrapInputComponent extends DynamicFormControlComponent {
constructor(layoutService, validationService) {
super(layoutService, validationService);
this.layoutService = layoutService;
this.validationService = validationService;
this.blur = new EventEmitter();
this.change = new EventEmitter();
this.focus = new EventEmitter();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicNGBootstrapInputComponent, deps: [{ token: i1.DynamicFormLayoutService }, { token: i1.DynamicFormValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: DynamicNGBootstrapInputComponent, isStandalone: true, selector: "dynamic-ng-bootstrap-input", inputs: { formLayout: "formLayout", group: "group", layout: "layout", model: "model" }, outputs: { blur: "blur", change: "change", focus: "focus" }, usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"group\" [class.input-group]=\"model.prefix || model.suffix\">\n\n <div *ngIf=\"model.prefix\" class=\"input-group-prepend\">\n <span class=\"input-group-text\" [innerHTML]=\"model.prefix\"></span>\n </div>\n\n <input *ngIf=\"model.inputType === 'file'; else maskedInput\" class=\"form-control-file\"\n [attr.accept]=\"model.accept\"\n [attr.max]=\"model.max\"\n [attr.min]=\"model.min\"\n [attr.multiple]=\"model.multiple\"\n [attr.step]=\"model.step\"\n [autocomplete]=\"model.autoComplete\"\n [autofocus]=\"model.autoFocus\"\n [class.is-invalid]=\"showErrorMessages\"\n [dynamicList]=\"model.listId\"\n [formControlName]=\"model.id\"\n [id]=\"id\"\n [maxlength]=\"model.maxLength\"\n [minlength]=\"model.minLength\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\"\n [pattern]=\"model.pattern\"\n [placeholder]=\"model.placeholder\"\n [readonly]=\"model.readOnly\"\n [required]=\"model.required\"\n [spellcheck]=\"model.spellCheck\"\n [tabindex]=\"model.tabIndex\"\n [type]=\"model.inputType\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"/>\n\n <ng-template #maskedInput>\n <input class=\"form-control\"\n [attr.accept]=\"model.accept\"\n [attr.max]=\"model.max\"\n [attr.min]=\"model.min\"\n [attr.multiple]=\"model.multiple\"\n [attr.step]=\"model.step\"\n [autocomplete]=\"model.autoComplete\"\n [autofocus]=\"model.autoFocus\"\n [class.is-invalid]=\"showErrorMessages\"\n [dynamicList]=\"model.listId\"\n [formControlName]=\"model.id\"\n [id]=\"id\"\n [maxlength]=\"model.maxLength\"\n [minlength]=\"model.minLength\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\"\n [pattern]=\"model.pattern\"\n [placeholder]=\"model.placeholder\"\n [readonly]=\"model.readOnly\"\n [required]=\"model.required\"\n [spellcheck]=\"model.spellCheck\"\n [tabindex]=\"model.tabIndex\"\n [mask]=\"model.mask\"\n [specialCharacters]=\"model.maskConfig?.specialCharacters\"\n [patterns]=\"model.maskConfig?.patterns\"\n [prefix]=\"model.maskConfig?.prefix\"\n [suffix]=\"model.maskConfig?.suffix\"\n [thousandSeparator]=\"model.maskConfig?.thousandSeparator\"\n [decimalMarker]=\"model.maskConfig?.decimalMarker\"\n [dropSpecialCharacters]=\"model.maskConfig?.dropSpecialCharacters\"\n [hiddenInput]=\"model.maskConfig?.hiddenInput\"\n [showMaskTyped]=\"model.maskConfig?.showMaskTyped\"\n [placeHolderCharacter]=\"model.maskConfig?.placeHolderCharacter\"\n [shownMaskExpression]=\"model.maskConfig?.shownMaskExpression\"\n [showTemplate]=\"model.maskConfig?.showTemplate\"\n [clearIfNotMatch]=\"model.maskConfig.clearIfNotMatch\"\n [validation]=\"model.maskConfig.validation\"\n [separatorLimit]=\"model.maskConfig.separatorLimit\"\n [allowNegativeNumbers]=\"model.maskConfig.allowNegativeNumbers\"\n [leadZeroDateTime]=\"model.maskConfig.leadZeroDateTime\"\n [type]=\"model.inputType\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"/>\n </ng-template>\n\n <div *ngIf=\"model.suffix\" class=\"input-group-append\">\n <span class=\"input-group-text\" [innerHTML]=\"model.suffix\"></span>\n </div>\n\n <datalist *ngIf=\"model.hasList\" [id]=\"model.listId\">\n <option *ngFor=\"let option of model.list$ | async\" [value]=\"option\">\n </datalist>\n\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: DynamicFormsCoreModule }, { kind: "directive", type: i1.DynamicListDirective, selector: "[dynamicList]", inputs: ["dynamicList"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicNGBootstrapInputComponent, decorators: [{
type: Component,
args: [{ selector: "dynamic-ng-bootstrap-input", changeDetection: ChangeDetectionStrategy.Default, standalone: true, imports: [ReactiveFormsModule, NgIf, DynamicFormsCoreModule, NgClass, NgxMaskDirective, NgFor, AsyncPipe], template: "<div [formGroup]=\"group\" [class.input-group]=\"model.prefix || model.suffix\">\n\n <div *ngIf=\"model.prefix\" class=\"input-group-prepend\">\n <span class=\"input-group-text\" [innerHTML]=\"model.prefix\"></span>\n </div>\n\n <input *ngIf=\"model.inputType === 'file'; else maskedInput\" class=\"form-control-file\"\n [attr.accept]=\"model.accept\"\n [attr.max]=\"model.max\"\n [attr.min]=\"model.min\"\n [attr.multiple]=\"model.multiple\"\n [attr.step]=\"model.step\"\n [autocomplete]=\"model.autoComplete\"\n [autofocus]=\"model.autoFocus\"\n [class.is-invalid]=\"showErrorMessages\"\n [dynamicList]=\"model.listId\"\n [formControlName]=\"model.id\"\n [id]=\"id\"\n [maxlength]=\"model.maxLength\"\n [minlength]=\"model.minLength\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\"\n [pattern]=\"model.pattern\"\n [placeholder]=\"model.placeholder\"\n [readonly]=\"model.readOnly\"\n [required]=\"model.required\"\n [spellcheck]=\"model.spellCheck\"\n [tabindex]=\"model.tabIndex\"\n [type]=\"model.inputType\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"/>\n\n <ng-template #maskedInput>\n <input class=\"form-control\"\n [attr.accept]=\"model.accept\"\n [attr.max]=\"model.max\"\n [attr.min]=\"model.min\"\n [attr.multiple]=\"model.multiple\"\n [attr.step]=\"model.step\"\n [autocomplete]=\"model.autoComplete\"\n [autofocus]=\"model.autoFocus\"\n [class.is-invalid]=\"showErrorMessages\"\n [dynamicList]=\"model.listId\"\n [formControlName]=\"model.id\"\n [id]=\"id\"\n [maxlength]=\"model.maxLength\"\n [minlength]=\"model.minLength\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\"\n [pattern]=\"model.pattern\"\n [placeholder]=\"model.placeholder\"\n [readonly]=\"model.readOnly\"\n [required]=\"model.required\"\n [spellcheck]=\"model.spellCheck\"\n [tabindex]=\"model.tabIndex\"\n [mask]=\"model.mask\"\n [specialCharacters]=\"model.maskConfig?.specialCharacters\"\n [patterns]=\"model.maskConfig?.patterns\"\n [prefix]=\"model.maskConfig?.prefix\"\n [suffix]=\"model.maskConfig?.suffix\"\n [thousandSeparator]=\"model.maskConfig?.thousandSeparator\"\n [decimalMarker]=\"model.maskConfig?.decimalMarker\"\n [dropSpecialCharacters]=\"model.maskConfig?.dropSpecialCharacters\"\n [hiddenInput]=\"model.maskConfig?.hiddenInput\"\n [showMaskTyped]=\"model.maskConfig?.showMaskTyped\"\n [placeHolderCharacter]=\"model.maskConfig?.placeHolderCharacter\"\n [shownMaskExpression]=\"model.maskConfig?.shownMaskExpression\"\n [showTemplate]=\"model.maskConfig?.showTemplate\"\n [clearIfNotMatch]=\"model.maskConfig.clearIfNotMatch\"\n [validation]=\"model.maskConfig.validation\"\n [separatorLimit]=\"model.maskConfig.separatorLimit\"\n [allowNegativeNumbers]=\"model.maskConfig.allowNegativeNumbers\"\n [leadZeroDateTime]=\"model.maskConfig.leadZeroDateTime\"\n [type]=\"model.inputType\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"/>\n </ng-template>\n\n <div *ngIf=\"model.suffix\" class=\"input-group-append\">\n <span class=\"input-group-text\" [innerHTML]=\"model.suffix\"></span>\n </div>\n\n <datalist *ngIf=\"model.hasList\" [id]=\"model.listId\">\n <option *ngFor=\"let option of model.list$ | async\" [value]=\"option\">\n </datalist>\n\n</div>\n" }]
}], ctorParameters: function () { return [{ type: i1.DynamicFormLayoutService }, { type: i1.DynamicFormValidationService }]; }, propDecorators: { formLayout: [{
type: Input
}], group: [{
type: Input
}], layout: [{
type: Input
}], model: [{
type: Input
}], blur: [{
type: Output
}], change: [{
type: Output
}], focus: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1uZy1ib290c3RyYXAtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZHluYW1pYy1mb3Jtcy91aS1uZy1ib290c3RyYXAvc3JjL2xpYi9pbnB1dC9keW5hbWljLW5nLWJvb3RzdHJhcC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1keW5hbWljLWZvcm1zL3VpLW5nLWJvb3RzdHJhcC9zcmMvbGliL2lucHV0L2R5bmFtaWMtbmctYm9vdHN0cmFwLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxFQUFvQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFDSCwyQkFBMkIsRUFNM0Isc0JBQXNCLEVBQ3pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQVNsRSxNQUFNLE9BQU8sZ0NBQWlDLFNBQVEsMkJBQTJCO0lBVTdFLFlBQXNCLGFBQXVDLEVBQVksaUJBQStDO1FBQ3BILEtBQUssQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUR0QixrQkFBYSxHQUFiLGFBQWEsQ0FBMEI7UUFBWSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQThCO1FBSjlHLFNBQUksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3QyxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0MsVUFBSyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBSXhELENBQUM7OEdBWlEsZ0NBQWdDO2tHQUFoQyxnQ0FBZ0Msa1FDckI3QywybUlBeUZBLDJDRHRFYyxtQkFBbUIsNnVEQUFFLElBQUksNEZBQUUsc0JBQXNCLHlJQUFFLE9BQU8sb0ZBQUUsZ0JBQWdCLHVlQUFFLEtBQUssOEdBQUUsU0FBUzs7MkZBRS9GLGdDQUFnQztrQkFQNUMsU0FBUzsrQkFDSSw0QkFBNEIsbUJBRXJCLHVCQUF1QixDQUFDLE9BQU8sY0FDcEMsSUFBSSxXQUNQLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDOzBKQUdoRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gICAgRHluYW1pY0Zvcm1Db250cm9sQ29tcG9uZW50LFxuICAgIER5bmFtaWNGb3JtQ29udHJvbExheW91dCxcbiAgICBEeW5hbWljRm9ybUxheW91dCxcbiAgICBEeW5hbWljRm9ybUxheW91dFNlcnZpY2UsXG4gICAgRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSxcbiAgICBEeW5hbWljSW5wdXRNb2RlbCxcbiAgICBEeW5hbWljRm9ybXNDb3JlTW9kdWxlXG59IGZyb20gXCJAbmctZHluYW1pYy1mb3Jtcy9jb3JlXCI7XG5pbXBvcnQgeyBOZ3hNYXNrRGlyZWN0aXZlIH0gZnJvbSBcIm5neC1tYXNrXCI7XG5pbXBvcnQgeyBOZ0lmLCBOZ0NsYXNzLCBOZ0ZvciwgQXN5bmNQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJkeW5hbWljLW5nLWJvb3RzdHJhcC1pbnB1dFwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vZHluYW1pYy1uZy1ib290c3RyYXAtaW5wdXQuY29tcG9uZW50Lmh0bWxcIixcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgTmdJZiwgRHluYW1pY0Zvcm1zQ29yZU1vZHVsZSwgTmdDbGFzcywgTmd4TWFza0RpcmVjdGl2ZSwgTmdGb3IsIEFzeW5jUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY05HQm9vdHN0cmFwSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBEeW5hbWljRm9ybUNvbnRyb2xDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGZvcm1MYXlvdXQ/OiBEeW5hbWljRm9ybUxheW91dDtcbiAgICBASW5wdXQoKSBncm91cCE6IFVudHlwZWRGb3JtR3JvdXA7XG4gICAgQElucHV0KCkgbGF5b3V0PzogRHluYW1pY0Zvcm1Db250cm9sTGF5b3V0O1xuICAgIEBJbnB1dCgpIG1vZGVsITogRHluYW1pY0lucHV0TW9kZWw7XG5cbiAgICBAT3V0cHV0KCkgYmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBsYXlvdXRTZXJ2aWNlOiBEeW5hbWljRm9ybUxheW91dFNlcnZpY2UsIHByb3RlY3RlZCB2YWxpZGF0aW9uU2VydmljZTogRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSkge1xuICAgICAgICBzdXBlcihsYXlvdXRTZXJ2aWNlLCB2YWxpZGF0aW9uU2VydmljZSk7XG4gICAgfVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImdyb3VwXCIgW2NsYXNzLmlucHV0LWdyb3VwXT1cIm1vZGVsLnByZWZpeCB8fCBtb2RlbC5zdWZmaXhcIj5cblxuICAgIDxkaXYgKm5nSWY9XCJtb2RlbC5wcmVmaXhcIiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgW2lubmVySFRNTF09XCJtb2RlbC5wcmVmaXhcIj48L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8aW5wdXQgKm5nSWY9XCJtb2RlbC5pbnB1dFR5cGUgPT09ICdmaWxlJzsgZWxzZSBtYXNrZWRJbnB1dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sLWZpbGVcIlxuICAgICAgICAgICBbYXR0ci5hY2NlcHRdPVwibW9kZWwuYWNjZXB0XCJcbiAgICAgICAgICAgW2F0dHIubWF4XT1cIm1vZGVsLm1heFwiXG4gICAgICAgICAgIFthdHRyLm1pbl09XCJtb2RlbC5taW5cIlxuICAgICAgICAgICBbYXR0ci5tdWx0aXBsZV09XCJtb2RlbC5tdWx0aXBsZVwiXG4gICAgICAgICAgIFthdHRyLnN0ZXBdPVwibW9kZWwuc3RlcFwiXG4gICAgICAgICAgIFthdXRvY29tcGxldGVdPVwibW9kZWwuYXV0b0NvbXBsZXRlXCJcbiAgICAgICAgICAgW2F1dG9mb2N1c109XCJtb2RlbC5hdXRvRm9jdXNcIlxuICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJzaG93RXJyb3JNZXNzYWdlc1wiXG4gICAgICAgICAgIFtkeW5hbWljTGlzdF09XCJtb2RlbC5saXN0SWRcIlxuICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIm1vZGVsLmlkXCJcbiAgICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICAgW21heGxlbmd0aF09XCJtb2RlbC5tYXhMZW5ndGhcIlxuICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1vZGVsLm1pbkxlbmd0aFwiXG4gICAgICAgICAgIFtuYW1lXT1cIm1vZGVsLm5hbWVcIlxuICAgICAgICAgICBbbmdDbGFzc109XCJnZXRDbGFzcygnZWxlbWVudCcsICdjb250cm9sJylcIlxuICAgICAgICAgICBbcGF0dGVybl09XCJtb2RlbC5wYXR0ZXJuXCJcbiAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1vZGVsLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgW3JlYWRvbmx5XT1cIm1vZGVsLnJlYWRPbmx5XCJcbiAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1vZGVsLnJlcXVpcmVkXCJcbiAgICAgICAgICAgW3NwZWxsY2hlY2tdPVwibW9kZWwuc3BlbGxDaGVja1wiXG4gICAgICAgICAgIFt0YWJpbmRleF09XCJtb2RlbC50YWJJbmRleFwiXG4gICAgICAgICAgIFt0eXBlXT1cIm1vZGVsLmlucHV0VHlwZVwiXG4gICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiLz5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbWFza2VkSW5wdXQ+XG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICBbYXR0ci5hY2NlcHRdPVwibW9kZWwuYWNjZXB0XCJcbiAgICAgICAgICAgICAgIFthdHRyLm1heF09XCJtb2RlbC5tYXhcIlxuICAgICAgICAgICAgICAgW2F0dHIubWluXT1cIm1vZGVsLm1pblwiXG4gICAgICAgICAgICAgICBbYXR0ci5tdWx0aXBsZV09XCJtb2RlbC5tdWx0aXBsZVwiXG4gICAgICAgICAgICAgICBbYXR0ci5zdGVwXT1cIm1vZGVsLnN0ZXBcIlxuICAgICAgICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJtb2RlbC5hdXRvQ29tcGxldGVcIlxuICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJtb2RlbC5hdXRvRm9jdXNcIlxuICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yTWVzc2FnZXNcIlxuICAgICAgICAgICAgICAgW2R5bmFtaWNMaXN0XT1cIm1vZGVsLmxpc3RJZFwiXG4gICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIm1vZGVsLmlkXCJcbiAgICAgICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1vZGVsLm1heExlbmd0aFwiXG4gICAgICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1vZGVsLm1pbkxlbmd0aFwiXG4gICAgICAgICAgICAgICBbbmFtZV09XCJtb2RlbC5uYW1lXCJcbiAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzKCdlbGVtZW50JywgJ2NvbnRyb2wnKVwiXG4gICAgICAgICAgICAgICBbcGF0dGVybl09XCJtb2RlbC5wYXR0ZXJuXCJcbiAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtb2RlbC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICBbcmVhZG9ubHldPVwibW9kZWwucmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1vZGVsLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgIFtzcGVsbGNoZWNrXT1cIm1vZGVsLnNwZWxsQ2hlY2tcIlxuICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIm1vZGVsLnRhYkluZGV4XCJcbiAgICAgICAgICAgICAgIFttYXNrXT1cIm1vZGVsLm1hc2tcIlxuICAgICAgICAgICAgICAgW3NwZWNpYWxDaGFyYWN0ZXJzXT1cIm1vZGVsLm1hc2tDb25maWc/LnNwZWNpYWxDaGFyYWN0ZXJzXCJcbiAgICAgICAgICAgICAgIFtwYXR0ZXJuc109XCJtb2RlbC5tYXNrQ29uZmlnPy5wYXR0ZXJuc1wiXG4gICAgICAgICAgICAgICBbcHJlZml4XT1cIm1vZGVsLm1hc2tDb25maWc/LnByZWZpeFwiXG4gICAgICAgICAgICAgICBbc3VmZml4XT1cIm1vZGVsLm1hc2tDb25maWc/LnN1ZmZpeFwiXG4gICAgICAgICAgICAgICBbdGhvdXNhbmRTZXBhcmF0b3JdPVwibW9kZWwubWFza0NvbmZpZz8udGhvdXNhbmRTZXBhcmF0b3JcIlxuICAgICAgICAgICAgICAgW2RlY2ltYWxNYXJrZXJdPVwibW9kZWwubWFza0NvbmZpZz8uZGVjaW1hbE1hcmtlclwiXG4gICAgICAgICAgICAgICBbZHJvcFNwZWNpYWxDaGFyYWN0ZXJzXT1cIm1vZGVsLm1hc2tDb25maWc/LmRyb3BTcGVjaWFsQ2hhcmFjdGVyc1wiXG4gICAgICAgICAgICAgICBbaGlkZGVuSW5wdXRdPVwibW9kZWwubWFza0NvbmZpZz8uaGlkZGVuSW5wdXRcIlxuICAgICAgICAgICAgICAgW3Nob3dNYXNrVHlwZWRdPVwibW9kZWwubWFza0NvbmZpZz8uc2hvd01hc2tUeXBlZFwiXG4gICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJDaGFyYWN0ZXJdPVwibW9kZWwubWFza0NvbmZpZz8ucGxhY2VIb2xkZXJDaGFyYWN0ZXJcIlxuICAgICAgICAgICAgICAgW3Nob3duTWFza0V4cHJlc3Npb25dPVwibW9kZWwubWFza0NvbmZpZz8uc2hvd25NYXNrRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAgICBbc2hvd1RlbXBsYXRlXT1cIm1vZGVsLm1hc2tDb25maWc/LnNob3dUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICBbY2xlYXJJZk5vdE1hdGNoXT1cIm1vZGVsLm1hc2tDb25maWcuY2xlYXJJZk5vdE1hdGNoXCJcbiAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uXT1cIm1vZGVsLm1hc2tDb25maWcudmFsaWRhdGlvblwiXG4gICAgICAgICAgICAgICBbc2VwYXJhdG9yTGltaXRdPVwibW9kZWwubWFza0NvbmZpZy5zZXBhcmF0b3JMaW1pdFwiXG4gICAgICAgICAgICAgICBbYWxsb3dOZWdhdGl2ZU51bWJlcnNdPVwibW9kZWwubWFza0NvbmZpZy5hbGxvd05lZ2F0aXZlTnVtYmVyc1wiXG4gICAgICAgICAgICAgICBbbGVhZFplcm9EYXRlVGltZV09XCJtb2RlbC5tYXNrQ29uZmlnLmxlYWRaZXJvRGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgW3R5cGVdPVwibW9kZWwuaW5wdXRUeXBlXCJcbiAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCIvPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibW9kZWwuc3VmZml4XCIgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgW2lubmVySFRNTF09XCJtb2RlbC5zdWZmaXhcIj48L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGF0YWxpc3QgKm5nSWY9XCJtb2RlbC5oYXNMaXN0XCIgW2lkXT1cIm1vZGVsLmxpc3RJZFwiPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgbW9kZWwubGlzdCQgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICA8L2RhdGFsaXN0PlxuXG48L2Rpdj5cbiJdfQ==