ngx-antd-form-builder
Version:
Simple Drag&Drop form builder using ng-zorro-antd
194 lines • 31.9 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { LayoutItemComponent } from '../layout-item/layout-item.component';
import { CommonModule } from '@angular/common';
import { NzLayoutModule } from 'ng-zorro-antd/layout';
import { SortablejsModule } from '../../utils/sortablejs/sortablejs.module';
import { NzFormModule } from 'ng-zorro-antd/form';
import { NzButtonModule } from 'ng-zorro-antd/button';
import { NzIconModule } from 'ng-zorro-antd/icon';
import { DialogModule } from '@angular/cdk/dialog';
import { PreviewDialog } from '../preview-dialog/preview.dialog';
import { cloneDeep } from '../../utils/func';
import { PreviewDataDialog } from '../preview-data-dialog/preview-data.dialog';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/dialog";
import * as i2 from "../../ngx-antd-form-builder.component";
import * as i3 from "@angular/common";
import * as i4 from "ng-zorro-antd/form";
import * as i5 from "ng-zorro-antd/button";
import * as i6 from "ng-zorro-antd/core/transition-patch";
import * as i7 from "ng-zorro-antd/core/wave";
import * as i8 from "../../utils/sortablejs/sortablejs.directive";
export class DesignFormComponentPanelComponent {
constructor(dialog, antdFormBuilderComponent) {
this.dialog = dialog;
this.antdFormBuilderComponent = antdFormBuilderComponent;
this.handleSetSelectItem = new EventEmitter();
this.saveSchema = new EventEmitter();
this.options = {
group: 'draggable-box',
// ghostClass: 'moving',
animation: 180,
handle: '.drag-move',
onAdd: this.deepClone.bind(this)
};
this.insertAllowedType = [
"input",
"textarea",
"number",
"select",
"checkbox",
"radio",
"date",
"time",
"rate",
"slider",
"switch",
"text",
"html"
];
}
openPreview() {
this.dialog.open(PreviewDialog, {
minWidth: '300px',
data: {
json: this.antdFormBuilderComponent.getData()
}
});
}
openJsonSchema() {
this.dialog.open(PreviewDataDialog, {
minWidth: '600px',
data: {
json: this.antdFormBuilderComponent.getJsonSchema()
}
});
}
save() {
this.saveSchema.emit();
}
deepClone(evt) {
const newIndex = evt.newIndex;
// json深拷贝一次
//const listString = JSON.stringify(this.data.list);
this.data.list = cloneDeep(this.data.list); // JSON.parse(listString);
// 删除icon及compoent属性
delete this.data.list[newIndex].component;
this.handleSetSelectItem.emit(this.data.list[newIndex]);
}
handleColAdd($event) {
const { evt, columns, isCopy = false } = $event;
// 重置或者生成key值
const newIndex = evt.newIndex;
const key = columns[newIndex].type + "_" + new Date().getTime();
if (columns[newIndex].key === "" || isCopy) {
columns[newIndex] = {
...columns[newIndex],
key,
};
if (typeof columns[newIndex].options !== "undefined") {
// 深拷贝options
//const optionsStr = JSON.stringify(columns[newIndex].options);
columns[newIndex].options = cloneDeep(columns[newIndex].options); //JSON.parse(optionsStr);
}
if (typeof columns[newIndex].rules !== "undefined") {
// 深拷贝rules
//const rulesStr = JSON.stringify(columns[newIndex].rules);
columns[newIndex].rules = cloneDeep(columns[newIndex].rules); //JSON.parse(rulesStr);
}
if (typeof columns[newIndex].list !== "undefined") {
// 深拷贝list
columns[newIndex].list = [];
}
if (typeof columns[newIndex].columns !== "undefined") {
// 深拷贝columns
//const columnsStr = JSON.stringify(columns[newIndex].columns);
columns[newIndex].columns = cloneDeep(columns[newIndex].columns); // JSON.parse(columnsStr);
// 复制时,清空数据
columns[newIndex].columns.forEach(item => {
item.list = [];
});
}
if (columns[newIndex].type === "table") {
// 深拷贝trs
//const trsStr = JSON.stringify(columns[newIndex].trs);
columns[newIndex].trs = cloneDeep(columns[newIndex].trs); // JSON.parse(trsStr);
// 复制时,清空数据
columns[newIndex].trs.forEach(item => {
item.tds.forEach(val => {
val.list = [];
});
});
}
}
// 深拷贝数据
//const listString = JSON.stringify(columns[newIndex]);
columns[newIndex] = cloneDeep(columns[newIndex]); //JSON.parse(listString);
this.handleSetSelectItem.emit(columns[newIndex]);
}
handleCopy(isCopy = true, data) {
}
handleDelete($event) {
const traverse = array => {
array = array.filter((element, index) => {
if (["grid", "tabs", "selectInputList", 'collapse'].includes(element.type)) {
// 栅格布局
element.columns.forEach(item => {
item.list = traverse(item.list);
});
}
if (element.type === "card" || element.type === "batch" || element.type === "block") {
// 卡片布局
element.list = traverse(element.list);
}
if (element.type === "table") {
// 表格布局
element.trs.forEach(item => {
item.tds.forEach(val => {
val.list = traverse(val.list);
});
});
}
if (element.key !== this.selectItem.key) {
return true;
}
else {
if (array.length === 1) {
this.handleSetSelectItem.emit({ key: "" });
//this.handleSelectItem({ key: "" });
}
else if (array.length - 1 > index) {
this.handleSetSelectItem.emit(array[index + 1]);
//this.handleSelectItem();
}
else {
this.handleSetSelectItem.emit(array[index - 1]);
//this.handleSelectItem();
}
return false;
}
});
return array;
};
this.data.list = traverse(this.data.list);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DesignFormComponentPanelComponent, deps: [{ token: i1.Dialog }, { token: i2.NgxAntdFormBuilderComponent }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: DesignFormComponentPanelComponent, isStandalone: true, selector: "app-design-form-component-panel", inputs: { data: "data", selectItem: "selectItem" }, outputs: { handleSetSelectItem: "handleSetSelectItem", saveSchema: "saveSchema" }, ngImport: i0, template: "<div class=\"form-panel\">\r\n <div class=\"panel-btn\">\r\n <button nz-button (click)=\"openPreview()\">Preview</button>\r\n <button nz-button (click)=\"openJsonSchema()\">View Schema</button>\r\n <button nz-button nzType=\"primary\" (click)=\"save()\">Save</button>\r\n </div>\r\n <form nz-form class=\"a-form-box\"\r\n [nzLayout]=\"data.config.layout\" [ngStyle]=\"data.config.customStyle\">\r\n <div class=\"draggable-box\">\r\n <div class=\"list-main\" [sortablejs]=\"data.list\" [sortablejsOptions]=\"options\">\r\n <app-layout-item class=\"drag-move\" *ngFor=\"let item of data.list\" \r\n [record]=\"item\" [config]=\"data.config\"\r\n [selectItem]=\"selectItem\"\r\n (handleColAdd)=\"handleColAdd($event)\"\r\n (handleSelectItem)=\"handleSetSelectItem.emit($event)\"\r\n (handleCopy)=\"handleCopy($event, $event)\"\r\n (handleDelete)=\"handleDelete($event)\"\r\n >\r\n </app-layout-item>\r\n </div>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-panel{height:100%;background:#eee;position:relative}.form-panel .panel-btn{padding:4px;margin-bottom:4px;height:40px}.form-panel .a-form-box{height:calc(100% - 40px)}.form-panel .a-form-box .draggable-box{height:100%;overflow:auto}.form-panel .a-form-box .draggable-box .list-main{min-height:100%;padding:5px;position:relative;background:#fafafa}\n"], dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "component", type: LayoutItemComponent, selector: "app-layout-item", inputs: ["record", "config", "selectItem"], outputs: ["handleColAdd", "handleSelectItem", "handleCopy", "handleDelete"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: NzLayoutModule }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i4.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i5.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i6.ɵ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: i7.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "ngmodule", type: SortablejsModule }, { kind: "directive", type: i8.SortablejsDirective, selector: "[sortablejs]", inputs: ["sortablejs", "sortablejsContainer", "sortablejsOptions", "sortablejsCloneFunction"], outputs: ["sortablejsInit"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DesignFormComponentPanelComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'app-design-form-component-panel', imports: [
DialogModule,
LayoutItemComponent, CommonModule, NzLayoutModule, NzFormModule, NzButtonModule, NzIconModule,
SortablejsModule
], template: "<div class=\"form-panel\">\r\n <div class=\"panel-btn\">\r\n <button nz-button (click)=\"openPreview()\">Preview</button>\r\n <button nz-button (click)=\"openJsonSchema()\">View Schema</button>\r\n <button nz-button nzType=\"primary\" (click)=\"save()\">Save</button>\r\n </div>\r\n <form nz-form class=\"a-form-box\"\r\n [nzLayout]=\"data.config.layout\" [ngStyle]=\"data.config.customStyle\">\r\n <div class=\"draggable-box\">\r\n <div class=\"list-main\" [sortablejs]=\"data.list\" [sortablejsOptions]=\"options\">\r\n <app-layout-item class=\"drag-move\" *ngFor=\"let item of data.list\" \r\n [record]=\"item\" [config]=\"data.config\"\r\n [selectItem]=\"selectItem\"\r\n (handleColAdd)=\"handleColAdd($event)\"\r\n (handleSelectItem)=\"handleSetSelectItem.emit($event)\"\r\n (handleCopy)=\"handleCopy($event, $event)\"\r\n (handleDelete)=\"handleDelete($event)\"\r\n >\r\n </app-layout-item>\r\n </div>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-panel{height:100%;background:#eee;position:relative}.form-panel .panel-btn{padding:4px;margin-bottom:4px;height:40px}.form-panel .a-form-box{height:calc(100% - 40px)}.form-panel .a-form-box .draggable-box{height:100%;overflow:auto}.form-panel .a-form-box .draggable-box .list-main{min-height:100%;padding:5px;position:relative;background:#fafafa}\n"] }]
}], ctorParameters: () => [{ type: i1.Dialog }, { type: i2.NgxAntdFormBuilderComponent }], propDecorators: { data: [{
type: Input
}], selectItem: [{
type: Input
}], handleSetSelectItem: [{
type: Output
}], saveSchema: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLWZvcm0tY29tcG9uZW50LXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hbnRkLWZvcm0tYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvZGVzaWduLWZvcm0tY29tcG9uZW50LXBhbmVsL2Rlc2lnbi1mb3JtLWNvbXBvbmVudC1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYW50ZC1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWNvbXBvbmVudC1wYW5lbC9kZXNpZ24tZm9ybS1jb21wb25lbnQtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsS0FBSyxFQUFZLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd6RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBUyxZQUFZLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FB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QUFDLENBQUM7d0JBQ2hELDBCQUEwQjtvQkFDNUIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNoRCwwQkFBMEI7b0JBQzVCLENBQUM7b0JBQ0QsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMzQyxDQUFDOytHQWpLVSxpQ0FBaUM7bUdBQWpDLGlDQUFpQyxrT0MxQjlDLDRoQ0FzQk0sMlpEREYsWUFBWSwrQkFDWixtQkFBbUIsb0xBQUMsWUFBWSxnUEFBQyxjQUFjLDhCQUFDLFlBQVksa1BBQUMsY0FBYywrcUJBQUMsWUFBWSw4QkFDeEYsZ0JBQWdCOzs0RkFHUCxpQ0FBaUM7a0JBWDdDLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLGlDQUFpQyxXQUdsQzt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQixFQUFDLFlBQVksRUFBQyxjQUFjLEVBQUMsWUFBWSxFQUFDLGNBQWMsRUFBQyxZQUFZO3dCQUN4RixnQkFBZ0I7cUJBQ2pCO3FIQUdRLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNhLG1CQUFtQjtzQkFBckMsTUFBTTtnQkFDWSxVQUFVO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9wdGlvbmFsLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ3NvcnRhYmxlanMnO1xyXG5pbXBvcnQgeyBOZ3hBbnRkRm9ybUJ1aWxkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9uZ3gtYW50ZC1mb3JtLWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTGF5b3V0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2xheW91dC1pdGVtL2xheW91dC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE56TGF5b3V0TW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9sYXlvdXQnO1xyXG5pbXBvcnQgeyBTb3J0YWJsZWpzTW9kdWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvc29ydGFibGVqcy9zb3J0YWJsZWpzLm1vZHVsZSc7XHJcbmltcG9ydCB7IE56Rm9ybU1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZm9ybSc7XHJcbmltcG9ydCB7IE56QnV0dG9uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9idXR0b24nXHJcbmltcG9ydCB7IE56SWNvbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaWNvbic7XHJcbmltcG9ydCB7RGlhbG9nLCBEaWFsb2dNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kaWFsb2cnO1xyXG5pbXBvcnQgeyBQcmV2aWV3RGlhbG9nIH0gZnJvbSAnLi4vcHJldmlldy1kaWFsb2cvcHJldmlldy5kaWFsb2cnO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICcuLi8uLi91dGlscy9mdW5jJztcclxuaW1wb3J0IHsgUHJldmlld0RhdGFEaWFsb2cgfSBmcm9tICcuLi9wcmV2aWV3LWRhdGEtZGlhbG9nL3ByZXZpZXctZGF0YS5kaWFsb2cnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBzZWxlY3RvcjogJ2FwcC1kZXNpZ24tZm9ybS1jb21wb25lbnQtcGFuZWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXNpZ24tZm9ybS1jb21wb25lbnQtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Rlc2lnbi1mb3JtLWNvbXBvbmVudC1wYW5lbC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIERpYWxvZ01vZHVsZSxcclxuICAgIExheW91dEl0ZW1Db21wb25lbnQsQ29tbW9uTW9kdWxlLE56TGF5b3V0TW9kdWxlLE56Rm9ybU1vZHVsZSxOekJ1dHRvbk1vZHVsZSxOekljb25Nb2R1bGUsXHJcbiAgICBTb3J0YWJsZWpzTW9kdWxlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVzaWduRm9ybUNvbXBvbmVudFBhbmVsQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBkYXRhOiBhbnlcclxuICBASW5wdXQoKSBzZWxlY3RJdGVtOiBhbnk7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGhhbmRsZVNldFNlbGVjdEl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpXHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNhdmVTY2hlbWE6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG4gIG9wdGlvbnM6IE9wdGlvbnMgPSB7XHJcbiAgICBncm91cDogJ2RyYWdnYWJsZS1ib3gnLFxyXG4gICAgLy8gZ2hvc3RDbGFzczogJ21vdmluZycsXHJcbiAgICBhbmltYXRpb246IDE4MCxcclxuICAgIGhhbmRsZTogJy5kcmFnLW1vdmUnLFxyXG4gICAgb25BZGQ6IHRoaXMuZGVlcENsb25lLmJpbmQodGhpcylcclxuICB9O1xyXG4gIGluc2VydEFsbG93ZWRUeXBlOiBzdHJpbmdbXT0gW1xyXG4gICAgXCJpbnB1dFwiLFxyXG4gICAgXCJ0ZXh0YXJlYVwiLFxyXG4gICAgXCJudW1iZXJcIixcclxuICAgIFwic2VsZWN0XCIsXHJcbiAgICBcImNoZWNrYm94XCIsXHJcbiAgICBcInJhZGlvXCIsXHJcbiAgICBcImRhdGVcIixcclxuICAgIFwidGltZVwiLFxyXG4gICAgXCJyYXRlXCIsXHJcbiAgICBcInNsaWRlclwiLFxyXG4gICAgXCJzd2l0Y2hcIixcclxuICAgIFwidGV4dFwiLFxyXG4gICAgXCJodG1sXCJcclxuICBdO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IERpYWxvZyxcclxuICAgIHByaXZhdGUgYW50ZEZvcm1CdWlsZGVyQ29tcG9uZW50OiBOZ3hBbnRkRm9ybUJ1aWxkZXJDb21wb25lbnQsXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBvcGVuUHJldmlldygpIHtcclxuICAgIHRoaXMuZGlhbG9nLm9wZW4oUHJldmlld0RpYWxvZywge1xyXG4gICAgICBtaW5XaWR0aDogJzMwMHB4JyxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGpzb246IHRoaXMuYW50ZEZvcm1CdWlsZGVyQ29tcG9uZW50LmdldERhdGEoKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb3Blbkpzb25TY2hlbWEoKSB7XHJcbiAgICB0aGlzLmRpYWxvZy5vcGVuKFByZXZpZXdEYXRhRGlhbG9nLCB7XHJcbiAgICAgIG1pbldpZHRoOiAnNjAwcHgnLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAganNvbjogdGhpcy5hbnRkRm9ybUJ1aWxkZXJDb21wb25lbnQuZ2V0SnNvblNjaGVtYSgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzYXZlKCkge1xyXG4gICAgdGhpcy5zYXZlU2NoZW1hLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGRlZXBDbG9uZShldnQpIHtcclxuICAgIGNvbnN0IG5ld0luZGV4ID0gZXZ0Lm5ld0luZGV4O1xyXG4gICAgLy8ganNvbua3seaLt+i0neS4gOasoVxyXG4gICAgLy9jb25zdCBsaXN0U3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLmxpc3QpO1xyXG4gICAgdGhpcy5kYXRhLmxpc3QgPSBjbG9uZURlZXAodGhpcy5kYXRhLmxpc3QpLy8gSlNPTi5wYXJzZShsaXN0U3RyaW5nKTtcclxuICAgIC8vIOWIoOmZpGljb27lj4pjb21wb2VudOWxnuaAp1xyXG4gICAgZGVsZXRlIHRoaXMuZGF0YS5saXN0W25ld0luZGV4XS5jb21wb25lbnQ7XHJcbiAgICB0aGlzLmhhbmRsZVNldFNlbGVjdEl0ZW0uZW1pdCh0aGlzLmRhdGEubGlzdFtuZXdJbmRleF0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ29sQWRkKCRldmVudCkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBldnQsIGNvbHVtbnMsIGlzQ29weSA9IGZhbHNlXHJcbiAgICB9ID0gJGV2ZW50XHJcblxyXG4gICAgLy8g6YeN572u5oiW6ICF55Sf5oiQa2V55YC8XHJcbiAgICBjb25zdCBuZXdJbmRleCA9IGV2dC5uZXdJbmRleDtcclxuICAgIGNvbnN0IGtleSA9IGNvbHVtbnNbbmV3SW5kZXhdLnR5cGUgKyBcIl9cIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgaWYgKGNvbHVtbnNbbmV3SW5kZXhdLmtleSA9PT0gXCJcIiB8fCBpc0NvcHkpIHtcclxuICAgICAgY29sdW1uc1tuZXdJbmRleF0gPSB7XHJcbiAgICAgICAgLi4uY29sdW1uc1tuZXdJbmRleF0sXHJcbiAgICAgICAga2V5LFxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0eXBlb2YgY29sdW1uc1tuZXdJbmRleF0ub3B0aW9ucyAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIC8vIOa3seaLt+i0nW9wdGlvbnNcclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnNTdHIgPSBKU09OLnN0cmluZ2lmeShjb2x1bW5zW25ld0luZGV4XS5vcHRpb25zKTtcclxuICAgICAgICBjb2x1bW5zW25ld0luZGV4XS5vcHRpb25zID0gY2xvbmVEZWVwKGNvbHVtbnNbbmV3SW5kZXhdLm9wdGlvbnMpIC8vSlNPTi5wYXJzZShvcHRpb25zU3RyKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIGNvbHVtbnNbbmV3SW5kZXhdLnJ1bGVzICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgLy8g5rex5ou36LSdcnVsZXNcclxuICAgICAgICAvL2NvbnN0IHJ1bGVzU3RyID0gSlNPTi5zdHJpbmdpZnkoY29sdW1uc1tuZXdJbmRleF0ucnVsZXMpO1xyXG4gICAgICAgIGNvbHVtbnNbbmV3SW5kZXhdLnJ1bGVzID0gY2xvbmVEZWVwKGNvbHVtbnNbbmV3SW5kZXhdLnJ1bGVzKSAvL0pTT04ucGFyc2UocnVsZXNTdHIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0eXBlb2YgY29sdW1uc1tuZXdJbmRleF0ubGlzdCAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIC8vIOa3seaLt+i0nWxpc3RcclxuICAgICAgICBjb2x1bW5zW25ld0luZGV4XS5saXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiBjb2x1bW5zW25ld0luZGV4XS5jb2x1bW5zICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgLy8g5rex5ou36LSdY29sdW1uc1xyXG4gICAgICAgIC8vY29uc3QgY29sdW1uc1N0ciA9IEpTT04uc3RyaW5naWZ5KGNvbHVtbnNbbmV3SW5kZXhdLmNvbHVtbnMpO1xyXG4gICAgICAgIGNvbHVtbnNbbmV3SW5kZXhdLmNvbHVtbnMgPSBjbG9uZURlZXAoY29sdW1uc1tuZXdJbmRleF0uY29sdW1ucykvLyBKU09OLnBhcnNlKGNvbHVtbnNTdHIpO1xyXG4gICAgICAgIC8vIOWkjeWItuaXtu+8jOa4heepuuaVsOaNrlxyXG4gICAgICAgIGNvbHVtbnNbbmV3SW5kZXhdLmNvbHVtbnMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgIGl0ZW0ubGlzdCA9IFtdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2x1bW5zW25ld0luZGV4XS50eXBlID09PSBcInRhYmxlXCIpIHtcclxuICAgICAgICAvLyDmt7Hmi7fotJ10cnNcclxuICAgICAgICAvL2NvbnN0IHRyc1N0ciA9IEpTT04uc3RyaW5naWZ5KGNvbHVtbnNbbmV3SW5kZXhdLnRycyk7XHJcbiAgICAgICAgY29sdW1uc1tuZXdJbmRleF0udHJzID0gY2xvbmVEZWVwKGNvbHVtbnNbbmV3SW5kZXhdLnRycykvLyBKU09OLnBhcnNlKHRyc1N0cik7XHJcbiAgICAgICAgLy8g5aSN5Yi25pe277yM5riF56m65pWw5o2uXHJcbiAgICAgICAgY29sdW1uc1tuZXdJbmRleF0udHJzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICBpdGVtLnRkcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgIHZhbC5saXN0ID0gW107XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8g5rex5ou36LSd5pWw5o2uXHJcbiAgICAvL2NvbnN0IGxpc3RTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShjb2x1bW5zW25ld0luZGV4XSk7XHJcbiAgICBjb2x1bW5zW25ld0luZGV4XSA9IGNsb25lRGVlcChjb2x1bW5zW25ld0luZGV4XSkgLy9KU09OLnBhcnNlKGxpc3RTdHJpbmcpO1xyXG4gICAgdGhpcy5oYW5kbGVTZXRTZWxlY3RJdGVtLmVtaXQoY29sdW1uc1tuZXdJbmRleF0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ29weShpc0NvcHkgPSB0cnVlLCBkYXRhKSB7XHJcbiAgfVxyXG4gIGhhbmRsZURlbGV0ZSgkZXZlbnQpIHtcclxuICAgIGNvbnN0IHRyYXZlcnNlID0gYXJyYXkgPT4ge1xyXG4gICAgICBhcnJheSA9IGFycmF5LmZpbHRlcigoZWxlbWVudCwgaW5kZXgpID0+IHtcclxuICAgICAgICBpZiAoW1wiZ3JpZFwiLCBcInRhYnNcIiwgXCJzZWxlY3RJbnB1dExpc3RcIiwgJ2NvbGxhcHNlJ10uaW5jbHVkZXMoZWxlbWVudC50eXBlKSkge1xyXG4gICAgICAgICAgLy8g5qCF5qC85biD5bGAXHJcbiAgICAgICAgICBlbGVtZW50LmNvbHVtbnMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5saXN0ID0gdHJhdmVyc2UoaXRlbS5saXN0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImNhcmRcIiB8fCBlbGVtZW50LnR5cGUgPT09IFwiYmF0Y2hcIiB8fCBlbGVtZW50LnR5cGUgPT09IFwiYmxvY2tcIikge1xyXG4gICAgICAgICAgLy8g5Y2h54mH5biD5bGAXHJcbiAgICAgICAgICBlbGVtZW50Lmxpc3QgPSB0cmF2ZXJzZShlbGVtZW50Lmxpc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInRhYmxlXCIpIHtcclxuICAgICAgICAgIC8vIOihqOagvOW4g+WxgFxyXG4gICAgICAgICAgZWxlbWVudC50cnMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS50ZHMuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgIHZhbC5saXN0ID0gdHJhdmVyc2UodmFsLmxpc3QpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZWxlbWVudC5rZXkgIT09IHRoaXMuc2VsZWN0SXRlbS5rZXkpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2V0U2VsZWN0SXRlbS5lbWl0KHsga2V5OiBcIlwiIH0pO1xyXG4gICAgICAgICAgICAvL3RoaXMuaGFuZGxlU2VsZWN0SXRlbSh7IGtleTogXCJcIiB9KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoIC0gMSA+IGluZGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2V0U2VsZWN0SXRlbS5lbWl0KGFycmF5W2luZGV4ICsgMV0pO1xyXG4gICAgICAgICAgICAvL3RoaXMuaGFuZGxlU2VsZWN0SXRlbSgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXRTZWxlY3RJdGVtLmVtaXQoYXJyYXlbaW5kZXggLSAxXSk7XHJcbiAgICAgICAgICAgIC8vdGhpcy5oYW5kbGVTZWxlY3RJdGVtKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfTtcclxuICAgIHRoaXMuZGF0YS5saXN0ID0gdHJhdmVyc2UodGhpcy5kYXRhLmxpc3QpXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLXBhbmVsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInBhbmVsLWJ0blwiPlxyXG4gICAgPGJ1dHRvbiBuei1idXR0b24gKGNsaWNrKT1cIm9wZW5QcmV2aWV3KClcIj5QcmV2aWV3PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG56LWJ1dHRvbiAoY2xpY2spPVwib3Blbkpzb25TY2hlbWEoKVwiPlZpZXcgU2NoZW1hPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNhdmUoKVwiPlNhdmU8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuICA8Zm9ybSBuei1mb3JtICBjbGFzcz1cImEtZm9ybS1ib3hcIlxyXG4gICAgW256TGF5b3V0XT1cImRhdGEuY29uZmlnLmxheW91dFwiIFtuZ1N0eWxlXT1cImRhdGEuY29uZmlnLmN1c3RvbVN0eWxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhZ2dhYmxlLWJveFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGlzdC1tYWluXCIgW3NvcnRhYmxlanNdPVwiZGF0YS5saXN0XCIgW3NvcnRhYmxlanNPcHRpb25zXT1cIm9wdGlvbnNcIj5cclxuICAgICAgICA8YXBwLWxheW91dC1pdGVtIGNsYXNzPVwiZHJhZy1tb3ZlXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YS5saXN0XCIgXHJcbiAgICAgICAgICBbcmVjb3JkXT1cIml0ZW1cIiBbY29uZmlnXT1cImRhdGEuY29uZmlnXCJcclxuICAgICAgICAgIFtzZWxlY3RJdGVtXT1cInNlbGVjdEl0ZW1cIlxyXG4gICAgICAgICAgKGhhbmRsZUNvbEFkZCk9XCJoYW5kbGVDb2xBZGQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoaGFuZGxlU2VsZWN0SXRlbSk9XCJoYW5kbGVTZXRTZWxlY3RJdGVtLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoaGFuZGxlQ29weSk9XCJoYW5kbGVDb3B5KCRldmVudCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAoaGFuZGxlRGVsZXRlKT1cImhhbmRsZURlbGV0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICA8L2FwcC1sYXlvdXQtaXRlbT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PiJdfQ==