UNPKG

ngx-antd-form-builder

Version:

Simple Drag&Drop form builder using ng-zorro-antd

110 lines 27 kB
import { CommonModule } from "@angular/common"; import { Component, Input, forwardRef } from "@angular/core"; import { FormsModule, NG_VALUE_ACCESSOR } from "@angular/forms"; import { NzButtonModule } from "ng-zorro-antd/button"; import { NzGridModule } from "ng-zorro-antd/grid"; import { NzIconModule } from "ng-zorro-antd/icon"; import { NzInputModule } from "ng-zorro-antd/input"; import { NzInputNumberModule } from "ng-zorro-antd/input-number"; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/input-number"; import * as i2 from "ng-zorro-antd/input"; import * as i3 from "@angular/forms"; import * as i4 from "@angular/common"; import * as i5 from "ng-zorro-antd/icon"; import * as i6 from "ng-zorro-antd/button"; import * as i7 from "ng-zorro-antd/core/transition-patch"; import * as i8 from "ng-zorro-antd/core/wave"; import * as i9 from "ng-zorro-antd/grid"; export class DesignFormChangeOptionComponent { constructor() { this.onChange = (_) => { }; this.onTouched = () => { }; //@Input() value: Array<any>; this.type = 'option'; } writeValue(obj) { this._value = obj; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { //throw new Error("Method not implemented."); } //@Output() readonly changeValue = new EventEmitter(); handleAdd() { // 添加 const addData = [ ...this._value, { value: `${this._value.length + 1}`, label: (this.type == 'collapse' ? "Panel " : "Option ") + (this._value.length + 1), list: this.type === "tab" || this.type == 'collapse' ? [] : undefined } ]; this._value = addData; this.onChange(addData); //this.$emit("input", addData); } handleAddCol() { // 添加栅格Col const addData = [ ...this._value, { span: 12, list: [] } ]; this._value = addData; this.onChange(addData); //this.$emit("input", addData); } handleAddRules() { const addData = [ ...this._value, { pattern: "", message: "" } ]; this._value = addData; this.onChange(addData); //this.$emit("input", addData); } handleDelete(deleteIndex) { // 删除 this._value = this._value.filter((val, index) => index !== deleteIndex); this.onChange(this._value); // this.$emit( // "input", // this.value.filter((val, index) => index !== deleteIndex) // ); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DesignFormChangeOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: DesignFormChangeOptionComponent, isStandalone: true, selector: "app-design-form-change-option", inputs: { type: "type" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DesignFormChangeOptionComponent), multi: true } ], ngImport: i0, template: "<div class=\"option-change-container\">\r\n <div *ngIf=\"type === 'option' || type === 'tab'\">\r\n <div nz-row [nzGutter]=\"6\" class=\"option-change-box\" *ngFor=\"let val of _value; let index = index\">\r\n <div nz-col nzSpan=\"12\">\r\n <input type=\"text\" [(ngModel)]=\"val.label\" nz-input placeholder=\"Label\">\r\n </div>\r\n <div nz-col nzSpan=\"6\">\r\n <input type=\"text\" [(ngModel)]=\"val.value\" nz-input placeholder=\"Value\">\r\n </div>\r\n <!-- <div nz-col nzSpan=\"6\">\r\n <input type=\"text\" [(ngModel)]=\"val.tooltip\" nz-input placeholder=\"tooltip\">\r\n </div> -->\r\n <div nz-col nzSpan=\"6\">\r\n <div class=\"option-delete-box\" (click)=\"handleDelete(index)\">\r\n <button nz-button nzDanger ><i nz-icon nzType=\"delete\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleAdd()\">Add</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"type === 'rules'\">\r\n <div nz-row class=\"option-change-box\" *ngFor=\"let val of _value; let index = index\">\r\n <ng-container *ngIf=\"index !== 0\">\r\n <div nz-col nzSpan=\"24\">\r\n <input type=\"text\" [(ngModel)]=\"val.message\" nz-input placeholder=\"Validation Tooltip\">\r\n </div>\r\n <div nz-col nzSpan=\"20\">\r\n <input type=\"text\" [(ngModel)]=\"val.pattern\" nz-input placeholder=\"Regex pattern\">\r\n </div>\r\n <div nz-col nzSpan=\"4\">\r\n <div class=\"option-delete-box\" (click)=\"handleDelete(index)\">\r\n <button nz-button nzType=\"primary\" nzDanger><i nz-icon nzType=\"delete\"></i></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleAddRules()\">Add</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"type === 'colspan'\">\r\n <div nz-row class=\"option-change-box\" *ngFor=\"let val of _value; let index = index\">\r\n <div nz-col nzSpan=\"18\">\r\n <nz-input-number [(ngModel)]=\"val.span\" style=\"width: 100%;\" [nzMax]=\"24\" [nzPlaceHolder]=\"'\u540D\u79F0'\"></nz-input-number>\r\n </div>\r\n <div nz-col nzSpan=\"6\">\r\n <div class=\"option-delete-box\" (click)=\"handleDelete(index)\">\r\n <button nz-button nzDanger><i nz-icon nzType=\"delete\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"24\">\r\n <button nz-button (click)=\"handleAddCol()\">Add</button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"type === 'collapse'\">\r\n <div nz-row class=\"option-change-box\" *ngFor=\"let val of _value; let index = index\">\r\n <div nz-col nzSpan=\"18\">\r\n <input type=\"text\" [(ngModel)]=\"val.label\" nz-input placeholder=\"Name\">\r\n </div>\r\n <div nz-col nzSpan=\"6\">\r\n <div class=\"option-delete-box\" (click)=\"handleDelete(index)\">\r\n <button nz-button nzDanger><i nz-icon nzType=\"delete\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <button nz-button (click)=\"handleAdd()\">Add</button>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:block;width:100%}:host .option-change-container>div>div>div{max-width:100%!important}:host .option-change-container>div>div>div input{width:100%;margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: NzInputNumberModule }, { kind: "component", type: i1.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i2.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i5.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i7.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i8.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i9.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i9.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DesignFormChangeOptionComponent, decorators: [{ type: Component, args: [{ standalone: true, selector: 'app-design-form-change-option', imports: [ NzInputNumberModule, NzInputModule, FormsModule, CommonModule, NzIconModule, NzButtonModule, NzGridModule, ], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DesignFormChangeOptionComponent), multi: true } ], template: "<div class=\"option-change-container\">\r\n <div *ngIf=\"type === 'option' || type === 'tab'\">\r\n <div nz-row [nzGutter]=\"6\" class=\"option-change-box\" *ngFor=\"let val of _value; let index = index\">\r\n <div nz-col nzSpan=\"12\">\r\n <input type=\"text\" [(ngModel)]=\"val.label\" nz-input placeholder=\"Label\">\r\n </div>\r\n <div nz-col nzSpan=\"6\">\r\n <input type=\"text\" [(ngModel)]=\"val.value\" nz-input placeholder=\"Value\">\r\n </div>\r\n <!-- <div nz-col nzSpan=\"6\">\r\n <input type=\"text\" [(ngModel)]=\"val.tooltip\" nz-input placeholder=\"tooltip\">\r\n </div> -->\r\n <div nz-col nzSpan=\"6\">\r\n <div class=\"option-delete-box\" (click)=\"handleDelete(index)\">\r\n <button nz-button nzDanger ><i nz-icon nzType=\"delete\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleAdd()\">Add</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"type === 'rules'\">\r\n <div nz-row class=\"option-change-box\" *ngFor=\"let val of _value; let index = index\">\r\n <ng-container *ngIf=\"index !== 0\">\r\n <div nz-col nzSpan=\"24\">\r\n <input type=\"text\" [(ngModel)]=\"val.message\" nz-input placeholder=\"Validation Tooltip\">\r\n </div>\r\n <div nz-col nzSpan=\"20\">\r\n <input type=\"text\" [(ngModel)]=\"val.pattern\" nz-input placeholder=\"Regex pattern\">\r\n </div>\r\n <div nz-col nzSpan=\"4\">\r\n <div class=\"option-delete-box\" (click)=\"handleDelete(index)\">\r\n <button nz-button nzType=\"primary\" nzDanger><i nz-icon nzType=\"delete\"></i></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleAddRules()\">Add</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"type === 'colspan'\">\r\n <div nz-row class=\"option-change-box\" *ngFor=\"let val of _value; let index = index\">\r\n <div nz-col nzSpan=\"18\">\r\n <nz-input-number [(ngModel)]=\"val.span\" style=\"width: 100%;\" [nzMax]=\"24\" [nzPlaceHolder]=\"'\u540D\u79F0'\"></nz-input-number>\r\n </div>\r\n <div nz-col nzSpan=\"6\">\r\n <div class=\"option-delete-box\" (click)=\"handleDelete(index)\">\r\n <button nz-button nzDanger><i nz-icon nzType=\"delete\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"24\">\r\n <button nz-button (click)=\"handleAddCol()\">Add</button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"type === 'collapse'\">\r\n <div nz-row class=\"option-change-box\" *ngFor=\"let val of _value; let index = index\">\r\n <div nz-col nzSpan=\"18\">\r\n <input type=\"text\" [(ngModel)]=\"val.label\" nz-input placeholder=\"Name\">\r\n </div>\r\n <div nz-col nzSpan=\"6\">\r\n <div class=\"option-delete-box\" (click)=\"handleDelete(index)\">\r\n <button nz-button nzDanger><i nz-icon nzType=\"delete\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <button nz-button (click)=\"handleAdd()\">Add</button>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:block;width:100%}:host .option-change-container>div>div>div{max-width:100%!important}:host .option-change-container>div>div>div input{width:100%;margin-bottom:10px}\n"] }] }], ctorParameters: () => [], propDecorators: { type: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLWZvcm0tY2hhbmdlLW9wdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYW50ZC1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWNoYW5nZS1vcHRpb24vZGVzaWduLWZvcm0tY2hhbmdlLW9wdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYW50ZC1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWNoYW5nZS1vcHRpb24vZGVzaWduLWZvcm0tY2hhbmdlLW9wdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXdCLFVBQVUsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBbUJqRSxNQUFNLE9BQU8sK0JBQStCO0lBQzFDO1FBR0EsYUFBUSxHQUFxQixDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLGNBQVMsR0FBZSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFlbEMs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K0IsV0FHaEM7d0JBQ1AsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBQyxZQUFZLEVBQUMsWUFBWSxFQUFDLGNBQWMsRUFBQyxZQUFZO3FCQUN0RyxhQUNVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGdDQUFnQyxDQUFDOzRCQUM5RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjt3REF3QlEsSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTnpCdXR0b25Nb2R1bGUgfSBmcm9tIFwibmctem9ycm8tYW50ZC9idXR0b25cIjtcclxuaW1wb3J0IHsgTnpHcmlkTW9kdWxlIH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvZ3JpZFwiO1xyXG5pbXBvcnQgeyBOekljb25Nb2R1bGUgfSBmcm9tIFwibmctem9ycm8tYW50ZC9pY29uXCI7XHJcbmltcG9ydCB7IE56SW5wdXRNb2R1bGUgfSBmcm9tIFwibmctem9ycm8tYW50ZC9pbnB1dFwiO1xyXG5pbXBvcnQgeyBOeklucHV0TnVtYmVyTW9kdWxlIH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvaW5wdXQtbnVtYmVyXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHNlbGVjdG9yOiAnYXBwLWRlc2lnbi1mb3JtLWNoYW5nZS1vcHRpb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXNpZ24tZm9ybS1jaGFuZ2Utb3B0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kZXNpZ24tZm9ybS1jaGFuZ2Utb3B0aW9uLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTnpJbnB1dE51bWJlck1vZHVsZSwgTnpJbnB1dE1vZHVsZSwgRm9ybXNNb2R1bGUsQ29tbW9uTW9kdWxlLE56SWNvbk1vZHVsZSxOekJ1dHRvbk1vZHVsZSxOekdyaWRNb2R1bGUsXHJcbiAgXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERlc2lnbkZvcm1DaGFuZ2VPcHRpb25Db21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxuICBcclxufSlcclxuZXhwb3J0IGNsYXNzIERlc2lnbkZvcm1DaGFuZ2VPcHRpb25Db21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgKSB7fVxyXG4gIF92YWx1ZTogYW55XHJcbiAgb25DaGFuZ2U6IChfOiBhbnkpID0+IHZvaWQgPSAoXzogYW55KSA9PiB7IH07XHJcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4geyB9O1xyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gb2JqXHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuXHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIC8vdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy9ASW5wdXQoKSB2YWx1ZTogQXJyYXk8YW55PjtcclxuICBASW5wdXQoKSB0eXBlOiBzdHJpbmcgPSAnb3B0aW9uJztcclxuICAvL0BPdXRwdXQoKSByZWFkb25seSBjaGFuZ2VWYWx1ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgaGFuZGxlQWRkKCkge1xyXG4gICAgLy8g5re75YqgXHJcbiAgICBjb25zdCBhZGREYXRhID0gW1xyXG4gICAgICAuLi50aGlzLl92YWx1ZSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiBgJHt0aGlzLl92YWx1ZS5sZW5ndGggKyAxfWAsXHJcbiAgICAgICAgbGFiZWw6ICh0aGlzLnR5cGUgPT0gJ2NvbGxhcHNlJyA/IFwiUGFuZWwgXCIgOiBcIk9wdGlvbiBcIikgKyAodGhpcy5fdmFsdWUubGVuZ3RoICsgMSksXHJcbiAgICAgICAgbGlzdDogdGhpcy50eXBlID09PSBcInRhYlwiIHx8IHRoaXMudHlwZSA9PSAnY29sbGFwc2UnID8gW10gOiB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuX3ZhbHVlID0gYWRkRGF0YVxyXG4gICAgdGhpcy5vbkNoYW5nZShhZGREYXRhKVxyXG4gICAgLy90aGlzLiRlbWl0KFwiaW5wdXRcIiwgYWRkRGF0YSk7XHJcbiAgfVxyXG4gIGhhbmRsZUFkZENvbCgpIHtcclxuICAgIC8vIOa3u+WKoOagheagvENvbFxyXG4gICAgY29uc3QgYWRkRGF0YSA9IFtcclxuICAgICAgLi4udGhpcy5fdmFsdWUsXHJcbiAgICAgIHtcclxuICAgICAgICBzcGFuOiAxMixcclxuICAgICAgICBsaXN0OiBbXVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gICAgdGhpcy5fdmFsdWUgPSBhZGREYXRhXHJcbiAgICB0aGlzLm9uQ2hhbmdlKGFkZERhdGEpXHJcbiAgICAvL3RoaXMuJGVtaXQoXCJpbnB1dFwiLCBhZGREYXRhKTtcclxuICB9XHJcbiAgaGFuZGxlQWRkUnVsZXMoKSB7XHJcbiAgICBjb25zdCBhZGREYXRhID0gW1xyXG4gICAgICAuLi50aGlzLl92YWx1ZSxcclxuICAgICAge1xyXG4gICAgICAgIHBhdHRlcm46IFwiXCIsXHJcbiAgICAgICAgbWVzc2FnZTogXCJcIlxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gICAgdGhpcy5fdmFsdWUgPSBhZGREYXRhXHJcbiAgICB0aGlzLm9uQ2hhbmdlKGFkZERhdGEpXHJcbiAgICAvL3RoaXMuJGVtaXQoXCJpbnB1dFwiLCBhZGREYXRhKTtcclxuICB9XHJcbiAgaGFuZGxlRGVsZXRlKGRlbGV0ZUluZGV4KSB7XHJcbiAgICAvLyDliKDpmaRcclxuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fdmFsdWUuZmlsdGVyKCh2YWwsIGluZGV4KSA9PiBpbmRleCAhPT0gZGVsZXRlSW5kZXgpXHJcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuX3ZhbHVlKVxyXG4gICAgLy8gdGhpcy4kZW1pdChcclxuICAgIC8vICAgXCJpbnB1dFwiLFxyXG4gICAgLy8gICB0aGlzLnZhbHVlLmZpbHRlcigodmFsLCBpbmRleCkgPT4gaW5kZXggIT09IGRlbGV0ZUluZGV4KVxyXG4gICAgLy8gKTtcclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwib3B0aW9uLWNoYW5nZS1jb250YWluZXJcIj5cclxuICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0gJ29wdGlvbicgfHwgdHlwZSA9PT0gJ3RhYidcIj5cclxuICAgIDxkaXYgbnotcm93IFtuekd1dHRlcl09XCI2XCIgY2xhc3M9XCJvcHRpb24tY2hhbmdlLWJveFwiICpuZ0Zvcj1cImxldCB2YWwgb2YgX3ZhbHVlOyBsZXQgaW5kZXggPSBpbmRleFwiPlxyXG4gICAgICA8ZGl2IG56LWNvbCBuelNwYW49XCIxMlwiPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmFsLmxhYmVsXCIgbnotaW5wdXQgcGxhY2Vob2xkZXI9XCJMYWJlbFwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiNlwiPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmFsLnZhbHVlXCIgbnotaW5wdXQgcGxhY2Vob2xkZXI9XCJWYWx1ZVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSA8ZGl2IG56LWNvbCBuelNwYW49XCI2XCI+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ2YWwudG9vbHRpcFwiIG56LWlucHV0IHBsYWNlaG9sZGVyPVwidG9vbHRpcFwiPlxyXG4gICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjZcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWRlbGV0ZS1ib3hcIiAoY2xpY2spPVwiaGFuZGxlRGVsZXRlKGluZGV4KVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpEYW5nZXIgPjxpIG56LWljb24gbnpUeXBlPVwiZGVsZXRlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiMjRcIj5cclxuICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIChjbGljayk9XCJoYW5kbGVBZGQoKVwiPkFkZDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cInR5cGUgPT09ICdydWxlcydcIj5cclxuICAgIDxkaXYgbnotcm93IGNsYXNzPVwib3B0aW9uLWNoYW5nZS1ib3hcIiAqbmdGb3I9XCJsZXQgdmFsIG9mIF92YWx1ZTsgbGV0IGluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluZGV4ICE9PSAwXCI+XHJcbiAgICAgICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiMjRcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmFsLm1lc3NhZ2VcIiBuei1pbnB1dCBwbGFjZWhvbGRlcj1cIlZhbGlkYXRpb24gVG9vbHRpcFwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjIwXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZhbC5wYXR0ZXJuXCIgbnotaW5wdXQgcGxhY2Vob2xkZXI9XCJSZWdleCBwYXR0ZXJuXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiNFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1kZWxldGUtYm94XCIgKGNsaWNrKT1cImhhbmRsZURlbGV0ZShpbmRleClcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIG56RGFuZ2VyPjxpIG56LWljb24gbnpUeXBlPVwiZGVsZXRlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IG56LWNvbCBuelNwYW49XCIyNFwiPlxyXG4gICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImhhbmRsZUFkZFJ1bGVzKClcIj5BZGQ8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCJ0eXBlID09PSAnY29sc3BhbidcIj5cclxuICAgIDxkaXYgbnotcm93IGNsYXNzPVwib3B0aW9uLWNoYW5nZS1ib3hcIiAqbmdGb3I9XCJsZXQgdmFsIG9mIF92YWx1ZTsgbGV0IGluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiMThcIj5cclxuICAgICAgICA8bnotaW5wdXQtbnVtYmVyIFsobmdNb2RlbCldPVwidmFsLnNwYW5cIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIFtuek1heF09XCIyNFwiIFtuelBsYWNlSG9sZGVyXT1cIiflkI3np7AnXCI+PC9uei1pbnB1dC1udW1iZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IG56LWNvbCBuelNwYW49XCI2XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1kZWxldGUtYm94XCIgKGNsaWNrKT1cImhhbmRsZURlbGV0ZShpbmRleClcIj5cclxuICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIG56RGFuZ2VyPjxpIG56LWljb24gbnpUeXBlPVwiZGVsZXRlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBuei1yb3c+XHJcbiAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjI0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gKGNsaWNrKT1cImhhbmRsZUFkZENvbCgpXCI+QWRkPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cInR5cGUgPT09ICdjb2xsYXBzZSdcIj5cclxuICAgIDxkaXYgbnotcm93IGNsYXNzPVwib3B0aW9uLWNoYW5nZS1ib3hcIiAqbmdGb3I9XCJsZXQgdmFsIG9mIF92YWx1ZTsgbGV0IGluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiMThcIj5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZhbC5sYWJlbFwiIG56LWlucHV0IHBsYWNlaG9sZGVyPVwiTmFtZVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiNlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24tZGVsZXRlLWJveFwiIChjbGljayk9XCJoYW5kbGVEZWxldGUoaW5kZXgpXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuekRhbmdlcj48aSBuei1pY29uIG56VHlwZT1cImRlbGV0ZVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjI0XCI+XHJcbiAgICAgIDxidXR0b24gbnotYnV0dG9uIChjbGljayk9XCJoYW5kbGVBZGQoKVwiPkFkZDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==