@seniorsistemas/components-ai 1.3.0 → 2.0.0
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-form/dynamic-form.component.mjs +263 -368
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-checkbox.component.mjs +53 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-date.component.mjs +5 -3
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-datetime.component.mjs +5 -3
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-dropdown.component.mjs +5 -3
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-image.component.mjs +162 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-lookup.component.mjs +203 -49
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-multiselect.component.mjs +90 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-number.component.mjs +3 -3
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-text.component.mjs +7 -7
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-time.component.mjs +66 -0
- package/esm2022/lib/components/dynamic-form/fields/index.mjs +5 -1
- package/esm2022/lib/components/dynamic-form/models/dynamic-form.models.mjs +1 -1
- package/esm2022/lib/components/loading/iassist-icon.component.mjs +14 -0
- package/esm2022/lib/components/loading/loading.component.mjs +47 -4
- package/esm2022/lib/i18n/en-US.json +4 -1
- package/esm2022/lib/i18n/es-ES.json +4 -1
- package/esm2022/lib/i18n/pt-BR.json +4 -1
- package/esm2022/lib/models/entity-list.config.mjs +1 -1
- package/esm2022/lib/services/websocket.service.mjs +184 -0
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/seniorsistemas-components-ai.mjs +1283 -661
- package/fesm2022/seniorsistemas-components-ai.mjs.map +1 -1
- package/lib/components/dynamic-form/dynamic-form.component.d.ts +8 -17
- package/lib/components/dynamic-form/fields/dynamic-field-checkbox.component.d.ts +8 -0
- package/lib/components/dynamic-form/fields/dynamic-field-image.component.d.ts +21 -0
- package/lib/components/dynamic-form/fields/dynamic-field-lookup.component.d.ts +19 -6
- package/lib/components/dynamic-form/fields/dynamic-field-multiselect.component.d.ts +10 -0
- package/lib/components/dynamic-form/fields/dynamic-field-time.component.d.ts +9 -0
- package/lib/components/dynamic-form/fields/index.d.ts +4 -0
- package/lib/components/dynamic-form/models/dynamic-form.models.d.ts +30 -84
- package/lib/components/loading/iassist-icon.component.d.ts +6 -0
- package/lib/components/loading/loading.component.d.ts +1 -1
- package/lib/models/entity-list.config.d.ts +12 -132
- package/lib/services/websocket.service.d.ts +63 -0
- package/package.json +3 -2
- package/public-api.d.ts +2 -0
- package/src/lib/i18n/en-US.json +4 -1
- package/src/lib/i18n/es-ES.json +4 -1
- package/src/lib/i18n/pt-BR.json +4 -1
|
@@ -13,6 +13,10 @@ import { DynamicFieldDatetimeComponent } from './fields/dynamic-field-datetime.c
|
|
|
13
13
|
import { DynamicFieldDropdownComponent } from './fields/dynamic-field-dropdown.component';
|
|
14
14
|
import { DynamicFieldLookupComponent } from './fields/dynamic-field-lookup.component';
|
|
15
15
|
import { DynamicFieldTextareaComponent } from './fields/dynamic-field-textarea.component';
|
|
16
|
+
import { DynamicFieldTimeComponent } from './fields/dynamic-field-time.component';
|
|
17
|
+
import { DynamicFieldCheckboxComponent } from './fields/dynamic-field-checkbox.component';
|
|
18
|
+
import { DynamicFieldMultiselectComponent } from './fields/dynamic-field-multiselect.component';
|
|
19
|
+
import { DynamicFieldImageComponent } from './fields/dynamic-field-image.component';
|
|
16
20
|
import * as i0 from "@angular/core";
|
|
17
21
|
import * as i1 from "@angular/forms";
|
|
18
22
|
import * as i2 from "../../services/translation.service";
|
|
@@ -29,14 +33,11 @@ export class DynamicFormComponent {
|
|
|
29
33
|
translationService;
|
|
30
34
|
maskService;
|
|
31
35
|
localeService;
|
|
32
|
-
|
|
33
|
-
formSections = [];
|
|
34
|
-
fixedFilters = []; // Filtros fixos (sempre visíveis no topo)
|
|
35
|
-
filterSections = []; // Seções de filtros (colapsáveis)
|
|
36
|
+
sections = [];
|
|
36
37
|
entityData = null;
|
|
37
38
|
mode = 'form';
|
|
38
|
-
// Display Mode
|
|
39
|
-
displayMode
|
|
39
|
+
// Display Mode — optional. If not set, renders inline without buttons.
|
|
40
|
+
displayMode;
|
|
40
41
|
visible = false;
|
|
41
42
|
dialogConfig = {};
|
|
42
43
|
drawerConfig = {};
|
|
@@ -54,102 +55,58 @@ export class DynamicFormComponent {
|
|
|
54
55
|
fieldSave = new EventEmitter();
|
|
55
56
|
form;
|
|
56
57
|
loading = false;
|
|
57
|
-
// Inline edit
|
|
58
|
+
// Inline edit state
|
|
58
59
|
editingField = null;
|
|
59
60
|
savingField = false;
|
|
60
|
-
|
|
61
|
-
return this.formFields.length > 0;
|
|
62
|
-
}
|
|
63
|
-
get hasSections() {
|
|
64
|
-
return this.formSections.length > 0;
|
|
65
|
-
}
|
|
66
|
-
get hasFixedFilters() {
|
|
67
|
-
return this.fixedFilters.length > 0;
|
|
68
|
-
}
|
|
69
|
-
get hasFilterSections() {
|
|
70
|
-
return this.filterSections.length > 0;
|
|
71
|
-
}
|
|
61
|
+
// --- Computed properties ---
|
|
72
62
|
get allFields() {
|
|
73
|
-
|
|
74
|
-
const sectionFields = this.formSections.flatMap(section => section.fields);
|
|
75
|
-
const filterSectionFields = this.filterSections.flatMap(section => section.fields);
|
|
76
|
-
return [...this.formFields, ...sectionFields, ...this.fixedFilters, ...filterSectionFields];
|
|
77
|
-
}
|
|
78
|
-
get isInlineMode() {
|
|
79
|
-
return this.displayMode === 'inline';
|
|
63
|
+
return this.sections.flatMap(section => section.fields);
|
|
80
64
|
}
|
|
81
65
|
get isInlineEditMode() {
|
|
82
66
|
return this.mode === 'inline-edit';
|
|
83
67
|
}
|
|
84
|
-
get fieldMode() {
|
|
85
|
-
return this.isInlineEditMode ? 'form' : this.mode;
|
|
86
|
-
}
|
|
87
68
|
get isDialogMode() {
|
|
88
69
|
return this.displayMode === 'dialog';
|
|
89
70
|
}
|
|
90
71
|
get isDrawerMode() {
|
|
91
72
|
return this.displayMode === 'drawer';
|
|
92
73
|
}
|
|
93
|
-
|
|
74
|
+
get isInlineMode() {
|
|
75
|
+
return !this.displayMode;
|
|
76
|
+
}
|
|
77
|
+
// Dialog config with defaults
|
|
94
78
|
get dialogHeader() {
|
|
95
79
|
return this.dialogConfig.header || this.translationService.translate('design.components_ai.form');
|
|
96
80
|
}
|
|
97
|
-
get dialogWidth() {
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
get
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return this.dialogConfig.resizable !== undefined ? this.dialogConfig.resizable : false;
|
|
105
|
-
}
|
|
106
|
-
get dialogMaximizable() {
|
|
107
|
-
return this.dialogConfig.maximizable !== undefined ? this.dialogConfig.maximizable : false;
|
|
108
|
-
}
|
|
109
|
-
get dialogCloseOnEscape() {
|
|
110
|
-
return this.dialogConfig.closeOnEscape !== undefined ? this.dialogConfig.closeOnEscape : true;
|
|
111
|
-
}
|
|
112
|
-
get dialogDismissableMask() {
|
|
113
|
-
return this.dialogConfig.dismissableMask !== undefined ? this.dialogConfig.dismissableMask : false;
|
|
114
|
-
}
|
|
115
|
-
// Drawer configuration with defaults
|
|
81
|
+
get dialogWidth() { return this.dialogConfig.width || '600px'; }
|
|
82
|
+
get dialogDraggable() { return this.dialogConfig.draggable ?? false; }
|
|
83
|
+
get dialogResizable() { return this.dialogConfig.resizable ?? false; }
|
|
84
|
+
get dialogMaximizable() { return this.dialogConfig.maximizable ?? false; }
|
|
85
|
+
get dialogCloseOnEscape() { return this.dialogConfig.closeOnEscape ?? true; }
|
|
86
|
+
get dialogDismissableMask() { return this.dialogConfig.dismissableMask ?? false; }
|
|
87
|
+
// Drawer config with defaults
|
|
116
88
|
get drawerHeader() {
|
|
117
89
|
return this.drawerConfig.header || this.translationService.translate('design.components_ai.form');
|
|
118
90
|
}
|
|
119
|
-
get drawerPosition() {
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
get
|
|
123
|
-
return this.drawerConfig.showCloseIcon !== undefined ? this.drawerConfig.showCloseIcon : true;
|
|
124
|
-
}
|
|
125
|
-
get drawerCloseOnEscape() {
|
|
126
|
-
return this.drawerConfig.closeOnEscape !== undefined ? this.drawerConfig.closeOnEscape : true;
|
|
127
|
-
}
|
|
128
|
-
get drawerDismissable() {
|
|
129
|
-
return this.drawerConfig.dismissable !== undefined ? this.drawerConfig.dismissable : true;
|
|
130
|
-
}
|
|
91
|
+
get drawerPosition() { return this.drawerConfig.position || 'right'; }
|
|
92
|
+
get drawerShowCloseIcon() { return this.drawerConfig.showCloseIcon ?? true; }
|
|
93
|
+
get drawerCloseOnEscape() { return this.drawerConfig.closeOnEscape ?? true; }
|
|
94
|
+
get drawerDismissable() { return this.drawerConfig.dismissable ?? true; }
|
|
131
95
|
get drawerStyle() {
|
|
132
96
|
const position = this.drawerPosition;
|
|
133
97
|
const isHorizontal = position === 'left' || position === 'right';
|
|
134
|
-
// Se tem customWidth, usa ela
|
|
135
98
|
if (this.drawerConfig.customWidth) {
|
|
136
|
-
return isHorizontal
|
|
137
|
-
? { width: this.drawerConfig.customWidth }
|
|
138
|
-
: { height: this.drawerConfig.customWidth };
|
|
99
|
+
return isHorizontal ? { width: this.drawerConfig.customWidth } : { height: this.drawerConfig.customWidth };
|
|
139
100
|
}
|
|
140
|
-
// Usa o tamanho padronizado
|
|
141
101
|
const size = this.drawerConfig.size || 'medium';
|
|
142
102
|
const sizeMap = {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
103
|
+
small: isHorizontal ? '25%' : '25vh',
|
|
104
|
+
medium: isHorizontal ? '40%' : '40vh',
|
|
105
|
+
large: isHorizontal ? '60%' : '60vh',
|
|
106
|
+
xlarge: isHorizontal ? '80%' : '80vh',
|
|
107
|
+
full: isHorizontal ? '100%' : '100vh'
|
|
148
108
|
};
|
|
149
|
-
|
|
150
|
-
return isHorizontal
|
|
151
|
-
? { width: sizeValue }
|
|
152
|
-
: { height: sizeValue };
|
|
109
|
+
return isHorizontal ? { width: sizeMap[size] } : { height: sizeMap[size] };
|
|
153
110
|
}
|
|
154
111
|
get submitLabel() {
|
|
155
112
|
return this.submitButtonLabel || this.translationService.translate('design.components_ai.save');
|
|
@@ -163,6 +120,7 @@ export class DynamicFormComponent {
|
|
|
163
120
|
this.maskService = maskService;
|
|
164
121
|
this.localeService = localeService;
|
|
165
122
|
}
|
|
123
|
+
// --- Lifecycle ---
|
|
166
124
|
ngOnInit() {
|
|
167
125
|
this.initForm();
|
|
168
126
|
if (this.entityData) {
|
|
@@ -172,53 +130,43 @@ export class DynamicFormComponent {
|
|
|
172
130
|
this.formReady.emit(this.form);
|
|
173
131
|
}
|
|
174
132
|
ngOnChanges(changes) {
|
|
175
|
-
// Handle entityData changes first
|
|
176
133
|
if (changes['entityData'] && this.form) {
|
|
177
|
-
|
|
178
|
-
this.loadEntityData();
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
this.resetForm();
|
|
182
|
-
}
|
|
134
|
+
this.entityData ? this.loadEntityData() : this.resetForm();
|
|
183
135
|
}
|
|
184
|
-
// When dialog/drawer opens, ensure form is loaded with entityData
|
|
185
136
|
if (changes['visible'] && changes['visible'].currentValue === true) {
|
|
186
137
|
this.loading = false;
|
|
187
|
-
// If opening with entityData, reload it to ensure form is populated
|
|
188
138
|
if (this.entityData && this.form) {
|
|
189
139
|
this.loadEntityData();
|
|
190
140
|
}
|
|
191
141
|
else if (!this.entityData && this.form) {
|
|
192
|
-
// If opening without entityData (new record), reset form
|
|
193
142
|
this.resetForm();
|
|
194
143
|
}
|
|
195
144
|
}
|
|
196
145
|
}
|
|
146
|
+
// --- Form init ---
|
|
197
147
|
initForm() {
|
|
198
148
|
const formControls = {};
|
|
199
|
-
// Processa todos os campos (diretos + das seções)
|
|
200
149
|
this.allFields.forEach(field => {
|
|
201
150
|
const defaultValue = this.getDefaultValue(field);
|
|
202
|
-
const validators =
|
|
203
|
-
|
|
204
|
-
formControls[field.field] = control;
|
|
151
|
+
const validators = field.validators || [];
|
|
152
|
+
formControls[field.field] = this.fb.control({ value: defaultValue, disabled: field.disabled || false }, validators);
|
|
205
153
|
});
|
|
206
154
|
this.form = this.fb.group(formControls);
|
|
207
155
|
this.applyInitialDisabledState();
|
|
208
156
|
}
|
|
209
157
|
getDefaultValue(field) {
|
|
210
|
-
if (field.defaultValue !== undefined)
|
|
158
|
+
if (field.defaultValue !== undefined)
|
|
211
159
|
return field.defaultValue;
|
|
212
|
-
}
|
|
213
160
|
switch (field.type) {
|
|
214
161
|
case 'number':
|
|
162
|
+
case 'currency':
|
|
215
163
|
case 'date':
|
|
216
|
-
|
|
164
|
+
case 'time': return null;
|
|
165
|
+
case 'checkbox': return false;
|
|
166
|
+
case 'multiselect': return [];
|
|
217
167
|
case 'dropdown':
|
|
218
|
-
case 'enum':
|
|
219
|
-
|
|
220
|
-
default:
|
|
221
|
-
return '';
|
|
168
|
+
case 'enum': return '';
|
|
169
|
+
default: return '';
|
|
222
170
|
}
|
|
223
171
|
}
|
|
224
172
|
applyInitialDisabledState() {
|
|
@@ -231,194 +179,138 @@ export class DynamicFormComponent {
|
|
|
231
179
|
}
|
|
232
180
|
});
|
|
233
181
|
}
|
|
182
|
+
// --- Data loading ---
|
|
234
183
|
loadEntityData() {
|
|
235
184
|
if (this.entityData && this.form) {
|
|
236
|
-
|
|
237
|
-
this.form.patchValue(processedData);
|
|
185
|
+
this.form.patchValue(this.processEntityData(this.entityData));
|
|
238
186
|
}
|
|
239
187
|
}
|
|
240
188
|
processEntityData(entity) {
|
|
241
|
-
const
|
|
189
|
+
const data = { ...entity };
|
|
242
190
|
this.allFields.forEach(field => {
|
|
243
|
-
if (field.type === 'date' &&
|
|
244
|
-
const
|
|
245
|
-
if (typeof
|
|
246
|
-
|
|
247
|
-
// Use date-only constructor to avoid timezone/hour issues
|
|
248
|
-
const parts = dateValue.substring(0, 10).split('-');
|
|
191
|
+
if (field.type === 'date' && data[field.field]) {
|
|
192
|
+
const v = data[field.field];
|
|
193
|
+
if (typeof v === 'string') {
|
|
194
|
+
const parts = v.substring(0, 10).split('-');
|
|
249
195
|
if (parts.length === 3) {
|
|
250
|
-
const
|
|
251
|
-
if (!isNaN(
|
|
252
|
-
|
|
253
|
-
}
|
|
196
|
+
const d = new Date(+parts[0], +parts[1] - 1, +parts[2]);
|
|
197
|
+
if (!isNaN(d.getTime()))
|
|
198
|
+
data[field.field] = d;
|
|
254
199
|
}
|
|
255
200
|
}
|
|
256
201
|
}
|
|
257
|
-
if (field.type === '
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
// Keep the full object to avoid unnecessary API calls
|
|
266
|
-
processedData[field.field] = lookupValue;
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
// Only has ID, extract it
|
|
270
|
-
processedData[field.field] = lookupValue.id;
|
|
202
|
+
if (field.type === 'time' && data[field.field]) {
|
|
203
|
+
const v = data[field.field];
|
|
204
|
+
if (typeof v === 'string') {
|
|
205
|
+
const parts = v.split(':');
|
|
206
|
+
if (parts.length >= 2) {
|
|
207
|
+
const d = new Date();
|
|
208
|
+
d.setHours(parseInt(parts[0], 10), parseInt(parts[1], 10), 0, 0);
|
|
209
|
+
data[field.field] = d;
|
|
271
210
|
}
|
|
272
211
|
}
|
|
273
212
|
}
|
|
213
|
+
if (field.type === 'lookup' && data[field.field]) {
|
|
214
|
+
const v = data[field.field];
|
|
215
|
+
if (typeof v === 'object' && v.id) {
|
|
216
|
+
const hasDisplay = field.lookupDisplayFields
|
|
217
|
+
? field.lookupDisplayFields.some(f => this.getNestedValue(v, f))
|
|
218
|
+
: v[field.lookupDisplayField || 'name'];
|
|
219
|
+
if (!hasDisplay)
|
|
220
|
+
data[field.field] = v.id;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
274
223
|
});
|
|
275
|
-
return
|
|
224
|
+
return data;
|
|
276
225
|
}
|
|
277
226
|
getNestedValue(obj, path) {
|
|
278
|
-
return path.split('.').reduce((
|
|
227
|
+
return path.split('.').reduce((cur, key) => cur?.[key], obj);
|
|
279
228
|
}
|
|
280
229
|
resetForm() {
|
|
281
230
|
if (this.form) {
|
|
282
|
-
const
|
|
283
|
-
this.allFields.forEach(
|
|
284
|
-
|
|
285
|
-
});
|
|
286
|
-
this.form.reset(resetValues);
|
|
231
|
+
const values = {};
|
|
232
|
+
this.allFields.forEach(f => values[f.field] = this.getDefaultValue(f));
|
|
233
|
+
this.form.reset(values);
|
|
287
234
|
}
|
|
288
235
|
}
|
|
289
|
-
|
|
290
|
-
const processedValue = { ...formValue };
|
|
291
|
-
this.allFields.forEach(field => {
|
|
292
|
-
const fieldValue = processedValue[field.field];
|
|
293
|
-
if (field.type === 'lookup') {
|
|
294
|
-
if (fieldValue && typeof fieldValue === 'object' && fieldValue.id) {
|
|
295
|
-
processedValue[field.field] = fieldValue;
|
|
296
|
-
}
|
|
297
|
-
else if (fieldValue && typeof fieldValue === 'string') {
|
|
298
|
-
processedValue[field.field] = { id: fieldValue };
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
processedValue[field.field] = null;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
});
|
|
305
|
-
return processedValue;
|
|
306
|
-
}
|
|
236
|
+
// --- Value processing on submit ---
|
|
307
237
|
processFormValue(formValue) {
|
|
308
|
-
const
|
|
309
|
-
if (this.entityData?.id)
|
|
310
|
-
|
|
311
|
-
}
|
|
238
|
+
const out = { ...formValue };
|
|
239
|
+
if (this.entityData?.id)
|
|
240
|
+
out.id = this.entityData.id;
|
|
312
241
|
this.allFields.forEach(field => {
|
|
313
|
-
const
|
|
242
|
+
const v = out[field.field];
|
|
314
243
|
if (field.type === 'lookup') {
|
|
315
|
-
|
|
316
|
-
if (
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
else if (fieldValue && fieldValue !== '') {
|
|
321
|
-
// If it's just an ID, wrap it in an object
|
|
322
|
-
processedValue[field.field] = { id: fieldValue };
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
processedValue[field.field] = null;
|
|
326
|
-
}
|
|
244
|
+
if (v && typeof v === 'object') { /* keep */ }
|
|
245
|
+
else if (v && v !== '')
|
|
246
|
+
out[field.field] = { id: v };
|
|
247
|
+
else
|
|
248
|
+
out[field.field] = null;
|
|
327
249
|
}
|
|
328
250
|
else if (field.type === 'date') {
|
|
329
|
-
if (
|
|
330
|
-
|
|
331
|
-
const y = fieldValue.getFullYear();
|
|
332
|
-
const m = String(fieldValue.getMonth() + 1).padStart(2, '0');
|
|
333
|
-
const d = String(fieldValue.getDate()).padStart(2, '0');
|
|
334
|
-
processedValue[field.field] = `${y}-${m}-${d}`;
|
|
335
|
-
}
|
|
336
|
-
else if (!fieldValue) {
|
|
337
|
-
processedValue[field.field] = null;
|
|
251
|
+
if (v instanceof Date) {
|
|
252
|
+
out[field.field] = `${v.getFullYear()}-${String(v.getMonth() + 1).padStart(2, '0')}-${String(v.getDate()).padStart(2, '0')}`;
|
|
338
253
|
}
|
|
254
|
+
else if (!v)
|
|
255
|
+
out[field.field] = null;
|
|
339
256
|
}
|
|
340
|
-
else if (
|
|
341
|
-
if (
|
|
342
|
-
|
|
257
|
+
else if (field.type === 'time') {
|
|
258
|
+
if (v instanceof Date) {
|
|
259
|
+
out[field.field] = `${String(v.getHours()).padStart(2, '0')}:${String(v.getMinutes()).padStart(2, '0')}:00`;
|
|
343
260
|
}
|
|
261
|
+
else if (!v)
|
|
262
|
+
out[field.field] = null;
|
|
263
|
+
}
|
|
264
|
+
else if (['text', 'textarea', 'number', 'currency', 'enum', 'dropdown'].includes(field.type)) {
|
|
265
|
+
if (v === '' || v === undefined)
|
|
266
|
+
out[field.field] = null;
|
|
344
267
|
}
|
|
345
268
|
});
|
|
346
|
-
return
|
|
269
|
+
return out;
|
|
347
270
|
}
|
|
271
|
+
// --- Layout ---
|
|
348
272
|
getFieldGridClass(field) {
|
|
273
|
+
const defaultSize = { xl: 6, lg: 6, md: 6, sm: 12 };
|
|
274
|
+
const size = typeof field.size === 'function'
|
|
275
|
+
? field.size(this.form?.value || {})
|
|
276
|
+
: (field.size || defaultSize);
|
|
349
277
|
const classes = [];
|
|
350
|
-
//
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
// Adiciona classe base
|
|
363
|
-
classes.push(`col-${baseColspan}`);
|
|
364
|
-
// Suporta tanto o objeto size quanto as propriedades antigas (para compatibilidade)
|
|
365
|
-
const sizeXs = field.size?.xs ?? field.colspanXs;
|
|
366
|
-
const sizeSm = field.size?.sm ?? field.colspanSm;
|
|
367
|
-
const sizeMd = field.size?.md ?? field.colspanMd;
|
|
368
|
-
const sizeLg = field.size?.lg ?? field.colspanLg;
|
|
369
|
-
const sizeXl = field.size?.xl ?? field.colspanXl;
|
|
370
|
-
// Adiciona classes responsivas se definidas
|
|
371
|
-
if (sizeXs !== undefined) {
|
|
372
|
-
classes.push(`col-xs-${sizeXs}`);
|
|
373
|
-
}
|
|
374
|
-
if (sizeSm !== undefined) {
|
|
375
|
-
classes.push(`col-sm-${sizeSm}`);
|
|
376
|
-
}
|
|
377
|
-
if (sizeMd !== undefined) {
|
|
378
|
-
classes.push(`col-md-${sizeMd}`);
|
|
379
|
-
}
|
|
380
|
-
if (sizeLg !== undefined) {
|
|
381
|
-
classes.push(`col-lg-${sizeLg}`);
|
|
382
|
-
}
|
|
383
|
-
if (sizeXl !== undefined) {
|
|
384
|
-
classes.push(`col-xl-${sizeXl}`);
|
|
385
|
-
}
|
|
278
|
+
// Base class from xl or fallback 6
|
|
279
|
+
classes.push(`col-${size.xl ?? size.lg ?? size.md ?? size.sm ?? 6}`);
|
|
280
|
+
if (size.xs !== undefined)
|
|
281
|
+
classes.push(`col-xs-${size.xs}`);
|
|
282
|
+
if (size.sm !== undefined)
|
|
283
|
+
classes.push(`col-sm-${size.sm}`);
|
|
284
|
+
if (size.md !== undefined)
|
|
285
|
+
classes.push(`col-md-${size.md}`);
|
|
286
|
+
if (size.lg !== undefined)
|
|
287
|
+
classes.push(`col-lg-${size.lg}`);
|
|
288
|
+
if (size.xl !== undefined)
|
|
289
|
+
classes.push(`col-xl-${size.xl}`);
|
|
386
290
|
return classes.join(' ');
|
|
387
291
|
}
|
|
292
|
+
// --- Conditional visibility/disabled ---
|
|
388
293
|
isFieldVisible(field) {
|
|
389
|
-
if (!field.visibleWhen)
|
|
294
|
+
if (!field.visibleWhen)
|
|
390
295
|
return true;
|
|
391
|
-
}
|
|
392
|
-
const dependentFieldValue = this.form.get(field.visibleWhen.field)?.value;
|
|
393
|
-
return dependentFieldValue === field.visibleWhen.value;
|
|
296
|
+
return field.visibleWhen(this.form?.value || {});
|
|
394
297
|
}
|
|
395
298
|
isFieldDisabled(field) {
|
|
396
|
-
if (field.disabled)
|
|
299
|
+
if (field.disabled)
|
|
397
300
|
return true;
|
|
398
|
-
|
|
399
|
-
if (!('disabledWhen' in field) || !field.disabledWhen) {
|
|
301
|
+
if (!field.disabledWhen)
|
|
400
302
|
return false;
|
|
401
|
-
}
|
|
402
|
-
const dependentFieldValue = this.form.get(field.disabledWhen.field)?.value;
|
|
403
|
-
if (field.disabledWhen.value === null) {
|
|
404
|
-
return !dependentFieldValue;
|
|
405
|
-
}
|
|
406
|
-
return dependentFieldValue === field.disabledWhen.value;
|
|
303
|
+
return field.disabledWhen(this.form?.value || {});
|
|
407
304
|
}
|
|
408
305
|
setupConditionalFieldsWatcher() {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
const
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
control.valueChanges.subscribe(() => {
|
|
418
|
-
this.clearHiddenFields();
|
|
419
|
-
this.updateDisabledFields();
|
|
420
|
-
});
|
|
421
|
-
}
|
|
306
|
+
// Since visibleWhen/disabledWhen are now functions that can depend on any field,
|
|
307
|
+
// we watch all fields for changes and re-evaluate
|
|
308
|
+
const hasConditional = this.allFields.some(f => f.visibleWhen || f.disabledWhen);
|
|
309
|
+
if (!hasConditional)
|
|
310
|
+
return;
|
|
311
|
+
this.form.valueChanges.subscribe(() => {
|
|
312
|
+
this.clearHiddenFields();
|
|
313
|
+
this.updateDisabledFields();
|
|
422
314
|
});
|
|
423
315
|
}
|
|
424
316
|
updateDisabledFields() {
|
|
@@ -426,13 +318,13 @@ export class DynamicFormComponent {
|
|
|
426
318
|
if (field.disabledWhen) {
|
|
427
319
|
const control = this.form.get(field.field);
|
|
428
320
|
if (control) {
|
|
429
|
-
const
|
|
430
|
-
if (
|
|
321
|
+
const shouldDisable = this.isFieldDisabled(field);
|
|
322
|
+
if (shouldDisable && control.enabled) {
|
|
431
323
|
control.setValue(null);
|
|
432
|
-
control.disable();
|
|
324
|
+
control.disable({ emitEvent: false });
|
|
433
325
|
}
|
|
434
|
-
else if (!
|
|
435
|
-
control.enable();
|
|
326
|
+
else if (!shouldDisable && control.disabled && !field.disabled) {
|
|
327
|
+
control.enable({ emitEvent: false });
|
|
436
328
|
}
|
|
437
329
|
}
|
|
438
330
|
}
|
|
@@ -442,100 +334,111 @@ export class DynamicFormComponent {
|
|
|
442
334
|
this.allFields.forEach(field => {
|
|
443
335
|
if (field.visibleWhen && !this.isFieldVisible(field)) {
|
|
444
336
|
const control = this.form.get(field.field);
|
|
445
|
-
if (control) {
|
|
446
|
-
|
|
447
|
-
control.setValue(resetValue);
|
|
337
|
+
if (control && control.value !== this.getDefaultValue(field)) {
|
|
338
|
+
control.setValue(this.getDefaultValue(field), { emitEvent: false });
|
|
448
339
|
control.markAsUntouched();
|
|
449
340
|
control.markAsPristine();
|
|
450
341
|
}
|
|
451
342
|
}
|
|
452
343
|
});
|
|
453
344
|
}
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
}
|
|
457
|
-
clearFilters() {
|
|
458
|
-
if (this.mode === 'filter') {
|
|
459
|
-
this.resetForm();
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
getTypePersonValue() {
|
|
463
|
-
const typePersonValue = this.form?.get('typePerson')?.value;
|
|
464
|
-
return typePersonValue || 'JURIDICAL_PERSON';
|
|
465
|
-
}
|
|
466
|
-
// Display Mode Control Methods
|
|
345
|
+
// --- Public methods ---
|
|
346
|
+
getForm() { return this.form; }
|
|
467
347
|
open(entity) {
|
|
468
348
|
if (entity) {
|
|
469
349
|
this.entityData = entity;
|
|
470
350
|
}
|
|
471
351
|
else {
|
|
472
352
|
this.entityData = null;
|
|
473
|
-
this.resetForm();
|
|
353
|
+
this.resetForm();
|
|
474
354
|
}
|
|
475
|
-
this.loading = false;
|
|
355
|
+
this.loading = false;
|
|
476
356
|
this.visible = true;
|
|
477
357
|
this.visibleChange.emit(true);
|
|
478
358
|
}
|
|
479
359
|
close() {
|
|
480
|
-
this.loading = false;
|
|
360
|
+
this.loading = false;
|
|
481
361
|
this.visible = false;
|
|
482
362
|
this.visibleChange.emit(false);
|
|
483
|
-
this.resetForm();
|
|
363
|
+
this.resetForm();
|
|
484
364
|
this.onCancel.emit();
|
|
485
365
|
}
|
|
486
|
-
handleCancel() {
|
|
487
|
-
this.close();
|
|
488
|
-
}
|
|
366
|
+
handleCancel() { this.close(); }
|
|
489
367
|
handleSubmit() {
|
|
490
368
|
if (this.mode === 'form' && this.form.invalid) {
|
|
491
369
|
this.form.markAllAsTouched();
|
|
492
370
|
return;
|
|
493
371
|
}
|
|
494
|
-
|
|
495
|
-
|
|
372
|
+
this.loading = true;
|
|
373
|
+
this.formSubmit.emit(this.processFormValue(this.form.value));
|
|
374
|
+
}
|
|
375
|
+
onFormKeydown(event) {
|
|
376
|
+
if (event.key === 'Enter') {
|
|
377
|
+
const target = event.target;
|
|
378
|
+
if (target.tagName === 'TEXTAREA')
|
|
379
|
+
return;
|
|
380
|
+
event.preventDefault();
|
|
381
|
+
// In inline-edit mode, Enter saves the current field
|
|
382
|
+
if (this.isInlineEditMode && this.editingField) {
|
|
383
|
+
this.saveInlineField(this.editingField);
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
this.handleSubmit();
|
|
387
|
+
}
|
|
496
388
|
}
|
|
497
|
-
const formValue = this.mode === 'filter'
|
|
498
|
-
? this.processFilterValue(this.form.value)
|
|
499
|
-
: this.processFormValue(this.form.value);
|
|
500
|
-
this.formSubmit.emit(formValue);
|
|
501
389
|
}
|
|
502
|
-
//
|
|
390
|
+
// --- Section helpers ---
|
|
391
|
+
getSectionStyle(section) {
|
|
392
|
+
if (!section.title)
|
|
393
|
+
return 'none';
|
|
394
|
+
return section.style || 'none';
|
|
395
|
+
}
|
|
396
|
+
// --- Inline Edit ---
|
|
503
397
|
startEditField(fieldName) {
|
|
504
|
-
if (this.isInlineEditMode)
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
const parts = value.substring(0, 10).split('-');
|
|
521
|
-
if (parts.length === 3) {
|
|
522
|
-
const date = new Date(+parts[0], +parts[1] - 1, +parts[2]);
|
|
523
|
-
control.setValue(!isNaN(date.getTime()) ? date : value);
|
|
524
|
-
}
|
|
525
|
-
else {
|
|
526
|
-
control.setValue(value);
|
|
527
|
-
}
|
|
398
|
+
if (!this.isInlineEditMode)
|
|
399
|
+
return;
|
|
400
|
+
this.editingField = fieldName;
|
|
401
|
+
if (this.entityData) {
|
|
402
|
+
const control = this.form.get(fieldName);
|
|
403
|
+
if (control) {
|
|
404
|
+
const field = this.allFields.find(f => f.field === fieldName);
|
|
405
|
+
const value = this.entityData[fieldName];
|
|
406
|
+
if (field?.type === 'lookup' && value && typeof value === 'object') {
|
|
407
|
+
control.setValue(value);
|
|
408
|
+
}
|
|
409
|
+
else if (field?.type === 'date' && value && typeof value === 'string') {
|
|
410
|
+
const parts = value.substring(0, 10).split('-');
|
|
411
|
+
if (parts.length === 3) {
|
|
412
|
+
const d = new Date(+parts[0], +parts[1] - 1, +parts[2]);
|
|
413
|
+
control.setValue(!isNaN(d.getTime()) ? d : value);
|
|
528
414
|
}
|
|
529
415
|
else {
|
|
530
416
|
control.setValue(value);
|
|
531
417
|
}
|
|
532
418
|
}
|
|
419
|
+
else {
|
|
420
|
+
control.setValue(value);
|
|
421
|
+
}
|
|
533
422
|
}
|
|
534
423
|
}
|
|
424
|
+
// Auto-focus the input after Angular renders the edit field
|
|
425
|
+
setTimeout(() => {
|
|
426
|
+
const el = document.querySelector(`.inline-edit-field input[id="${fieldName}"], .inline-edit-field textarea[id="${fieldName}"]`);
|
|
427
|
+
el?.focus();
|
|
428
|
+
});
|
|
429
|
+
// For lookup fields, auto-save when value changes (user selects from dialog)
|
|
430
|
+
const field = this.allFields.find(f => f.field === fieldName);
|
|
431
|
+
if (field?.type === 'lookup') {
|
|
432
|
+
const control = this.form.get(fieldName);
|
|
433
|
+
const sub = control?.valueChanges.subscribe(val => {
|
|
434
|
+
if (val && typeof val === 'object') {
|
|
435
|
+
sub?.unsubscribe();
|
|
436
|
+
this.saveInlineField(fieldName);
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
}
|
|
535
440
|
}
|
|
536
|
-
isFieldEditing(fieldName) {
|
|
537
|
-
return this.editingField === fieldName;
|
|
538
|
-
}
|
|
441
|
+
isFieldEditing(fieldName) { return this.editingField === fieldName; }
|
|
539
442
|
saveInlineField(fieldName) {
|
|
540
443
|
if (!this.isInlineEditMode)
|
|
541
444
|
return;
|
|
@@ -545,29 +448,21 @@ export class DynamicFormComponent {
|
|
|
545
448
|
return;
|
|
546
449
|
}
|
|
547
450
|
this.savingField = true;
|
|
548
|
-
let
|
|
549
|
-
// For lookup fields, keep the full object (don't extract ID)
|
|
451
|
+
let value = control.value;
|
|
550
452
|
const field = this.allFields.find(f => f.field === fieldName);
|
|
551
|
-
if (field?.type === 'lookup' &&
|
|
552
|
-
|
|
553
|
-
fieldValue = { id: fieldValue };
|
|
453
|
+
if (field?.type === 'lookup' && value && typeof value !== 'object') {
|
|
454
|
+
value = { id: value };
|
|
554
455
|
}
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
const y = fieldValue.getFullYear();
|
|
558
|
-
const m = String(fieldValue.getMonth() + 1).padStart(2, '0');
|
|
559
|
-
const d = String(fieldValue.getDate()).padStart(2, '0');
|
|
560
|
-
fieldValue = `${y}-${m}-${d}`;
|
|
456
|
+
if (field?.type === 'date' && value instanceof Date) {
|
|
457
|
+
value = `${value.getFullYear()}-${String(value.getMonth() + 1).padStart(2, '0')}-${String(value.getDate()).padStart(2, '0')}`;
|
|
561
458
|
}
|
|
562
|
-
this.fieldSave.emit({ field: fieldName, value
|
|
459
|
+
this.fieldSave.emit({ field: fieldName, value });
|
|
563
460
|
}
|
|
564
461
|
cancelInlineEdit() {
|
|
565
462
|
if (this.isInlineEditMode && this.editingField) {
|
|
566
463
|
const control = this.form.get(this.editingField);
|
|
567
464
|
if (control && this.entityData) {
|
|
568
|
-
|
|
569
|
-
const originalValue = this.entityData[this.editingField];
|
|
570
|
-
control.setValue(originalValue);
|
|
465
|
+
control.setValue(this.entityData[this.editingField]);
|
|
571
466
|
control.markAsPristine();
|
|
572
467
|
control.markAsUntouched();
|
|
573
468
|
}
|
|
@@ -575,75 +470,77 @@ export class DynamicFormComponent {
|
|
|
575
470
|
this.savingField = false;
|
|
576
471
|
}
|
|
577
472
|
}
|
|
578
|
-
// Method to be called by parent after save completes
|
|
579
473
|
completeInlineEdit() {
|
|
580
474
|
this.editingField = null;
|
|
581
475
|
this.savingField = false;
|
|
582
476
|
}
|
|
477
|
+
// --- Display value for inline-edit mode ---
|
|
583
478
|
getFieldDisplayValue(fieldName) {
|
|
584
479
|
if (!this.entityData)
|
|
585
480
|
return '';
|
|
586
481
|
const field = this.allFields.find(f => f.field === fieldName);
|
|
587
482
|
const value = this.entityData[fieldName];
|
|
588
|
-
if (!value)
|
|
483
|
+
if (!value && value !== false && value !== 0)
|
|
589
484
|
return '';
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
if (field?.type === 'lookup' && typeof value === 'object' && field.lookupDisplayFields) {
|
|
596
|
-
return field.lookupDisplayFields
|
|
597
|
-
.map(f => this.getNestedValue(value, f))
|
|
598
|
-
.filter(v => v)
|
|
599
|
-
.join(' - ');
|
|
485
|
+
if (field?.type === 'lookup' && typeof value === 'object') {
|
|
486
|
+
if (field.lookupDisplayFields) {
|
|
487
|
+
return field.lookupDisplayFields.map(f => this.getNestedValue(value, f)).filter(v => v).join(' - ');
|
|
488
|
+
}
|
|
489
|
+
return value[field.lookupDisplayField || 'name'] || '';
|
|
600
490
|
}
|
|
601
|
-
// For dropdown/enum fields, find the matching option label
|
|
602
491
|
if ((field?.type === 'dropdown' || field?.type === 'enum') && field) {
|
|
603
|
-
const
|
|
604
|
-
const
|
|
605
|
-
const
|
|
606
|
-
const
|
|
607
|
-
|
|
608
|
-
return
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
492
|
+
const opts = field.options || field.enumOptions || [];
|
|
493
|
+
const optVal = field.optionValue || 'value';
|
|
494
|
+
const optLbl = field.optionLabel || 'label';
|
|
495
|
+
const match = opts.find((o) => (typeof o === 'object' ? o[optVal] : o) === value);
|
|
496
|
+
if (match)
|
|
497
|
+
return typeof match === 'object' ? match[optLbl] : match;
|
|
498
|
+
}
|
|
499
|
+
if (field?.type === 'currency' && typeof value === 'number') {
|
|
500
|
+
const moneyConfig = this.maskService.getMoneyConfig();
|
|
501
|
+
return new Intl.NumberFormat(field.locale || moneyConfig.locale, {
|
|
502
|
+
style: 'currency',
|
|
503
|
+
currency: field.currency || moneyConfig.currency
|
|
504
|
+
}).format(value);
|
|
613
505
|
}
|
|
614
|
-
// For number fields, format appropriately
|
|
615
506
|
if (field?.type === 'number' && typeof value === 'number') {
|
|
616
|
-
|
|
617
|
-
return new Intl.NumberFormat(field.locale || 'pt-BR', {
|
|
618
|
-
style: 'currency',
|
|
619
|
-
currency: field.currency || 'BRL'
|
|
620
|
-
}).format(value);
|
|
621
|
-
}
|
|
622
|
-
return new Intl.NumberFormat(field.locale || 'pt-BR', {
|
|
507
|
+
return new Intl.NumberFormat('pt-BR', {
|
|
623
508
|
minimumFractionDigits: field.minFractionDigits || 0,
|
|
624
509
|
maximumFractionDigits: field.maxFractionDigits || 2
|
|
625
510
|
}).format(value);
|
|
626
511
|
}
|
|
627
|
-
|
|
628
|
-
if (field?.type === 'date' && value) {
|
|
512
|
+
if (field?.type === 'date' && value)
|
|
629
513
|
return this.localeService.formatDate(value);
|
|
514
|
+
if (field?.type === 'time' && value) {
|
|
515
|
+
if (value instanceof Date)
|
|
516
|
+
return `${String(value.getHours()).padStart(2, '0')}:${String(value.getMinutes()).padStart(2, '0')}`;
|
|
517
|
+
return typeof value === 'string' ? value.substring(0, 5) : String(value);
|
|
518
|
+
}
|
|
519
|
+
if (field?.type === 'checkbox') {
|
|
520
|
+
return value ? this.translationService.translate('design.components_ai.boolean_true')
|
|
521
|
+
: this.translationService.translate('design.components_ai.boolean_false');
|
|
522
|
+
}
|
|
523
|
+
if (field?.type === 'multiselect' && Array.isArray(value)) {
|
|
524
|
+
const opts = field.options || field.enumOptions || [];
|
|
525
|
+
const optVal = field.optionValue || 'value';
|
|
526
|
+
const optLbl = field.optionLabel || 'label';
|
|
527
|
+
return value.map(v => {
|
|
528
|
+
const o = opts.find((opt) => (typeof opt === 'object' ? opt[optVal] : opt) === v);
|
|
529
|
+
return o ? (typeof o === 'object' ? o[optLbl] : o) : v;
|
|
530
|
+
}).join(', ');
|
|
630
531
|
}
|
|
631
|
-
// For text fields with document mask, format the value
|
|
632
532
|
if (field?.type === 'text' && field.mask === 'document' && value) {
|
|
633
|
-
const
|
|
634
|
-
const typePerson = this.entityData[dependsOn] || 'JURIDICAL_PERSON';
|
|
533
|
+
const typePerson = this.entityData[field.maskDependsOn || 'typePerson'] || 'JURIDICAL_PERSON';
|
|
635
534
|
return this.maskService.applyDocumentMask(String(value), typePerson);
|
|
636
535
|
}
|
|
637
|
-
if (field?.type === 'text' && field.mask === 'cpf' && value)
|
|
536
|
+
if (field?.type === 'text' && field.mask === 'cpf' && value)
|
|
638
537
|
return this.maskService.applyCpfMask(String(value));
|
|
639
|
-
|
|
640
|
-
if (field?.type === 'text' && field.mask === 'cnpj' && value) {
|
|
538
|
+
if (field?.type === 'text' && field.mask === 'cnpj' && value)
|
|
641
539
|
return this.maskService.applyCnpjMask(String(value));
|
|
642
|
-
}
|
|
643
540
|
return String(value);
|
|
644
541
|
}
|
|
645
542
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.TranslationService }, { token: i3.MaskService }, { token: i4.LocaleService }], target: i0.ɵɵFactoryTarget.Component });
|
|
646
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sia-dynamic-form", inputs: { formFields: "formFields", formSections: "formSections", fixedFilters: "fixedFilters", filterSections: "filterSections", entityData: "entityData", mode: "mode", displayMode: "displayMode", visible: "visible", dialogConfig: "dialogConfig", drawerConfig: "drawerConfig", showSubmitButton: "showSubmitButton", showCancelButton: "showCancelButton", submitButtonLabel: "submitButtonLabel", cancelButtonLabel: "cancelButtonLabel", submitButtonIcon: "submitButtonIcon", cancelButtonIcon: "cancelButtonIcon" }, outputs: { formReady: "formReady", formSubmit: "formSubmit", visibleChange: "visibleChange", onCancel: "onCancel", fieldSave: "fieldSave" }, usesOnChanges: true, ngImport: i0, template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Datetime Field -->\n <sia-dynamic-field-datetime\n *ngIf=\"field.type === 'datetime'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-datetime>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i8.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i9.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i10.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldTextComponent, selector: "sia-dynamic-field-text" }, { kind: "component", type: DynamicFieldNumberComponent, selector: "sia-dynamic-field-number" }, { kind: "component", type: DynamicFieldDateComponent, selector: "sia-dynamic-field-date" }, { kind: "component", type: DynamicFieldDatetimeComponent, selector: "sia-dynamic-field-datetime" }, { kind: "component", type: DynamicFieldDropdownComponent, selector: "sia-dynamic-field-dropdown" }, { kind: "component", type: DynamicFieldLookupComponent, selector: "sia-dynamic-field-lookup", inputs: ["field", "form", "formGroup", "mode"] }, { kind: "component", type: DynamicFieldTextareaComponent, selector: "sia-dynamic-field-textarea" }] });
|
|
543
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sia-dynamic-form", inputs: { sections: "sections", entityData: "entityData", mode: "mode", displayMode: "displayMode", visible: "visible", dialogConfig: "dialogConfig", drawerConfig: "drawerConfig", showSubmitButton: "showSubmitButton", showCancelButton: "showCancelButton", submitButtonLabel: "submitButtonLabel", cancelButtonLabel: "cancelButtonLabel", submitButtonIcon: "submitButtonIcon", cancelButtonIcon: "cancelButtonIcon" }, outputs: { formReady: "formReady", formSubmit: "formSubmit", visibleChange: "visibleChange", onCancel: "onCancel", fieldSave: "fieldSave" }, usesOnChanges: true, ngImport: i0, template: "<!-- Inline Mode (no displayMode set) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Dialog Mode -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n\n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button *ngIf=\"showCancelButton\" [label]=\"cancelLabel | translate\" [icon]=\"cancelButtonIcon\" severity=\"secondary\" (onClick)=\"handleCancel()\" [disabled]=\"loading\"></p-button>\n <p-button *ngIf=\"showSubmitButton\" [label]=\"submitLabel | translate\" [icon]=\"submitButtonIcon\" (onClick)=\"handleSubmit()\" [loading]=\"loading\" [disabled]=\"form.invalid\"></p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Drawer Mode -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n\n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button *ngIf=\"showCancelButton\" [label]=\"cancelLabel | translate\" [icon]=\"cancelButtonIcon\" severity=\"secondary\" (onClick)=\"handleCancel()\" [disabled]=\"loading\"></p-button>\n <p-button *ngIf=\"showSubmitButton\" [label]=\"submitLabel | translate\" [icon]=\"submitButtonIcon\" (onClick)=\"handleSubmit()\" [loading]=\"loading\" [disabled]=\"form.invalid\"></p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Form Content Template -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\" (keydown)=\"onFormKeydown($event)\">\n\n <ng-container *ngFor=\"let section of sections\">\n <!-- No title = bare fields -->\n <ng-container *ngIf=\"!section.title\">\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Bordered section -->\n <div *ngIf=\"section.title && getSectionStyle(section) === 'bordered'\" class=\"bordered-section\">\n <h3 class=\"section-heading\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n {{ section.title }}\n </h3>\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Panel section -->\n <p-panel\n *ngIf=\"section.title && getSectionStyle(section) === 'panel'\"\n [toggleable]=\"true\"\n [collapsed]=\"section.collapsed || false\"\n styleClass=\"section-panel\">\n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n\n <!-- Heading-only section (title present, style='none' or omitted) -->\n <div *ngIf=\"section.title && getSectionStyle(section) === 'none'\" class=\"heading-section\">\n <h3 class=\"section-heading\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n {{ section.title }}\n </h3>\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Custom content projection -->\n <ng-content></ng-content>\n </form>\n</ng-template>\n\n<!-- Field Template -->\n<ng-template #fieldTemplate let-field=\"field\">\n <sia-dynamic-field-text *ngIf=\"field.type === 'text'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-text>\n <sia-dynamic-field-textarea *ngIf=\"field.type === 'textarea'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-textarea>\n <sia-dynamic-field-number *ngIf=\"field.type === 'number' || field.type === 'currency'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-number>\n <sia-dynamic-field-date *ngIf=\"field.type === 'date'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-date>\n <sia-dynamic-field-datetime *ngIf=\"field.type === 'datetime'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-datetime>\n <sia-dynamic-field-dropdown *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-dropdown>\n <sia-dynamic-field-lookup *ngIf=\"field.type === 'lookup'\" [field]=\"field\" [form]=\"form\" [formGroup]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-lookup>\n <sia-dynamic-field-time *ngIf=\"field.type === 'time'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-time>\n <sia-dynamic-field-checkbox *ngIf=\"field.type === 'checkbox'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-checkbox>\n <sia-dynamic-field-multiselect *ngIf=\"field.type === 'multiselect'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-multiselect>\n <sia-dynamic-field-image *ngIf=\"field.type === 'image'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-image>\n</ng-template>\n\n<!-- Inline Edit Field Template -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n <div class=\"field-display\" *ngIf=\"!isFieldEditing(field.field)\" (click)=\"startEditField(field.field)\" [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" [attr.data-placeholder]=\"field.placeholder || ('design.components_ai.not_informed' | translate)\">{{ getFieldDisplayValue(field.field) }}</span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n <div class=\"edit-actions\">\n <p-button type=\"button\" icon=\"pi pi-check\" [rounded]=\"true\" [text]=\"true\" severity=\"success\" (onClick)=\"saveInlineField(field.field)\" [loading]=\"savingField\" [disabled]=\"form.get(field.field)?.invalid\" size=\"small\"></p-button>\n <p-button type=\"button\" icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\" (onClick)=\"cancelInlineEdit()\" [disabled]=\"savingField\" size=\"small\"></p-button>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%;display:flex;flex-direction:column;gap:1.5rem}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .bordered-section{border:1px solid var(--p-surface-200, var(--surface-200, #e5e7eb));border-radius:var(--p-border-radius, var(--border-radius, 6px));padding:1.5rem}.dynamic-form .bordered-section .section-heading{margin:0 0 1rem;font-size:1rem;font-weight:600;color:var(--text-color);display:flex;align-items:center;gap:.5rem}.dynamic-form .bordered-section .section-heading .section-icon{color:var(--primary-color)}.dynamic-form .heading-section .section-heading{margin:0 0 1rem;font-size:1rem;font-weight:600;color:var(--text-color);display:flex;align-items:center;gap:.5rem}.dynamic-form .heading-section .section-heading .section-icon{color:var(--primary-color)}.dynamic-form ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50)}.dynamic-form ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary)}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:transparent;border:1px solid var(--p-surface-300, var(--surface-300, #d1d5db));border-radius:var(--p-border-radius, var(--border-radius, 6px));cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){border-color:var(--p-primary-color, var(--primary-color))}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6;background-color:var(--p-surface-50, var(--surface-50, #f9fafb))}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--p-primary-color, var(--primary-color));font-size:.875rem;opacity:0;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;align-items:center;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:0;flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i8.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i9.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i10.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldTextComponent, selector: "sia-dynamic-field-text" }, { kind: "component", type: DynamicFieldNumberComponent, selector: "sia-dynamic-field-number" }, { kind: "component", type: DynamicFieldDateComponent, selector: "sia-dynamic-field-date" }, { kind: "component", type: DynamicFieldDatetimeComponent, selector: "sia-dynamic-field-datetime" }, { kind: "component", type: DynamicFieldDropdownComponent, selector: "sia-dynamic-field-dropdown" }, { kind: "component", type: DynamicFieldLookupComponent, selector: "sia-dynamic-field-lookup", inputs: ["field", "form", "formGroup", "mode"] }, { kind: "component", type: DynamicFieldTextareaComponent, selector: "sia-dynamic-field-textarea" }, { kind: "component", type: DynamicFieldTimeComponent, selector: "sia-dynamic-field-time" }, { kind: "component", type: DynamicFieldCheckboxComponent, selector: "sia-dynamic-field-checkbox" }, { kind: "component", type: DynamicFieldMultiselectComponent, selector: "sia-dynamic-field-multiselect" }, { kind: "component", type: DynamicFieldImageComponent, selector: "sia-dynamic-field-image" }] });
|
|
647
544
|
}
|
|
648
545
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, decorators: [{
|
|
649
546
|
type: Component,
|
|
@@ -661,15 +558,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
661
558
|
DynamicFieldDatetimeComponent,
|
|
662
559
|
DynamicFieldDropdownComponent,
|
|
663
560
|
DynamicFieldLookupComponent,
|
|
664
|
-
DynamicFieldTextareaComponent
|
|
665
|
-
], template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Datetime Field -->\n <sia-dynamic-field-datetime\n *ngIf=\"field.type === 'datetime'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-datetime>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"] }]
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
type: Input
|
|
670
|
-
|
|
671
|
-
type: Input
|
|
672
|
-
}], filterSections: [{
|
|
561
|
+
DynamicFieldTextareaComponent,
|
|
562
|
+
DynamicFieldTimeComponent,
|
|
563
|
+
DynamicFieldCheckboxComponent,
|
|
564
|
+
DynamicFieldMultiselectComponent,
|
|
565
|
+
DynamicFieldImageComponent
|
|
566
|
+
], template: "<!-- Inline Mode (no displayMode set) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Dialog Mode -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n\n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button *ngIf=\"showCancelButton\" [label]=\"cancelLabel | translate\" [icon]=\"cancelButtonIcon\" severity=\"secondary\" (onClick)=\"handleCancel()\" [disabled]=\"loading\"></p-button>\n <p-button *ngIf=\"showSubmitButton\" [label]=\"submitLabel | translate\" [icon]=\"submitButtonIcon\" (onClick)=\"handleSubmit()\" [loading]=\"loading\" [disabled]=\"form.invalid\"></p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Drawer Mode -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n\n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button *ngIf=\"showCancelButton\" [label]=\"cancelLabel | translate\" [icon]=\"cancelButtonIcon\" severity=\"secondary\" (onClick)=\"handleCancel()\" [disabled]=\"loading\"></p-button>\n <p-button *ngIf=\"showSubmitButton\" [label]=\"submitLabel | translate\" [icon]=\"submitButtonIcon\" (onClick)=\"handleSubmit()\" [loading]=\"loading\" [disabled]=\"form.invalid\"></p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Form Content Template -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\" (keydown)=\"onFormKeydown($event)\">\n\n <ng-container *ngFor=\"let section of sections\">\n <!-- No title = bare fields -->\n <ng-container *ngIf=\"!section.title\">\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Bordered section -->\n <div *ngIf=\"section.title && getSectionStyle(section) === 'bordered'\" class=\"bordered-section\">\n <h3 class=\"section-heading\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n {{ section.title }}\n </h3>\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Panel section -->\n <p-panel\n *ngIf=\"section.title && getSectionStyle(section) === 'panel'\"\n [toggleable]=\"true\"\n [collapsed]=\"section.collapsed || false\"\n styleClass=\"section-panel\">\n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n\n <!-- Heading-only section (title present, style='none' or omitted) -->\n <div *ngIf=\"section.title && getSectionStyle(section) === 'none'\" class=\"heading-section\">\n <h3 class=\"section-heading\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n {{ section.title }}\n </h3>\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Custom content projection -->\n <ng-content></ng-content>\n </form>\n</ng-template>\n\n<!-- Field Template -->\n<ng-template #fieldTemplate let-field=\"field\">\n <sia-dynamic-field-text *ngIf=\"field.type === 'text'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-text>\n <sia-dynamic-field-textarea *ngIf=\"field.type === 'textarea'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-textarea>\n <sia-dynamic-field-number *ngIf=\"field.type === 'number' || field.type === 'currency'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-number>\n <sia-dynamic-field-date *ngIf=\"field.type === 'date'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-date>\n <sia-dynamic-field-datetime *ngIf=\"field.type === 'datetime'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-datetime>\n <sia-dynamic-field-dropdown *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-dropdown>\n <sia-dynamic-field-lookup *ngIf=\"field.type === 'lookup'\" [field]=\"field\" [form]=\"form\" [formGroup]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-lookup>\n <sia-dynamic-field-time *ngIf=\"field.type === 'time'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-time>\n <sia-dynamic-field-checkbox *ngIf=\"field.type === 'checkbox'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-checkbox>\n <sia-dynamic-field-multiselect *ngIf=\"field.type === 'multiselect'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-multiselect>\n <sia-dynamic-field-image *ngIf=\"field.type === 'image'\" [field]=\"field\" [form]=\"form\" [mode]=\"'form'\"></sia-dynamic-field-image>\n</ng-template>\n\n<!-- Inline Edit Field Template -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n <div class=\"field-display\" *ngIf=\"!isFieldEditing(field.field)\" (click)=\"startEditField(field.field)\" [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" [attr.data-placeholder]=\"field.placeholder || ('design.components_ai.not_informed' | translate)\">{{ getFieldDisplayValue(field.field) }}</span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n <div class=\"edit-actions\">\n <p-button type=\"button\" icon=\"pi pi-check\" [rounded]=\"true\" [text]=\"true\" severity=\"success\" (onClick)=\"saveInlineField(field.field)\" [loading]=\"savingField\" [disabled]=\"form.get(field.field)?.invalid\" size=\"small\"></p-button>\n <p-button type=\"button\" icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\" (onClick)=\"cancelInlineEdit()\" [disabled]=\"savingField\" size=\"small\"></p-button>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%;display:flex;flex-direction:column;gap:1.5rem}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .bordered-section{border:1px solid var(--p-surface-200, var(--surface-200, #e5e7eb));border-radius:var(--p-border-radius, var(--border-radius, 6px));padding:1.5rem}.dynamic-form .bordered-section .section-heading{margin:0 0 1rem;font-size:1rem;font-weight:600;color:var(--text-color);display:flex;align-items:center;gap:.5rem}.dynamic-form .bordered-section .section-heading .section-icon{color:var(--primary-color)}.dynamic-form .heading-section .section-heading{margin:0 0 1rem;font-size:1rem;font-weight:600;color:var(--text-color);display:flex;align-items:center;gap:.5rem}.dynamic-form .heading-section .section-heading .section-icon{color:var(--primary-color)}.dynamic-form ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50)}.dynamic-form ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary)}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:transparent;border:1px solid var(--p-surface-300, var(--surface-300, #d1d5db));border-radius:var(--p-border-radius, var(--border-radius, 6px));cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){border-color:var(--p-primary-color, var(--primary-color))}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6;background-color:var(--p-surface-50, var(--surface-50, #f9fafb))}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--p-primary-color, var(--primary-color));font-size:.875rem;opacity:0;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;align-items:center;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:0;flex-shrink:0}\n"] }]
|
|
567
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.TranslationService }, { type: i3.MaskService }, { type: i4.LocaleService }], propDecorators: { sections: [{
|
|
673
568
|
type: Input
|
|
674
569
|
}], entityData: [{
|
|
675
570
|
type: Input
|
|
@@ -706,4 +601,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
706
601
|
}], fieldSave: [{
|
|
707
602
|
type: Output
|
|
708
603
|
}] } });
|
|
709
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFXOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFG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aXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9wYW5lbCc7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5pbXBvcnQgeyBEcmF3ZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RyYXdlcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBcbiAgRHluYW1pY0Zvcm1GaWVsZENvbmZpZywgXG4gIER5bmFtaWNGb3JtU2VjdGlvbixcbiAgRHluYW1pY0Zvcm1EaXNwbGF5TW9kZSxcbiAgRHluYW1pY0Zvcm1EaWFsb2dDb25maWcsXG4gIER5bmFtaWNGb3JtRHJhd2VyQ29uZmlnXG59IGZyb20gJy4vbW9kZWxzL2R5bmFtaWMtZm9ybS5tb2RlbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBNYXNrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21hc2suc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbG9jYWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3RyYW5zbGF0ZS5waXBlJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZFRleHRDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtbnVtYmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGREYXRlQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1kYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGREYXRldGltZUNvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtZGF0ZXRpbWUuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkTG9va3VwQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1sb29rdXAuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZFRleHRhcmVhQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC10ZXh0YXJlYS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaWEtZHluYW1pYy1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFBhbmVsTW9kdWxlLFxuICAgIERpYWxvZ01vZHVsZSxcbiAgICBEcmF3ZXJNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgRHluYW1pY0ZpZWxkVGV4dENvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGROdW1iZXJDb21wb25lbnQsXG4gICAgRHluYW1pY0ZpZWxkRGF0ZUNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGREYXRldGltZUNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGREcm9wZG93bkNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRMb29rdXBDb21wb25lbnQsXG4gICAgRHluYW1pY0ZpZWxkVGV4dGFyZWFDb21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9keW5hbWljLWZvcm0uY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBmb3JtRmllbGRzOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgZm9ybVNlY3Rpb25zOiBEeW5hbWljRm9ybVNlY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBmaXhlZEZpbHRlcnM6IER5bmFtaWNGb3JtRmllbGRDb25maWdbXSA9IFtdOyAvLyBGaWx0cm9zIGZpeG9zIChzZW1wcmUgdmlzw612ZWlzIG5vIHRvcG8pXG4gIEBJbnB1dCgpIGZpbHRlclNlY3Rpb25zOiBEeW5hbWljRm9ybVNlY3Rpb25bXSA9IFtdOyAvLyBTZcOnw7VlcyBkZSBmaWx0cm9zIChjb2xhcHPDoXZlaXMpXG4gIEBJbnB1dCgpIGVudGl0eURhdGE6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIG1vZGU6ICdmb3JtJyB8ICdmaWx0ZXInIHwgJ2lubGluZS1lZGl0JyA9ICdmb3JtJztcbiAgXG4gIC8vIERpc3BsYXkgTW9kZSBDb25maWd1cmF0aW9uXG4gIEBJbnB1dCgpIGRpc3BsYXlNb2RlOiBEeW5hbWljRm9ybURpc3BsYXlNb2RlID0gJ2lubGluZSc7XG4gIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGlhbG9nQ29uZmlnOiBEeW5hbWljRm9ybURpYWxvZ0NvbmZpZyA9IHt9O1xuICBASW5wdXQoKSBkcmF3ZXJDb25maWc6IER5bmFtaWNGb3JtRHJhd2VyQ29uZmlnID0ge307XG4gIFxuICAvLyBCdXR0b24gQ29uZmlndXJhdGlvblxuICBASW5wdXQoKSBzaG93U3VibWl0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dDYW5jZWxCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc3VibWl0QnV0dG9uTGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNhbmNlbEJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBzdWJtaXRCdXR0b25JY29uOiBzdHJpbmcgPSAncGkgcGktY2hlY2snO1xuICBASW5wdXQoKSBjYW5jZWxCdXR0b25JY29uOiBzdHJpbmcgPSAncGkgcGktdGltZXMnO1xuICBcbiAgQE91dHB1dCgpIGZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPigpO1xuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIG9uQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZmllbGRTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnkgfT4oKTtcblxuICBmb3JtITogRm9ybUdyb3VwO1xuICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBJbmxpbmUgZWRpdCBtb2RlIHN0YXRlXG4gIGVkaXRpbmdGaWVsZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNhdmluZ0ZpZWxkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGhhc0ZpZWxkcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtRmllbGRzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgaGFzU2VjdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgaGFzRml4ZWRGaWx0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpeGVkRmlsdGVycy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0IGhhc0ZpbHRlclNlY3Rpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlclNlY3Rpb25zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgYWxsRmllbGRzKCk6IER5bmFtaWNGb3JtRmllbGRDb25maWdbXSB7XG4gICAgLy8gUmV0b3JuYSB0b2RvcyBvcyBjYW1wb3MgKGRpcmV0b3MgKyBkYXMgc2XDp8O1ZXMgKyBmaWx0cm9zIGZpeG9zICsgc2XDp8O1ZXMgZGUgZmlsdHJvcylcbiAgICBjb25zdCBzZWN0aW9uRmllbGRzID0gdGhpcy5mb3JtU2VjdGlvbnMuZmxhdE1hcChzZWN0aW9uID0+IHNlY3Rpb24uZmllbGRzKTtcbiAgICBjb25zdCBmaWx0ZXJTZWN0aW9uRmllbGRzID0gdGhpcy5maWx0ZXJTZWN0aW9ucy5mbGF0TWFwKHNlY3Rpb24gPT4gc2VjdGlvbi5maWVsZHMpO1xuICAgIHJldHVybiBbLi4udGhpcy5mb3JtRmllbGRzLCAuLi5zZWN0aW9uRmllbGRzLCAuLi50aGlzLmZpeGVkRmlsdGVycywgLi4uZmlsdGVyU2VjdGlvbkZpZWxkc107XG4gIH1cblxuICBnZXQgaXNJbmxpbmVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXlNb2RlID09PSAnaW5saW5lJztcbiAgfVxuXG4gIGdldCBpc0lubGluZUVkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdpbmxpbmUtZWRpdCc7XG4gIH1cblxuICBnZXQgZmllbGRNb2RlKCk6ICdmb3JtJyB8ICdmaWx0ZXInIHtcbiAgICByZXR1cm4gdGhpcy5pc0lubGluZUVkaXRNb2RlID8gJ2Zvcm0nIDogdGhpcy5tb2RlIGFzICdmb3JtJyB8ICdmaWx0ZXInO1xuICB9XG5cbiAgZ2V0IGlzRGlhbG9nTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ2RpYWxvZyc7XG4gIH1cblxuICBnZXQgaXNEcmF3ZXJNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXlNb2RlID09PSAnZHJhd2VyJztcbiAgfVxuXG4gIC8vIERpYWxvZyBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgZ2V0IGRpYWxvZ0hlYWRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZ0NvbmZpZy5oZWFkZXIgfHwgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5mb3JtJyk7XG4gIH1cblxuICBnZXQgZGlhbG9nV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcud2lkdGggfHwgJzYwMHB4JztcbiAgfVxuXG4gIGdldCBkaWFsb2dEcmFnZ2FibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLmRyYWdnYWJsZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5kaWFsb2dDb25maWcuZHJhZ2dhYmxlIDogZmFsc2U7XG4gIH1cblxuICBnZXQgZGlhbG9nUmVzaXphYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZ0NvbmZpZy5yZXNpemFibGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGlhbG9nQ29uZmlnLnJlc2l6YWJsZSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGRpYWxvZ01heGltaXphYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZ0NvbmZpZy5tYXhpbWl6YWJsZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5kaWFsb2dDb25maWcubWF4aW1pemFibGUgOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkaWFsb2dDbG9zZU9uRXNjYXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZ0NvbmZpZy5jbG9zZU9uRXNjYXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLmRpYWxvZ0NvbmZpZy5jbG9zZU9uRXNjYXBlIDogdHJ1ZTtcbiAgfVxuXG4gIGdldCBkaWFsb2dEaXNtaXNzYWJsZU1hc2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLmRpc21pc3NhYmxlTWFzayAhPT0gdW5kZWZpbmVkID8gdGhpcy5kaWFsb2dDb25maWcuZGlzbWlzc2FibGVNYXNrIDogZmFsc2U7XG4gIH1cblxuICAvLyBEcmF3ZXIgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHRzXG4gIGdldCBkcmF3ZXJIZWFkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3ZXJDb25maWcuaGVhZGVyIHx8IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnZGVzaWduLmNvbXBvbmVudHNfYWkuZm9ybScpO1xuICB9XG5cbiAgZ2V0IGRyYXdlclBvc2l0aW9uKCk6ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wJyB8ICdib3R0b20nIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3ZXJDb25maWcucG9zaXRpb24gfHwgJ3JpZ2h0JztcbiAgfVxuXG4gIGdldCBkcmF3ZXJTaG93Q2xvc2VJY29uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRyYXdlckNvbmZpZy5zaG93Q2xvc2VJY29uICE9PSB1bmRlZmluZWQgPyB0aGlzLmRyYXdlckNvbmZpZy5zaG93Q2xvc2VJY29uIDogdHJ1ZTtcbiAgfVxuXG4gIGdldCBkcmF3ZXJDbG9zZU9uRXNjYXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRyYXdlckNvbmZpZy5jbG9zZU9uRXNjYXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLmRyYXdlckNvbmZpZy5jbG9zZU9uRXNjYXBlIDogdHJ1ZTtcbiAgfVxuXG4gIGdldCBkcmF3ZXJEaXNtaXNzYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3ZXJDb25maWcuZGlzbWlzc2FibGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuZHJhd2VyQ29uZmlnLmRpc21pc3NhYmxlIDogdHJ1ZTtcbiAgfVxuXG4gIGdldCBkcmF3ZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZHJhd2VyUG9zaXRpb247XG4gICAgY29uc3QgaXNIb3Jpem9udGFsID0gcG9zaXRpb24gPT09ICdsZWZ0JyB8fCBwb3NpdGlvbiA9PT0gJ3JpZ2h0JztcbiAgICBcbiAgICAvLyBTZSB0ZW0gY3VzdG9tV2lkdGgsIHVzYSBlbGFcbiAgICBpZiAodGhpcy5kcmF3ZXJDb25maWcuY3VzdG9tV2lkdGgpIHtcbiAgICAgIHJldHVybiBpc0hvcml6b250YWwgXG4gICAgICAgID8geyB3aWR0aDogdGhpcy5kcmF3ZXJDb25maWcuY3VzdG9tV2lkdGggfVxuICAgICAgICA6IHsgaGVpZ2h0OiB0aGlzLmRyYXdlckNvbmZpZy5jdXN0b21XaWR0aCB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2EgbyB0YW1hbmhvIHBhZHJvbml6YWRvXG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuZHJhd2VyQ29uZmlnLnNpemUgfHwgJ21lZGl1bSc7XG4gICAgY29uc3Qgc2l6ZU1hcCA9IHtcbiAgICAgICdzbWFsbCc6IGlzSG9yaXpvbnRhbCA/ICcyNSUnIDogJzI1dmgnLFxuICAgICAgJ21lZGl1bSc6IGlzSG9yaXpvbnRhbCA/ICc0MCUnIDogJzQwdmgnLFxuICAgICAgJ2xhcmdlJzogaXNIb3Jpem9udGFsID8gJzYwJScgOiAnNjB2aCcsXG4gICAgICAneGxhcmdlJzogaXNIb3Jpem9udGFsID8gJzgwJScgOiAnODB2aCcsXG4gICAgICAnZnVsbCc6IGlzSG9yaXpvbnRhbCA/ICcxMDAlJyA6ICcxMDB2aCdcbiAgICB9O1xuICAgIFxuICAgIGNvbnN0IHNpemVWYWx1ZSA9IHNpemVNYXBbc2l6ZV07XG4gICAgcmV0dXJuIGlzSG9yaXpvbnRhbCBcbiAgICAgID8geyB3aWR0aDogc2l6ZVZhbHVlIH1cbiAgICAgIDogeyBoZWlnaHQ6IHNpemVWYWx1ZSB9O1xuICB9XG5cbiAgZ2V0IHN1Ym1pdExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VibWl0QnV0dG9uTGFiZWwgfHwgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5zYXZlJyk7XG4gIH1cblxuICBnZXQgY2FuY2VsTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jYW5jZWxCdXR0b25MYWJlbCB8fCB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Rlc2lnbi5jb21wb25lbnRzX2FpLmNhbmNlbCcpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1hc2tTZXJ2aWNlOiBNYXNrU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2FsZVNlcnZpY2U6IExvY2FsZVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICBpZiAodGhpcy5lbnRpdHlEYXRhKSB7XG4gICAgICB0aGlzLmxvYWRFbnRpdHlEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0dXBDb25kaXRpb25hbEZpZWxkc1dhdGNoZXIoKTtcbiAgICB0aGlzLmZvcm1SZWFkeS5lbWl0KHRoaXMuZm9ybSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGVudGl0eURhdGEgY2hhbmdlcyBmaXJzdFxuICAgIGlmIChjaGFuZ2VzWydlbnRpdHlEYXRhJ10gJiYgdGhpcy5mb3JtKSB7XG4gICAgICBpZiAodGhpcy5lbnRpdHlEYXRhKSB7XG4gICAgICAgIHRoaXMubG9hZEVudGl0eURhdGEoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFdoZW4gZGlhbG9nL2RyYXdlciBvcGVucywgZW5zdXJlIGZvcm0gaXMgbG9hZGVkIHdpdGggZW50aXR5RGF0YVxuICAgIGlmIChjaGFuZ2VzWyd2aXNpYmxlJ10gJiYgY2hhbmdlc1sndmlzaWJsZSddLmN1cnJlbnRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICBcbiAgICAgIC8vIElmIG9wZW5pbmcgd2l0aCBlbnRpdHlEYXRhLCByZWxvYWQgaXQgdG8gZW5zdXJlIGZvcm0gaXMgcG9wdWxhdGVkXG4gICAgICBpZiAodGhpcy5lbnRpdHlEYXRhICYmIHRoaXMuZm9ybSkge1xuICAgICAgICB0aGlzLmxvYWRFbnRpdHlEYXRhKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmVudGl0eURhdGEgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgIC8vIElmIG9wZW5pbmcgd2l0aG91dCBlbnRpdHlEYXRhIChuZXcgcmVjb3JkKSwgcmVzZXQgZm9ybVxuICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGluaXRGb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1Db250cm9sczogYW55ID0ge307XG4gICAgXG4gICAgLy8gUHJvY2Vzc2EgdG9kb3Mgb3MgY2FtcG9zIChkaXJldG9zICsgZGFzIHNlw6fDtWVzKVxuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoZmllbGQpO1xuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMubW9kZSA9PT0gJ2ZpbHRlcicgPyBbXSA6IChmaWVsZC52YWxpZGF0b3JzIHx8IFtdKTtcbiAgICAgIFxuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgeyB2YWx1ZTogZGVmYXVsdFZhbHVlLCBkaXNhYmxlZDogZmllbGQuZGlzYWJsZWQgfHwgZmFsc2UgfSxcbiAgICAgICAgdmFsaWRhdG9yc1xuICAgICAgKTtcbiAgICAgIFxuICAgICAgZm9ybUNvbnRyb2xzW2ZpZWxkLmZpZWxkXSA9IGNvbnRyb2w7XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChmb3JtQ29udHJvbHMpO1xuICAgIHRoaXMuYXBwbHlJbml0aWFsRGlzYWJsZWRTdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmFsdWUoZmllbGQ6IER5bmFtaWNGb3JtRmllbGRDb25maWcpOiBhbnkge1xuICAgIGlmIChmaWVsZC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZpZWxkLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBjYXNlICdkcm9wZG93bic6XG4gICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ2ZpbHRlcicgPyBudWxsIDogJyc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUluaXRpYWxEaXNhYmxlZFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgaWYgKGZpZWxkLmRpc2FibGVkV2hlbikge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZC5maWVsZCk7XG4gICAgICAgIGlmIChjb250cm9sICYmIHRoaXMuaXNGaWVsZERpc2FibGVkKGZpZWxkKSkge1xuICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkRW50aXR5RGF0YSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbnRpdHlEYXRhICYmIHRoaXMuZm9ybSkge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJvY2Vzc0VudGl0eURhdGEodGhpcy5lbnRpdHlEYXRhKTtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHByb2Nlc3NlZERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0VudGl0eURhdGEoZW50aXR5OiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHByb2Nlc3NlZERhdGEgPSB7IC4uLmVudGl0eSB9O1xuICAgIFxuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdkYXRlJyAmJiBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXSkge1xuICAgICAgICBjb25zdCBkYXRlVmFsdWUgPSBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRlVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gQ29udmVydCBkYXRlIHN0cmluZyAoeXl5eS1NTS1kZCBvciBJU08pIHRvIERhdGUgb2JqZWN0IGZvciBwLWNhbGVuZGFyXG4gICAgICAgICAgLy8gVXNlIGRhdGUtb25seSBjb25zdHJ1Y3RvciB0byBhdm9pZCB0aW1lem9uZS9ob3VyIGlzc3Vlc1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gZGF0ZVZhbHVlLnN1YnN0cmluZygwLCAxMCkuc3BsaXQoJy0nKTtcbiAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoK3BhcnRzWzBdLCArcGFydHNbMV0gLSAxLCArcGFydHNbMl0pO1xuICAgICAgICAgICAgaWYgKCFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF0gPSBkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2xvb2t1cCcgJiYgcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF0pIHtcbiAgICAgICAgY29uc3QgbG9va3VwVmFsdWUgPSBwcm9jZXNzZWREYXRhW2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgLy8gS2VlcCB0aGUgZnVsbCBvYmplY3QgaWYgaXQgaGFzIGRpc3BsYXkgZGF0YSwgb3RoZXJ3aXNlIGV4dHJhY3QgSURcbiAgICAgICAgaWYgKHR5cGVvZiBsb29rdXBWYWx1ZSA9PT0gJ29iamVjdCcgJiYgbG9va3VwVmFsdWUuaWQpIHtcbiAgICAgICAgICBjb25zdCBoYXNEaXNwbGF5RGF0YSA9IGZpZWxkLmxvb2t1cERpc3BsYXlGaWVsZHMgXG4gICAgICAgICAgICA/IGZpZWxkLmxvb2t1cERpc3BsYXlGaWVsZHMuc29tZShmID0+IHRoaXMuZ2V0TmVzdGVkVmFsdWUobG9va3VwVmFsdWUsIGYpKVxuICAgICAgICAgICAgOiBsb29rdXBWYWx1ZVtmaWVsZC5sb29rdXBEaXNwbGF5RmllbGQgfHwgJ25hbWUnXTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaGFzRGlzcGxheURhdGEpIHtcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGZ1bGwgb2JqZWN0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IEFQSSBjYWxsc1xuICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtmaWVsZC5maWVsZF0gPSBsb29rdXBWYWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT25seSBoYXMgSUQsIGV4dHJhY3QgaXRcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFbZmllbGQuZmllbGRdID0gbG9va3VwVmFsdWUuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHByb2Nlc3NlZERhdGE7XG4gIH1cblxuICBwcml2YXRlIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChjdXJyZW50LCBrZXkpID0+IGN1cnJlbnQ/LltrZXldLCBvYmopO1xuICB9XG5cbiAgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm0pIHtcbiAgICAgIGNvbnN0IHJlc2V0VmFsdWVzOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICByZXNldFZhbHVlc1tmaWVsZC5maWVsZF0gPSB0aGlzLmdldERlZmF1bHRWYWx1ZShmaWVsZCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZm9ybS5yZXNldChyZXNldFZhbHVlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRmlsdGVyVmFsdWUoZm9ybVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHByb2Nlc3NlZFZhbHVlID0geyAuLi5mb3JtVmFsdWUgfTtcbiAgICBcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF07XG4gICAgICBcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnbG9va3VwJykge1xuICAgICAgICBpZiAoZmllbGRWYWx1ZSAmJiB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCcgJiYgZmllbGRWYWx1ZS5pZCkge1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IGZpZWxkVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZSAmJiB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSB7IGlkOiBmaWVsZFZhbHVlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBwcm9jZXNzZWRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0Zvcm1WYWx1ZShmb3JtVmFsdWU6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkVmFsdWUgPSB7IC4uLmZvcm1WYWx1ZSB9O1xuICAgIFxuICAgIGlmICh0aGlzLmVudGl0eURhdGE/LmlkKSB7XG4gICAgICBwcm9jZXNzZWRWYWx1ZS5pZCA9IHRoaXMuZW50aXR5RGF0YS5pZDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5hbGxGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdO1xuICAgICAgXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2xvb2t1cCcpIHtcbiAgICAgICAgLy8gS2VlcCB0aGUgZnVsbCBvYmplY3QgZm9yIGxvb2t1cCBmaWVsZHNcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgJiYgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gT2JqZWN0IGlzIGFscmVhZHkgY29tcGxldGUsIGtlZXAgaXQgYXMgaXNcbiAgICAgICAgICBwcm9jZXNzZWRWYWx1ZVtmaWVsZC5maWVsZF0gPSBmaWVsZFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUgJiYgZmllbGRWYWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAvLyBJZiBpdCdzIGp1c3QgYW4gSUQsIHdyYXAgaXQgaW4gYW4gb2JqZWN0XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0geyBpZDogZmllbGRWYWx1ZSB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgIGlmIChmaWVsZFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIC8vIFNlcmlhbGl6ZSBhcyB5eXl5LU1NLWRkIHVzaW5nIGxvY2FsIGRhdGUgY29tcG9uZW50cyAobm8gVVRDIHNoaWZ0KVxuICAgICAgICAgIGNvbnN0IHkgPSBmaWVsZFZhbHVlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgY29uc3QgbSA9IFN0cmluZyhmaWVsZFZhbHVlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgIGNvbnN0IGQgPSBTdHJpbmcoZmllbGRWYWx1ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgcHJvY2Vzc2VkVmFsdWVbZmllbGQuZmllbGRdID0gYCR7eX0tJHttfS0ke2R9YDtcbiAgICAgICAgfSBlbHNlIGlmICghZmllbGRWYWx1ZSkge1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoWyd0ZXh0JywgJ3RleHRhcmVhJywgJ251bWJlcicsICdlbnVtJywgJ2Ryb3Bkb3duJ10uaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT09ICcnIHx8IGZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHByb2Nlc3NlZFZhbHVlW2ZpZWxkLmZpZWxkXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcHJvY2Vzc2VkVmFsdWU7XG4gIH1cblxuICBnZXRGaWVsZEdyaWRDbGFzcyhmaWVsZDogRHluYW1pY0Zvcm1GaWVsZENvbmZpZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBDb2xzcGFuIGJhc2UgKHBhZHLDo286IDYpXG4gICAgbGV0IGJhc2VDb2xzcGFuID0gZmllbGQuY29sc3BhbiB8fCA2O1xuICAgIFxuICAgIC8vIFZlcmlmaWNhIGNvbmRpw6fDtWVzIGRlIGNvbHNwYW4gZGluw6JtaWNvXG4gICAgaWYgKGZpZWxkLmNvbHNwYW5XaGVuICYmIGZpZWxkLmNvbHNwYW5XaGVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGZpZWxkLmNvbHNwYW5XaGVuKSB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVudEZpZWxkVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGNvbmRpdGlvbi5maWVsZCk/LnZhbHVlO1xuICAgICAgICBpZiAoZGVwZW5kZW50RmllbGRWYWx1ZSA9PT0gY29uZGl0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgYmFzZUNvbHNwYW4gPSBjb25kaXRpb24uY29sc3BhbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBZGljaW9uYSBjbGFzc2UgYmFzZVxuICAgIGNsYXNzZXMucHVzaChgY29sLSR7YmFzZUNvbHNwYW59YCk7XG4gICAgXG4gICAgLy8gU3Vwb3J0YSB0YW50byBvIG9iamV0byBzaXplIHF1YW50byBhcyBwcm9wcmllZGFkZXMgYW50aWdhcyAocGFyYSBjb21wYXRpYmlsaWRhZGUpXG4gICAgY29uc3Qgc2l6ZVhzID0gZmllbGQuc2l6ZT8ueHMgPz8gZmllbGQuY29sc3BhblhzO1xuICAgIGNvbnN0IHNpemVTbSA9IGZpZWxkLnNpemU/LnNtID8/IGZpZWxkLmNvbHNwYW5TbTtcbiAgICBjb25zdCBzaXplTWQgPSBmaWVsZC5zaXplPy5tZCA/PyBmaWVsZC5jb2xzcGFuTWQ7XG4gICAgY29uc3Qgc2l6ZUxnID0gZmllbGQuc2l6ZT8ubGcgPz8gZmllbGQuY29sc3BhbkxnO1xuICAgIGNvbnN0IHNpemVYbCA9IGZpZWxkLnNpemU/LnhsID8/IGZpZWxkLmNvbHNwYW5YbDtcbiAgICBcbiAgICAvLyBBZGljaW9uYSBjbGFzc2VzIHJlc3BvbnNpdmFzIHNlIGRlZmluaWRhc1xuICAgIGlmIChzaXplWHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wteHMtJHtzaXplWHN9YCk7XG4gICAgfVxuICAgIGlmIChzaXplU20gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wtc20tJHtzaXplU219YCk7XG4gICAgfVxuICAgIGlmIChzaXplTWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wtbWQtJHtzaXplTWR9YCk7XG4gICAgfVxuICAgIGlmIChzaXplTGcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wtbGctJHtzaXplTGd9YCk7XG4gICAgfVxuICAgIGlmIChzaXplWGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBjb2wteGwtJHtzaXplWGx9YCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGlzRmllbGRWaXNpYmxlKGZpZWxkOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZC52aXNpYmxlV2hlbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGVwZW5kZW50RmllbGRWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoZmllbGQudmlzaWJsZVdoZW4uZmllbGQpPy52YWx1ZTtcbiAgICByZXR1cm4gZGVwZW5kZW50RmllbGRWYWx1ZSA9PT0gZmllbGQudmlzaWJsZVdoZW4udmFsdWU7XG4gIH1cblxuICBpc0ZpZWxkRGlzYWJsZWQoZmllbGQ6IER5bmFtaWNGb3JtRmllbGRDb25maWcpOiBib29sZWFuIHtcbiAgICBpZiAoZmllbGQuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICBpZiAoISgnZGlzYWJsZWRXaGVuJyBpbiBmaWVsZCkgfHwgIWZpZWxkLmRpc2FibGVkV2hlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGVuZGVudEZpZWxkVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkLmRpc2FibGVkV2hlbiEuZmllbGQpPy52YWx1ZTtcbiAgICBcbiAgICBpZiAoZmllbGQuZGlzYWJsZWRXaGVuIS52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICFkZXBlbmRlbnRGaWVsZFZhbHVlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVwZW5kZW50RmllbGRWYWx1ZSA9PT0gZmllbGQuZGlzYWJsZWRXaGVuIS52YWx1ZTtcbiAgfVxuXG4gIHNldHVwQ29uZGl0aW9uYWxGaWVsZHNXYXRjaGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGVEZXBlbmRlbnRGaWVsZHMgPSB0aGlzLmFsbEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQudmlzaWJsZVdoZW4pO1xuICAgIGNvbnN0IHZpc2libGVXYXRjaGVkRmllbGRzID0gWy4uLm5ldyBTZXQodmlzaWJsZURlcGVuZGVudEZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQudmlzaWJsZVdoZW4hLmZpZWxkKSldO1xuXG4gICAgY29uc3QgZGlzYWJsZWREZXBlbmRlbnRGaWVsZHMgPSB0aGlzLmFsbEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQuZGlzYWJsZWRXaGVuKTtcbiAgICBjb25zdCBkaXNhYmxlZFdhdGNoZWRGaWVsZHMgPSBbLi4ubmV3IFNldChkaXNhYmxlZERlcGVuZGVudEZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQuZGlzYWJsZWRXaGVuIS5maWVsZCkpXTtcblxuICAgIGNvbnN0IGFsbFdhdGNoZWRGaWVsZHMgPSBbLi4ubmV3IFNldChbLi4udmlzaWJsZVdhdGNoZWRGaWVsZHMsIC4uLmRpc2FibGVkV2F0Y2hlZEZpZWxkc10pXTtcblxuICAgIGFsbFdhdGNoZWRGaWVsZHMuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcbiAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbGVhckhpZGRlbkZpZWxkcygpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRGaWVsZHMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVEaXNhYmxlZEZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC5kaXNhYmxlZFdoZW4pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGQuZmllbGQpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIGNvbnN0IHNob3VsZEJlRGlzYWJsZWQgPSB0aGlzLmlzRmllbGREaXNhYmxlZChmaWVsZCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHNob3VsZEJlRGlzYWJsZWQgJiYgY29udHJvbC5lbmFibGVkKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgY29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghc2hvdWxkQmVEaXNhYmxlZCAmJiBjb250cm9sLmRpc2FibGVkICYmICFmaWVsZC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgY29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFySGlkZGVuRmllbGRzKCk6IHZvaWQge1xuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgaWYgKGZpZWxkLnZpc2libGVXaGVuICYmICF0aGlzLmlzRmllbGRWaXNpYmxlKGZpZWxkKSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZC5maWVsZCk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgY29uc3QgcmVzZXRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGZpZWxkKTtcbiAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHJlc2V0VmFsdWUpO1xuICAgICAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICAgICAgY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRGb3JtKCk6IEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZmlsdGVyJykge1xuICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBnZXRUeXBlUGVyc29uVmFsdWUoKTogJ05BVFVSQUxfUEVSU09OJyB8ICdKVVJJRElDQUxfUEVSU09OJyB7XG4gICAgY29uc3QgdHlwZVBlcnNvblZhbHVlID0gdGhpcy5mb3JtPy5nZXQoJ3R5cGVQZXJzb24nKT8udmFsdWU7XG4gICAgcmV0dXJuIHR5cGVQZXJzb25WYWx1ZSB8fCAnSlVSSURJQ0FMX1BFUlNPTic7XG4gIH1cblxuICAvLyBEaXNwbGF5IE1vZGUgQ29udHJvbCBNZXRob2RzXG4gIG9wZW4oZW50aXR5PzogYW55KTogdm9pZCB7XG4gICAgaWYgKGVudGl0eSkge1xuICAgICAgdGhpcy5lbnRpdHlEYXRhID0gZW50aXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVudGl0eURhdGEgPSBudWxsO1xuICAgICAgdGhpcy5yZXNldEZvcm0oKTsgLy8gUmVzZXQgZm9ybSB3aGVuIG9wZW5pbmcgZm9yIG5ldyBlbnRpdHlcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7IC8vIFJlc2V0IGxvYWRpbmcgc3RhdGVcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7IC8vIFJlc2V0IGxvYWRpbmcgc3RhdGVcbiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5yZXNldEZvcm0oKTsgLy8gUmVzZXQgZm9ybSB3aGVuIGNsb3NpbmdcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIGhhbmRsZUNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBoYW5kbGVTdWJtaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2Zvcm0nICYmIHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnZmlsdGVyJykge1xuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5tb2RlID09PSAnZmlsdGVyJyBcbiAgICAgID8gdGhpcy5wcm9jZXNzRmlsdGVyVmFsdWUodGhpcy5mb3JtLnZhbHVlKVxuICAgICAgOiB0aGlzLnByb2Nlc3NGb3JtVmFsdWUodGhpcy5mb3JtLnZhbHVlKTtcbiAgICBcbiAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdChmb3JtVmFsdWUpO1xuICB9XG5cbiAgLy8gSW5saW5lIEVkaXQgTW9kZSBNZXRob2RzXG4gIHN0YXJ0RWRpdEZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJbmxpbmVFZGl0TW9kZSkge1xuICAgICAgdGhpcy5lZGl0aW5nRmllbGQgPSBmaWVsZE5hbWU7XG4gICAgICBcbiAgICAgIC8vIEVuc3VyZSB0aGUgZmllbGQgaGFzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gZW50aXR5RGF0YVxuICAgICAgaWYgKHRoaXMuZW50aXR5RGF0YSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5hbGxGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGZpZWxkTmFtZSk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmVudGl0eURhdGFbZmllbGROYW1lXTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgbG9va3VwIGZpZWxkcyBpbiBpbmxpbmUtZWRpdCBtb2RlLCBrZWVwIHRoZSBmdWxsIG9iamVjdFxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgdW5uZWNlc3NhcnkgQVBJIGNhbGxzIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSB0aGUgZGF0YVxuICAgICAgICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2xvb2t1cCcgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gS2VlcCB0aGUgZnVsbCBvYmplY3QgLSB0aGUgbG9va3VwIGNvbXBvbmVudCB3aWxsIHVzZSBpdFxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZD8udHlwZSA9PT0gJ2RhdGUnICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0ZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgZm9yIHAtY2FsZW5kYXIgKGRhdGUtb25seSwgbm8gdGltZSBjb21wb25lbnQpXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnN1YnN0cmluZygwLCAxMCkuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCtwYXJ0c1swXSwgK3BhcnRzWzFdIC0gMSwgK3BhcnRzWzJdKTtcbiAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZSghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gZGF0ZSA6IHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc0ZpZWxkRWRpdGluZyhmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdGaWVsZCA9PT0gZmllbGROYW1lO1xuICB9XG5cbiAgc2F2ZUlubGluZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzSW5saW5lRWRpdE1vZGUpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XG4gICAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2F2aW5nRmllbGQgPSB0cnVlO1xuICAgIFxuICAgIGxldCBmaWVsZFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBcbiAgICAvLyBGb3IgbG9va3VwIGZpZWxkcywga2VlcCB0aGUgZnVsbCBvYmplY3QgKGRvbid0IGV4dHJhY3QgSUQpXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmFsbEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gZmllbGROYW1lKTtcbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdsb29rdXAnICYmIGZpZWxkVmFsdWUgJiYgdHlwZW9mIGZpZWxkVmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBJZiBpdCdzIGp1c3QgYW4gSUQsIHdyYXAgaXQgaW4gYW4gb2JqZWN0XG4gICAgICBmaWVsZFZhbHVlID0geyBpZDogZmllbGRWYWx1ZSB9O1xuICAgIH1cblxuICAgIC8vIEZvciBkYXRlIGZpZWxkcywgc2VyaWFsaXplIGFzIHl5eXktTU0tZGQgKG5vIHRpbWUgY29tcG9uZW50KVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2RhdGUnICYmIGZpZWxkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBjb25zdCB5ID0gZmllbGRWYWx1ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgbSA9IFN0cmluZyhmaWVsZFZhbHVlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgY29uc3QgZCA9IFN0cmluZyhmaWVsZFZhbHVlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGZpZWxkVmFsdWUgPSBgJHt5fS0ke219LSR7ZH1gO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmZpZWxkU2F2ZS5lbWl0KHsgZmllbGQ6IGZpZWxkTmFtZSwgdmFsdWU6IGZpZWxkVmFsdWUgfSk7XG4gIH1cblxuICBjYW5jZWxJbmxpbmVFZGl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5saW5lRWRpdE1vZGUgJiYgdGhpcy5lZGl0aW5nRmllbGQpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZWRpdGluZ0ZpZWxkKTtcbiAgICAgIGlmIChjb250cm9sICYmIHRoaXMuZW50aXR5RGF0YSkge1xuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLmVudGl0eURhdGFbdGhpcy5lZGl0aW5nRmllbGRdO1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKG9yaWdpbmFsVmFsdWUpO1xuICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmVkaXRpbmdGaWVsZCA9IG51bGw7XG4gICAgICB0aGlzLnNhdmluZ0ZpZWxkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gTWV0aG9kIHRvIGJlIGNhbGxlZCBieSBwYXJlbnQgYWZ0ZXIgc2F2ZSBjb21wbGV0ZXNcbiAgY29tcGxldGVJbmxpbmVFZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdGluZ0ZpZWxkID0gbnVsbDtcbiAgICB0aGlzLnNhdmluZ0ZpZWxkID0gZmFsc2U7XG4gIH1cblxuICBnZXRGaWVsZERpc3BsYXlWYWx1ZShmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmVudGl0eURhdGEpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5hbGxGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGZpZWxkTmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmVudGl0eURhdGFbZmllbGROYW1lXTtcblxuICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcblxuICAgIC8vIEZvciBsb29rdXAgZmllbGRzLCByZXR1cm4gdGhlIGRpc3BsYXkgbmFtZVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2xvb2t1cCcgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5uYW1lKSB7XG4gICAgICByZXR1cm4gdmFsdWUubmFtZTtcbiAgICB9XG5cbiAgICAvLyBGb3IgbG9va3VwIGZpZWxkcyB3aXRoIG11bHRpcGxlIGRpc3BsYXkgZmllbGRzXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnbG9va3VwJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIGZpZWxkLmxvb2t1cERpc3BsYXlGaWVsZHMpIHtcbiAgICAgIHJldHVybiBmaWVsZC5sb29rdXBEaXNwbGF5RmllbGRzXG4gICAgICAgIC5tYXAoZiA9PiB0aGlzLmdldE5lc3RlZFZhbHVlKHZhbHVlLCBmKSlcbiAgICAgICAgLmZpbHRlcih2ID0+IHYpXG4gICAgICAgIC5qb2luKCcgLSAnKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZHJvcGRvd24vZW51bSBmaWVsZHMsIGZpbmQgdGhlIG1hdGNoaW5nIG9wdGlvbiBsYWJlbFxuICAgIGlmICgoZmllbGQ/LnR5cGUgPT09ICdkcm9wZG93bicgfHwgZmllbGQ/LnR5cGUgPT09ICdlbnVtJykgJiYgZmllbGQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBmaWVsZC5vcHRpb25zIHx8IGZpZWxkLmVudW1PcHRpb25zIHx8IFtdO1xuICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBmaWVsZC5vcHRpb25WYWx1ZSB8fCAndmFsdWUnO1xuICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSBmaWVsZC5vcHRpb25MYWJlbCB8fCAnbGFiZWwnO1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSBvcHRpb25zLmZpbmQoKG9wdDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdFZhbCA9IHR5cGVvZiBvcHQgPT09ICdvYmplY3QnID8gb3B0W29wdGlvblZhbHVlXSA6IG9wdDtcbiAgICAgICAgcmV0dXJuIG9wdFZhbCA9PT0gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChtYXRjaGluZ09wdGlvbikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG1hdGNoaW5nT3B0aW9uID09PSAnb2JqZWN0JyA/IG1hdGNoaW5nT3B0aW9uW29wdGlvbkxhYmVsXSA6IG1hdGNoaW5nT3B0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvciBudW1iZXIgZmllbGRzLCBmb3JtYXQgYXBwcm9wcmlhdGVseVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGZpZWxkLm51bWJlck1vZGUgPT09ICdjdXJyZW5jeScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChmaWVsZC5sb2NhbGUgfHwgJ3B0LUJSJywge1xuICAgICAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgICAgIGN1cnJlbmN5OiBmaWVsZC5jdXJyZW5jeSB8fCAnQlJMJ1xuICAgICAgICB9KS5mb3JtYXQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChmaWVsZC5sb2NhbGUgfHwgJ3B0LUJSJywge1xuICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IGZpZWxkLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDAsXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZmllbGQubWF4RnJhY3Rpb25EaWdpdHMgfHwgMlxuICAgICAgfSkuZm9ybWF0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZGF0ZSBmaWVsZHMsIGZvcm1hdCBhcyBkYXRlXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnZGF0ZScgJiYgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsZVNlcnZpY2UuZm9ybWF0RGF0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRleHQgZmllbGRzIHdpdGggZG9jdW1lbnQgbWFzaywgZm9ybWF0IHRoZSB2YWx1ZVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ3RleHQnICYmIGZpZWxkLm1hc2sgPT09ICdkb2N1bWVudCcgJiYgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGRlcGVuZHNPbiA9IGZpZWxkLm1hc2tEZXBlbmRzT24gfHwgJ3R5cGVQZXJzb24nO1xuICAgICAgY29uc3QgdHlwZVBlcnNvbiA9IHRoaXMuZW50aXR5RGF0YVtkZXBlbmRzT25dIHx8ICdKVVJJRElDQUxfUEVSU09OJztcbiAgICAgIHJldHVybiB0aGlzLm1hc2tTZXJ2aWNlLmFwcGx5RG9jdW1lbnRNYXNrKFN0cmluZyh2YWx1ZSksIHR5cGVQZXJzb24pO1xuICAgIH1cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd0ZXh0JyAmJiBmaWVsZC5tYXNrID09PSAnY3BmJyAmJiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFza1NlcnZpY2UuYXBwbHlDcGZNYXNrKFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd0ZXh0JyAmJiBmaWVsZC5tYXNrID09PSAnY25waicgJiYgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hc2tTZXJ2aWNlLmFwcGx5Q25wak1hc2soU3RyaW5nKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cbiIsIjwhLS0gTW9kbyBJbmxpbmUgKHBhZHLDo28pIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSW5saW5lTW9kZVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybUNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIE1vZG8gRGlhbG9nIC0tPlxuPHAtZGlhbG9nXG4gICpuZ0lmPVwiaXNEaWFsb2dNb2RlXCJcbiAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgW2hlYWRlcl09XCJkaWFsb2dIZWFkZXIgfCB0cmFuc2xhdGVcIlxuICBbbW9kYWxdPVwidHJ1ZVwiXG4gIFtzdHlsZV09XCJ7IHdpZHRoOiBkaWFsb2dXaWR0aCB9XCJcbiAgW2RyYWdnYWJsZV09XCJkaWFsb2dEcmFnZ2FibGVcIlxuICBbcmVzaXphYmxlXT1cImRpYWxvZ1Jlc2l6YWJsZVwiXG4gIFttYXhpbWl6YWJsZV09XCJkaWFsb2dNYXhpbWl6YWJsZVwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cImRpYWxvZ0Nsb3NlT25Fc2NhcGVcIlxuICBbZGlzbWlzc2FibGVNYXNrXT1cImRpYWxvZ0Rpc21pc3NhYmxlTWFza1wiXG4gIChvbkhpZGUpPVwiY2xvc2UoKVwiPlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm1Db250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gIFxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCIgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uIHx8IHNob3dDYW5jZWxCdXR0b25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWZvb3RlclwiPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiXG4gICAgICAgIFtsYWJlbF09XCJjYW5jZWxMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpY29uXT1cImNhbmNlbEJ1dHRvbkljb25cIlxuICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNhbmNlbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIj5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgICA8cC1idXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uXCJcbiAgICAgICAgW2xhYmVsXT1cInN1Ym1pdExhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2ljb25dPVwic3VibWl0QnV0dG9uSWNvblwiXG4gICAgICAgIChvbkNsaWNrKT1cImhhbmRsZVN1Ym1pdCgpXCJcbiAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIj5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuXG48IS0tIE1vZG8gRHJhd2VyIC0tPlxuPHAtZHJhd2VyXG4gICpuZ0lmPVwiaXNEcmF3ZXJNb2RlXCJcbiAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgW2hlYWRlcl09XCJkcmF3ZXJIZWFkZXIgfCB0cmFuc2xhdGVcIlxuICBbcG9zaXRpb25dPVwiZHJhd2VyUG9zaXRpb25cIlxuICBbc3R5bGVdPVwiZHJhd2VyU3R5bGVcIlxuICBbc2hvd0Nsb3NlSWNvbl09XCJkcmF3ZXJTaG93Q2xvc2VJY29uXCJcbiAgW2Nsb3NlT25Fc2NhcGVdPVwiZHJhd2VyQ2xvc2VPbkVzY2FwZVwiXG4gIFttb2RhbF09XCJkcmF3ZXJEaXNtaXNzYWJsZVwiXG4gIChvbkhpZGUpPVwiY2xvc2UoKVwiPlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm1Db250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gIFxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCIgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uIHx8IHNob3dDYW5jZWxCdXR0b25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWZvb3RlclwiPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiXG4gICAgICAgIFtsYWJlbF09XCJjYW5jZWxMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpY29uXT1cImNhbmNlbEJ1dHRvbkljb25cIlxuICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNhbmNlbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIj5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgICA8cC1idXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uXCJcbiAgICAgICAgW2xhYmVsXT1cInN1Ym1pdExhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2ljb25dPVwic3VibWl0QnV0dG9uSWNvblwiXG4gICAgICAgIChvbkNsaWNrKT1cImhhbmRsZVN1Ym1pdCgpXCJcbiAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIj5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZHJhd2VyPlxuXG48IS0tIFRlbXBsYXRlIGRvIEZvcm11bMOhcmlvIChyZXV0aWxpesOhdmVsKSAtLT5cbjxuZy10ZW1wbGF0ZSAjZm9ybUNvbnRlbnQ+XG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZHluYW1pYy1mb3JtXCI+XG4gICAgXG4gICAgPCEtLSBGaWx0cm9zIEZpeG9zIChhcGVuYXMgbm8gbW9kbyBmaWx0ZXIpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJtb2RlID09PSAnZmlsdGVyJyAmJiBoYXNGaXhlZEZpbHRlcnNcIiBjbGFzcz1cImZpeGVkLWZpbHRlcnMtc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZml4ZWRGaWx0ZXJzXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIFtuZ0NsYXNzXT1cImdldEZpZWxkR3JpZENsYXNzKGZpZWxkKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2FtcG9zIERpcmV0b3MgKHNlbSBzZcOnw6NvKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzRmllbGRzXCI+XG4gICAgICA8IS0tIE1vZG8gSW5saW5lIEVkaXQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiaW5saW5lLWVkaXQtZmllbGRzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvcm1GaWVsZHNcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGaWVsZFZpc2libGUoZmllbGQpXCIgY2xhc3M9XCJpbmxpbmUtZWRpdC1maWVsZFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlubGluZUVkaXRGaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTW9kbyBGb3JtIE5vcm1hbCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRmllbGRzXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIFtuZ0NsYXNzXT1cImdldEZpZWxkR3JpZENsYXNzKGZpZWxkKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2XDp8O1ZXMgZGUgQ2FtcG9zIChtb2RvIGZvcm0pIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJoYXNTZWN0aW9uc1wiIGNsYXNzPVwic2VjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICA8cC1wYW5lbCBcbiAgICAgICAgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgZm9ybVNlY3Rpb25zXCJcbiAgICAgICAgW3RvZ2dsZWFibGVdPVwic2VjdGlvbi50b2dnbGVhYmxlICE9PSBmYWxzZVwiXG4gICAgICAgIFtjb2xsYXBzZWRdPVwic2VjdGlvbi5jb2xsYXBzZWQgfHwgZmFsc2VcIlxuICAgICAgICBbc3R5bGVDbGFzc109XCInc2VjdGlvbi1wYW5lbCdcIj5cbiAgICAgICAgXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxpICpuZ0lmPVwic2VjdGlvbi5pY29uXCIgW2NsYXNzXT1cInNlY3Rpb24uaWNvbiArICcgc2VjdGlvbi1pY29uJ1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPnt7IHNlY3Rpb24udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPCEtLSBNb2RvIElubGluZSBFZGl0IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiaW5saW5lLWVkaXQtZmllbGRzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBjbGFzcz1cImlubGluZS1lZGl0LWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmxpbmVFZGl0RmllbGRUZW1wbGF0ZTsgY29udGV4dDogeyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTW9kbyBGb3JtIE5vcm1hbCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0lubGluZUVkaXRNb2RlXCIgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBbbmdDbGFzc109XCJnZXRGaWVsZEdyaWRDbGFzcyhmaWVsZClcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvcC1wYW5lbD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2XDp8O1ZXMgZGUgRmlsdHJvcyAoYXBlbmFzIG5vIG1vZG8gZmlsdGVyKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gJ2ZpbHRlcicgJiYgaGFzRmlsdGVyU2VjdGlvbnNcIiBjbGFzcz1cImZpbHRlci1zZWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgIDxwLXBhbmVsIFxuICAgICAgICAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBmaWx0ZXJTZWN0aW9uc1wiXG4gICAgICAgIFtoZWFkZXJdPVwic2VjdGlvbi50aXRsZVwiXG4gICAgICAgIFt0b2dnbGVhYmxlXT1cInRydWVcIlxuICAgICAgICBbY29sbGFwc2VkXT1cInRydWVcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGaWVsZFZpc2libGUoZmllbGQpXCIgW25nQ2xhc3NdPVwiZ2V0RmllbGRHcmlkQ2xhc3MoZmllbGQpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3AtcGFuZWw+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJvdMO1ZXMgaW5saW5lIChhcGVuYXMgcGFyYSBtb2RvIGlubGluZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzSW5saW5lTW9kZSAmJiAoc2hvd1N1Ym1pdEJ1dHRvbiB8fCBzaG93Q2FuY2VsQnV0dG9uKVwiIGNsYXNzPVwiZm9ybS1hY3Rpb25zXCI+XG4gICAgICA8cC1idXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93Q2FuY2VsQnV0dG9uXCJcbiAgICAgICAgW2xhYmVsXT1cImNhbmNlbExhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2ljb25dPVwiY2FuY2VsQnV0dG9uSWNvblwiXG4gICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2FuY2VsKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1wiPlxuICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgIDxwLWJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dTdWJtaXRCdXR0b25cIlxuICAgICAgICBbbGFiZWxdPVwic3VibWl0TGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaWNvbl09XCJzdWJtaXRCdXR0b25JY29uXCJcbiAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlU3VibWl0KClcIlxuICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiPlxuICAgICAgPC9wLWJ1dHRvbj5cbiAgICA8L2Rpdj5cblxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFRlbXBsYXRlIGRlIENhbXBvIChyZXV0aWxpesOhdmVsKSAtLT5cbjxuZy10ZW1wbGF0ZSAjZmllbGRUZW1wbGF0ZSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8IS0tIFRleHQgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC10ZXh0XG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAndGV4dCdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtdGV4dD5cblxuICA8IS0tIFRleHRhcmVhIEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtdGV4dGFyZWFcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYSdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtdGV4dGFyZWE+XG5cbiAgPCEtLSBOdW1iZXIgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1udW1iZXJcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInXCJcbiAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgIFtmb3JtXT1cImZvcm1cIlxuICAgIFttb2RlXT1cImZpZWxkTW9kZVwiPlxuICA8L3NpYS1keW5hbWljLWZpZWxkLW51bWJlcj5cblxuICA8IS0tIERhdGUgRmllbGQgLS0+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1kYXRlXG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZGF0ZSdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtZGF0ZT5cblxuICA8IS0tIERhdGV0aW1lIEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtZGF0ZXRpbWVcbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdkYXRldGltZSdcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgW21vZGVdPVwiZmllbGRNb2RlXCI+XG4gIDwvc2lhLWR5bmFtaWMtZmllbGQtZGF0ZXRpbWU+XG5cbiAgPCEtLSBEcm9wZG93bi9FbnVtIEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtZHJvcGRvd25cbiAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdkcm9wZG93bicgfHwgZmllbGQudHlwZSA9PT0gJ2VudW0nXCJcbiAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgIFtmb3JtXT1cImZvcm1cIlxuICAgIFttb2RlXT1cImZpZWxkTW9kZVwiPlxuICA8L3NpYS1keW5hbWljLWZpZWxkLWRyb3Bkb3duPlxuXG4gIDwhLS0gTG9va3VwIEZpZWxkIC0tPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtbG9va3VwXG4gICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnbG9va3VwJ1wiXG4gICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICBbZm9ybV09XCJmb3JtXCJcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgIFttb2RlXT1cImZpZWxkTW9kZVwiPlxuICA8L3NpYS1keW5hbWljLWZpZWxkLWxvb2t1cD5cbjwvbmctdGVtcGxhdGU+XG5cblxuPCEtLSBUZW1wbGF0ZSBkZSBDYW1wbyBJbmxpbmUgRWRpdCAtLT5cbjxuZy10ZW1wbGF0ZSAjaW5saW5lRWRpdEZpZWxkVGVtcGxhdGUgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cImVkaXQtaW5saW5lLWZpZWxkXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eyBmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgXG4gICAgPCEtLSBEaXNwbGF5IE1vZGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkLWRpc3BsYXlcIiBcbiAgICAgICAgICpuZ0lmPVwiIWlzRmllbGRFZGl0aW5nKGZpZWxkLmZpZWxkKVwiIFxuICAgICAgICAgKGNsaWNrKT1cInN0YXJ0RWRpdEZpZWxkKGZpZWxkLmZpZWxkKVwiXG4gICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZGlzcGxheS12YWx1ZVwiIFxuICAgICAgICAgICAgW2F0dHIuZGF0YS1wbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAoJ2NybXguYnVzaW5lc3Mubm90X2luZm9ybWVkJyB8IHRyYW5zbGF0ZSlcIj5cbiAgICAgICAge3sgZ2V0RmllbGREaXNwbGF5VmFsdWUoZmllbGQuZmllbGQpIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8aSBjbGFzcz1cInBpIHBpLXBlbmNpbCBlZGl0LWljb25cIiAqbmdJZj1cIiFmaWVsZC5kaXNhYmxlZFwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8IS0tIEVkaXQgTW9kZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQtZWRpdFwiICpuZ0lmPVwiaXNGaWVsZEVkaXRpbmcoZmllbGQuZmllbGQpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LWFjdGlvbnNcIj5cbiAgICAgICAgPHAtYnV0dG9uIFxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiBcbiAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcbiAgICAgICAgICBzZXZlcml0eT1cInByaW1hcnlcIlxuICAgICAgICAgIChvbkNsaWNrKT1cInNhdmVJbmxpbmVGaWVsZChmaWVsZC5maWVsZClcIiBcbiAgICAgICAgICBbbG9hZGluZ109XCJzYXZpbmdGaWVsZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KGZpZWxkLmZpZWxkKT8uaW52YWxpZFwiPlxuICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICA8cC1idXR0b24gXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIFxuICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAob25DbGljayk9XCJjYW5jZWxJbmxpbmVFZGl0KClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJzYXZpbmdGaWVsZFwiPlxuICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDwhLS0gRXJyb3IgTWVzc2FnZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1lcnJvclwiICpuZ0lmPVwiZm9ybS5nZXQoZmllbGQuZmllbGQpPy5pbnZhbGlkICYmIGZvcm0uZ2V0KGZpZWxkLmZpZWxkKT8udG91Y2hlZFwiPlxuICAgICAgICA8c21hbGwgY2xhc3M9XCJwLWVycm9yXCI+XG4gICAgICAgICAge3sgZm9ybS5nZXQoZmllbGQuZmllbGQpPy5lcnJvcnM/LlsncmVxdWlyZWQnXSA/ICgnY3JteC5idXNpbmVzcy5yZXF1aXJlZF9maWVsZCcgfCB0cmFuc2xhdGUpIDogJycgfX1cbiAgICAgICAgPC9zbWFsbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
604
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFXOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFG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RSxFQUFFLEVBQUUsQ0FBQztRQUMxRSxNQUFNLElBQUksR0FBeUIsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVU7WUFDakUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLENBQUM7UUFFaEMsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBQzdCLG1DQUFtQztRQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FB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QixvQkFBb0I7a0JBMUJoQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osYUFBYTt3QkFDYix5QkFBeUI7d0JBQ3pCLDJCQUEyQjt3QkFDM0IseUJBQXlCO3dCQUN6Qiw2QkFBNkI7d0JBQzdCLDZCQUE2Qjt3QkFDN0IsMkJBQTJCO3dCQUMzQiw2QkFBNkI7d0JBQzdCLHlCQUF5Qjt3QkFDekIsNkJBQTZCO3dCQUM3QixnQ0FBZ0M7d0JBQ2hDLDBCQUEwQjtxQkFDM0I7dUtBS1EsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9wYW5lbCc7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5pbXBvcnQgeyBEcmF3ZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RyYXdlcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQge1xuICBEeW5hbWljRm9ybUZpZWxkQ29uZmlnLFxuICBEeW5hbWljRm9ybUZpZWxkU2l6ZSxcbiAgRHluYW1pY0Zvcm1TZWN0aW9uLFxuICBEeW5hbWljRm9ybURpYWxvZ0NvbmZpZyxcbiAgRHluYW1pY0Zvcm1EcmF3ZXJDb25maWdcbn0gZnJvbSAnLi9tb2RlbHMvZHluYW1pYy1mb3JtLm1vZGVscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1hc2tTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFzay5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2NhbGUuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvdHJhbnNsYXRlLnBpcGUnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkVGV4dENvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkTnVtYmVyQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1udW1iZXIuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZERhdGVDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWRhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZERhdGV0aW1lQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1kYXRldGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWRyb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRMb29rdXBDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWxvb2t1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkVGV4dGFyZWFDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLXRleHRhcmVhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRUaW1lQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC10aW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzL2R5bmFtaWMtZmllbGQtY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZE11bHRpc2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMvZHluYW1pYy1maWVsZC1tdWx0aXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkSW1hZ2VDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkcy9keW5hbWljLWZpZWxkLWltYWdlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpYS1keW5hbWljLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgUGFuZWxNb2R1bGUsXG4gICAgRGlhbG9nTW9kdWxlLFxuICAgIERyYXdlck1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBEeW5hbWljRmllbGRUZXh0Q29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZE51bWJlckNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGREYXRlQ29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZERhdGV0aW1lQ29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZERyb3Bkb3duQ29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZExvb2t1cENvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRUZXh0YXJlYUNvbXBvbmVudCxcbiAgICBEeW5hbWljRmllbGRUaW1lQ29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZENoZWNrYm94Q29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZE11bHRpc2VsZWN0Q29tcG9uZW50LFxuICAgIER5bmFtaWNGaWVsZEltYWdlQ29tcG9uZW50XG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgc2VjdGlvbnM6IER5bmFtaWNGb3JtU2VjdGlvbltdID0gW107XG4gIEBJbnB1dCgpIGVudGl0eURhdGE6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIG1vZGU6ICdmb3JtJyB8ICdpbmxpbmUtZWRpdCcgPSAnZm9ybSc7XG5cbiAgLy8gRGlzcGxheSBNb2RlIOKAlCBvcHRpb25hbC4gSWYgbm90IHNldCwgcmVuZGVycyBpbmxpbmUgd2l0aG91dCBidXR0b25zLlxuICBASW5wdXQoKSBkaXNwbGF5TW9kZT86ICdkaWFsb2cnIHwgJ2RyYXdlcic7XG4gIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGlhbG9nQ29uZmlnOiBEeW5hbWljRm9ybURpYWxvZ0NvbmZpZyA9IHt9O1xuICBASW5wdXQoKSBkcmF3ZXJDb25maWc6IER5bmFtaWNGb3JtRHJhd2VyQ29uZmlnID0ge307XG5cbiAgLy8gQnV0dG9uIENvbmZpZ3VyYXRpb25cbiAgQElucHV0KCkgc2hvd1N1Ym1pdEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pdEJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBjYW5jZWxCdXR0b25MYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgc3VibWl0QnV0dG9uSWNvbjogc3RyaW5nID0gJ3BpIHBpLWNoZWNrJztcbiAgQElucHV0KCkgY2FuY2VsQnV0dG9uSWNvbjogc3RyaW5nID0gJ3BpIHBpLXRpbWVzJztcblxuICBAT3V0cHV0KCkgZm9ybVJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XG4gIEBPdXRwdXQoKSBmb3JtU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBmaWVsZFNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmllbGQ6IHN0cmluZywgdmFsdWU6IGFueSB9PigpO1xuXG4gIGZvcm0hOiBGb3JtR3JvdXA7XG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBJbmxpbmUgZWRpdCBzdGF0ZVxuICBlZGl0aW5nRmllbGQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzYXZpbmdGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIC0tLSBDb21wdXRlZCBwcm9wZXJ0aWVzIC0tLVxuXG4gIGdldCBhbGxGaWVsZHMoKTogRHluYW1pY0Zvcm1GaWVsZENvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5mbGF0TWFwKHNlY3Rpb24gPT4gc2VjdGlvbi5maWVsZHMpO1xuICB9XG5cbiAgZ2V0IGlzSW5saW5lRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ2lubGluZS1lZGl0JztcbiAgfVxuXG4gIGdldCBpc0RpYWxvZ01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheU1vZGUgPT09ICdkaWFsb2cnO1xuICB9XG5cbiAgZ2V0IGlzRHJhd2VyTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ2RyYXdlcic7XG4gIH1cblxuICBnZXQgaXNJbmxpbmVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kaXNwbGF5TW9kZTtcbiAgfVxuXG4gIC8vIERpYWxvZyBjb25maWcgd2l0aCBkZWZhdWx0c1xuICBnZXQgZGlhbG9nSGVhZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLmhlYWRlciB8fCB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Rlc2lnbi5jb21wb25lbnRzX2FpLmZvcm0nKTtcbiAgfVxuICBnZXQgZGlhbG9nV2lkdGgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLndpZHRoIHx8ICc2MDBweCc7IH1cbiAgZ2V0IGRpYWxvZ0RyYWdnYWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLmRyYWdnYWJsZSA/PyBmYWxzZTsgfVxuICBnZXQgZGlhbG9nUmVzaXphYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcucmVzaXphYmxlID8/IGZhbHNlOyB9XG4gIGdldCBkaWFsb2dNYXhpbWl6YWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZGlhbG9nQ29uZmlnLm1heGltaXphYmxlID8/IGZhbHNlOyB9XG4gIGdldCBkaWFsb2dDbG9zZU9uRXNjYXBlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5kaWFsb2dDb25maWcuY2xvc2VPbkVzY2FwZSA/PyB0cnVlOyB9XG4gIGdldCBkaWFsb2dEaXNtaXNzYWJsZU1hc2soKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmRpYWxvZ0NvbmZpZy5kaXNtaXNzYWJsZU1hc2sgPz8gZmFsc2U7IH1cblxuICAvLyBEcmF3ZXIgY29uZmlnIHdpdGggZGVmYXVsdHNcbiAgZ2V0IGRyYXdlckhlYWRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRyYXdlckNvbmZpZy5oZWFkZXIgfHwgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5mb3JtJyk7XG4gIH1cbiAgZ2V0IGRyYXdlclBvc2l0aW9uKCk6ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wJyB8ICdib3R0b20nIHsgcmV0dXJuIHRoaXMuZHJhd2VyQ29uZmlnLnBvc2l0aW9uIHx8ICdyaWdodCc7IH1cbiAgZ2V0IGRyYXdlclNob3dDbG9zZUljb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmRyYXdlckNvbmZpZy5zaG93Q2xvc2VJY29uID8/IHRydWU7IH1cbiAgZ2V0IGRyYXdlckNsb3NlT25Fc2NhcGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmRyYXdlckNvbmZpZy5jbG9zZU9uRXNjYXBlID8/IHRydWU7IH1cbiAgZ2V0IGRyYXdlckRpc21pc3NhYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5kcmF3ZXJDb25maWcuZGlzbWlzc2FibGUgPz8gdHJ1ZTsgfVxuXG4gIGdldCBkcmF3ZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZHJhd2VyUG9zaXRpb247XG4gICAgY29uc3QgaXNIb3Jpem9udGFsID0gcG9zaXRpb24gPT09ICdsZWZ0JyB8fCBwb3NpdGlvbiA9PT0gJ3JpZ2h0JztcbiAgICBpZiAodGhpcy5kcmF3ZXJDb25maWcuY3VzdG9tV2lkdGgpIHtcbiAgICAgIHJldHVybiBpc0hvcml6b250YWwgPyB7IHdpZHRoOiB0aGlzLmRyYXdlckNvbmZpZy5jdXN0b21XaWR0aCB9IDogeyBoZWlnaHQ6IHRoaXMuZHJhd2VyQ29uZmlnLmN1c3RvbVdpZHRoIH07XG4gICAgfVxuICAgIGNvbnN0IHNpemUgPSB0aGlzLmRyYXdlckNvbmZpZy5zaXplIHx8ICdtZWRpdW0nO1xuICAgIGNvbnN0IHNpemVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBzbWFsbDogaXNIb3Jpem9udGFsID8gJzI1JScgOiAnMjV2aCcsXG4gICAgICBtZWRpdW06IGlzSG9yaXpvbnRhbCA/ICc0MCUnIDogJzQwdmgnLFxuICAgICAgbGFyZ2U6IGlzSG9yaXpvbnRhbCA/ICc2MCUnIDogJzYwdmgnLFxuICAgICAgeGxhcmdlOiBpc0hvcml6b250YWwgPyAnODAlJyA6ICc4MHZoJyxcbiAgICAgIGZ1bGw6IGlzSG9yaXpvbnRhbCA/ICcxMDAlJyA6ICcxMDB2aCdcbiAgICB9O1xuICAgIHJldHVybiBpc0hvcml6b250YWwgPyB7IHdpZHRoOiBzaXplTWFwW3NpemVdIH0gOiB7IGhlaWdodDogc2l6ZU1hcFtzaXplXSB9O1xuICB9XG5cbiAgZ2V0IHN1Ym1pdExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VibWl0QnV0dG9uTGFiZWwgfHwgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5zYXZlJyk7XG4gIH1cbiAgZ2V0IGNhbmNlbExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FuY2VsQnV0dG9uTGFiZWwgfHwgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5jYW5jZWwnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXNrU2VydmljZTogTWFza1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlXG4gICkge31cblxuICAvLyAtLS0gTGlmZWN5Y2xlIC0tLVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICBpZiAodGhpcy5lbnRpdHlEYXRhKSB7XG4gICAgICB0aGlzLmxvYWRFbnRpdHlEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0dXBDb25kaXRpb25hbEZpZWxkc1dhdGNoZXIoKTtcbiAgICB0aGlzLmZvcm1SZWFkeS5lbWl0KHRoaXMuZm9ybSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2VudGl0eURhdGEnXSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgIHRoaXMuZW50aXR5RGF0YSA/IHRoaXMubG9hZEVudGl0eURhdGEoKSA6IHRoaXMucmVzZXRGb3JtKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2aXNpYmxlJ10gJiYgY2hhbmdlc1sndmlzaWJsZSddLmN1cnJlbnRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5lbnRpdHlEYXRhICYmIHRoaXMuZm9ybSkge1xuICAgICAgICB0aGlzLmxvYWRFbnRpdHlEYXRhKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmVudGl0eURhdGEgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIEZvcm0gaW5pdCAtLS1cblxuICBpbml0Rm9ybSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtQ29udHJvbHM6IGFueSA9IHt9O1xuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoZmllbGQpO1xuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IGZpZWxkLnZhbGlkYXRvcnMgfHwgW107XG4gICAgICBmb3JtQ29udHJvbHNbZmllbGQuZmllbGRdID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICB7IHZhbHVlOiBkZWZhdWx0VmFsdWUsIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCB8fCBmYWxzZSB9LFxuICAgICAgICB2YWxpZGF0b3JzXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoZm9ybUNvbnRyb2xzKTtcbiAgICB0aGlzLmFwcGx5SW5pdGlhbERpc2FibGVkU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlKGZpZWxkOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnKTogYW55IHtcbiAgICBpZiAoZmllbGQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVybiBmaWVsZC5kZWZhdWx0VmFsdWU7XG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICBjYXNlICdudW1iZXInOiBjYXNlICdjdXJyZW5jeSc6IGNhc2UgJ2RhdGUnOiBjYXNlICd0aW1lJzogcmV0dXJuIG51bGw7XG4gICAgICBjYXNlICdjaGVja2JveCc6IHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzogcmV0dXJuIFtdO1xuICAgICAgY2FzZSAnZHJvcGRvd24nOiBjYXNlICdlbnVtJzogcmV0dXJuICcnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlJbml0aWFsRGlzYWJsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC5kaXNhYmxlZFdoZW4pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGQuZmllbGQpO1xuICAgICAgICBpZiAoY29udHJvbCAmJiB0aGlzLmlzRmllbGREaXNhYmxlZChmaWVsZCkpIHtcbiAgICAgICAgICBjb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tIERhdGEgbG9hZGluZyAtLS1cblxuICBsb2FkRW50aXR5RGF0YSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbnRpdHlEYXRhICYmIHRoaXMuZm9ybSkge1xuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5wcm9jZXNzRW50aXR5RGF0YSh0aGlzLmVudGl0eURhdGEpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NFbnRpdHlEYXRhKGVudGl0eTogYW55KTogYW55IHtcbiAgICBjb25zdCBkYXRhID0geyAuLi5lbnRpdHkgfTtcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScgJiYgZGF0YVtmaWVsZC5maWVsZF0pIHtcbiAgICAgICAgY29uc3QgdiA9IGRhdGFbZmllbGQuZmllbGRdO1xuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSB2LnN1YnN0cmluZygwLCAxMCkuc3BsaXQoJy0nKTtcbiAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoK3BhcnRzWzBdLCArcGFydHNbMV0gLSAxLCArcGFydHNbMl0pO1xuICAgICAgICAgICAgaWYgKCFpc05hTihkLmdldFRpbWUoKSkpIGRhdGFbZmllbGQuZmllbGRdID0gZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAndGltZScgJiYgZGF0YVtmaWVsZC5maWVsZF0pIHtcbiAgICAgICAgY29uc3QgdiA9IGRhdGFbZmllbGQuZmllbGRdO1xuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSB2LnNwbGl0KCc6Jyk7XG4gICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGQuc2V0SG91cnMocGFyc2VJbnQocGFydHNbMF0sIDEwKSwgcGFyc2VJbnQocGFydHNbMV0sIDEwKSwgMCwgMCk7XG4gICAgICAgICAgICBkYXRhW2ZpZWxkLmZpZWxkXSA9IGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2xvb2t1cCcgJiYgZGF0YVtmaWVsZC5maWVsZF0pIHtcbiAgICAgICAgY29uc3QgdiA9IGRhdGFbZmllbGQuZmllbGRdO1xuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYuaWQpIHtcbiAgICAgICAgICBjb25zdCBoYXNEaXNwbGF5ID0gZmllbGQubG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgPyBmaWVsZC5sb29rdXBEaXNwbGF5RmllbGRzLnNvbWUoZiA9PiB0aGlzLmdldE5lc3RlZFZhbHVlKHYsIGYpKVxuICAgICAgICAgICAgOiB2W2ZpZWxkLmxvb2t1cERpc3BsYXlGaWVsZCB8fCAnbmFtZSddO1xuICAgICAgICAgIGlmICghaGFzRGlzcGxheSkgZGF0YVtmaWVsZC5maWVsZF0gPSB2LmlkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcml2YXRlIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChjdXIsIGtleSkgPT4gY3VyPy5ba2V5XSwgb2JqKTtcbiAgfVxuXG4gIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICBjb25zdCB2YWx1ZXM6IGFueSA9IHt9O1xuICAgICAgdGhpcy5hbGxGaWVsZHMuZm9yRWFjaChmID0+IHZhbHVlc1tmLmZpZWxkXSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGYpKTtcbiAgICAgIHRoaXMuZm9ybS5yZXNldCh2YWx1ZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBWYWx1ZSBwcm9jZXNzaW5nIG9uIHN1Ym1pdCAtLS1cblxuICBwcml2YXRlIHByb2Nlc3NGb3JtVmFsdWUoZm9ybVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IG91dCA9IHsgLi4uZm9ybVZhbHVlIH07XG4gICAgaWYgKHRoaXMuZW50aXR5RGF0YT8uaWQpIG91dC5pZCA9IHRoaXMuZW50aXR5RGF0YS5pZDtcblxuICAgIHRoaXMuYWxsRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgY29uc3QgdiA9IG91dFtmaWVsZC5maWVsZF07XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2xvb2t1cCcpIHtcbiAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnKSB7IC8qIGtlZXAgKi8gfVxuICAgICAgICBlbHNlIGlmICh2ICYmIHYgIT09ICcnKSBvdXRbZmllbGQuZmllbGRdID0geyBpZDogdiB9O1xuICAgICAgICBlbHNlIG91dFtmaWVsZC5maWVsZF0gPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgb3V0W2ZpZWxkLmZpZWxkXSA9IGAke3YuZ2V0RnVsbFllYXIoKX0tJHtTdHJpbmcodi5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcodi5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICAgICAgfSBlbHNlIGlmICghdikgb3V0W2ZpZWxkLmZpZWxkXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICd0aW1lJykge1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICBvdXRbZmllbGQuZmllbGRdID0gYCR7U3RyaW5nKHYuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKX06JHtTdHJpbmcodi5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyl9OjAwYDtcbiAgICAgICAgfSBlbHNlIGlmICghdikgb3V0W2ZpZWxkLmZpZWxkXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKFsndGV4dCcsICd0ZXh0YXJlYScsICdudW1iZXInLCAnY3VycmVuY3knLCAnZW51bScsICdkcm9wZG93biddLmluY2x1ZGVzKGZpZWxkLnR5cGUpKSB7XG4gICAgICAgIGlmICh2ID09PSAnJyB8fCB2ID09PSB1bmRlZmluZWQpIG91dFtmaWVsZC5maWVsZF0gPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyAtLS0gTGF5b3V0IC0tLVxuXG4gIGdldEZpZWxkR3JpZENsYXNzKGZpZWxkOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWZhdWx0U2l6ZTogRHluYW1pY0Zvcm1GaWVsZFNpemUgPSB7IHhsOiA2LCBsZzogNiwgbWQ6IDYsIHNtOiAxMiB9O1xuICAgIGNvbnN0IHNpemU6IER5bmFtaWNGb3JtRmllbGRTaXplID0gdHlwZW9mIGZpZWxkLnNpemUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gZmllbGQuc2l6ZSh0aGlzLmZvcm0/LnZhbHVlIHx8IHt9KVxuICAgICAgOiAoZmllbGQuc2l6ZSB8fCBkZWZhdWx0U2l6ZSk7XG5cbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIC8vIEJhc2UgY2xhc3MgZnJvbSB4bCBvciBmYWxsYmFjayA2XG4gICAgY2xhc3Nlcy5wdXNoKGBjb2wtJHtzaXplLnhsID8/IHNpemUubGcgPz8gc2l6ZS5tZCA/PyBzaXplLnNtID8/IDZ9YCk7XG4gICAgaWYgKHNpemUueHMgIT09IHVuZGVmaW5lZCkgY2xhc3Nlcy5wdXNoKGBjb2wteHMtJHtzaXplLnhzfWApO1xuICAgIGlmIChzaXplLnNtICE9PSB1bmRlZmluZWQpIGNsYXNzZXMucHVzaChgY29sLXNtLSR7c2l6ZS5zbX1gKTtcbiAgICBpZiAoc2l6ZS5tZCAhPT0gdW5kZWZpbmVkKSBjbGFzc2VzLnB1c2goYGNvbC1tZC0ke3NpemUubWR9YCk7XG4gICAgaWYgKHNpemUubGcgIT09IHVuZGVmaW5lZCkgY2xhc3Nlcy5wdXNoKGBjb2wtbGctJHtzaXplLmxnfWApO1xuICAgIGlmIChzaXplLnhsICE9PSB1bmRlZmluZWQpIGNsYXNzZXMucHVzaChgY29sLXhsLSR7c2l6ZS54bH1gKTtcbiAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICAvLyAtLS0gQ29uZGl0aW9uYWwgdmlzaWJpbGl0eS9kaXNhYmxlZCAtLS1cblxuICBpc0ZpZWxkVmlzaWJsZShmaWVsZDogRHluYW1pY0Zvcm1GaWVsZENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQudmlzaWJsZVdoZW4pIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmaWVsZC52aXNpYmxlV2hlbih0aGlzLmZvcm0/LnZhbHVlIHx8IHt9KTtcbiAgfVxuXG4gIGlzRmllbGREaXNhYmxlZChmaWVsZDogRHluYW1pY0Zvcm1GaWVsZENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmIChmaWVsZC5kaXNhYmxlZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFmaWVsZC5kaXNhYmxlZFdoZW4pIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZmllbGQuZGlzYWJsZWRXaGVuKHRoaXMuZm9ybT8udmFsdWUgfHwge30pO1xuICB9XG5cbiAgc2V0dXBDb25kaXRpb25hbEZpZWxkc1dhdGNoZXIoKTogdm9pZCB7XG4gICAgLy8gU2luY2UgdmlzaWJsZVdoZW4vZGlzYWJsZWRXaGVuIGFyZSBub3cgZnVuY3Rpb25zIHRoYXQgY2FuIGRlcGVuZCBvbiBhbnkgZmllbGQsXG4gICAgLy8gd2Ugd2F0Y2ggYWxsIGZpZWxkcyBmb3IgY2hhbmdlcyBhbmQgcmUtZXZhbHVhdGVcbiAgICBjb25zdCBoYXNDb25kaXRpb25hbCA9IHRoaXMuYWxsRmllbGRzLnNvbWUoZiA9PiBmLnZpc2libGVXaGVuIHx8IGYuZGlzYWJsZWRXaGVuKTtcbiAgICBpZiAoIWhhc0NvbmRpdGlvbmFsKSByZXR1cm47XG5cbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNsZWFySGlkZGVuRmllbGRzKCk7XG4gICAgICB0aGlzLnVwZGF0ZURpc2FibGVkRmllbGRzKCk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVEaXNhYmxlZEZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC5kaXNhYmxlZFdoZW4pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGQuZmllbGQpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIGNvbnN0IHNob3VsZERpc2FibGUgPSB0aGlzLmlzRmllbGREaXNhYmxlZChmaWVsZCk7XG4gICAgICAgICAgaWYgKHNob3VsZERpc2FibGUgJiYgY29udHJvbC5lbmFibGVkKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFzaG91bGREaXNhYmxlICYmIGNvbnRyb2wuZGlzYWJsZWQgJiYgIWZpZWxkLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhckhpZGRlbkZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmIChmaWVsZC52aXNpYmxlV2hlbiAmJiAhdGhpcy5pc0ZpZWxkVmlzaWJsZShmaWVsZCkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGQuZmllbGQpO1xuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLnZhbHVlICE9PSB0aGlzLmdldERlZmF1bHRWYWx1ZShmaWVsZCkpIHtcbiAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGZpZWxkKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICAgICAgY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0gUHVibGljIG1ldGhvZHMgLS0tXG5cbiAgZ2V0Rm9ybSgpOiBGb3JtR3JvdXAgeyByZXR1cm4gdGhpcy5mb3JtOyB9XG5cbiAgb3BlbihlbnRpdHk/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZW50aXR5KSB7XG4gICAgICB0aGlzLmVudGl0eURhdGEgPSBlbnRpdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW50aXR5RGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBoYW5kbGVDYW5jZWwoKTogdm9pZCB7IHRoaXMuY2xvc2UoKTsgfVxuXG4gIGhhbmRsZVN1Ym1pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZm9ybScgJiYgdGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQodGhpcy5wcm9jZXNzRm9ybVZhbHVlKHRoaXMuZm9ybS52YWx1ZSkpO1xuICB9XG5cbiAgb25Gb3JtS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIEluIGlubGluZS1lZGl0IG1vZGUsIEVudGVyIHNhdmVzIHRoZSBjdXJyZW50IGZpZWxkXG4gICAgICBpZiAodGhpcy5pc0lubGluZUVkaXRNb2RlICYmIHRoaXMuZWRpdGluZ0ZpZWxkKSB7XG4gICAgICAgIHRoaXMuc2F2ZUlubGluZUZpZWxkKHRoaXMuZWRpdGluZ0ZpZWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU3VibWl0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIFNlY3Rpb24gaGVscGVycyAtLS1cblxuICBnZXRTZWN0aW9uU3R5bGUoc2VjdGlvbjogRHluYW1pY0Zvcm1TZWN0aW9uKTogc3RyaW5nIHtcbiAgICBpZiAoIXNlY3Rpb24udGl0bGUpIHJldHVybiAnbm9uZSc7XG4gICAgcmV0dXJuIHNlY3Rpb24uc3R5bGUgfHwgJ25vbmUnO1xuICB9XG5cbiAgLy8gLS0tIElubGluZSBFZGl0IC0tLVxuXG4gIHN0YXJ0RWRpdEZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzSW5saW5lRWRpdE1vZGUpIHJldHVybjtcbiAgICB0aGlzLmVkaXRpbmdGaWVsZCA9IGZpZWxkTmFtZTtcbiAgICBpZiAodGhpcy5lbnRpdHlEYXRhKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmFsbEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gZmllbGROYW1lKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmVudGl0eURhdGFbZmllbGROYW1lXTtcbiAgICAgICAgaWYgKGZpZWxkPy50eXBlID09PSAnbG9va3VwJyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LnR5cGUgPT09ICdkYXRlJyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgMTApLnNwbGl0KCctJyk7XG4gICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKCtwYXJ0c1swXSwgK3BhcnRzWzFdIC0gMSwgK3BhcnRzWzJdKTtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoIWlzTmFOKGQuZ2V0VGltZSgpKSA/IGQgOiB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBBdXRvLWZvY3VzIHRoZSBpbnB1dCBhZnRlciBBbmd1bGFyIHJlbmRlcnMgdGhlIGVkaXQgZmllbGRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLmlubGluZS1lZGl0LWZpZWxkIGlucHV0W2lkPVwiJHtmaWVsZE5hbWV9XCJdLCAuaW5saW5lLWVkaXQtZmllbGQgdGV4dGFyZWFbaWQ9XCIke2ZpZWxkTmFtZX1cIl1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGVsPy5mb2N1cygpO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yIGxvb2t1cCBmaWVsZHMsIGF1dG8tc2F2ZSB3aGVuIHZhbHVlIGNoYW5nZXMgKHVzZXIgc2VsZWN0cyBmcm9tIGRpYWxvZylcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWxsRmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBmaWVsZE5hbWUpO1xuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2xvb2t1cCcpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XG4gICAgICBjb25zdCBzdWIgPSBjb250cm9sPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBzdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5zYXZlSW5saW5lRmllbGQoZmllbGROYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNGaWVsZEVkaXRpbmcoZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZWRpdGluZ0ZpZWxkID09PSBmaWVsZE5hbWU7IH1cblxuICBzYXZlSW5saW5lRmllbGQoZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNJbmxpbmVFZGl0TW9kZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XG4gICAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wuaW52YWxpZCkgeyBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7IHJldHVybjsgfVxuXG4gICAgdGhpcy5zYXZpbmdGaWVsZCA9IHRydWU7XG4gICAgbGV0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWxsRmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBmaWVsZE5hbWUpO1xuXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnbG9va3VwJyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICB2YWx1ZSA9IHsgaWQ6IHZhbHVlIH07XG4gICAgfVxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2RhdGUnICYmIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgdmFsdWUgPSBgJHt2YWx1ZS5nZXRGdWxsWWVhcigpfS0ke1N0cmluZyh2YWx1ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcodmFsdWUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgfVxuICAgIHRoaXMuZmllbGRTYXZlLmVtaXQoeyBmaWVsZDogZmllbGROYW1lLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIGNhbmNlbElubGluZUVkaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJbmxpbmVFZGl0TW9kZSAmJiB0aGlzLmVkaXRpbmdGaWVsZCkge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5lZGl0aW5nRmllbGQpO1xuICAgICAgaWYgKGNvbnRyb2wgJiYgdGhpcy5lbnRpdHlEYXRhKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodGhpcy5lbnRpdHlEYXRhW3RoaXMuZWRpdGluZ0ZpZWxkXSk7XG4gICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZWRpdGluZ0ZpZWxkID0gbnVsbDtcbiAgICAgIHRoaXMuc2F2aW5nRmllbGQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb21wbGV0ZUlubGluZUVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0aW5nRmllbGQgPSBudWxsO1xuICAgIHRoaXMuc2F2aW5nRmllbGQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIC0tLSBEaXNwbGF5IHZhbHVlIGZvciBpbmxpbmUtZWRpdCBtb2RlIC0tLVxuXG4gIGdldEZpZWxkRGlzcGxheVZhbHVlKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZW50aXR5RGF0YSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5hbGxGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGZpZWxkTmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmVudGl0eURhdGFbZmllbGROYW1lXTtcbiAgICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gMCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAnbG9va3VwJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoZmllbGQubG9va3VwRGlzcGxheUZpZWxkcykge1xuICAgICAgICByZXR1cm4gZmllbGQubG9va3VwRGlzcGxheUZpZWxkcy5tYXAoZiA9PiB0aGlzLmdldE5lc3RlZFZhbHVlKHZhbHVlLCBmKSkuZmlsdGVyKHYgPT4gdikuam9pbignIC0gJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVbZmllbGQubG9va3VwRGlzcGxheUZpZWxkIHx8ICduYW1lJ10gfHwgJyc7XG4gICAgfVxuXG4gICAgaWYgKChmaWVsZD8udHlwZSA9PT0gJ2Ryb3Bkb3duJyB8fCBmaWVsZD8udHlwZSA9PT0gJ2VudW0nKSAmJiBmaWVsZCkge1xuICAgICAgY29uc3Qgb3B0cyA9IGZpZWxkLm9wdGlvbnMgfHwgZmllbGQuZW51bU9wdGlvbnMgfHwgW107XG4gICAgICBjb25zdCBvcHRWYWwgPSBmaWVsZC5vcHRpb25WYWx1ZSB8fCAndmFsdWUnO1xuICAgICAgY29uc3Qgb3B0TGJsID0gZmllbGQub3B0aW9uTGFiZWwgfHwgJ2xhYmVsJztcbiAgICAgIGNvbnN0IG1hdGNoID0gb3B0cy5maW5kKChvOiBhbnkpID0+ICh0eXBlb2YgbyA9PT0gJ29iamVjdCcgPyBvW29wdFZhbF0gOiBvKSA9PT0gdmFsdWUpO1xuICAgICAgaWYgKG1hdGNoKSByZXR1cm4gdHlwZW9mIG1hdGNoID09PSAnb2JqZWN0JyA/IG1hdGNoW29wdExibF0gOiBtYXRjaDtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdjdXJyZW5jeScgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgbW9uZXlDb25maWcgPSB0aGlzLm1hc2tTZXJ2aWNlLmdldE1vbmV5Q29uZmlnKCk7XG4gICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KGZpZWxkLmxvY2FsZSB8fCBtb25leUNvbmZpZy5sb2NhbGUsIHtcbiAgICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXG4gICAgICAgIGN1cnJlbmN5OiBmaWVsZC5jdXJyZW5jeSB8fCBtb25leUNvbmZpZy5jdXJyZW5jeVxuICAgICAgfSkuZm9ybWF0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ3B0LUJSJywge1xuICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IGZpZWxkLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDAsXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZmllbGQubWF4RnJhY3Rpb25EaWdpdHMgfHwgMlxuICAgICAgfSkuZm9ybWF0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdkYXRlJyAmJiB2YWx1ZSkgcmV0dXJuIHRoaXMubG9jYWxlU2VydmljZS5mb3JtYXREYXRlKHZhbHVlKTtcblxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ3RpbWUnICYmIHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gYCR7U3RyaW5nKHZhbHVlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyl9OiR7U3RyaW5nKHZhbHVlLmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5zdWJzdHJpbmcoMCwgNSkgOiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgcmV0dXJuIHZhbHVlID8gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdkZXNpZ24uY29tcG9uZW50c19haS5ib29sZWFuX3RydWUnKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnZGVzaWduLmNvbXBvbmVudHNfYWkuYm9vbGVhbl9mYWxzZScpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ211bHRpc2VsZWN0JyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3Qgb3B0cyA9IGZpZWxkLm9wdGlvbnMgfHwgZmllbGQuZW51bU9wdGlvbnMgfHwgW107XG4gICAgICBjb25zdCBvcHRWYWwgPSBmaWVsZC5vcHRpb25WYWx1ZSB8fCAndmFsdWUnO1xuICAgICAgY29uc3Qgb3B0TGJsID0gZmllbGQub3B0aW9uTGFiZWwgfHwgJ2xhYmVsJztcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAodiA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSBvcHRzLmZpbmQoKG9wdDogYW55KSA9PiAodHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHRbb3B0VmFsXSA6IG9wdCkgPT09IHYpO1xuICAgICAgICByZXR1cm4gbyA/ICh0eXBlb2YgbyA9PT0gJ29iamVjdCcgPyBvW29wdExibF0gOiBvKSA6IHY7XG4gICAgICB9KS5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ3RleHQnICYmIGZpZWxkLm1hc2sgPT09ICdkb2N1bWVudCcgJiYgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHR5cGVQZXJzb24gPSB0aGlzLmVudGl0eURhdGFbZmllbGQubWFza0RlcGVuZHNPbiB8fCAndHlwZVBlcnNvbiddIHx8ICdKVVJJRElDQUxfUEVSU09OJztcbiAgICAgIHJldHVybiB0aGlzLm1hc2tTZXJ2aWNlLmFwcGx5RG9jdW1lbnRNYXNrKFN0cmluZyh2YWx1ZSksIHR5cGVQZXJzb24pO1xuICAgIH1cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd0ZXh0JyAmJiBmaWVsZC5tYXNrID09PSAnY3BmJyAmJiB2YWx1ZSkgcmV0dXJuIHRoaXMubWFza1NlcnZpY2UuYXBwbHlDcGZNYXNrKFN0cmluZyh2YWx1ZSkpO1xuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ3RleHQnICYmIGZpZWxkLm1hc2sgPT09ICdjbnBqJyAmJiB2YWx1ZSkgcmV0dXJuIHRoaXMubWFza1NlcnZpY2UuYXBwbHlDbnBqTWFzayhTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG59XG4iLCI8IS0tIElubGluZSBNb2RlIChubyBkaXNwbGF5TW9kZSBzZXQpIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSW5saW5lTW9kZVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybUNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIERpYWxvZyBNb2RlIC0tPlxuPHAtZGlhbG9nXG4gICpuZ0lmPVwiaXNEaWFsb2dNb2RlXCJcbiAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgW2hlYWRlcl09XCJkaWFsb2dIZWFkZXIgfCB0cmFuc2xhdGVcIlxuICBbbW9kYWxdPVwidHJ1ZVwiXG4gIFtzdHlsZV09XCJ7IHdpZHRoOiBkaWFsb2dXaWR0aCB9XCJcbiAgW2RyYWdnYWJsZV09XCJkaWFsb2dEcmFnZ2FibGVcIlxuICBbcmVzaXphYmxlXT1cImRpYWxvZ1Jlc2l6YWJsZVwiXG4gIFttYXhpbWl6YWJsZV09XCJkaWFsb2dNYXhpbWl6YWJsZVwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cImRpYWxvZ0Nsb3NlT25Fc2NhcGVcIlxuICBbZGlzbWlzc2FibGVNYXNrXT1cImRpYWxvZ0Rpc21pc3NhYmxlTWFza1wiXG4gIChvbkhpZGUpPVwiY2xvc2UoKVwiPlxuXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb3JtQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIiAqbmdJZj1cInNob3dTdWJtaXRCdXR0b24gfHwgc2hvd0NhbmNlbEJ1dHRvblwiPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG4gICAgICA8cC1idXR0b24gKm5nSWY9XCJzaG93Q2FuY2VsQnV0dG9uXCIgW2xhYmVsXT1cImNhbmNlbExhYmVsIHwgdHJhbnNsYXRlXCIgW2ljb25dPVwiY2FuY2VsQnV0dG9uSWNvblwiIHNldmVyaXR5PVwic2Vjb25kYXJ5XCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwibG9hZGluZ1wiPjwvcC1idXR0b24+XG4gICAgICA8cC1idXR0b24gKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uXCIgW2xhYmVsXT1cInN1Ym1pdExhYmVsIHwgdHJhbnNsYXRlXCIgW2ljb25dPVwic3VibWl0QnV0dG9uSWNvblwiIChvbkNsaWNrKT1cImhhbmRsZVN1Ym1pdCgpXCIgW2xvYWRpbmddPVwibG9hZGluZ1wiIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIj48L3AtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cblxuPCEtLSBEcmF3ZXIgTW9kZSAtLT5cbjxwLWRyYXdlclxuICAqbmdJZj1cImlzRHJhd2VyTW9kZVwiXG4gIFsodmlzaWJsZSldPVwidmlzaWJsZVwiXG4gIFtoZWFkZXJdPVwiZHJhd2VySGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgW3Bvc2l0aW9uXT1cImRyYXdlclBvc2l0aW9uXCJcbiAgW3N0eWxlXT1cImRyYXdlclN0eWxlXCJcbiAgW3Nob3dDbG9zZUljb25dPVwiZHJhd2VyU2hvd0Nsb3NlSWNvblwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cImRyYXdlckNsb3NlT25Fc2NhcGVcIlxuICBbbW9kYWxdPVwiZHJhd2VyRGlzbWlzc2FibGVcIlxuICAob25IaWRlKT1cImNsb3NlKClcIj5cblxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybUNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCIgKm5nSWY9XCJzaG93U3VibWl0QnV0dG9uIHx8IHNob3dDYW5jZWxCdXR0b25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWZvb3RlclwiPlxuICAgICAgPHAtYnV0dG9uICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiIFtsYWJlbF09XCJjYW5jZWxMYWJlbCB8IHRyYW5zbGF0ZVwiIFtpY29uXT1cImNhbmNlbEJ1dHRvbkljb25cIiBzZXZlcml0eT1cInNlY29uZGFyeVwiIChvbkNsaWNrKT1cImhhbmRsZUNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cImxvYWRpbmdcIj48L3AtYnV0dG9uPlxuICAgICAgPHAtYnV0dG9uICpuZ0lmPVwic2hvd1N1Ym1pdEJ1dHRvblwiIFtsYWJlbF09XCJzdWJtaXRMYWJlbCB8IHRyYW5zbGF0ZVwiIFtpY29uXT1cInN1Ym1pdEJ1dHRvbkljb25cIiAob25DbGljayk9XCJoYW5kbGVTdWJtaXQoKVwiIFtsb2FkaW5nXT1cImxvYWRpbmdcIiBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCI+PC9wLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1kcmF3ZXI+XG5cbjwhLS0gRm9ybSBDb250ZW50IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNmb3JtQ29udGVudD5cbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJkeW5hbWljLWZvcm1cIiAoa2V5ZG93bik9XCJvbkZvcm1LZXlkb3duKCRldmVudClcIj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2Ygc2VjdGlvbnNcIj5cbiAgICAgIDwhLS0gTm8gdGl0bGUgPSBiYXJlIGZpZWxkcyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VjdGlvbi50aXRsZVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzSW5saW5lRWRpdE1vZGVcIiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBzZWN0aW9uLmZpZWxkc1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIFtuZ0NsYXNzXT1cImdldEZpZWxkR3JpZENsYXNzKGZpZWxkKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmllbGRUZW1wbGF0ZTsgY29udGV4dDogeyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiaW5saW5lLWVkaXQtZmllbGRzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBjbGFzcz1cImlubGluZS1lZGl0LWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmxpbmVFZGl0RmllbGRUZW1wbGF0ZTsgY29udGV4dDogeyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQm9yZGVyZWQgc2VjdGlvbiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWN0aW9uLnRpdGxlICYmIGdldFNlY3Rpb25TdHlsZShzZWN0aW9uKSA9PT0gJ2JvcmRlcmVkJ1wiIGNsYXNzPVwiYm9yZGVyZWQtc2VjdGlvblwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5cbiAgICAgICAgICA8aSAqbmdJZj1cInNlY3Rpb24uaWNvblwiIFtjbGFzc109XCJzZWN0aW9uLmljb24gKyAnIHNlY3Rpb24taWNvbidcIj48L2k+XG4gICAgICAgICAge3sgc2VjdGlvbi50aXRsZSB9fVxuICAgICAgICA8L2gzPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzSW5saW5lRWRpdE1vZGVcIiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBzZWN0aW9uLmZpZWxkc1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIFtuZ0NsYXNzXT1cImdldEZpZWxkR3JpZENsYXNzKGZpZWxkKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmllbGRUZW1wbGF0ZTsgY29udGV4dDogeyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiaW5saW5lLWVkaXQtZmllbGRzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBjbGFzcz1cImlubGluZS1lZGl0LWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmxpbmVFZGl0RmllbGRUZW1wbGF0ZTsgY29udGV4dDogeyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGFuZWwgc2VjdGlvbiAtLT5cbiAgICAgIDxwLXBhbmVsXG4gICAgICAgICpuZ0lmPVwic2VjdGlvbi50aXRsZSAmJiBnZXRTZWN0aW9uU3R5bGUoc2VjdGlvbikgPT09ICdwYW5lbCdcIlxuICAgICAgICBbdG9nZ2xlYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgW2NvbGxhcHNlZF09XCJzZWN0aW9uLmNvbGxhcHNlZCB8fCBmYWxzZVwiXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJzZWN0aW9uLXBhbmVsXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxpICpuZ0lmPVwic2VjdGlvbi5pY29uXCIgW2NsYXNzXT1cInNlY3Rpb24uaWNvbiArICcgc2VjdGlvbi1pY29uJ1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPnt7IHNlY3Rpb24udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbmxpbmVFZGl0TW9kZVwiIGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGaWVsZFZpc2libGUoZmllbGQpXCIgW25nQ2xhc3NdPVwiZ2V0RmllbGRHcmlkQ2xhc3MoZmllbGQpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0lubGluZUVkaXRNb2RlXCIgY2xhc3M9XCJpbmxpbmUtZWRpdC1maWVsZHNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBzZWN0aW9uLmZpZWxkc1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmllbGRWaXNpYmxlKGZpZWxkKVwiIGNsYXNzPVwiaW5saW5lLWVkaXQtZmllbGRcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlubGluZUVkaXRGaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3AtcGFuZWw+XG5cbiAgICAgIDwhLS0gSGVhZGluZy1vbmx5IHNlY3Rpb24gKHRpdGxlIHByZXNlbnQsIHN0eWxlPSdub25lJyBvciBvbWl0dGVkKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWN0aW9uLnRpdGxlICYmIGdldFNlY3Rpb25TdHlsZShzZWN0aW9uKSA9PT0gJ25vbmUnXCIgY2xhc3M9XCJoZWFkaW5nLXNlY3Rpb25cIj5cbiAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+XG4gICAgICAgICAgPGkgKm5nSWY9XCJzZWN0aW9uLmljb25cIiBbY2xhc3NdPVwic2VjdGlvbi5pY29uICsgJyBzZWN0aW9uLWljb24nXCI+PC9pPlxuICAgICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cbiAgICAgICAgPC9oMz5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0lubGluZUVkaXRNb2RlXCIgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ZpZWxkVmlzaWJsZShmaWVsZClcIiBbbmdDbGFzc109XCJnZXRGaWVsZEdyaWRDbGFzcyhmaWVsZClcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzSW5saW5lRWRpdE1vZGVcIiBjbGFzcz1cImlubGluZS1lZGl0LWZpZWxkc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGaWVsZFZpc2libGUoZmllbGQpXCIgY2xhc3M9XCJpbmxpbmUtZWRpdC1maWVsZFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5saW5lRWRpdEZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBDdXN0b20gY29udGVudCBwcm9qZWN0aW9uIC0tPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9mb3JtPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBGaWVsZCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZmllbGRUZW1wbGF0ZSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtdGV4dCAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0ZXh0J1wiIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImZvcm1cIiBbbW9kZV09XCInZm9ybSdcIj48L3NpYS1keW5hbWljLWZpZWxkLXRleHQ+XG4gIDxzaWEtZHluYW1pYy1maWVsZC10ZXh0YXJlYSAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYSdcIiBbZmllbGRdPVwiZmllbGRcIiBbZm9ybV09XCJmb3JtXCIgW21vZGVdPVwiJ2Zvcm0nXCI+PC9zaWEtZHluYW1pYy1maWVsZC10ZXh0YXJlYT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLW51bWJlciAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInIHx8IGZpZWxkLnR5cGUgPT09ICdjdXJyZW5jeSdcIiBbZmllbGRdPVwiZmllbGRcIiBbZm9ybV09XCJmb3JtXCIgW21vZGVdPVwiJ2Zvcm0nXCI+PC9zaWEtZHluYW1pYy1maWVsZC1udW1iZXI+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1kYXRlICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2RhdGUnXCIgW2ZpZWxkXT1cImZpZWxkXCIgW2Zvcm1dPVwiZm9ybVwiIFttb2RlXT1cIidmb3JtJ1wiPjwvc2lhLWR5bmFtaWMtZmllbGQtZGF0ZT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLWRhdGV0aW1lICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2RhdGV0aW1lJ1wiIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImZvcm1cIiBbbW9kZV09XCInZm9ybSdcIj48L3NpYS1keW5hbWljLWZpZWxkLWRhdGV0aW1lPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtZHJvcGRvd24gKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZHJvcGRvd24nIHx8IGZpZWxkLnR5cGUgPT09ICdlbnVtJ1wiIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImZvcm1cIiBbbW9kZV09XCInZm9ybSdcIj48L3NpYS1keW5hbWljLWZpZWxkLWRyb3Bkb3duPlxuICA8c2lhLWR5bmFtaWMtZmllbGQtbG9va3VwICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2xvb2t1cCdcIiBbZmllbGRdPVwiZmllbGRcIiBbZm9ybV09XCJmb3JtXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgW21vZGVdPVwiJ2Zvcm0nXCI+PC9zaWEtZHluYW1pYy1maWVsZC1sb29rdXA+XG4gIDxzaWEtZHluYW1pYy1maWVsZC10aW1lICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ3RpbWUnXCIgW2ZpZWxkXT1cImZpZWxkXCIgW2Zvcm1dPVwiZm9ybVwiIFttb2RlXT1cIidmb3JtJ1wiPjwvc2lhLWR5bmFtaWMtZmllbGQtdGltZT5cbiAgPHNpYS1keW5hbWljLWZpZWxkLWNoZWNrYm94ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2NoZWNrYm94J1wiIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImZvcm1cIiBbbW9kZV09XCInZm9ybSdcIj48L3NpYS1keW5hbWljLWZpZWxkLWNoZWNrYm94PlxuICA8c2lhLWR5bmFtaWMtZmllbGQtbXVsdGlzZWxlY3QgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnbXVsdGlzZWxlY3QnXCIgW2ZpZWxkXT1cImZpZWxkXCIgW2Zvcm1dPVwiZm9ybVwiIFttb2RlXT1cIidmb3JtJ1wiPjwvc2lhLWR5bmFtaWMtZmllbGQtbXVsdGlzZWxlY3Q+XG4gIDxzaWEtZHluYW1pYy1maWVsZC1pbWFnZSAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdpbWFnZSdcIiBbZmllbGRdPVwiZmllbGRcIiBbZm9ybV09XCJmb3JtXCIgW21vZGVdPVwiJ2Zvcm0nXCI+PC9zaWEtZHluYW1pYy1maWVsZC1pbWFnZT5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gSW5saW5lIEVkaXQgRmllbGQgVGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2lubGluZUVkaXRGaWVsZFRlbXBsYXRlIGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+e3sgZmllbGQubGFiZWwgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICA8ZGl2IGNsYXNzPVwiZmllbGQtZGlzcGxheVwiICpuZ0lmPVwiIWlzRmllbGRFZGl0aW5nKGZpZWxkLmZpZWxkKVwiIChjbGljayk9XCJzdGFydEVkaXRGaWVsZChmaWVsZC5maWVsZClcIiBbY2xhc3MuZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWRcIj5cbiAgICA8c3BhbiBjbGFzcz1cImRpc3BsYXktdmFsdWVcIiBbYXR0ci5kYXRhLXBsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICgnZGVzaWduLmNvbXBvbmVudHNfYWkubm90X2luZm9ybWVkJyB8IHRyYW5zbGF0ZSlcIj57eyBnZXRGaWVsZERpc3BsYXlWYWx1ZShmaWVsZC5maWVsZCkgfX08L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1wZW5jaWwgZWRpdC1pY29uXCIgKm5nSWY9XCIhZmllbGQuZGlzYWJsZWRcIj48L2k+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZmllbGQtZWRpdFwiICpuZ0lmPVwiaXNGaWVsZEVkaXRpbmcoZmllbGQuZmllbGQpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVGVtcGxhdGU7IGNvbnRleHQ6IHsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdC1hY3Rpb25zXCI+XG4gICAgICA8cC1idXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIFtyb3VuZGVkXT1cInRydWVcIiBbdGV4dF09XCJ0cnVlXCIgc2V2ZXJpdHk9XCJzdWNjZXNzXCIgKG9uQ2xpY2spPVwic2F2ZUlubGluZUZpZWxkKGZpZWxkLmZpZWxkKVwiIFtsb2FkaW5nXT1cInNhdmluZ0ZpZWxkXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KGZpZWxkLmZpZWxkKT8uaW52YWxpZFwiIHNpemU9XCJzbWFsbFwiPjwvcC1idXR0b24+XG4gICAgICA8cC1idXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS10aW1lc1wiIFtyb3VuZGVkXT1cInRydWVcIiBbdGV4dF09XCJ0cnVlXCIgc2V2ZXJpdHk9XCJkYW5nZXJcIiAob25DbGljayk9XCJjYW5jZWxJbmxpbmVFZGl0KClcIiBbZGlzYWJsZWRdPVwic2F2aW5nRmllbGRcIiBzaXplPVwic21hbGxcIj48L3AtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|