@dignite-ng/expand.dynamic-form 0.0.8 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/dynamic/dynamic.component.mjs +3 -3
- package/esm2022/lib/components/from/ck-editor/ck-editor-config.component.mjs +2 -2
- package/esm2022/lib/components/from/file-explorer/file-explorer-config.component.mjs +2 -2
- package/esm2022/lib/components/from/file-explorer/file-explorer-config.mjs +3 -2
- package/esm2022/lib/components/from/form-control-group.mjs +1 -17
- package/esm2022/lib/components/from/index.mjs +1 -3
- package/esm2022/lib/dynamic-form.module.mjs +7 -22
- package/esm2022/lib/services/create-dynamic-components.service.mjs +51 -0
- package/esm2022/lib/services/index.mjs +2 -1
- package/fesm2022/dignite-ng-expand.dynamic-form.mjs +61 -709
- package/fesm2022/dignite-ng-expand.dynamic-form.mjs.map +1 -1
- package/lib/components/dynamic/dynamic.component.d.ts +1 -1
- package/lib/components/from/index.d.ts +0 -2
- package/lib/dynamic-form.module.d.ts +8 -11
- package/lib/services/create-dynamic-components.service.d.ts +13 -0
- package/lib/services/index.d.ts +1 -0
- package/package.json +1 -1
- package/esm2022/lib/components/from/matrix/index.mjs +0 -4
- package/esm2022/lib/components/from/matrix/matrix-config.component.mjs +0 -225
- package/esm2022/lib/components/from/matrix/matrix-config.mjs +0 -50
- package/esm2022/lib/components/from/matrix/matrix-control.component.mjs +0 -110
- package/esm2022/lib/components/from/table/index.mjs +0 -4
- package/esm2022/lib/components/from/table/table-config.component.mjs +0 -171
- package/esm2022/lib/components/from/table/table-config.mjs +0 -38
- package/esm2022/lib/components/from/table/table-control.component.mjs +0 -112
- package/lib/components/from/matrix/index.d.ts +0 -3
- package/lib/components/from/matrix/matrix-config.component.d.ts +0 -72
- package/lib/components/from/matrix/matrix-config.d.ts +0 -24
- package/lib/components/from/matrix/matrix-control.component.d.ts +0 -39
- package/lib/components/from/table/index.d.ts +0 -3
- package/lib/components/from/table/table-config.component.d.ts +0 -57
- package/lib/components/from/table/table-config.d.ts +0 -18
- package/lib/components/from/table/table-control.component.d.ts +0 -36
|
@@ -34,5 +34,5 @@ export declare class DynamicComponent {
|
|
|
34
34
|
/**加载动态表单组件 */
|
|
35
35
|
loadfieldComponent(FieldControlItem?: FieldControlGroupInterfaces): void;
|
|
36
36
|
static ɵfac: i0.ɵɵFactoryDeclaration<DynamicComponent, never>;
|
|
37
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DynamicComponent, "df-dynamic", never, { "selected": { "alias": "selected"; "required": false; }; "type": { "alias": "type"; "required": false; }; "entity": { "alias": "entity"; "required": false; }; "culture": { "alias": "culture"; "required": false; }; "parentFiledName": { "alias": "parentFiledName"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; }, {}, never, never,
|
|
37
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DynamicComponent, "df-dynamic", never, { "selected": { "alias": "selected"; "required": false; }; "type": { "alias": "type"; "required": false; }; "entity": { "alias": "entity"; "required": false; }; "culture": { "alias": "culture"; "required": false; }; "parentFiledName": { "alias": "parentFiledName"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; }, {}, never, never, false, never>;
|
|
38
38
|
}
|
|
@@ -13,19 +13,16 @@ import * as i10 from "./components/from/file-explorer/file-explorer-control.comp
|
|
|
13
13
|
import * as i11 from "./components/from/ck-editor/ck-editor-config.component";
|
|
14
14
|
import * as i12 from "./components/from/select/select-config.component";
|
|
15
15
|
import * as i13 from "./components/from/select/select-control.component";
|
|
16
|
-
import * as i14 from "./components/
|
|
17
|
-
import * as i15 from "
|
|
18
|
-
import * as i16 from "
|
|
19
|
-
import * as i17 from "
|
|
20
|
-
import * as i18 from "@
|
|
21
|
-
import * as i19 from "
|
|
22
|
-
import * as i20 from "@
|
|
23
|
-
import * as i21 from "@ng-bootstrap/ng-bootstrap";
|
|
24
|
-
import * as i22 from "ng-zorro-antd/tree";
|
|
25
|
-
import * as i23 from "@dignite-ng/expand.file-explorer";
|
|
16
|
+
import * as i14 from "./components/dynamic/dynamic.component";
|
|
17
|
+
import * as i15 from "@angular/forms";
|
|
18
|
+
import * as i16 from "@abp/ng.core";
|
|
19
|
+
import * as i17 from "@abp/ng.theme.shared";
|
|
20
|
+
import * as i18 from "@ng-bootstrap/ng-bootstrap";
|
|
21
|
+
import * as i19 from "ng-zorro-antd/tree";
|
|
22
|
+
import * as i20 from "@dignite-ng/expand.file-explorer";
|
|
26
23
|
export declare class DynamicFormModule {
|
|
27
24
|
static forRoot(config?: any): ModuleWithProviders<DynamicFormModule>;
|
|
28
25
|
static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFormModule, never>;
|
|
29
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<DynamicFormModule, [typeof i1.TextEditConfigComponent, typeof i2.TextEditComponent, typeof i3.SwitchConfigComponent, typeof i4.SwitchControlComponent, typeof i5.NumbericEditConfigComponent, typeof i6.NumbericEditControlComponent, typeof i7.DateEditConfigComponent, typeof i8.DateEditControlComponent, typeof i9.FileExplorerConfigComponent, typeof i10.FileExplorerControlComponent, typeof i11.CkEditorConfigComponent, typeof i12.SelectConfigComponent, typeof i13.SelectControlComponent, typeof i14.
|
|
26
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<DynamicFormModule, [typeof i1.TextEditConfigComponent, typeof i2.TextEditComponent, typeof i3.SwitchConfigComponent, typeof i4.SwitchControlComponent, typeof i5.NumbericEditConfigComponent, typeof i6.NumbericEditControlComponent, typeof i7.DateEditConfigComponent, typeof i8.DateEditControlComponent, typeof i9.FileExplorerConfigComponent, typeof i10.FileExplorerControlComponent, typeof i11.CkEditorConfigComponent, typeof i12.SelectConfigComponent, typeof i13.SelectControlComponent, typeof i14.DynamicComponent], [typeof i15.FormsModule, typeof i16.CoreModule, typeof i17.ThemeSharedModule, typeof i15.ReactiveFormsModule, typeof i18.NgbDropdownModule, typeof i19.NzTreeModule, typeof i20.FileExplorerModule], [typeof i1.TextEditConfigComponent, typeof i2.TextEditComponent, typeof i3.SwitchConfigComponent, typeof i4.SwitchControlComponent, typeof i5.NumbericEditConfigComponent, typeof i6.NumbericEditControlComponent, typeof i7.DateEditConfigComponent, typeof i8.DateEditControlComponent, typeof i9.FileExplorerConfigComponent, typeof i10.FileExplorerControlComponent, typeof i11.CkEditorConfigComponent, typeof i12.SelectConfigComponent, typeof i13.SelectControlComponent, typeof i14.DynamicComponent]>;
|
|
30
27
|
static ɵinj: i0.ɵɵInjectorDeclaration<DynamicFormModule>;
|
|
31
28
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FieldControlGroupInterfaces } from '../interfaces';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class CreateDynamicComponentsService {
|
|
4
|
+
constructor();
|
|
5
|
+
/**表单控件组 */
|
|
6
|
+
_fieldControlGroup: FieldControlGroupInterfaces[];
|
|
7
|
+
/**加载动态表单配置组件 */
|
|
8
|
+
loadfieldConfigComponent(input: any): void;
|
|
9
|
+
/**加载动态表单组件 */
|
|
10
|
+
loadfieldComponent(input: any): void;
|
|
11
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CreateDynamicComponentsService, never>;
|
|
12
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CreateDynamicComponentsService>;
|
|
13
|
+
}
|
package/lib/services/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export * from './matrix-config';
|
|
2
|
-
export * from './matrix-control.component';
|
|
3
|
-
export * from './matrix-config.component';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLWZvcm0vc3JjL2xpYi9jb21wb25lbnRzL2Zyb20vbWF0cml4L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWlCLENBQUE7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQTtBQUMxQyxjQUFjLDJCQUEyQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9tYXRyaXgtY29uZmlnJ1xyXG5leHBvcnQgKiBmcm9tICcuL21hdHJpeC1jb250cm9sLmNvbXBvbmVudCdcclxuZXhwb3J0ICogZnJvbSAnLi9tYXRyaXgtY29uZmlnLmNvbXBvbmVudCciXX0=
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
-
import { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';
|
|
3
|
-
import { MatrixConfig, MatrixItemConfig } from './matrix-config';
|
|
4
|
-
import { getExcludeAssignControl } from '../form-control-group';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/forms";
|
|
7
|
-
import * as i2 from "../../../services";
|
|
8
|
-
import * as i3 from "@angular/common";
|
|
9
|
-
import * as i4 from "@abp/ng.core";
|
|
10
|
-
import * as i5 from "@ngx-validate/core";
|
|
11
|
-
import * as i6 from "@abp/ng.theme.shared";
|
|
12
|
-
import * as i7 from "@ng-bootstrap/ng-bootstrap";
|
|
13
|
-
class MatrixConfigComponent {
|
|
14
|
-
fb;
|
|
15
|
-
_DfApiService;
|
|
16
|
-
constructor(fb, _DfApiService) {
|
|
17
|
-
this.fb = fb;
|
|
18
|
-
this._DfApiService = _DfApiService;
|
|
19
|
-
}
|
|
20
|
-
/**表单控件组 */
|
|
21
|
-
_FieldControlGroup;
|
|
22
|
-
/**表单控件类型 */
|
|
23
|
-
_type;
|
|
24
|
-
set type(v) {
|
|
25
|
-
this._type = v;
|
|
26
|
-
this.dataLoaded();
|
|
27
|
-
}
|
|
28
|
-
/**表单实体 */
|
|
29
|
-
_Entity;
|
|
30
|
-
set Entity(v) {
|
|
31
|
-
this._Entity = v;
|
|
32
|
-
this.dataLoaded();
|
|
33
|
-
}
|
|
34
|
-
/**选择的表单信息 */
|
|
35
|
-
_selected;
|
|
36
|
-
set selected(v) {
|
|
37
|
-
if (v) {
|
|
38
|
-
this._selected = v;
|
|
39
|
-
this.dataLoaded();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
submitclick;
|
|
43
|
-
async dataLoaded() {
|
|
44
|
-
if (this._Entity && this._type) {
|
|
45
|
-
await this.AfterInit();
|
|
46
|
-
this.submitclick.nativeElement.click();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
AfterInit() {
|
|
50
|
-
return new Promise(async (resolve, rejects) => {
|
|
51
|
-
this._FieldControlGroup = getExcludeAssignControl(this._type);
|
|
52
|
-
// this._FieldControlGroup = getExcludeAssignControl(this._type)
|
|
53
|
-
this._Entity.setControl('formConfiguration', this.fb.group(new MatrixConfig()));
|
|
54
|
-
await this.setSelectValue();
|
|
55
|
-
this.formConfiguration.patchValue(this._selected.formConfiguration);
|
|
56
|
-
resolve(true);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
setSelectValue() {
|
|
60
|
-
return new Promise((resolve, rejects) => {
|
|
61
|
-
if (this._selected && this._selected.formControlName == this._type) {
|
|
62
|
-
this._selected.formConfiguration['MatrixBlockTypes'].forEach(((el, index) => {
|
|
63
|
-
this.addMatrixBlockTypeItem(el);
|
|
64
|
-
el.fields.forEach((elf, indexf) => {
|
|
65
|
-
this.addMatrixFieldItem(elf, index);
|
|
66
|
-
});
|
|
67
|
-
}));
|
|
68
|
-
resolve(true);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
/**获取表单配置 */
|
|
73
|
-
get formConfiguration() {
|
|
74
|
-
return this._Entity.get('formConfiguration');
|
|
75
|
-
}
|
|
76
|
-
/**获取表单配置下的矩阵块表单数组 */
|
|
77
|
-
get MatrixBlockTypes() {
|
|
78
|
-
return this.formConfiguration.controls['MatrixBlockTypes'];
|
|
79
|
-
}
|
|
80
|
-
/**模态框-状态 */
|
|
81
|
-
matrixModalOpen = false;
|
|
82
|
-
/**模态框-是否正在编辑 */
|
|
83
|
-
isMatrixModalEdit = false;
|
|
84
|
-
/**模态框-用于确定模态的繁忙状态是否为真 */
|
|
85
|
-
modalBusy = false;
|
|
86
|
-
/**模态框-表单 */
|
|
87
|
-
matrixModalForm;
|
|
88
|
-
/**表单控件模板-用于在form外提交submit */
|
|
89
|
-
matrixModalModalSubmit;
|
|
90
|
-
/**矩阵块-选择的下标 */
|
|
91
|
-
selectMatrixBlockIndex = 0;
|
|
92
|
-
/**矩阵块-选择的矩阵下字段的下标 */
|
|
93
|
-
selectMatrixFieldIndex = 0;
|
|
94
|
-
/**模态框-状态改变 */
|
|
95
|
-
matrixModalVisibleChange(event) {
|
|
96
|
-
if (!event) {
|
|
97
|
-
this.isMatrixModalEdit = false;
|
|
98
|
-
this.matrixModalForm = undefined;
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**矩阵块--新增-打开模态框 */
|
|
103
|
-
addMatrixBlockType() {
|
|
104
|
-
this.matrixModalForm = this.fb.group(new MatrixItemConfig());
|
|
105
|
-
this.matrixModalOpen = true;
|
|
106
|
-
}
|
|
107
|
-
/**模态框--矩阵表单保存提交 */
|
|
108
|
-
createOrEditSave() {
|
|
109
|
-
let input = this.matrixModalForm.value;
|
|
110
|
-
if (!this.matrixModalForm.valid)
|
|
111
|
-
return;
|
|
112
|
-
if (this.isMatrixModalEdit) {
|
|
113
|
-
let MatrixBlockTypesItem = this.MatrixBlockTypes.at(this.selectMatrixBlockIndex);
|
|
114
|
-
MatrixBlockTypesItem.patchValue({
|
|
115
|
-
...input
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
this.addMatrixBlockTypeItem(input);
|
|
120
|
-
}
|
|
121
|
-
this.matrixModalOpen = false;
|
|
122
|
-
}
|
|
123
|
-
/**新增矩阵块-向数组表单中增加项 */
|
|
124
|
-
addMatrixBlockTypeItem(input) {
|
|
125
|
-
this.MatrixBlockTypes.push(new FormGroup({
|
|
126
|
-
displayName: new FormControl(input.displayName, Validators.required),
|
|
127
|
-
name: new FormControl(input.name, Validators.required),
|
|
128
|
-
fields: new FormArray([])
|
|
129
|
-
}));
|
|
130
|
-
}
|
|
131
|
-
/**编辑矩阵块 */
|
|
132
|
-
EditMatrixBlock(input) {
|
|
133
|
-
this.matrixModalForm = this.fb.group(new MatrixItemConfig());
|
|
134
|
-
this.matrixModalForm.patchValue({
|
|
135
|
-
...input
|
|
136
|
-
});
|
|
137
|
-
this.matrixModalOpen = true;
|
|
138
|
-
this.isMatrixModalEdit = true;
|
|
139
|
-
}
|
|
140
|
-
/**删除矩阵块 */
|
|
141
|
-
DeleteMatrixBlock(index) {
|
|
142
|
-
this.MatrixBlockTypes.removeAt(index);
|
|
143
|
-
}
|
|
144
|
-
/**矩阵块-选择 */
|
|
145
|
-
selectMatrixBlockChange(index) {
|
|
146
|
-
this.selectMatrixBlockIndex = index;
|
|
147
|
-
}
|
|
148
|
-
/**矩阵字段-新增 */
|
|
149
|
-
addMatrixField() {
|
|
150
|
-
this.addMatrixFieldItem('', this.selectMatrixBlockIndex);
|
|
151
|
-
}
|
|
152
|
-
/**矩阵字段-新增矩阵字段项 */
|
|
153
|
-
addMatrixFieldItem(input = '', selectMatrixBlockIndex) {
|
|
154
|
-
/**矩阵下标的矩阵项Form */
|
|
155
|
-
let MatrixBlockTypesItemForm = this.MatrixBlockTypes.at(selectMatrixBlockIndex);
|
|
156
|
-
let MatrixFieldItemForm = MatrixBlockTypesItemForm.get('fields');
|
|
157
|
-
MatrixFieldItemForm.push(this.fb.group({
|
|
158
|
-
/**字段名称 Display name of this field */
|
|
159
|
-
displayName: [input.displayName, [Validators.required]],
|
|
160
|
-
/**字段唯一名称 Unique Name*/
|
|
161
|
-
name: [input.name, [Validators.required]],
|
|
162
|
-
/**描述 说明 */
|
|
163
|
-
description: [input.description, []],
|
|
164
|
-
/**FieldType字段类型 表单控件名称 */
|
|
165
|
-
formControlName: [input.formControlName || 'TextEdit', [Validators.required]],
|
|
166
|
-
//动态表单配置
|
|
167
|
-
formConfiguration: new FormGroup({}),
|
|
168
|
-
}));
|
|
169
|
-
}
|
|
170
|
-
/**删除矩阵字段项 */
|
|
171
|
-
deleteMatrixField(MatrixFieldForm, index) {
|
|
172
|
-
MatrixFieldForm.removeAt(index);
|
|
173
|
-
this.selectMatrixFieldIndex = 0;
|
|
174
|
-
}
|
|
175
|
-
/**矩阵字段-选择 */
|
|
176
|
-
selectMatrixFieldChange(MatrixBlockIndex, MatrixFieldIndex) {
|
|
177
|
-
this.selectMatrixFieldIndex = MatrixFieldIndex;
|
|
178
|
-
}
|
|
179
|
-
get nameInput() {
|
|
180
|
-
return this.matrixModalForm?.get('name');
|
|
181
|
-
}
|
|
182
|
-
get FieldnameInput() {
|
|
183
|
-
let MatrixBlockTypesItemForm = this.MatrixBlockTypes.at(this.selectMatrixBlockIndex);
|
|
184
|
-
let MatrixFieldItemForm = MatrixBlockTypesItemForm.get('fields');
|
|
185
|
-
return MatrixFieldItemForm.at(this.selectMatrixFieldIndex).get('name');
|
|
186
|
-
}
|
|
187
|
-
/**矩阵displayNameInput字段失去焦点 */
|
|
188
|
-
displayNameInputBlur(event) {
|
|
189
|
-
let value = event.target.value;
|
|
190
|
-
let pinyin = this._DfApiService.chineseToPinyin(value);
|
|
191
|
-
let nameInput = this.nameInput;
|
|
192
|
-
if (nameInput.value)
|
|
193
|
-
return;
|
|
194
|
-
nameInput.patchValue(pinyin);
|
|
195
|
-
}
|
|
196
|
-
/**矩阵displayNameInput字段失去焦点 */
|
|
197
|
-
MatrixFieldDisplayNameInputBlur(event) {
|
|
198
|
-
let value = event.target.value;
|
|
199
|
-
let pinyin = this._DfApiService.chineseToPinyin(value);
|
|
200
|
-
let FieldnameInput = this.FieldnameInput;
|
|
201
|
-
if (FieldnameInput.value)
|
|
202
|
-
return;
|
|
203
|
-
FieldnameInput.patchValue(pinyin);
|
|
204
|
-
}
|
|
205
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MatrixConfigComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DfApiService }], target: i0.ɵɵFactoryTarget.Component });
|
|
206
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MatrixConfigComponent, selector: "df-matrix-config", inputs: { type: "type", Entity: "Entity", selected: "selected" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }, { propertyName: "matrixModalModalSubmit", first: true, predicate: ["matrixModalModalSubmit"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"_Entity\">\n <div formGroupName=\"formConfiguration\">\n <div class=\"mb-2\">\n <label class=\"form-label\">{{'Cms::::FormControl:Matrix' | abpLocalization}}</label>\n <div class=\"row\">\n <div class=\"col-md-3\">\n <div class=\"list-group\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::MatrixBlockType' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixBlockType()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixBlockChange(i)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"i===selectMatrixBlockIndex\">\n <div>\n <div>{{item.value.displayName}}</div>\n <div>{{item.value.name}}</div>\n </div>\n <div ngbDropdown class=\"d-inline-block\">\n <button type=\"button\" class=\"btn btn-light btn-sm\" id=\"dropdownBasic1\"\n style=\"z-index: 8;\" ngbDropdownToggle></button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"z-index: 9;\">\n <button ngbDropdownItem\n (click.stop)=\"EditMatrixBlock(item.value)\">{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"DeleteMatrixBlock(i)\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </div>\n </div>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"list-group\" *ngIf=\"MatrixBlockTypes?.controls.length>0\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::Fields' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixField()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <ng-container *ngIf=\"i === selectMatrixBlockIndex\">\n <ng-container *ngFor=\"let el of item.controls['fields'].controls;let fi =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixFieldChange(i,fi)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"fi===selectMatrixFieldIndex\">\n <div>\n <div>{{el.value.displayName}}</div>\n <div>{{el.value.name}}</div>\n </div>\n <button type=\"button\"\n (click.stop)=\"deleteMatrixField(item.controls['fields'],fi)\"\n class=\"btn btn-sm btn-li\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-6\" formArrayName=\"MatrixBlockTypes\">\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <div [formGroupName]=\"i\" [hidden]=\"i !== selectMatrixBlockIndex\">\n <div formArrayName=\"fields\">\n <ng-container *ngFor=\"let item of item.controls['fields'].controls;let fi =index\">\n <div [formGroupName]=\"fi\" [hidden]=\"fi !== selectMatrixFieldIndex\">\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"MatrixFieldDisplayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"name\">{{'DigniteAbpForms::FieldName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n <div class=\"form-text\">\n {{'DigniteAbpForms::FieldNameHelpText' | abpLocalization}}</div>\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"description\">{{'Cms::Description' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"description\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"formControlName\">{{'Cms::FieldType' | abpLocalization}}</label>\n <select class=\"form-select\" formControlName=\"formControlName\">\n <ng-container *ngFor=\"let item of _FieldControlGroup;let i =index\">\n <option [value]=\"item.name\">{{item.displayName}}</option>\n </ng-container>\n </select>\n </div>\n <ng-container *ngIf=\"item.value.formControlName&&item\">\n <df-dynamic [type]=\"item.value.formControlName\" [entity]=\"item\"\n [selected]=\"_selected?_selected['formConfiguration']['MatrixBlockTypes'][i]['fields'][fi]:''\"></df-dynamic>\n </ng-container>\n\n\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n\n </div>\n </div>\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\n #submitclick></button>\n </div>\n</form>\n\n\n\n<abp-modal [(visible)]=\"matrixModalOpen\" [busy]=\"modalBusy\" (visibleChange)=\"matrixModalVisibleChange($event)\" >\n <ng-template #abpHeader>\n <h3>{{isMatrixEdit?('AbpUi::Edit' | abpLocalization):('Cms::New' | abpLocalization)}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"matrixModalForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"matrixModalForm\"\n (ngSubmit)=\"createOrEditSave()\">\n <button type=\"submit\" #matrixModalModalSubmit style=\"display: none\"></button>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"displayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"name\">{{'Cms::Name' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\"\n (click)=\"matrixModalModalSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>", styles: [""], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.FormSubmitDirective, selector: "form[ngSubmit][formGroup]", inputs: ["debounce", "notValidateOnSubmit", "markAsDirtyWhenSubmit"], outputs: ["ngSubmit"] }, { kind: "directive", type: i4.InitDirective, selector: "[abpInit]", outputs: ["abpInit"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i5.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i6.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i6.ModalCloseDirective, selector: "[abpClose]" }, { kind: "directive", type: i7.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i7.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i7.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i7.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] });
|
|
207
|
-
}
|
|
208
|
-
export { MatrixConfigComponent };
|
|
209
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MatrixConfigComponent, decorators: [{
|
|
210
|
-
type: Component,
|
|
211
|
-
args: [{ selector: 'df-matrix-config', template: "<form [formGroup]=\"_Entity\">\n <div formGroupName=\"formConfiguration\">\n <div class=\"mb-2\">\n <label class=\"form-label\">{{'Cms::::FormControl:Matrix' | abpLocalization}}</label>\n <div class=\"row\">\n <div class=\"col-md-3\">\n <div class=\"list-group\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::MatrixBlockType' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixBlockType()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixBlockChange(i)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"i===selectMatrixBlockIndex\">\n <div>\n <div>{{item.value.displayName}}</div>\n <div>{{item.value.name}}</div>\n </div>\n <div ngbDropdown class=\"d-inline-block\">\n <button type=\"button\" class=\"btn btn-light btn-sm\" id=\"dropdownBasic1\"\n style=\"z-index: 8;\" ngbDropdownToggle></button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"z-index: 9;\">\n <button ngbDropdownItem\n (click.stop)=\"EditMatrixBlock(item.value)\">{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"DeleteMatrixBlock(i)\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </div>\n </div>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"list-group\" *ngIf=\"MatrixBlockTypes?.controls.length>0\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::Fields' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixField()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <ng-container *ngIf=\"i === selectMatrixBlockIndex\">\n <ng-container *ngFor=\"let el of item.controls['fields'].controls;let fi =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixFieldChange(i,fi)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"fi===selectMatrixFieldIndex\">\n <div>\n <div>{{el.value.displayName}}</div>\n <div>{{el.value.name}}</div>\n </div>\n <button type=\"button\"\n (click.stop)=\"deleteMatrixField(item.controls['fields'],fi)\"\n class=\"btn btn-sm btn-li\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-6\" formArrayName=\"MatrixBlockTypes\">\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <div [formGroupName]=\"i\" [hidden]=\"i !== selectMatrixBlockIndex\">\n <div formArrayName=\"fields\">\n <ng-container *ngFor=\"let item of item.controls['fields'].controls;let fi =index\">\n <div [formGroupName]=\"fi\" [hidden]=\"fi !== selectMatrixFieldIndex\">\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"MatrixFieldDisplayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"name\">{{'DigniteAbpForms::FieldName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n <div class=\"form-text\">\n {{'DigniteAbpForms::FieldNameHelpText' | abpLocalization}}</div>\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"description\">{{'Cms::Description' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"description\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"formControlName\">{{'Cms::FieldType' | abpLocalization}}</label>\n <select class=\"form-select\" formControlName=\"formControlName\">\n <ng-container *ngFor=\"let item of _FieldControlGroup;let i =index\">\n <option [value]=\"item.name\">{{item.displayName}}</option>\n </ng-container>\n </select>\n </div>\n <ng-container *ngIf=\"item.value.formControlName&&item\">\n <df-dynamic [type]=\"item.value.formControlName\" [entity]=\"item\"\n [selected]=\"_selected?_selected['formConfiguration']['MatrixBlockTypes'][i]['fields'][fi]:''\"></df-dynamic>\n </ng-container>\n\n\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n\n </div>\n </div>\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\n #submitclick></button>\n </div>\n</form>\n\n\n\n<abp-modal [(visible)]=\"matrixModalOpen\" [busy]=\"modalBusy\" (visibleChange)=\"matrixModalVisibleChange($event)\" >\n <ng-template #abpHeader>\n <h3>{{isMatrixEdit?('AbpUi::Edit' | abpLocalization):('Cms::New' | abpLocalization)}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"matrixModalForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"matrixModalForm\"\n (ngSubmit)=\"createOrEditSave()\">\n <button type=\"submit\" #matrixModalModalSubmit style=\"display: none\"></button>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"displayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"name\">{{'Cms::Name' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\"\n (click)=\"matrixModalModalSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>" }]
|
|
212
|
-
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.DfApiService }]; }, propDecorators: { type: [{
|
|
213
|
-
type: Input
|
|
214
|
-
}], Entity: [{
|
|
215
|
-
type: Input
|
|
216
|
-
}], selected: [{
|
|
217
|
-
type: Input
|
|
218
|
-
}], submitclick: [{
|
|
219
|
-
type: ViewChild,
|
|
220
|
-
args: ['submitclick', { static: true }]
|
|
221
|
-
}], matrixModalModalSubmit: [{
|
|
222
|
-
type: ViewChild,
|
|
223
|
-
args: ['matrixModalModalSubmit', { static: false }]
|
|
224
|
-
}] } });
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LWNvbmZpZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLWZvcm0vc3JjL2xpYi9jb21wb25lbnRzL2Zyb20vbWF0cml4L21hdHJpeC1jb25maWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mcm9tL21hdHJpeC9tYXRyaXgtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXNCLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLFNBQVMsRUFBZSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7O0FBRWhFLE1BS2EscUJBQXFCO0lBR3RCO0lBQ0E7SUFGVixZQUNVLEVBQWUsRUFDZixhQUEyQjtRQUQzQixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2Ysa0JBQWEsR0FBYixhQUFhLENBQWM7SUFDbEMsQ0FBQztJQUVKLFdBQVc7SUFDWCxrQkFBa0IsQ0FBTztJQUN6QixZQUFZO0lBQ1osS0FBSyxDQUFLO0lBQ1YsSUFDVyxJQUFJLENBQUMsQ0FBTTtRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQTtRQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBQ0QsVUFBVTtJQUNWLE9BQU8sQ0FBdUI7SUFDOUIsSUFDVyxNQUFNLENBQUMsQ0FBWTtRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUdELGFBQWE7SUFDYixTQUFTLENBQUs7SUFDZCxJQUNXLFFBQVEsQ0FBQyxDQUFNO1FBRXhCLElBQUksQ0FBQyxFQUFFO1lBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUE7WUFDbEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1NBQ2xCO0lBQ0gsQ0FBQztJQUcyQyxXQUFXLENBQWE7SUFFcEUsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM5QixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzVDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDN0QsZ0VBQWdFO1lBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQy9FLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQ25FLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNmLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3RDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNsRSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQzFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQTtvQkFDL0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7d0JBQ2hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7b0JBQ3JDLENBQUMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ2Q7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxZQUFZO0lBQ1osSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBYyxDQUFBO0lBQzNELENBQUM7SUFFRCxxQkFBcUI7SUFDckIsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFjLENBQUE7SUFDekUsQ0FBQztJQUdELFlBQVk7SUFDWixlQUFlLEdBQVksS0FBSyxDQUFBO0lBQ2hDLGdCQUFnQjtJQUNoQixpQkFBaUIsR0FBUSxLQUFLLENBQUE7SUFFOUIseUJBQXlCO0lBQ3pCLFNBQVMsR0FBWSxLQUFLLENBQUE7SUFFMUIsWUFBWTtJQUNaLGVBQWUsQ0FBd0I7SUFFdkMsNkJBQTZCO0lBQzJCLHNCQUFzQixDQUFhO0lBRTNGLGVBQWU7SUFDZixzQkFBc0IsR0FBUSxDQUFDLENBQUE7SUFFL0IscUJBQXFCO0lBQ3JCLHNCQUFzQixHQUFRLENBQUMsQ0FBQTtJQUUvQixjQUFjO0lBQ2Qsd0JBQXdCLENBQUMsS0FBSztRQUM1QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQTtZQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtZQUNoQyxPQUFNO1NBQ1A7SUFDSCxDQUFDO0lBR0QsbUJBQW1CO0lBQ25CLGtCQUFrQjtRQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxDQUFBO1FBQzVELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO0lBQzdCLENBQUM7SUFJRCxtQkFBbUI7SUFDbkIsZ0JBQWdCO1FBQ2QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUE7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztZQUFFLE9BQU07UUFDdkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBYyxDQUFBO1lBQzdGLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztnQkFDOUIsR0FBRyxLQUFLO2FBQ1QsQ0FBQyxDQUFBO1NBQ0g7YUFBTTtZQUNMLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUNuQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFBO0lBQzlCLENBQUM7SUFDRCxxQkFBcUI7SUFDckIsc0JBQXNCLENBQUMsS0FBSztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDO1lBQ3ZDLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEUsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUN0RCxNQUFNLEVBQUUsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQzFCLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUNELFdBQVc7SUFDWCxlQUFlLENBQUMsS0FBSztRQUNuQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxDQUFBO1FBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO1lBQzlCLEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7SUFDL0IsQ0FBQztJQUVELFdBQVc7SUFDWCxpQkFBaUIsQ0FBQyxLQUFLO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVELFlBQVk7SUFDWix1QkFBdUIsQ0FBQyxLQUFLO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUE7SUFDckMsQ0FBQztJQUVELGFBQWE7SUFDYixjQUFjO1FBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBQ0Qsa0JBQWtCO0lBQ2xCLGtCQUFrQixDQUFDLFFBQWEsRUFBRSxFQUFFLHNCQUFzQjtRQUN4RCxrQkFBa0I7UUFDbEIsSUFBSSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFjLENBQUE7UUFDNUYsSUFBSSxtQkFBbUIsR0FBRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFjLENBQUE7UUFDN0UsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3JDLHFDQUFxQztZQUNyQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZELHVCQUF1QjtZQUN2QixJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pDLFdBQVc7WUFDWCxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNwQywwQkFBMEI7WUFDMUIsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsUUFBUTtZQUNULGlCQUFpQixFQUFFLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQztTQUNyQyxDQUFDLENBQUMsQ0FBQTtJQUVMLENBQUM7SUFFQSxhQUFhO0lBQ2QsaUJBQWlCLENBQUMsZUFBZSxFQUFFLEtBQUs7UUFDdEMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMvQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRCxhQUFhO0lBQ2IsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCO1FBQ3hELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLElBQUksd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQWMsQ0FBQTtRQUNqRyxJQUFJLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQWMsQ0FBQTtRQUM3RSxPQUFPLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixvQkFBb0IsQ0FBQyxLQUFLO1FBQ3hCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFBO1FBQzlCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3RELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7UUFDOUIsSUFBSSxTQUFTLENBQUMsS0FBSztZQUFFLE9BQU07UUFDM0IsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBQ0QsOEJBQThCO0lBQzlCLCtCQUErQixDQUFDLEtBQUs7UUFDbkMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFDOUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdEQsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQTtRQUN4QyxJQUFJLGNBQWMsQ0FBQyxLQUFLO1lBQUUsT0FBTTtRQUNoQyxjQUFjLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ25DLENBQUM7d0dBN05VLHFCQUFxQjs0RkFBckIscUJBQXFCLHVXQ1hsQywyeFRBb0pZOztTRHpJQyxxQkFBcUI7NEZBQXJCLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxrQkFBa0I7NkhBZ0JqQixJQUFJO3NCQURkLEtBQUs7Z0JBUUssTUFBTTtzQkFEaEIsS0FBSztnQkFVSyxRQUFRO3NCQURsQixLQUFLO2dCQVVzQyxXQUFXO3NCQUF0RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBeURjLHNCQUFzQjtzQkFBN0UsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdHJpeENvbmZpZywgTWF0cml4SXRlbUNvbmZpZyB9IGZyb20gJy4vbWF0cml4LWNvbmZpZyc7XG5pbXBvcnQgeyBEZkFwaVNlcnZpY2UsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgZ2V0RXhjbHVkZUFzc2lnbkNvbnRyb2wgfSBmcm9tICcuLi9mb3JtLWNvbnRyb2wtZ3JvdXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZi1tYXRyaXgtY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdHJpeC1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRyaXgtY29uZmlnLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWF0cml4Q29uZmlnQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIF9EZkFwaVNlcnZpY2U6IERmQXBpU2VydmljZSxcbiAgKSB7fVxuXG4gIC8qKuihqOWNleaOp+S7tue7hCAqL1xuICBfRmllbGRDb250cm9sR3JvdXA6IGFueVtdXG4gIC8qKuihqOWNleaOp+S7tuexu+WeiyAqL1xuICBfdHlwZTogYW55XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdHlwZSh2OiBhbnkpIHtcbiAgICB0aGlzLl90eXBlID0gdlxuICAgIHRoaXMuZGF0YUxvYWRlZCgpXG4gIH1cbiAgLyoq6KGo5Y2V5a6e5L2TICovXG4gIF9FbnRpdHk6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZFxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IEVudGl0eSh2OiBGb3JtR3JvdXApIHtcbiAgICB0aGlzLl9FbnRpdHkgPSB2O1xuICAgIHRoaXMuZGF0YUxvYWRlZCgpXG4gIH1cblxuXG4gIC8qKumAieaLqeeahOihqOWNleS/oeaBryAqL1xuICBfc2VsZWN0ZWQ6IGFueVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHY6IGFueSkge1xuICAgIFxuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHZcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCgpXG4gICAgfVxuICB9XG5cblxuICBAVmlld0NoaWxkKCdzdWJtaXRjbGljaycsIHsgc3RhdGljOiB0cnVlIH0pIHN1Ym1pdGNsaWNrOiBFbGVtZW50UmVmO1xuXG4gIGFzeW5jIGRhdGFMb2FkZWQoKSB7XG4gICAgaWYgKHRoaXMuX0VudGl0eSAmJiB0aGlzLl90eXBlKSB7XG4gICAgICBhd2FpdCB0aGlzLkFmdGVySW5pdCgpXG4gICAgICB0aGlzLnN1Ym1pdGNsaWNrLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG4gIH1cblxuICBBZnRlckluaXQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3RzKSA9PiB7XG4gICAgICB0aGlzLl9GaWVsZENvbnRyb2xHcm91cCA9IGdldEV4Y2x1ZGVBc3NpZ25Db250cm9sKHRoaXMuX3R5cGUpXG4gICAgICAvLyB0aGlzLl9GaWVsZENvbnRyb2xHcm91cCA9IGdldEV4Y2x1ZGVBc3NpZ25Db250cm9sKHRoaXMuX3R5cGUpXG4gICAgICB0aGlzLl9FbnRpdHkuc2V0Q29udHJvbCgnZm9ybUNvbmZpZ3VyYXRpb24nLCB0aGlzLmZiLmdyb3VwKG5ldyBNYXRyaXhDb25maWcoKSkpXG4gICAgICBhd2FpdCB0aGlzLnNldFNlbGVjdFZhbHVlKClcbiAgICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24ucGF0Y2hWYWx1ZSh0aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvbilcbiAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICB9KVxuICB9XG5cbiAgc2V0U2VsZWN0VmFsdWUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3RzKSA9PiB7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQgJiYgdGhpcy5fc2VsZWN0ZWQuZm9ybUNvbnRyb2xOYW1lID09IHRoaXMuX3R5cGUpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQuZm9ybUNvbmZpZ3VyYXRpb25bJ01hdHJpeEJsb2NrVHlwZXMnXS5mb3JFYWNoKCgoZWwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRNYXRyaXhCbG9ja1R5cGVJdGVtKGVsKVxuICAgICAgICAgIGVsLmZpZWxkcy5mb3JFYWNoKChlbGYsIGluZGV4ZikgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRNYXRyaXhGaWVsZEl0ZW0oZWxmLCBpbmRleClcbiAgICAgICAgICB9KVxuICAgICAgICB9KSlcbiAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKirojrflj5booajljZXphY3nva4gKi9cbiAgZ2V0IGZvcm1Db25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9FbnRpdHkuZ2V0KCdmb3JtQ29uZmlndXJhdGlvbicpIGFzIEZvcm1Hcm91cFxuICB9XG5cbiAgLyoq6I635Y+W6KGo5Y2V6YWN572u5LiL55qE55+p6Zi15Z2X6KGo5Y2V5pWw57uEICovXG4gIGdldCBNYXRyaXhCbG9ja1R5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWd1cmF0aW9uLmNvbnRyb2xzWydNYXRyaXhCbG9ja1R5cGVzJ10gYXMgRm9ybUFycmF5XG4gIH1cblxuXG4gIC8qKuaooeaAgeahhi3nirbmgIEgKi9cbiAgbWF0cml4TW9kYWxPcGVuOiBib29sZWFuID0gZmFsc2VcbiAgLyoq5qih5oCB5qGGLeaYr+WQpuato+WcqOe8lui+kSAqL1xuICBpc01hdHJpeE1vZGFsRWRpdDogYW55ID0gZmFsc2VcblxuICAvKirmqKHmgIHmoYYt55So5LqO56Gu5a6a5qih5oCB55qE57mB5b+Z54q25oCB5piv5ZCm5Li655yfICovXG4gIG1vZGFsQnVzeTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoq5qih5oCB5qGGLeihqOWNlSAqL1xuICBtYXRyaXhNb2RhbEZvcm06IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuICAvKirooajljZXmjqfku7bmqKHmnb8t55So5LqO5ZyoZm9ybeWkluaPkOS6pHN1Ym1pdCAqL1xuICBAVmlld0NoaWxkKCdtYXRyaXhNb2RhbE1vZGFsU3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pIG1hdHJpeE1vZGFsTW9kYWxTdWJtaXQ6IEVsZW1lbnRSZWY7XG5cbiAgLyoq55+p6Zi15Z2XLemAieaLqeeahOS4i+aghyAqL1xuICBzZWxlY3RNYXRyaXhCbG9ja0luZGV4OiBhbnkgPSAwXG5cbiAgLyoq55+p6Zi15Z2XLemAieaLqeeahOefqemYteS4i+Wtl+auteeahOS4i+aghyAqL1xuICBzZWxlY3RNYXRyaXhGaWVsZEluZGV4OiBhbnkgPSAwXG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgeaUueWPmCAqL1xuICBtYXRyaXhNb2RhbFZpc2libGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLmlzTWF0cml4TW9kYWxFZGl0ID0gZmFsc2VcbiAgICAgIHRoaXMubWF0cml4TW9kYWxGb3JtID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuXG4gIC8qKuefqemYteWdly0t5paw5aKeLeaJk+W8gOaooeaAgeahhiAqL1xuICBhZGRNYXRyaXhCbG9ja1R5cGUoKSB7XG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0gPSB0aGlzLmZiLmdyb3VwKG5ldyBNYXRyaXhJdGVtQ29uZmlnKCkpXG4gICAgdGhpcy5tYXRyaXhNb2RhbE9wZW4gPSB0cnVlXG4gIH1cblxuXG5cbiAgLyoq5qih5oCB5qGGLS3nn6npmLXooajljZXkv53lrZjmj5DkuqQgKi9cbiAgY3JlYXRlT3JFZGl0U2F2ZSgpIHtcbiAgICBsZXQgaW5wdXQgPSB0aGlzLm1hdHJpeE1vZGFsRm9ybS52YWx1ZVxuICAgIGlmICghdGhpcy5tYXRyaXhNb2RhbEZvcm0udmFsaWQpIHJldHVyblxuICAgIGlmICh0aGlzLmlzTWF0cml4TW9kYWxFZGl0KSB7XG4gICAgICBsZXQgTWF0cml4QmxvY2tUeXBlc0l0ZW0gPSB0aGlzLk1hdHJpeEJsb2NrVHlwZXMuYXQodGhpcy5zZWxlY3RNYXRyaXhCbG9ja0luZGV4KSBhcyBGb3JtR3JvdXBcbiAgICAgIE1hdHJpeEJsb2NrVHlwZXNJdGVtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi5pbnB1dFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRNYXRyaXhCbG9ja1R5cGVJdGVtKGlucHV0KVxuICAgIH1cbiAgICB0aGlzLm1hdHJpeE1vZGFsT3BlbiA9IGZhbHNlXG4gIH1cbiAgLyoq5paw5aKe55+p6Zi15Z2XLeWQkeaVsOe7hOihqOWNleS4reWinuWKoOmhuSAqL1xuICBhZGRNYXRyaXhCbG9ja1R5cGVJdGVtKGlucHV0KSB7XG4gICAgdGhpcy5NYXRyaXhCbG9ja1R5cGVzLnB1c2gobmV3IEZvcm1Hcm91cCh7XG4gICAgICBkaXNwbGF5TmFtZTogbmV3IEZvcm1Db250cm9sKGlucHV0LmRpc3BsYXlOYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbChpbnB1dC5uYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGZpZWxkczogbmV3IEZvcm1BcnJheShbXSlcbiAgICB9KSlcbiAgfVxuICAvKirnvJbovpHnn6npmLXlnZcgKi9cbiAgRWRpdE1hdHJpeEJsb2NrKGlucHV0KSB7XG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0gPSB0aGlzLmZiLmdyb3VwKG5ldyBNYXRyaXhJdGVtQ29uZmlnKCkpXG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAuLi5pbnB1dFxuICAgIH0pXG4gICAgdGhpcy5tYXRyaXhNb2RhbE9wZW4gPSB0cnVlXG4gICAgdGhpcy5pc01hdHJpeE1vZGFsRWRpdCA9IHRydWVcbiAgfVxuXG4gIC8qKuWIoOmZpOefqemYteWdlyAqL1xuICBEZWxldGVNYXRyaXhCbG9jayhpbmRleCkge1xuICAgIHRoaXMuTWF0cml4QmxvY2tUeXBlcy5yZW1vdmVBdChpbmRleClcbiAgfVxuXG4gIC8qKuefqemYteWdly3pgInmi6kgKi9cbiAgc2VsZWN0TWF0cml4QmxvY2tDaGFuZ2UoaW5kZXgpIHtcbiAgICB0aGlzLnNlbGVjdE1hdHJpeEJsb2NrSW5kZXggPSBpbmRleFxuICB9XG5cbiAgLyoq55+p6Zi15a2X5q61LeaWsOWiniAqL1xuICBhZGRNYXRyaXhGaWVsZCgpIHtcbiAgICB0aGlzLmFkZE1hdHJpeEZpZWxkSXRlbSgnJywgdGhpcy5zZWxlY3RNYXRyaXhCbG9ja0luZGV4KVxuICB9XG4gIC8qKuefqemYteWtl+autS3mlrDlop7nn6npmLXlrZfmrrXpobkgKi9cbiAgYWRkTWF0cml4RmllbGRJdGVtKGlucHV0OiBhbnkgPSAnJywgc2VsZWN0TWF0cml4QmxvY2tJbmRleCkge1xuICAgIC8qKuefqemYteS4i+agh+eahOefqemYtemhuUZvcm0gKi9cbiAgICBsZXQgTWF0cml4QmxvY2tUeXBlc0l0ZW1Gb3JtID0gdGhpcy5NYXRyaXhCbG9ja1R5cGVzLmF0KHNlbGVjdE1hdHJpeEJsb2NrSW5kZXgpIGFzIEZvcm1Hcm91cFxuICAgIGxldCBNYXRyaXhGaWVsZEl0ZW1Gb3JtID0gTWF0cml4QmxvY2tUeXBlc0l0ZW1Gb3JtLmdldCgnZmllbGRzJykgYXMgRm9ybUFycmF5XG4gICAgTWF0cml4RmllbGRJdGVtRm9ybS5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgLyoq5a2X5q615ZCN56ewIERpc3BsYXkgbmFtZSBvZiB0aGlzIGZpZWxkICovXG4gICAgICBkaXNwbGF5TmFtZTogW2lucHV0LmRpc3BsYXlOYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgLyoq5a2X5q615ZSv5LiA5ZCN56ewIFVuaXF1ZSBOYW1lKi9cbiAgICAgIG5hbWU6IFtpbnB1dC5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgLyoq5o+P6L+wIOivtOaYjiAqL1xuICAgICAgZGVzY3JpcHRpb246IFtpbnB1dC5kZXNjcmlwdGlvbiwgW11dLFxuICAgICAgLyoqRmllbGRUeXBl5a2X5q6157G75Z6LIOihqOWNleaOp+S7tuWQjeensCAqL1xuICAgICAgZm9ybUNvbnRyb2xOYW1lOiBbaW5wdXQuZm9ybUNvbnRyb2xOYW1lIHx8ICdUZXh0RWRpdCcsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgLy/liqjmgIHooajljZXphY3nva5cbiAgICAgIGZvcm1Db25maWd1cmF0aW9uOiBuZXcgRm9ybUdyb3VwKHt9KSxcbiAgICB9KSlcblxuICB9XG5cbiAgIC8qKuWIoOmZpOefqemYteWtl+autemhuSAqL1xuICBkZWxldGVNYXRyaXhGaWVsZChNYXRyaXhGaWVsZEZvcm0sIGluZGV4KSB7XG4gICAgTWF0cml4RmllbGRGb3JtLnJlbW92ZUF0KGluZGV4KVxuICAgIHRoaXMuc2VsZWN0TWF0cml4RmllbGRJbmRleCA9IDBcbiAgfVxuXG4gIC8qKuefqemYteWtl+autS3pgInmi6kgKi9cbiAgc2VsZWN0TWF0cml4RmllbGRDaGFuZ2UoTWF0cml4QmxvY2tJbmRleCwgTWF0cml4RmllbGRJbmRleCkge1xuICAgIHRoaXMuc2VsZWN0TWF0cml4RmllbGRJbmRleCA9IE1hdHJpeEZpZWxkSW5kZXhcbiAgfVxuXG4gIGdldCBuYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4TW9kYWxGb3JtPy5nZXQoJ25hbWUnKVxuICB9XG4gIGdldCBGaWVsZG5hbWVJbnB1dCgpIHtcbiAgICBsZXQgTWF0cml4QmxvY2tUeXBlc0l0ZW1Gb3JtID0gdGhpcy5NYXRyaXhCbG9ja1R5cGVzLmF0KHRoaXMuc2VsZWN0TWF0cml4QmxvY2tJbmRleCkgYXMgRm9ybUdyb3VwXG4gICAgbGV0IE1hdHJpeEZpZWxkSXRlbUZvcm0gPSBNYXRyaXhCbG9ja1R5cGVzSXRlbUZvcm0uZ2V0KCdmaWVsZHMnKSBhcyBGb3JtQXJyYXlcbiAgICByZXR1cm4gTWF0cml4RmllbGRJdGVtRm9ybS5hdCh0aGlzLnNlbGVjdE1hdHJpeEZpZWxkSW5kZXgpLmdldCgnbmFtZScpXG4gIH1cblxuICAvKirnn6npmLVkaXNwbGF5TmFtZUlucHV05a2X5q615aSx5Y6754Sm54K5ICovXG4gIGRpc3BsYXlOYW1lSW5wdXRCbHVyKGV2ZW50KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgbGV0IHBpbnlpbiA9IHRoaXMuX0RmQXBpU2VydmljZS5jaGluZXNlVG9QaW55aW4odmFsdWUpXG4gICAgbGV0IG5hbWVJbnB1dCA9IHRoaXMubmFtZUlucHV0XG4gICAgaWYgKG5hbWVJbnB1dC52YWx1ZSkgcmV0dXJuXG4gICAgbmFtZUlucHV0LnBhdGNoVmFsdWUocGlueWluKVxuICB9XG4gIC8qKuefqemYtWRpc3BsYXlOYW1lSW5wdXTlrZfmrrXlpLHljrvnhKbngrkgKi9cbiAgTWF0cml4RmllbGREaXNwbGF5TmFtZUlucHV0Qmx1cihldmVudCkge1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgIGxldCBwaW55aW4gPSB0aGlzLl9EZkFwaVNlcnZpY2UuY2hpbmVzZVRvUGlueWluKHZhbHVlKVxuICAgIGxldCBGaWVsZG5hbWVJbnB1dCA9IHRoaXMuRmllbGRuYW1lSW5wdXRcbiAgICBpZiAoRmllbGRuYW1lSW5wdXQudmFsdWUpIHJldHVyblxuICAgIEZpZWxkbmFtZUlucHV0LnBhdGNoVmFsdWUocGlueWluKVxuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cIl9FbnRpdHlcIj5cbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJmb3JtQ29uZmlndXJhdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J0Ntczo6OjpGb3JtQ29udHJvbDpNYXRyaXgnIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtY3VycmVudD1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydDbXM6Ok1hdHJpeEJsb2NrVHlwZScgfCBhYnBMb2NhbGl6YXRpb259fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBwLTBcIiAoY2xpY2suc3RvcCk9XCJhZGRNYXRyaXhCbG9ja1R5cGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzLWNpcmNsZSBwLTFcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBNYXRyaXhCbG9ja1R5cGVzLmNvbnRyb2xzO2xldCBpID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljay5zdG9wKT1cInNlbGVjdE1hdHJpeEJsb2NrQ2hhbmdlKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaT09PXNlbGVjdE1hdHJpeEJsb2NrSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tpdGVtLnZhbHVlLmRpc3BsYXlOYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tpdGVtLnZhbHVlLm5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtXCIgaWQ9XCJkcm9wZG93bkJhc2ljMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ6LWluZGV4OiA4O1wiIG5nYkRyb3Bkb3duVG9nZ2xlPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgYXJpYS1sYWJlbGxlZGJ5PVwiZHJvcGRvd25CYXNpYzFcIiBzdHlsZT1cInotaW5kZXg6IDk7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiRWRpdE1hdHJpeEJsb2NrKGl0ZW0udmFsdWUpXCI+e3snQWJwVWk6OkVkaXQnIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkRyb3Bkb3duSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJEZWxldGVNYXRyaXhCbG9jayhpKVwiPnt7J0FicFVpOjpEZWxldGUnIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXBcIiAqbmdJZj1cIk1hdHJpeEJsb2NrVHlwZXM/LmNvbnRyb2xzLmxlbmd0aD4wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1jdXJyZW50PVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0Ntczo6RmllbGRzJyB8IGFicExvY2FsaXphdGlvbn19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIHAtMFwiIChjbGljay5zdG9wKT1cImFkZE1hdHJpeEZpZWxkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1cy1jaXJjbGUgcC0xXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgTWF0cml4QmxvY2tUeXBlcy5jb250cm9scztsZXQgaSA9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSA9PT0gc2VsZWN0TWF0cml4QmxvY2tJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbCBvZiBpdGVtLmNvbnRyb2xzWydmaWVsZHMnXS5jb250cm9scztsZXQgZmkgPWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2suc3RvcCk9XCJzZWxlY3RNYXRyaXhGaWVsZENoYW5nZShpLGZpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJmaT09PXNlbGVjdE1hdHJpeEZpZWxkSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7ZWwudmFsdWUuZGlzcGxheU5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7ZWwudmFsdWUubmFtZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiZGVsZXRlTWF0cml4RmllbGQoaXRlbS5jb250cm9sc1snZmllbGRzJ10sZmkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saVwiPnt7J0FicFVpOjpEZWxldGUnIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIiBmb3JtQXJyYXlOYW1lPVwiTWF0cml4QmxvY2tUeXBlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIE1hdHJpeEJsb2NrVHlwZXMuY29udHJvbHM7bGV0IGkgPWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbaGlkZGVuXT1cImkgIT09IHNlbGVjdE1hdHJpeEJsb2NrSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJmaWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtLmNvbnRyb2xzWydmaWVsZHMnXS5jb250cm9scztsZXQgZmkgPWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtR3JvdXBOYW1lXT1cImZpXCIgW2hpZGRlbl09XCJmaSAhPT0gc2VsZWN0TWF0cml4RmllbGRJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwiZGlzcGxheU5hbWVcIj57eydDbXM6OkRpc3BsYXlOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJNYXRyaXhGaWVsZERpc3BsYXlOYW1lSW5wdXRCbHVyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcj1cIm5hbWVcIj57eydEaWduaXRlQWJwRm9ybXM6OkZpZWxkTmFtZScgfCBhYnBMb2NhbGl6YXRpb259fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEaWduaXRlQWJwRm9ybXM6OkZpZWxkTmFtZUhlbHBUZXh0JyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJkZXNjcmlwdGlvblwiPnt7J0Ntczo6RGVzY3JpcHRpb24nIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJmb3JtQ29udHJvbE5hbWVcIj57eydDbXM6OkZpZWxkVHlwZScgfCBhYnBMb2NhbGl6YXRpb259fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cImZvcm1Db250cm9sTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBfRmllbGRDb250cm9sR3JvdXA7bGV0IGkgPWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiaXRlbS5uYW1lXCI+e3tpdGVtLmRpc3BsYXlOYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS52YWx1ZS5mb3JtQ29udHJvbE5hbWUmJml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRmLWR5bmFtaWMgW3R5cGVdPVwiaXRlbS52YWx1ZS5mb3JtQ29udHJvbE5hbWVcIiBbZW50aXR5XT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIl9zZWxlY3RlZD9fc2VsZWN0ZWRbJ2Zvcm1Db25maWd1cmF0aW9uJ11bJ01hdHJpeEJsb2NrVHlwZXMnXVtpXVsnZmllbGRzJ11bZmldOicnXCI+PC9kZi1keW5hbWljPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAoYWJwSW5pdCk9XCJzdWJtaXRjbGljaz8ubmF0aXZlRWxlbWVudD8uY2xpY2soKVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIlxuICAgICAgICAgICAgI3N1Ym1pdGNsaWNrPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuXG5cblxuPGFicC1tb2RhbCBbKHZpc2libGUpXT1cIm1hdHJpeE1vZGFsT3BlblwiIFtidXN5XT1cIm1vZGFsQnVzeVwiICh2aXNpYmxlQ2hhbmdlKT1cIm1hdHJpeE1vZGFsVmlzaWJsZUNoYW5nZSgkZXZlbnQpXCIgPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxuICAgICAgICA8aDM+e3tpc01hdHJpeEVkaXQ/KCdBYnBVaTo6RWRpdCcgfCBhYnBMb2NhbGl6YXRpb24pOignQ21zOjpOZXcnIHwgYWJwTG9jYWxpemF0aW9uKX19PC9oMz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNsb2FkZXJSZWY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj48aSBjbGFzcz1cImZhIGZhLXB1bHNlIGZhLXNwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXRyaXhNb2RhbEZvcm07IGVsc2UgbG9hZGVyUmVmXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cInNpdGVzLW1vZGFsLWZvcm1cIiAjbXlGb3JtPVwibmdGb3JtXCIgW2Zvcm1Hcm91cF09XCJtYXRyaXhNb2RhbEZvcm1cIlxuICAgICAgICAgICAgICAgIChuZ1N1Ym1pdCk9XCJjcmVhdGVPckVkaXRTYXZlKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAjbWF0cml4TW9kYWxNb2RhbFN1Ym1pdCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiZGlzcGxheU5hbWVcIj57eydDbXM6OkRpc3BsYXlOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJkaXNwbGF5TmFtZUlucHV0Qmx1cigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cIm5hbWVcIj57eydDbXM6Ok5hbWUnIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGFicENsb3NlPnt7J0FicFVpOjpDbG9zZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxuICAgICAgICA8YWJwLWJ1dHRvbiBpY29uQ2xhc3M9XCJmYSBmYS1jaGVja1wiXG4gICAgICAgICAgICAoY2xpY2spPVwibWF0cml4TW9kYWxNb2RhbFN1Ym1pdC5uYXRpdmVFbGVtZW50LmNsaWNrKClcIj57eydBYnBVaTo6U2F2ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYWJwLWJ1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+Il19
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { FormArray, FormGroup, Validators } from "@angular/forms";
|
|
2
|
-
export class MatrixConfig {
|
|
3
|
-
// 矩阵类型
|
|
4
|
-
'MatrixBlockTypes' = new FormArray([]);
|
|
5
|
-
constructor(data) {
|
|
6
|
-
if (data) {
|
|
7
|
-
for (const key in data) {
|
|
8
|
-
if (data.hasOwnProperty(key)) {
|
|
9
|
-
this[key] = data[key];
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
export class MatrixItemConfig {
|
|
16
|
-
displayName = ['', [Validators.required]];
|
|
17
|
-
/**字段名字 */
|
|
18
|
-
name = ['', [Validators.required]];
|
|
19
|
-
constructor(data) {
|
|
20
|
-
if (data) {
|
|
21
|
-
for (const key in data) {
|
|
22
|
-
if (data.hasOwnProperty(key)) {
|
|
23
|
-
this[key] = data[key];
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
export class matrixFieldInputBase {
|
|
30
|
-
/**字段名称 Display name of this field */
|
|
31
|
-
displayName = ['', [Validators.required]];
|
|
32
|
-
/**字段唯一名称 Unique Name*/
|
|
33
|
-
name = ['', [Validators.required]];
|
|
34
|
-
/**描述 说明 */
|
|
35
|
-
description = ['', []];
|
|
36
|
-
/**FieldType字段类型 表单控件名称 */
|
|
37
|
-
formControlName = ['TextEdit', [Validators.required]];
|
|
38
|
-
/**动态表单配置 */
|
|
39
|
-
formConfiguration = new FormGroup({});
|
|
40
|
-
constructor(data) {
|
|
41
|
-
if (data) {
|
|
42
|
-
for (const key in data) {
|
|
43
|
-
if (data.hasOwnProperty(key)) {
|
|
44
|
-
this[key] = data[key];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2R5bmFtaWMtZm9ybS9zcmMvbGliL2NvbXBvbmVudHMvZnJvbS9tYXRyaXgvbWF0cml4LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFlLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxNQUFNLE9BQU8sWUFBWTtJQUNyQixPQUFPO0lBQ1Asa0JBQWtCLEdBQVEsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFM0MsWUFBWSxJQUFtQjtRQUMzQixJQUFJLElBQUksRUFBRTtZQUNOLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3pCO2FBQ0o7U0FDSjtJQUNMLENBQUM7Q0FDSjtBQUNELE1BQU0sT0FBTyxnQkFBZ0I7SUFFekIsV0FBVyxHQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDL0MsVUFBVTtJQUNWLElBQUksR0FBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRXhDLFlBQVksSUFBbUI7UUFDM0IsSUFBSSxJQUFJLEVBQUU7WUFDTixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN6QjthQUNKO1NBQ0o7SUFHTCxDQUFDO0NBQ0o7QUFJRCxNQUFNLE9BQU8sb0JBQW9CO0lBRzdCLHFDQUFxQztJQUNyQyxXQUFXLEdBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvQyx1QkFBdUI7SUFDdkIsSUFBSSxHQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDeEMsV0FBVztJQUNYLFdBQVcsR0FBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QiwwQkFBMEI7SUFDMUIsZUFBZSxHQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDNUQsWUFBWTtJQUNYLGlCQUFpQixHQUEwQixJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUc1RCxZQUFZLElBQTJCO1FBQ25DLElBQUksSUFBSSxFQUFFO1lBQ04sS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDekI7YUFDSjtTQUNKO0lBRUwsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWF0cml4Q29uZmlnIHtcclxuICAgIC8vIOefqemYteexu+Wei1xyXG4gICAgJ01hdHJpeEJsb2NrVHlwZXMnOiBhbnkgPSBuZXcgRm9ybUFycmF5KFtdKVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBNYXRyaXhDb25maWcpIHtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1trZXldID0gZGF0YVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBNYXRyaXhJdGVtQ29uZmlnIHtcclxuICBcclxuICAgIGRpc3BsYXlOYW1lOiBhbnkgPSBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV07XHJcbiAgICAvKirlrZfmrrXlkI3lrZcgKi9cclxuICAgIG5hbWU6IGFueSA9IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogTWF0cml4Q29uZmlnKSB7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IGRhdGFba2V5XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBtYXRyaXhGaWVsZElucHV0QmFzZSB7XHJcblxyXG5cclxuICAgIC8qKuWtl+auteWQjeensCBEaXNwbGF5IG5hbWUgb2YgdGhpcyBmaWVsZCAqL1xyXG4gICAgZGlzcGxheU5hbWU6IGFueSA9IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXTtcclxuICAgIC8qKuWtl+auteWUr+S4gOWQjeensCBVbmlxdWUgTmFtZSovXHJcbiAgICBuYW1lOiBhbnkgPSBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV07XHJcbiAgICAvKirmj4/ov7Ag6K+05piOICovXHJcbiAgICBkZXNjcmlwdGlvbjogYW55ID0gWycnLCBbXV07XHJcbiAgICAvKipGaWVsZFR5cGXlrZfmrrXnsbvlnosg6KGo5Y2V5o6n5Lu25ZCN56ewICovXHJcbiAgICBmb3JtQ29udHJvbE5hbWU6IGFueSA9IFsnVGV4dEVkaXQnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dO1xyXG4gICAvKirliqjmgIHooajljZXphY3nva4gKi9cclxuICAgIGZvcm1Db25maWd1cmF0aW9uOiBGb3JtR3JvdXAgfCB1bmRlZmluZWQgPSBuZXcgRm9ybUdyb3VwKHt9KVxyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogbWF0cml4RmllbGRJbnB1dEJhc2UpIHtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1trZXldID0gZGF0YVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSJdfQ==
|