@cqa-lib/cqa-ui 1.1.410 → 1.1.412
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/esm2020/lib/execution-screen/basic-step/basic-step.component.mjs +1 -1
- package/esm2020/lib/execution-screen/condition-debug-step/condition-branch-editor.component.mjs +413 -0
- package/esm2020/lib/execution-screen/condition-debug-step/condition-debug-step.component.mjs +904 -0
- package/esm2020/lib/execution-screen/condition-step/condition-step.component.mjs +1 -1
- package/esm2020/lib/execution-screen/execution-step.models.mjs +1 -1
- package/esm2020/lib/execution-screen/jump-to-step-modal/jump-to-step-modal.component.mjs +46 -8
- package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +9 -3
- package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +9 -3
- package/esm2020/lib/execution-screen/step-renderer/step-renderer.component.mjs +27 -3
- package/esm2020/lib/test-case-details/test-case-step-components.token.mjs +1 -1
- package/esm2020/lib/ui-kit.module.mjs +17 -1
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +1403 -17
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +1397 -16
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/execution-screen/condition-debug-step/condition-branch-editor.component.d.ts +131 -0
- package/lib/execution-screen/condition-debug-step/condition-debug-step.component.d.ts +221 -0
- package/lib/execution-screen/execution-step.models.d.ts +5 -0
- package/lib/execution-screen/loop-step/loop-step.component.d.ts +7 -1
- package/lib/execution-screen/step-group/step-group.component.d.ts +7 -1
- package/lib/execution-screen/step-renderer/step-renderer.component.d.ts +7 -1
- package/lib/test-case-details/test-case-step-components.token.d.ts +1 -0
- package/lib/ui-kit.module.d.ts +116 -114
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/styles.css +1 -1
package/esm2020/lib/execution-screen/condition-debug-step/condition-branch-editor.component.mjs
ADDED
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { FormArray, FormControl, Validators } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/forms";
|
|
5
|
+
import * as i2 from "../../dynamic-select/dynamic-select-field.component";
|
|
6
|
+
import * as i3 from "../../step-builder/template-variables-form/template-variables-form.component";
|
|
7
|
+
import * as i4 from "@angular/material/icon";
|
|
8
|
+
import * as i5 from "../../step-builder/advanced-variables-form/advanced-variables-form.component";
|
|
9
|
+
import * as i6 from "../../button/button.component";
|
|
10
|
+
import * as i7 from "../../badge/badge.component";
|
|
11
|
+
import * as i8 from "@angular/common";
|
|
12
|
+
/**
|
|
13
|
+
* Lightweight single-condition editor used in debug mode to:
|
|
14
|
+
* - Add a new ELSE IF branch (mode = 'add-else-if')
|
|
15
|
+
* - Edit an existing IF or ELSE IF condition (mode = 'edit')
|
|
16
|
+
*
|
|
17
|
+
* This is a simplified variant of StepBuilderConditionComponent with one condition row.
|
|
18
|
+
*/
|
|
19
|
+
export class ConditionBranchEditorComponent {
|
|
20
|
+
constructor(fb, cdr) {
|
|
21
|
+
this.fb = fb;
|
|
22
|
+
this.cdr = cdr;
|
|
23
|
+
/** 'add-else-if' shows "Add ELSE IF" title/button; 'edit' shows "Edit Condition" title/button */
|
|
24
|
+
this.mode = 'add-else-if';
|
|
25
|
+
/** List of condition action templates (filtered to IF_CONDITION type) */
|
|
26
|
+
this.conditionTemplates = [];
|
|
27
|
+
/** Called to derive template variables from a selected template */
|
|
28
|
+
this.setConditionTemplateVariables = () => [];
|
|
29
|
+
/** Called to derive advanced settings variables */
|
|
30
|
+
this.setAdvancedSettingsVariables = () => [];
|
|
31
|
+
/** Element options for variable forms */
|
|
32
|
+
this.elementOptions = [];
|
|
33
|
+
this.hasMoreElements = false;
|
|
34
|
+
this.isLoadingElements = false;
|
|
35
|
+
this.screenNameOptions = [];
|
|
36
|
+
this.hasMoreScreenNames = false;
|
|
37
|
+
this.isLoadingScreenNames = false;
|
|
38
|
+
this.parameterOptions = [];
|
|
39
|
+
this.hasMoreParameters = false;
|
|
40
|
+
this.isLoadingParameters = false;
|
|
41
|
+
this.environmentOptions = [];
|
|
42
|
+
this.hasMoreEnvironments = false;
|
|
43
|
+
this.isLoadingEnvironments = false;
|
|
44
|
+
/** True while the parent is saving (disables/shows loader on Save button) */
|
|
45
|
+
this.isSaving = false;
|
|
46
|
+
this.save = new EventEmitter();
|
|
47
|
+
this.cancelled = new EventEmitter();
|
|
48
|
+
this.loadMoreElements = new EventEmitter();
|
|
49
|
+
this.searchElements = new EventEmitter();
|
|
50
|
+
this.searchElementsByScreenName = new EventEmitter();
|
|
51
|
+
this.createElement = new EventEmitter();
|
|
52
|
+
this.searchScreenName = new EventEmitter();
|
|
53
|
+
this.loadMoreScreenNames = new EventEmitter();
|
|
54
|
+
this.createScreenNameRequest = new EventEmitter();
|
|
55
|
+
this.searchParameters = new EventEmitter();
|
|
56
|
+
this.loadMoreParameters = new EventEmitter();
|
|
57
|
+
this.searchEnvironments = new EventEmitter();
|
|
58
|
+
this.loadMoreEnvironments = new EventEmitter();
|
|
59
|
+
this.selectedTemplate = null;
|
|
60
|
+
this.templateVariables = [];
|
|
61
|
+
this.advancedSettingsVariables = [];
|
|
62
|
+
this.advancedExpanded = false;
|
|
63
|
+
this.updatedHtmlGrammar = '';
|
|
64
|
+
this.valueConfigCache = null;
|
|
65
|
+
this.valueConfigWithHandler = null;
|
|
66
|
+
}
|
|
67
|
+
get title() {
|
|
68
|
+
return this.mode === 'edit' ? 'Edit Condition' : 'Add ELSE IF';
|
|
69
|
+
}
|
|
70
|
+
get saveButtonLabel() {
|
|
71
|
+
return this.mode === 'edit' ? 'Save' : 'Add ELSE IF';
|
|
72
|
+
}
|
|
73
|
+
get conditionRowLabel() {
|
|
74
|
+
return this.branchLabel ?? (this.mode === 'edit' ? 'IF' : 'ELSE IF');
|
|
75
|
+
}
|
|
76
|
+
ngOnInit() {
|
|
77
|
+
this.variablesForm = this.fb.array([]);
|
|
78
|
+
this.advancedVariablesForm = this.fb.array([]);
|
|
79
|
+
this.conditionForm = this.fb.group({
|
|
80
|
+
value: [null, Validators.required],
|
|
81
|
+
description: [''],
|
|
82
|
+
metadata: [''],
|
|
83
|
+
});
|
|
84
|
+
this.updateValueConfigCache();
|
|
85
|
+
// Pre-populate for edit mode
|
|
86
|
+
if (this.mode === 'edit' && this.initialConditionData) {
|
|
87
|
+
this.prefillFromInitialData();
|
|
88
|
+
}
|
|
89
|
+
this.cdr.markForCheck();
|
|
90
|
+
}
|
|
91
|
+
ngOnChanges(changes) {
|
|
92
|
+
if (changes['conditionTemplates'] && !changes['conditionTemplates'].firstChange) {
|
|
93
|
+
this.updateValueConfigCache();
|
|
94
|
+
this.valueConfigWithHandler = null;
|
|
95
|
+
// Re-prefill if we now have templates and were waiting
|
|
96
|
+
if (this.mode === 'edit' && this.initialConditionData && !this.selectedTemplate) {
|
|
97
|
+
this.prefillFromInitialData();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
this.cdr.markForCheck();
|
|
101
|
+
}
|
|
102
|
+
prefillFromInitialData() {
|
|
103
|
+
if (!this.initialConditionData || !this.conditionTemplates?.length)
|
|
104
|
+
return;
|
|
105
|
+
const { templateId, action, description, metadata } = this.initialConditionData;
|
|
106
|
+
// Find matching template
|
|
107
|
+
let template;
|
|
108
|
+
if (templateId != null) {
|
|
109
|
+
template = this.conditionTemplates.find(t => String(t.id) === String(templateId) || t.displayName === String(templateId));
|
|
110
|
+
}
|
|
111
|
+
if (!template && action) {
|
|
112
|
+
template = this.conditionTemplates.find(t => t.naturalText === action || t.htmlGrammar === action || t.displayName === action);
|
|
113
|
+
}
|
|
114
|
+
if (template) {
|
|
115
|
+
const selectId = template.id?.toString() || template.displayName || '';
|
|
116
|
+
this.conditionForm?.get('value')?.setValue(selectId, { emitEvent: false });
|
|
117
|
+
this.selectedTemplate = template;
|
|
118
|
+
// Get fresh variables structure with saved values by passing the raw step
|
|
119
|
+
const vars = this.setConditionTemplateVariables(template, this.editTestStep);
|
|
120
|
+
this.templateVariables = vars;
|
|
121
|
+
this.buildVariablesForm();
|
|
122
|
+
this.updateHtmlGrammar();
|
|
123
|
+
// Advanced variables
|
|
124
|
+
if (this.setAdvancedSettingsVariables) {
|
|
125
|
+
this.advancedSettingsVariables = this.setAdvancedSettingsVariables(template, this.editTestStep);
|
|
126
|
+
this.buildAdvancedVariablesForm();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (description)
|
|
130
|
+
this.conditionForm?.get('description')?.setValue(description, { emitEvent: false });
|
|
131
|
+
if (metadata)
|
|
132
|
+
this.conditionForm?.get('metadata')?.setValue(metadata, { emitEvent: false });
|
|
133
|
+
this.cdr.markForCheck();
|
|
134
|
+
}
|
|
135
|
+
updateValueConfigCache() {
|
|
136
|
+
const opts = (this.conditionTemplates || []).map(t => ({
|
|
137
|
+
id: t.id?.toString() || t.displayName || '',
|
|
138
|
+
value: t.id?.toString() || t.displayName || '',
|
|
139
|
+
name: t.htmlGrammar || t.naturalText || '',
|
|
140
|
+
label: t.htmlGrammar || t.naturalText || ''
|
|
141
|
+
}));
|
|
142
|
+
this.valueConfigCache = {
|
|
143
|
+
key: 'value',
|
|
144
|
+
placeholder: 'Select Condition Template*',
|
|
145
|
+
multiple: false,
|
|
146
|
+
searchable: true,
|
|
147
|
+
displayLabelAsInnerHtml: true,
|
|
148
|
+
options: opts
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
getValueConfig() {
|
|
152
|
+
if (this.valueConfigWithHandler)
|
|
153
|
+
return this.valueConfigWithHandler;
|
|
154
|
+
if (!this.valueConfigCache)
|
|
155
|
+
this.updateValueConfigCache();
|
|
156
|
+
this.valueConfigWithHandler = {
|
|
157
|
+
...this.valueConfigCache,
|
|
158
|
+
onChange: (v) => this.onTemplateValueChange(v)
|
|
159
|
+
};
|
|
160
|
+
return this.valueConfigWithHandler;
|
|
161
|
+
}
|
|
162
|
+
onTemplateValueChange(templateId) {
|
|
163
|
+
const template = this.conditionTemplates.find(t => String(t.id) === String(templateId) || t.displayName === String(templateId));
|
|
164
|
+
if (template) {
|
|
165
|
+
this.selectedTemplate = template;
|
|
166
|
+
this.templateVariables = this.setConditionTemplateVariables(template);
|
|
167
|
+
this.buildVariablesForm();
|
|
168
|
+
this.updateHtmlGrammar();
|
|
169
|
+
if (this.setAdvancedSettingsVariables) {
|
|
170
|
+
this.advancedSettingsVariables = this.setAdvancedSettingsVariables(template);
|
|
171
|
+
this.buildAdvancedVariablesForm();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.selectedTemplate = null;
|
|
176
|
+
this.templateVariables = [];
|
|
177
|
+
this.clearVariablesForm();
|
|
178
|
+
this.advancedSettingsVariables = [];
|
|
179
|
+
this.clearAdvancedVariablesForm();
|
|
180
|
+
}
|
|
181
|
+
this.cdr.markForCheck();
|
|
182
|
+
}
|
|
183
|
+
buildVariablesForm() {
|
|
184
|
+
while (this.variablesForm.length)
|
|
185
|
+
this.variablesForm.removeAt(0);
|
|
186
|
+
this.templateVariables.forEach(variable => {
|
|
187
|
+
const defaultValue = variable.type === 'boolean'
|
|
188
|
+
? (variable.value === true || variable.value === 'true' || variable.value === 1)
|
|
189
|
+
: (variable.value || '');
|
|
190
|
+
const group = this.fb.group({
|
|
191
|
+
name: [variable.name],
|
|
192
|
+
value: [defaultValue],
|
|
193
|
+
type: [variable.type || 'string'],
|
|
194
|
+
label: [variable.label || ''],
|
|
195
|
+
options: [variable.options || []]
|
|
196
|
+
});
|
|
197
|
+
const label = variable.label?.toLowerCase() || '';
|
|
198
|
+
if (label === 'test-data' || label === 'source-value' || label === 'target-value' ||
|
|
199
|
+
label === 'source_value' || label === 'target_value') {
|
|
200
|
+
const valueStr = String(defaultValue || '');
|
|
201
|
+
let dataType = 'plain-text';
|
|
202
|
+
if (valueStr.startsWith('@|') && valueStr.endsWith('|'))
|
|
203
|
+
dataType = 'parameter';
|
|
204
|
+
else if (valueStr.startsWith('$|') && valueStr.endsWith('|'))
|
|
205
|
+
dataType = 'runtime';
|
|
206
|
+
else if (valueStr.startsWith('*|') && valueStr.endsWith('|'))
|
|
207
|
+
dataType = 'environment';
|
|
208
|
+
group.addControl('dataType', new FormControl(dataType));
|
|
209
|
+
}
|
|
210
|
+
this.variablesForm.push(group);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
clearVariablesForm() {
|
|
214
|
+
while (this.variablesForm.length)
|
|
215
|
+
this.variablesForm.removeAt(0);
|
|
216
|
+
}
|
|
217
|
+
buildAdvancedVariablesForm() {
|
|
218
|
+
while (this.advancedVariablesForm.length)
|
|
219
|
+
this.advancedVariablesForm.removeAt(0);
|
|
220
|
+
this.advancedSettingsVariables.forEach(variable => {
|
|
221
|
+
let defaultValue;
|
|
222
|
+
if (variable.type === 'str_list') {
|
|
223
|
+
const arr = Array.isArray(variable.value) ? variable.value : [];
|
|
224
|
+
defaultValue = this.fb.array(arr.length > 0 ? arr.map((i) => this.fb.control(i)) : [this.fb.control('')]);
|
|
225
|
+
}
|
|
226
|
+
else if (variable.type === 'boolean') {
|
|
227
|
+
defaultValue = variable.value === true || variable.value === 'true' || variable.value === 1;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
defaultValue = variable.value || '';
|
|
231
|
+
}
|
|
232
|
+
const group = this.fb.group({
|
|
233
|
+
name: [variable.name],
|
|
234
|
+
value: variable.type === 'str_list' ? defaultValue : [defaultValue],
|
|
235
|
+
type: [variable.type || 'string'],
|
|
236
|
+
label: [variable.label || '']
|
|
237
|
+
});
|
|
238
|
+
this.advancedVariablesForm.push(group);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
clearAdvancedVariablesForm() {
|
|
242
|
+
while (this.advancedVariablesForm.length)
|
|
243
|
+
this.advancedVariablesForm.removeAt(0);
|
|
244
|
+
}
|
|
245
|
+
updateHtmlGrammar() {
|
|
246
|
+
if (!this.selectedTemplate?.htmlGrammar) {
|
|
247
|
+
this.updatedHtmlGrammar = '';
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (this.computeHtmlGrammarFn) {
|
|
251
|
+
this.updatedHtmlGrammar = this.computeHtmlGrammarFn(this.selectedTemplate, this.templateVariables);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
let g = this.selectedTemplate.htmlGrammar;
|
|
255
|
+
this.templateVariables.forEach(v => {
|
|
256
|
+
const re = new RegExp(`<span[^>]*data-event-key="${v.name}"[^>]*>.*?</span>`, 'gi');
|
|
257
|
+
const escaped = String(v.value || '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
258
|
+
g = g.replace(re, escaped);
|
|
259
|
+
});
|
|
260
|
+
this.updatedHtmlGrammar = g;
|
|
261
|
+
}
|
|
262
|
+
get currentHtmlGrammar() {
|
|
263
|
+
return this.updatedHtmlGrammar || this.selectedTemplate?.htmlGrammar || this.selectedTemplate?.naturalText || '';
|
|
264
|
+
}
|
|
265
|
+
getTemplateVariables() { return this.templateVariables; }
|
|
266
|
+
getVariablesForm() { return this.variablesForm; }
|
|
267
|
+
getAdvancedVariables() { return this.advancedSettingsVariables; }
|
|
268
|
+
getAdvancedVariablesForm() { return this.advancedVariablesForm; }
|
|
269
|
+
get isAdvancedExpanded() { return this.advancedExpanded; }
|
|
270
|
+
toggleAdvanced() { this.advancedExpanded = !this.advancedExpanded; this.cdr.markForCheck(); }
|
|
271
|
+
get hasSelectedTemplate() { return this.selectedTemplate; }
|
|
272
|
+
onVariableValueChange(name, value) {
|
|
273
|
+
const v = this.templateVariables.find(tv => tv.name === name);
|
|
274
|
+
if (v)
|
|
275
|
+
v.value = value;
|
|
276
|
+
const idx = this.variablesForm.controls.findIndex(c => c.get('name')?.value === name);
|
|
277
|
+
if (idx !== -1)
|
|
278
|
+
this.variablesForm.at(idx).get('value')?.setValue(value, { emitEvent: false });
|
|
279
|
+
this.updateHtmlGrammar();
|
|
280
|
+
this.cdr.markForCheck();
|
|
281
|
+
}
|
|
282
|
+
onVariableBooleanChange(name, value) {
|
|
283
|
+
this.onVariableValueChange(name, value);
|
|
284
|
+
}
|
|
285
|
+
onAdvancedVariableValueChange(name, value) {
|
|
286
|
+
const v = this.advancedSettingsVariables.find(tv => tv.name === name);
|
|
287
|
+
if (v)
|
|
288
|
+
v.value = value;
|
|
289
|
+
const idx = this.advancedVariablesForm.controls.findIndex(c => c.get('name')?.value === name);
|
|
290
|
+
if (idx !== -1 && v?.type !== 'str_list') {
|
|
291
|
+
this.advancedVariablesForm.at(idx).get('value')?.setValue(value, { emitEvent: false });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
onAdvancedVariableBooleanChange(name, value) {
|
|
295
|
+
this.onAdvancedVariableValueChange(name, value);
|
|
296
|
+
}
|
|
297
|
+
isFormValid() {
|
|
298
|
+
if (!this.conditionForm.valid)
|
|
299
|
+
return false;
|
|
300
|
+
return this.templateVariables.every(v => {
|
|
301
|
+
if (v.dataKey === 'element' || v.dataKey === 'test_data' || v.dataKey === 'source_value' || v.dataKey === 'target_value') {
|
|
302
|
+
return v.value !== null && v.value !== undefined && v.value !== '';
|
|
303
|
+
}
|
|
304
|
+
return true;
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
onCancel() { this.cancelled.emit(); }
|
|
308
|
+
onSave() {
|
|
309
|
+
if (!this.isFormValid())
|
|
310
|
+
return;
|
|
311
|
+
// Sync advanced form values back to array
|
|
312
|
+
this.advancedSettingsVariables.forEach((variable, i) => {
|
|
313
|
+
const fg = this.advancedVariablesForm.at(i);
|
|
314
|
+
if (!fg)
|
|
315
|
+
return;
|
|
316
|
+
const fv = fg.get('value')?.value;
|
|
317
|
+
if (variable.type === 'str_list' && fv instanceof FormArray) {
|
|
318
|
+
variable.value = fv.controls.map(c => c.value).filter((val) => val?.trim() !== '');
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
variable.value = fv;
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
this.save.emit({
|
|
325
|
+
template: this.selectedTemplate,
|
|
326
|
+
templateVariables: [...this.templateVariables],
|
|
327
|
+
advancedSettingsVariables: [...this.advancedSettingsVariables],
|
|
328
|
+
action: this.selectedTemplate?.naturalText || this.selectedTemplate?.htmlGrammar || '',
|
|
329
|
+
resolvedAction: this.currentHtmlGrammar,
|
|
330
|
+
description: this.conditionForm.get('description')?.value || '',
|
|
331
|
+
metadata: this.conditionForm.get('metadata')?.value || '',
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
ConditionBranchEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ConditionBranchEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
336
|
+
ConditionBranchEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ConditionBranchEditorComponent, selector: "cqa-condition-branch-editor", inputs: { mode: "mode", conditionTemplates: "conditionTemplates", setConditionTemplateVariables: "setConditionTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", initialConditionData: "initialConditionData", editTestStep: "editTestStep", branchLabel: "branchLabel", isSaving: "isSaving" }, outputs: { save: "save", cancelled: "cancelled", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n {{ title }}\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Single Condition Row -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\" [formGroup]=\"conditionForm\">\n <!-- Condition Label + Template Dropdown -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ conditionRowLabel }}\n </div>\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"conditionForm\" [config]=\"getValueConfig()\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"hasSelectedTemplate\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"currentHtmlGrammar\">\n </div>\n </div>\n\n <!-- Template Variables Form -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getTemplateVariables()\"\n [variablesForm]=\"getVariablesForm()\"\n [metadata]=\"conditionForm.get('metadata')?.value || ''\"\n [description]=\"conditionForm.get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"conditionForm.get('metadata')?.setValue($event)\"\n (descriptionChange)=\"conditionForm.get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n\n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"getAdvancedVariables().length > 0\" class=\"cqa-mt-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"isAdvancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"isAdvancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form\n [advancedVariables]=\"getAdvancedVariables()\"\n [advancedVariableForm]=\"getAdvancedVariablesForm()\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isSaving\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"saveButtonLabel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Saving\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "defaultTestDataEndIndex", "isInsideForLoopStep", "isEditInDepth", "isDebug", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i7.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ConditionBranchEditorComponent, decorators: [{
|
|
338
|
+
type: Component,
|
|
339
|
+
args: [{ selector: 'cqa-condition-branch-editor', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n {{ title }}\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Single Condition Row -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\" [formGroup]=\"conditionForm\">\n <!-- Condition Label + Template Dropdown -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ conditionRowLabel }}\n </div>\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"conditionForm\" [config]=\"getValueConfig()\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"hasSelectedTemplate\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"currentHtmlGrammar\">\n </div>\n </div>\n\n <!-- Template Variables Form -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getTemplateVariables()\"\n [variablesForm]=\"getVariablesForm()\"\n [metadata]=\"conditionForm.get('metadata')?.value || ''\"\n [description]=\"conditionForm.get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"conditionForm.get('metadata')?.setValue($event)\"\n (descriptionChange)=\"conditionForm.get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n\n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"getAdvancedVariables().length > 0\" class=\"cqa-mt-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"isAdvancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"isAdvancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form\n [advancedVariables]=\"getAdvancedVariables()\"\n [advancedVariableForm]=\"getAdvancedVariablesForm()\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isSaving\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"saveButtonLabel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Saving\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n", styles: [] }]
|
|
340
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
|
|
341
|
+
type: Input
|
|
342
|
+
}], conditionTemplates: [{
|
|
343
|
+
type: Input
|
|
344
|
+
}], setConditionTemplateVariables: [{
|
|
345
|
+
type: Input
|
|
346
|
+
}], setAdvancedSettingsVariables: [{
|
|
347
|
+
type: Input
|
|
348
|
+
}], computeHtmlGrammarFn: [{
|
|
349
|
+
type: Input
|
|
350
|
+
}], elementOptions: [{
|
|
351
|
+
type: Input
|
|
352
|
+
}], hasMoreElements: [{
|
|
353
|
+
type: Input
|
|
354
|
+
}], isLoadingElements: [{
|
|
355
|
+
type: Input
|
|
356
|
+
}], screenNameOptions: [{
|
|
357
|
+
type: Input
|
|
358
|
+
}], hasMoreScreenNames: [{
|
|
359
|
+
type: Input
|
|
360
|
+
}], isLoadingScreenNames: [{
|
|
361
|
+
type: Input
|
|
362
|
+
}], parameterOptions: [{
|
|
363
|
+
type: Input
|
|
364
|
+
}], hasMoreParameters: [{
|
|
365
|
+
type: Input
|
|
366
|
+
}], isLoadingParameters: [{
|
|
367
|
+
type: Input
|
|
368
|
+
}], environmentOptions: [{
|
|
369
|
+
type: Input
|
|
370
|
+
}], hasMoreEnvironments: [{
|
|
371
|
+
type: Input
|
|
372
|
+
}], isLoadingEnvironments: [{
|
|
373
|
+
type: Input
|
|
374
|
+
}], defaultTestDataProfileId: [{
|
|
375
|
+
type: Input
|
|
376
|
+
}], defaultTestDataStartIndex: [{
|
|
377
|
+
type: Input
|
|
378
|
+
}], initialConditionData: [{
|
|
379
|
+
type: Input
|
|
380
|
+
}], editTestStep: [{
|
|
381
|
+
type: Input
|
|
382
|
+
}], branchLabel: [{
|
|
383
|
+
type: Input
|
|
384
|
+
}], isSaving: [{
|
|
385
|
+
type: Input
|
|
386
|
+
}], save: [{
|
|
387
|
+
type: Output
|
|
388
|
+
}], cancelled: [{
|
|
389
|
+
type: Output
|
|
390
|
+
}], loadMoreElements: [{
|
|
391
|
+
type: Output
|
|
392
|
+
}], searchElements: [{
|
|
393
|
+
type: Output
|
|
394
|
+
}], searchElementsByScreenName: [{
|
|
395
|
+
type: Output
|
|
396
|
+
}], createElement: [{
|
|
397
|
+
type: Output
|
|
398
|
+
}], searchScreenName: [{
|
|
399
|
+
type: Output
|
|
400
|
+
}], loadMoreScreenNames: [{
|
|
401
|
+
type: Output
|
|
402
|
+
}], createScreenNameRequest: [{
|
|
403
|
+
type: Output
|
|
404
|
+
}], searchParameters: [{
|
|
405
|
+
type: Output
|
|
406
|
+
}], loadMoreParameters: [{
|
|
407
|
+
type: Output
|
|
408
|
+
}], searchEnvironments: [{
|
|
409
|
+
type: Output
|
|
410
|
+
}], loadMoreEnvironments: [{
|
|
411
|
+
type: Output
|
|
412
|
+
}] } });
|
|
413
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uLWJyYW5jaC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9leGVjdXRpb24tc2NyZWVuL2NvbmRpdGlvbi1kZWJ1Zy1zdGVwL2NvbmRpdGlvbi1icmFuY2gtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9jb25kaXRpb24tZGVidWctc3RlcC9jb25kaXRpb24tYnJhbmNoLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUN0Qyx1QkFBdUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBMEIsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBZTVGOzs7Ozs7R0FNRztBQVFILE1BQU0sT0FBTyw4QkFBOEI7SUEwRnpDLFlBQW9CLEVBQWUsRUFBVSxHQUFzQjtRQUEvQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF4Rm5FLGlHQUFpRztRQUN4RixTQUFJLEdBQTJCLGFBQWEsQ0FBQztRQUV0RCx5RUFBeUU7UUFDaEUsdUJBQWtCLEdBQXFCLEVBQUUsQ0FBQztRQUVuRCxtRUFBbUU7UUFDMUQsa0NBQTZCLEdBQXdELEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUV2RyxtREFBbUQ7UUFDMUMsaUNBQTRCLEdBQXdELEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUt0Ryx5Q0FBeUM7UUFDaEMsbUJBQWMsR0FBVSxFQUFFLENBQUM7UUFDM0Isb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLHNCQUFpQixH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QTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3Rpb25UZW1wbGF0ZSB9IGZyb20gJy4uLy4uL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25CcmFuY2hTYXZlRGF0YSB7XG4gIHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSB8IG51bGw7XG4gIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W107XG4gIGFjdGlvbjogc3RyaW5nO1xuICAvKiogUmVzb2x2ZWQgSFRNTCBncmFtbWFyIHdpdGggYWN0dWFsIHZhcmlhYmxlIHZhbHVlcyBzdWJzdGl0dXRlZCDigJQgdXNlIGZvciBkaXNwbGF5L2NvbmRpdGlvblRleHQgKi9cbiAgcmVzb2x2ZWRBY3Rpb246IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgbWV0YWRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBMaWdodHdlaWdodCBzaW5nbGUtY29uZGl0aW9uIGVkaXRvciB1c2VkIGluIGRlYnVnIG1vZGUgdG86XG4gKiAgLSBBZGQgYSBuZXcgRUxTRSBJRiBicmFuY2ggKG1vZGUgPSAnYWRkLWVsc2UtaWYnKVxuICogIC0gRWRpdCBhbiBleGlzdGluZyBJRiBvciBFTFNFIElGIGNvbmRpdGlvbiAobW9kZSA9ICdlZGl0JylcbiAqXG4gKiBUaGlzIGlzIGEgc2ltcGxpZmllZCB2YXJpYW50IG9mIFN0ZXBCdWlsZGVyQ29uZGl0aW9uQ29tcG9uZW50IHdpdGggb25lIGNvbmRpdGlvbiByb3cuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1jb25kaXRpb24tYnJhbmNoLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25kaXRpb24tYnJhbmNoLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uQnJhbmNoRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIC8qKiAnYWRkLWVsc2UtaWYnIHNob3dzIFwiQWRkIEVMU0UgSUZcIiB0aXRsZS9idXR0b247ICdlZGl0JyBzaG93cyBcIkVkaXQgQ29uZGl0aW9uXCIgdGl0bGUvYnV0dG9uICovXG4gIEBJbnB1dCgpIG1vZGU6ICdhZGQtZWxzZS1pZicgfCAnZWRpdCcgPSAnYWRkLWVsc2UtaWYnO1xuXG4gIC8qKiBMaXN0IG9mIGNvbmRpdGlvbiBhY3Rpb24gdGVtcGxhdGVzIChmaWx0ZXJlZCB0byBJRl9DT05ESVRJT04gdHlwZSkgKi9cbiAgQElucHV0KCkgY29uZGl0aW9uVGVtcGxhdGVzOiBBY3Rpb25UZW1wbGF0ZVtdID0gW107XG5cbiAgLyoqIENhbGxlZCB0byBkZXJpdmUgdGVtcGxhdGUgdmFyaWFibGVzIGZyb20gYSBzZWxlY3RlZCB0ZW1wbGF0ZSAqL1xuICBASW5wdXQoKSBzZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlczogKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSwgdGVzdFN0ZXA/OiBhbnkpID0+IGFueVtdID0gKCkgPT4gW107XG5cbiAgLyoqIENhbGxlZCB0byBkZXJpdmUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzICovXG4gIEBJbnB1dCgpIHNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6ICh0ZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUsIHRlc3RTdGVwPzogYW55KSA9PiBhbnlbXSA9ICgpID0+IFtdO1xuXG4gIC8qKiBDZW50cmFsaXNlZCBIVE1MIGdyYW1tYXIgY29tcHV0YXRpb24gZnVuY3Rpb24gKi9cbiAgQElucHV0KCkgY29tcHV0ZUh0bWxHcmFtbWFyRm4/OiAodGVtcGxhdGU6IGFueSwgdmFyaWFibGVzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG4gIC8qKiBFbGVtZW50IG9wdGlvbnMgZm9yIHZhcmlhYmxlIGZvcm1zICovXG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2NyZWVuTmFtZU9wdGlvbnM6IHsgaWQ/OiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhcmFtZXRlck9wdGlvbnM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10gPSBbXTtcbiAgQElucHV0KCkgaGFzTW9yZUVudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyO1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4PzogbnVtYmVyO1xuXG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwcmUtcG9wdWxhdGVzIHRoZSBmb3JtIGZvciBlZGl0IG1vZGUuIHNoYXBlOiB7IHRlbXBsYXRlSWQsIHRlbXBsYXRlVmFyaWFibGVzLCBhY3Rpb24gfSAqL1xuICBASW5wdXQoKSBpbml0aWFsQ29uZGl0aW9uRGF0YT86IHtcbiAgICB0ZW1wbGF0ZUlkPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHRlbXBsYXRlVmFyaWFibGVzPzogYW55W107XG4gICAgYWN0aW9uPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogc3RyaW5nO1xuICB9O1xuXG4gIC8qKiBSYXcgYnJhbmNoIHN0ZXAgb2JqZWN0IOKAlCBwYXNzZWQgdGhyb3VnaCB0byBzZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyBzbyB0aGUgc2VydmljZSBjYW4gZXh0cmFjdCBzYXZlZCB2YWx1ZXMgZnJvbSBzdGVwLmV2ZW50ICovXG4gIEBJbnB1dCgpIGVkaXRUZXN0U3RlcD86IGFueTtcblxuICAvKiogTGFiZWwgc2hvd24gbmV4dCB0byB0aGUgY29uZGl0aW9uIHRlbXBsYXRlIGRyb3Bkb3duIChlLmcuICdJRicsICdFTFNFIElGJykuIEluZmVycmVkIGZyb20gbW9kZSB3aGVuIG5vdCBwcm92aWRlZC4gKi9cbiAgQElucHV0KCkgYnJhbmNoTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqIFRydWUgd2hpbGUgdGhlIHBhcmVudCBpcyBzYXZpbmcgKGRpc2FibGVzL3Nob3dzIGxvYWRlciBvbiBTYXZlIGJ1dHRvbikgKi9cbiAgQElucHV0KCkgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29uZGl0aW9uQnJhbmNoU2F2ZURhdGE+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjx7IHNjcmVlbk5hbWVJZDogbnVtYmVyOyBzZWFyY2hUZXJtPzogc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc2VhcmNoUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgbG9hZE1vcmVQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgc2VhcmNoRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBjb25kaXRpb25Gb3JtITogRm9ybUdyb3VwO1xuXG4gIHByaXZhdGUgc2VsZWN0ZWRUZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSB2YXJpYWJsZXNGb3JtITogRm9ybUFycmF5O1xuICBwcml2YXRlIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIHByaXZhdGUgYWR2YW5jZWRWYXJpYWJsZXNGb3JtITogRm9ybUFycmF5O1xuICBwcml2YXRlIGFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB1cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcblxuICBwcml2YXRlIHZhbHVlQ29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZhbHVlQ29uZmlnV2l0aEhhbmRsZXI6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdlZGl0JyA/ICdFZGl0IENvbmRpdGlvbicgOiAnQWRkIEVMU0UgSUYnO1xuICB9XG5cbiAgZ2V0IHNhdmVCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdlZGl0JyA/ICdTYXZlJyA6ICdBZGQgRUxTRSBJRic7XG4gIH1cblxuICBnZXQgY29uZGl0aW9uUm93TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5icmFuY2hMYWJlbCA/PyAodGhpcy5tb2RlID09PSAnZWRpdCcgPyAnSUYnIDogJ0VMU0UgSUYnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy52YXJpYWJsZXNGb3JtID0gdGhpcy5mYi5hcnJheShbXSk7XG4gICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmFycmF5KFtdKTtcblxuICAgIHRoaXMuY29uZGl0aW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdmFsdWU6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgbWV0YWRhdGE6IFsnJ10sXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVZhbHVlQ29uZmlnQ2FjaGUoKTtcblxuICAgIC8vIFByZS1wb3B1bGF0ZSBmb3IgZWRpdCBtb2RlXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuaW5pdGlhbENvbmRpdGlvbkRhdGEpIHtcbiAgICAgIHRoaXMucHJlZmlsbEZyb21Jbml0aWFsRGF0YSgpO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25kaXRpb25UZW1wbGF0ZXMnXSAmJiAhY2hhbmdlc1snY29uZGl0aW9uVGVtcGxhdGVzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVDb25maWdDYWNoZSgpO1xuICAgICAgdGhpcy52YWx1ZUNvbmZpZ1dpdGhIYW5kbGVyID0gbnVsbDtcbiAgICAgIC8vIFJlLXByZWZpbGwgaWYgd2Ugbm93IGhhdmUgdGVtcGxhdGVzIGFuZCB3ZXJlIHdhaXRpbmdcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdlZGl0JyAmJiB0aGlzLmluaXRpYWxDb25kaXRpb25EYXRhICYmICF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5wcmVmaWxsRnJvbUluaXRpYWxEYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVmaWxsRnJvbUluaXRpYWxEYXRhKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbml0aWFsQ29uZGl0aW9uRGF0YSB8fCAhdGhpcy5jb25kaXRpb25UZW1wbGF0ZXM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyB0ZW1wbGF0ZUlkLCBhY3Rpb24sIGRlc2NyaXB0aW9uLCBtZXRhZGF0YSB9ID0gdGhpcy5pbml0aWFsQ29uZGl0aW9uRGF0YTtcblxuICAgIC8vIEZpbmQgbWF0Y2hpbmcgdGVtcGxhdGVcbiAgICBsZXQgdGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZUlkICE9IG51bGwpIHtcbiAgICAgIHRlbXBsYXRlID0gdGhpcy5jb25kaXRpb25UZW1wbGF0ZXMuZmluZChcbiAgICAgICAgdCA9PiBTdHJpbmcodC5pZCkgPT09IFN0cmluZyh0ZW1wbGF0ZUlkKSB8fCB0LmRpc3BsYXlOYW1lID09PSBTdHJpbmcodGVtcGxhdGVJZClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGVtcGxhdGUgJiYgYWN0aW9uKSB7XG4gICAgICB0ZW1wbGF0ZSA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzLmZpbmQoXG4gICAgICAgIHQgPT4gdC5uYXR1cmFsVGV4dCA9PT0gYWN0aW9uIHx8IHQuaHRtbEdyYW1tYXIgPT09IGFjdGlvbiB8fCB0LmRpc3BsYXlOYW1lID09PSBhY3Rpb25cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICBjb25zdCBzZWxlY3RJZCA9IHRlbXBsYXRlLmlkPy50b1N0cmluZygpIHx8IHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8ICcnO1xuICAgICAgdGhpcy5jb25kaXRpb25Gb3JtPy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHNlbGVjdElkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcblxuICAgICAgLy8gR2V0IGZyZXNoIHZhcmlhYmxlcyBzdHJ1Y3R1cmUgd2l0aCBzYXZlZCB2YWx1ZXMgYnkgcGFzc2luZyB0aGUgcmF3IHN0ZXBcbiAgICAgIGNvbnN0IHZhcnMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKHRlbXBsYXRlLCB0aGlzLmVkaXRUZXN0U3RlcCk7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdmFycztcblxuICAgICAgdGhpcy5idWlsZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgIHRoaXMudXBkYXRlSHRtbEdyYW1tYXIoKTtcblxuICAgICAgLy8gQWR2YW5jZWQgdmFyaWFibGVzXG4gICAgICBpZiAodGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyh0ZW1wbGF0ZSwgdGhpcy5lZGl0VGVzdFN0ZXApO1xuICAgICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlc2NyaXB0aW9uKSB0aGlzLmNvbmRpdGlvbkZvcm0/LmdldCgnZGVzY3JpcHRpb24nKT8uc2V0VmFsdWUoZGVzY3JpcHRpb24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBpZiAobWV0YWRhdGEpIHRoaXMuY29uZGl0aW9uRm9ybT8uZ2V0KCdtZXRhZGF0YScpPy5zZXRWYWx1ZShtZXRhZGF0YSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZUNvbmZpZ0NhY2hlKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdHM6IFNlbGVjdE9wdGlvbltdID0gKHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzIHx8IFtdKS5tYXAodCA9PiAoe1xuICAgICAgaWQ6IHQuaWQ/LnRvU3RyaW5nKCkgfHwgdC5kaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIHZhbHVlOiB0LmlkPy50b1N0cmluZygpIHx8IHQuZGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBuYW1lOiB0Lmh0bWxHcmFtbWFyIHx8IHQubmF0dXJhbFRleHQgfHwgJycsXG4gICAgICBsYWJlbDogdC5odG1sR3JhbW1hciB8fCB0Lm5hdHVyYWxUZXh0IHx8ICcnXG4gICAgfSkpO1xuICAgIHRoaXMudmFsdWVDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IENvbmRpdGlvbiBUZW1wbGF0ZSonLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIGRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0c1xuICAgIH07XG4gIH1cblxuICBnZXRWYWx1ZUNvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGlmICh0aGlzLnZhbHVlQ29uZmlnV2l0aEhhbmRsZXIpIHJldHVybiB0aGlzLnZhbHVlQ29uZmlnV2l0aEhhbmRsZXI7XG4gICAgaWYgKCF0aGlzLnZhbHVlQ29uZmlnQ2FjaGUpIHRoaXMudXBkYXRlVmFsdWVDb25maWdDYWNoZSgpO1xuICAgIHRoaXMudmFsdWVDb25maWdXaXRoSGFuZGxlciA9IHtcbiAgICAgIC4uLnRoaXMudmFsdWVDb25maWdDYWNoZSEsXG4gICAgICBvbkNoYW5nZTogKHY6IGFueSkgPT4gdGhpcy5vblRlbXBsYXRlVmFsdWVDaGFuZ2UodilcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnZhbHVlQ29uZmlnV2l0aEhhbmRsZXI7XG4gIH1cblxuICBvblRlbXBsYXRlVmFsdWVDaGFuZ2UodGVtcGxhdGVJZDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmNvbmRpdGlvblRlbXBsYXRlcy5maW5kKFxuICAgICAgdCA9PiBTdHJpbmcodC5pZCkgPT09IFN0cmluZyh0ZW1wbGF0ZUlkKSB8fCB0LmRpc3BsYXlOYW1lID09PSBTdHJpbmcodGVtcGxhdGVJZClcbiAgICApO1xuICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyh0ZW1wbGF0ZSk7XG4gICAgICB0aGlzLmJ1aWxkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICAgICAgaWYgKHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgPSB0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXModGVtcGxhdGUpO1xuICAgICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICB0aGlzLmNsZWFyVmFyaWFibGVzRm9ybSgpO1xuICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW107XG4gICAgICB0aGlzLmNsZWFyQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMudmFyaWFibGVzRm9ybS5sZW5ndGgpIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZS5uYW1lXSxcbiAgICAgICAgdmFsdWU6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICAgIGxhYmVsOiBbdmFyaWFibGUubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGUub3B0aW9ucyB8fCBbXV1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGFiZWwgPSB2YXJpYWJsZS5sYWJlbD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChsYWJlbCA9PT0gJ3Rlc3QtZGF0YScgfHwgbGFiZWwgPT09ICdzb3VyY2UtdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0LXZhbHVlJyB8fFxuICAgICAgICAgIGxhYmVsID09PSAnc291cmNlX3ZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcoZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSBkYXRhVHlwZSA9ICdwYXJhbWV0ZXInO1xuICAgICAgICBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIGRhdGFUeXBlID0gJ3J1bnRpbWUnO1xuICAgICAgICBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIGRhdGFUeXBlID0gJ2Vudmlyb25tZW50JztcbiAgICAgICAgZ3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVR5cGUpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKGdyb3VwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoKSB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGgpIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IEFycmF5LmlzQXJyYXkodmFyaWFibGUudmFsdWUpID8gdmFyaWFibGUudmFsdWUgOiBbXTtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdGhpcy5mYi5hcnJheShhcnIubGVuZ3RoID4gMCA/IGFyci5tYXAoKGk6IHN0cmluZykgPT4gdGhpcy5mYi5jb250cm9sKGkpKSA6IFt0aGlzLmZiLmNvbnRyb2woJycpXSk7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ucHVzaChncm91cCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGgpIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVIdG1sR3JhbW1hcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZT8uaHRtbEdyYW1tYXIpIHsgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJzsgcmV0dXJuOyB9XG4gICAgaWYgKHRoaXMuY29tcHV0ZUh0bWxHcmFtbWFyRm4pIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGhpcy5jb21wdXRlSHRtbEdyYW1tYXJGbih0aGlzLnNlbGVjdGVkVGVtcGxhdGUsIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZyA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZS5odG1sR3JhbW1hcjtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godiA9PiB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYDxzcGFuW14+XSpkYXRhLWV2ZW50LWtleT1cIiR7di5uYW1lfVwiW14+XSo+Lio/PC9zcGFuPmAsICdnaScpO1xuICAgICAgY29uc3QgZXNjYXBlZCA9IFN0cmluZyh2LnZhbHVlIHx8ICcnKS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gICAgICBnID0gZy5yZXBsYWNlKHJlLCBlc2NhcGVkKTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9IGc7XG4gIH1cblxuICBnZXQgY3VycmVudEh0bWxHcmFtbWFyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyIHx8IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZT8uaHRtbEdyYW1tYXIgfHwgdGhpcy5zZWxlY3RlZFRlbXBsYXRlPy5uYXR1cmFsVGV4dCB8fCAnJztcbiAgfVxuXG4gIGdldFRlbXBsYXRlVmFyaWFibGVzKCk6IGFueVtdIHsgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM7IH1cbiAgZ2V0VmFyaWFibGVzRm9ybSgpOiBGb3JtQXJyYXkgeyByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtOyB9XG4gIGdldEFkdmFuY2VkVmFyaWFibGVzKCk6IGFueVtdIHsgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczsgfVxuICBnZXRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTogRm9ybUFycmF5IHsgcmV0dXJuIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtOyB9XG4gIGdldCBpc0FkdmFuY2VkRXhwYW5kZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7IH1cbiAgdG9nZ2xlQWR2YW5jZWQoKTogdm9pZCB7IHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpOyB9XG4gIGdldCBoYXNTZWxlY3RlZFRlbXBsYXRlKCk6IEFjdGlvblRlbXBsYXRlIHwgbnVsbCB7IHJldHVybiB0aGlzLnNlbGVjdGVkVGVtcGxhdGU7IH1cblxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh0diA9PiB0di5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAodikgdi52YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoYyA9PiBjLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gbmFtZSk7XG4gICAgaWYgKGlkeCAhPT0gLTEpIHRoaXMudmFyaWFibGVzRm9ybS5hdChpZHgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUh0bWxHcmFtbWFyKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblZhcmlhYmxlQm9vbGVhbkNoYW5nZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UobmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgb25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHR2ID0+IHR2Lm5hbWUgPT09IG5hbWUpO1xuICAgIGlmICh2KSB2LnZhbHVlID0gdmFsdWU7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KGMgPT4gYy5nZXQoJ25hbWUnKT8udmFsdWUgPT09IG5hbWUpO1xuICAgIGlmIChpZHggIT09IC0xICYmIHY/LnR5cGUgIT09ICdzdHJfbGlzdCcpIHtcbiAgICAgICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdChpZHgpIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UobmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMub25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UobmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgaXNGb3JtVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvbkZvcm0udmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5ldmVyeSh2ID0+IHtcbiAgICAgIGlmICh2LmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2LmRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IHYuZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgdi5kYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICByZXR1cm4gdi52YWx1ZSAhPT0gbnVsbCAmJiB2LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdi52YWx1ZSAhPT0gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQgeyB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7IH1cblxuICBvblNhdmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHJldHVybjtcbiAgICAvLyBTeW5jIGFkdmFuY2VkIGZvcm0gdmFsdWVzIGJhY2sgdG8gYXJyYXlcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGkpID0+IHtcbiAgICAgIGNvbnN0IGZnID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQoaSkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKCFmZykgcmV0dXJuO1xuICAgICAgY29uc3QgZnYgPSBmZy5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdzdHJfbGlzdCcgJiYgZnYgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmdi5jb250cm9scy5tYXAoYyA9PiBjLnZhbHVlKS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWw/LnRyaW0oKSAhPT0gJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmdjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2F2ZS5lbWl0KHtcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogWy4uLnRoaXMudGVtcGxhdGVWYXJpYWJsZXNdLFxuICAgICAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogWy4uLnRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc10sXG4gICAgICBhY3Rpb246IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZT8ubmF0dXJhbFRleHQgfHwgdGhpcy5zZWxlY3RlZFRlbXBsYXRlPy5odG1sR3JhbW1hciB8fCAnJyxcbiAgICAgIHJlc29sdmVkQWN0aW9uOiB0aGlzLmN1cnJlbnRIdG1sR3JhbW1hcixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmRpdGlvbkZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpPy52YWx1ZSB8fCAnJyxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLmNvbmRpdGlvbkZvcm0uZ2V0KCdtZXRhZGF0YScpPy52YWx1ZSB8fCAnJyxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktMlwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItNFwiPlxuICAgIHt7IHRpdGxlIH19XG4gIDwvaDI+XG5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICA8IS0tIENvbmRpdGlvbiBCdWlsZGVyIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1tYi02XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTNcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgICAgQ29uZGl0aW9uIEJ1aWxkZXJcbiAgICAgICAgPC9oMz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNpbmdsZSBDb25kaXRpb24gUm93IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIiBbZm9ybUdyb3VwXT1cImNvbmRpdGlvbkZvcm1cIj5cbiAgICAgICAgPCEtLSBDb25kaXRpb24gTGFiZWwgKyBUZW1wbGF0ZSBEcm9wZG93biAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPCEtLSBMYWJlbCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkXCI+XG4gICAgICAgICAgICB7eyBjb25kaXRpb25Sb3dMYWJlbCB9fVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBWYWx1ZSBUZW1wbGF0ZSBEcm9wZG93biAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctWzE1MHB4XSBjcWEtdGV4dC1bMTBweF1cIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiY29uZGl0aW9uRm9ybVwiIFtjb25maWddPVwiZ2V0VmFsdWVDb25maWcoKVwiPlxuICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVGVtcGxhdGUgVmFyaWFibGVzIFNlY3Rpb24gKHNob3duIHdoZW4gdGVtcGxhdGUgaXMgc2VsZWN0ZWQpIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRUZW1wbGF0ZVwiIGNsYXNzPVwiY3FhLW10LTJcIj5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIEdyYW1tYXIgRGlzcGxheSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZmxleC13cmFwIGNxYS1nYXAtMSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hY3Rpb24tZm9ybWF0IGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJjdXJyZW50SHRtbEdyYW1tYXJcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUZW1wbGF0ZSBWYXJpYWJsZXMgRm9ybSAtLT5cbiAgICAgICAgICA8Y3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO1wiXG4gICAgICAgICAgICBbdGVtcGxhdGVWYXJpYWJsZXNdPVwiZ2V0VGVtcGxhdGVWYXJpYWJsZXMoKVwiXG4gICAgICAgICAgICBbdmFyaWFibGVzRm9ybV09XCJnZXRWYXJpYWJsZXNGb3JtKClcIlxuICAgICAgICAgICAgW21ldGFkYXRhXT1cImNvbmRpdGlvbkZvcm0uZ2V0KCdtZXRhZGF0YScpPy52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiY29uZGl0aW9uRm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJyk/LnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZUVsZW1lbnRzXT1cImhhc01vcmVFbGVtZW50c1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICBbcGFyYW1ldGVyT3B0aW9uc109XCJwYXJhbWV0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlUGFyYW1ldGVyc109XCJoYXNNb3JlUGFyYW1ldGVyc1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nUGFyYW1ldGVyc109XCJpc0xvYWRpbmdQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgIFtlbnZpcm9ubWVudE9wdGlvbnNdPVwiZW52aXJvbm1lbnRPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlRW52aXJvbm1lbnRzXT1cImhhc01vcmVFbnZpcm9ubWVudHNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ0Vudmlyb25tZW50c109XCJpc0xvYWRpbmdFbnZpcm9ubWVudHNcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleFwiXG4gICAgICAgICAgICAodmFyaWFibGVWYWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAobWV0YWRhdGFDaGFuZ2UpPVwiY29uZGl0aW9uRm9ybS5nZXQoJ21ldGFkYXRhJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cImNvbmRpdGlvbkZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZUVsZW1lbnRzKT1cImxvYWRNb3JlRWxlbWVudHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbGVtZW50cyk9XCJzZWFyY2hFbGVtZW50cy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lKT1cInNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY3JlYXRlRWxlbWVudCk9XCJjcmVhdGVFbGVtZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoU2NyZWVuTmFtZSk9XCJzZWFyY2hTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVTY3JlZW5OYW1lcyk9XCJsb2FkTW9yZVNjcmVlbk5hbWVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QpPVwiY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWFyY2hQYXJhbWV0ZXJzKT1cInNlYXJjaFBhcmFtZXRlcnMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZVBhcmFtZXRlcnMpPVwibG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKVwiXG4gICAgICAgICAgICAoc2VhcmNoRW52aXJvbm1lbnRzKT1cInNlYXJjaEVudmlyb25tZW50cy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlRW52aXJvbm1lbnRzKT1cImxvYWRNb3JlRW52aXJvbm1lbnRzLmVtaXQoKVwiPlxuICAgICAgICAgIDwvY3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtPlxuXG4gICAgICAgICAgPCEtLSBBZHZhbmNlZCBTZXR0aW5ncyBWYXJpYWJsZXMgRm9ybSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0QWR2YW5jZWRWYXJpYWJsZXMoKS5sZW5ndGggPiAwXCIgY2xhc3M9XCJjcWEtbXQtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW1iLTEuNVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFkdmFuY2VkKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiaXNBZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgICBleHBhbmRfbW9yZVxuICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNBZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxjcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm1cbiAgICAgICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJnZXRBZHZhbmNlZFZhcmlhYmxlcygpXCJcbiAgICAgICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlRm9ybV09XCJnZXRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKVwiXG4gICAgICAgICAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgKHZhcmlhYmxlVmFsdWVDaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWdhcC0yIGNxYS1tdC1hdXRvIGNxYS1wdC00IGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2FuY2VsXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b24gKm5nSWY9XCIhaXNTYXZpbmdcIiBjbGFzcz1cImNxYS13LTEvMlwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBbdGV4dF09XCJzYXZlQnV0dG9uTGFiZWxcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhaXNGb3JtVmFsaWQoKVwiXG4gICAgICAoY2xpY2tlZCk9XCJvblNhdmUoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNTYXZpbmdcIiBjbGFzcz1cImNxYS13LTEvMiBjcWEtZmxleC0xIGNxYS1taW4taC1bMzhweF0gY3FhLXJvdW5kZWQtWzhweF1cIj5cbiAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJTYXZpbmfigKZcIiBpY29uPVwiYXV0b3JlbmV3XCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIFtpbmxpbmVTdHlsZXNdPVwiJ21pbi1oZWlnaHQ6IDM4cHg7IGhlaWdodDogMzhweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7J1wiXG4gICAgICAgIHZhcmlhbnQ9XCJpbmZvXCIgc2l6ZT1cIm1lZGl1bVwiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|