@cqa-lib/cqa-ui 1.1.167 → 1.1.169
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/step-builder/step-builder-action/step-builder-action.component.mjs +7 -4
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +391 -0
- package/esm2020/lib/ui-kit.module.mjs +14 -5
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +384 -8
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +401 -8
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +2 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +114 -0
- package/lib/ui-kit.module.d.ts +21 -19
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { FormGroup, FormControl } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../segment-control/segment-control.component";
|
|
5
|
+
import * as i2 from "../../dynamic-select/dynamic-select-field.component";
|
|
6
|
+
import * as i3 from "../../custom-input/custom-input.component";
|
|
7
|
+
import * as i4 from "../step-builder-action/step-builder-action.component";
|
|
8
|
+
import * as i5 from "../../button/button.component";
|
|
9
|
+
import * as i6 from "@angular/common";
|
|
10
|
+
export class StepBuilderLoopComponent {
|
|
11
|
+
constructor() {
|
|
12
|
+
/** Currently selected loop type */
|
|
13
|
+
this.loopType = 'for';
|
|
14
|
+
/** Options for the select option dropdown */
|
|
15
|
+
this.selectOptions = [
|
|
16
|
+
{ value: 'dataProfile', label: 'Data Profile' },
|
|
17
|
+
{ value: 'runTime', label: 'Run Time' }
|
|
18
|
+
];
|
|
19
|
+
/** Options for the data profile dropdown - accepts DataProfileOption objects */
|
|
20
|
+
this.dataProfileOptions = [];
|
|
21
|
+
/** Indicates if more data profiles are available for loading */
|
|
22
|
+
this.hasMoreDataProfiles = false;
|
|
23
|
+
/** Loading state for data profiles */
|
|
24
|
+
this.isLoadingDataProfiles = false;
|
|
25
|
+
/** Function to handle variable processing or custom logic. Can be passed from parent component. */
|
|
26
|
+
this.setWhileTemplateVariables = () => { return []; };
|
|
27
|
+
/** Emit when step is created */
|
|
28
|
+
this.createStep = new EventEmitter();
|
|
29
|
+
/** Emit when cancelled */
|
|
30
|
+
this.cancelled = new EventEmitter();
|
|
31
|
+
/** Emit when loop type changes */
|
|
32
|
+
this.loopTypeChange = new EventEmitter();
|
|
33
|
+
/** Emit when more data profiles need to be loaded */
|
|
34
|
+
this.loadMoreDataProfiles = new EventEmitter();
|
|
35
|
+
/** Emit when data profile search query changes */
|
|
36
|
+
this.searchDataProfiles = new EventEmitter();
|
|
37
|
+
this.whileTemplates = [];
|
|
38
|
+
this.whileSearchPlaceholder = 'Search While';
|
|
39
|
+
this.whileSearchValue = '';
|
|
40
|
+
this.selectedWhileTemplate = null;
|
|
41
|
+
this.selectedLoopType = 'for';
|
|
42
|
+
// Internal state for managing loop indices
|
|
43
|
+
this.selectedDataProfile = null;
|
|
44
|
+
this.startArray = [];
|
|
45
|
+
this.endArray = [];
|
|
46
|
+
// Initialize single FormGroup with all fields
|
|
47
|
+
this.loopForm = new FormGroup({
|
|
48
|
+
selectOption: new FormControl(null),
|
|
49
|
+
dataProfile: new FormControl(null),
|
|
50
|
+
loopStart: new FormControl(null),
|
|
51
|
+
loopEnd: new FormControl(null),
|
|
52
|
+
runTime: new FormControl(null)
|
|
53
|
+
});
|
|
54
|
+
// Initialize configs
|
|
55
|
+
this.selectOptionConfig = {
|
|
56
|
+
key: 'selectOption',
|
|
57
|
+
placeholder: 'select option',
|
|
58
|
+
selectedValue: 'dataProfile',
|
|
59
|
+
multiple: false,
|
|
60
|
+
searchable: false,
|
|
61
|
+
options: this.selectOptions
|
|
62
|
+
};
|
|
63
|
+
this.dataProfileConfig = {
|
|
64
|
+
key: 'dataProfile',
|
|
65
|
+
placeholder: 'data profile',
|
|
66
|
+
multiple: false,
|
|
67
|
+
searchable: true,
|
|
68
|
+
serverSearch: true,
|
|
69
|
+
hasMore: this.hasMoreDataProfiles,
|
|
70
|
+
isLoading: this.isLoadingDataProfiles,
|
|
71
|
+
options: [],
|
|
72
|
+
onChange: (value) => {
|
|
73
|
+
this.onDataProfileChange(value);
|
|
74
|
+
},
|
|
75
|
+
onSearch: (query) => {
|
|
76
|
+
this.onSearchDataProfiles(query);
|
|
77
|
+
},
|
|
78
|
+
onLoadMore: (query) => {
|
|
79
|
+
this.loadMoreDataProfiles.emit(query || '');
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
this.loopStartConfig = {
|
|
83
|
+
key: 'loopStart',
|
|
84
|
+
placeholder: 'loop start',
|
|
85
|
+
multiple: false,
|
|
86
|
+
searchable: false,
|
|
87
|
+
options: [],
|
|
88
|
+
onChange: (value) => {
|
|
89
|
+
this.onLoopStartChange(value);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
this.loopEndConfig = {
|
|
93
|
+
key: 'loopEnd',
|
|
94
|
+
placeholder: 'loop end',
|
|
95
|
+
multiple: false,
|
|
96
|
+
searchable: false,
|
|
97
|
+
options: [],
|
|
98
|
+
onChange: (value) => {
|
|
99
|
+
// Handle change if needed
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
ngOnInit() {
|
|
104
|
+
this.selectedLoopType = this.loopType;
|
|
105
|
+
this.updateConfigs();
|
|
106
|
+
}
|
|
107
|
+
ngOnChanges(changes) {
|
|
108
|
+
console.log("this.whileTemplates", this.whileTemplates);
|
|
109
|
+
if (changes['selectOptions']) {
|
|
110
|
+
this.updateConfigs();
|
|
111
|
+
}
|
|
112
|
+
if (changes['dataProfileOptions']) {
|
|
113
|
+
this.updateConfigs();
|
|
114
|
+
// If a data profile is already selected, update loop indices
|
|
115
|
+
const currentProfileId = this.loopForm.get('dataProfile')?.value;
|
|
116
|
+
if (currentProfileId) {
|
|
117
|
+
this.onDataProfileChange(currentProfileId);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (changes['hasMoreDataProfiles'] || changes['isLoadingDataProfiles']) {
|
|
121
|
+
this.updateDataProfileConfig();
|
|
122
|
+
}
|
|
123
|
+
if (changes['loopType']) {
|
|
124
|
+
this.selectedLoopType = this.loopType;
|
|
125
|
+
}
|
|
126
|
+
// Note: loopStartOptions and loopEndOptions are now calculated dynamically
|
|
127
|
+
// so they don't need to be updated from inputs
|
|
128
|
+
}
|
|
129
|
+
updateConfigs() {
|
|
130
|
+
// Convert DataProfileOption[] to SelectOption[]
|
|
131
|
+
this.dataProfileConfig = {
|
|
132
|
+
...this.dataProfileConfig,
|
|
133
|
+
options: this.convertDataProfileOptionsToSelectOptions(this.dataProfileOptions),
|
|
134
|
+
hasMore: this.hasMoreDataProfiles,
|
|
135
|
+
isLoading: this.isLoadingDataProfiles,
|
|
136
|
+
onChange: (value) => {
|
|
137
|
+
this.onDataProfileChange(value);
|
|
138
|
+
},
|
|
139
|
+
onSearch: (query) => {
|
|
140
|
+
this.onSearchDataProfiles(query);
|
|
141
|
+
},
|
|
142
|
+
onLoadMore: (query) => {
|
|
143
|
+
this.loadMoreDataProfiles.emit(query || '');
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
// Loop start and end options are updated when data profile is selected
|
|
147
|
+
this.updateLoopIndexOptions();
|
|
148
|
+
}
|
|
149
|
+
convertDataProfileOptionsToSelectOptions(options) {
|
|
150
|
+
return options.map(option => ({
|
|
151
|
+
id: option.id,
|
|
152
|
+
value: option.id,
|
|
153
|
+
name: option.name,
|
|
154
|
+
label: option.name
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Handle data profile selection and update loop start/end options
|
|
159
|
+
*/
|
|
160
|
+
onDataProfileChange(profileId) {
|
|
161
|
+
const selectedProfile = this.dataProfileOptions.find(profile => profile.id === profileId || String(profile.id) === String(profileId));
|
|
162
|
+
if (selectedProfile) {
|
|
163
|
+
this.selectedDataProfile = selectedProfile;
|
|
164
|
+
this.updateLoopIndicesFromProfile(selectedProfile);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.selectedDataProfile = null;
|
|
168
|
+
this.startArray = [];
|
|
169
|
+
this.endArray = [];
|
|
170
|
+
this.updateLoopIndexOptions();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Calculate loop indices based on selected data profile
|
|
175
|
+
*/
|
|
176
|
+
updateLoopIndicesFromProfile(profile) {
|
|
177
|
+
// Calculate data length from data array or use provided dataLength
|
|
178
|
+
let dataSetLength = 1;
|
|
179
|
+
if (profile.data && Array.isArray(profile.data)) {
|
|
180
|
+
dataSetLength = profile.data.length;
|
|
181
|
+
}
|
|
182
|
+
else if (profile.dataLength && profile.dataLength > 0) {
|
|
183
|
+
dataSetLength = profile.dataLength;
|
|
184
|
+
}
|
|
185
|
+
// Create start array from 1 to dataSetLength
|
|
186
|
+
this.startArray = Array.from({ length: dataSetLength }, (_, i) => i + 1);
|
|
187
|
+
// Initialize end array same as start array
|
|
188
|
+
// End array will be updated when start index is selected
|
|
189
|
+
this.endArray = [...this.startArray];
|
|
190
|
+
// Set default values if form is empty
|
|
191
|
+
const currentStart = this.loopForm.get('loopStart')?.value;
|
|
192
|
+
const currentEnd = this.loopForm.get('loopEnd')?.value;
|
|
193
|
+
if (!currentStart && this.startArray.length > 0) {
|
|
194
|
+
this.loopForm.get('loopStart')?.setValue(this.startArray[0]);
|
|
195
|
+
}
|
|
196
|
+
if (!currentEnd && this.endArray.length > 0) {
|
|
197
|
+
this.loopForm.get('loopEnd')?.setValue(this.endArray[this.endArray.length - 1]);
|
|
198
|
+
}
|
|
199
|
+
this.updateLoopIndexOptions();
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Handle loop start change and update end options
|
|
203
|
+
*/
|
|
204
|
+
onLoopStartChange(startIndex) {
|
|
205
|
+
if (!this.selectedDataProfile || !startIndex) {
|
|
206
|
+
this.endArray = [...this.startArray];
|
|
207
|
+
this.updateLoopIndexOptions();
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const startIdx = typeof startIndex === 'string' ? parseInt(startIndex) : startIndex;
|
|
211
|
+
if (isNaN(startIdx) || startIdx < 1) {
|
|
212
|
+
this.endArray = [...this.startArray];
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// End array should be from startIndex to end of data
|
|
216
|
+
// Based on reference: endArray = startArray.splice(startIndex - 1, startArray.length)
|
|
217
|
+
const startArrayCopy = [...this.startArray];
|
|
218
|
+
this.endArray = startArrayCopy.slice(startIdx - 1);
|
|
219
|
+
}
|
|
220
|
+
// Auto-update end index if current end is invalid
|
|
221
|
+
const currentEnd = this.loopForm.get('loopEnd')?.value;
|
|
222
|
+
const endIdx = typeof currentEnd === 'string' ? parseInt(currentEnd) : currentEnd;
|
|
223
|
+
if (!currentEnd || isNaN(endIdx) || endIdx < startIdx) {
|
|
224
|
+
if (this.endArray.length > 0) {
|
|
225
|
+
this.loopForm.get('loopEnd')?.setValue(this.endArray[this.endArray.length - 1]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
this.updateLoopIndexOptions();
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Update loop start and end config options
|
|
232
|
+
*/
|
|
233
|
+
updateLoopIndexOptions() {
|
|
234
|
+
// Convert startArray to SelectOptions
|
|
235
|
+
const startOptions = this.startArray.map(idx => ({
|
|
236
|
+
id: idx,
|
|
237
|
+
value: idx,
|
|
238
|
+
name: String(idx),
|
|
239
|
+
label: String(idx)
|
|
240
|
+
}));
|
|
241
|
+
// Convert endArray to SelectOptions
|
|
242
|
+
const endOptions = this.endArray.map(idx => ({
|
|
243
|
+
id: idx,
|
|
244
|
+
value: idx,
|
|
245
|
+
name: String(idx),
|
|
246
|
+
label: String(idx)
|
|
247
|
+
}));
|
|
248
|
+
this.loopStartConfig = {
|
|
249
|
+
...this.loopStartConfig,
|
|
250
|
+
options: [{ id: -1, value: -1, name: 'Start', label: 'Start' }, ...startOptions],
|
|
251
|
+
onChange: (value) => {
|
|
252
|
+
this.onLoopStartChange(value);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
this.loopEndConfig = {
|
|
256
|
+
...this.loopEndConfig,
|
|
257
|
+
options: [...endOptions, { id: -1, value: -1, name: 'End', label: 'End' }],
|
|
258
|
+
onChange: (value) => {
|
|
259
|
+
// Handle change if needed
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
onLoopTypeChange(type) {
|
|
264
|
+
const loopType = type;
|
|
265
|
+
this.selectedLoopType = loopType;
|
|
266
|
+
this.loopTypeChange.emit(loopType);
|
|
267
|
+
}
|
|
268
|
+
onCancel() {
|
|
269
|
+
this.resetForm();
|
|
270
|
+
this.cancelled.emit();
|
|
271
|
+
}
|
|
272
|
+
onCreateStep() {
|
|
273
|
+
const formValue = this.loopForm.value;
|
|
274
|
+
if (this.selectedLoopType === 'while') {
|
|
275
|
+
if (!this.selectedWhileTemplate) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const stepData = {
|
|
280
|
+
selectedLoopType: this.selectedLoopType,
|
|
281
|
+
loopType: this.selectedLoopType,
|
|
282
|
+
selectOption: formValue.selectOption || undefined,
|
|
283
|
+
dataProfile: formValue.dataProfile || undefined,
|
|
284
|
+
loopStart: formValue.loopStart || undefined,
|
|
285
|
+
loopEnd: formValue.loopEnd || undefined,
|
|
286
|
+
runTime: formValue.runTime || undefined,
|
|
287
|
+
whileTemplate: this.selectedWhileTemplate || undefined
|
|
288
|
+
};
|
|
289
|
+
console.log('stepData', stepData);
|
|
290
|
+
this.createStep.emit(stepData);
|
|
291
|
+
}
|
|
292
|
+
createWhileStep(event) {
|
|
293
|
+
console.log('createWhileStep', event);
|
|
294
|
+
const stepData = {
|
|
295
|
+
selectedLoopType: this.selectedLoopType,
|
|
296
|
+
loopType: this.selectedLoopType,
|
|
297
|
+
event: event
|
|
298
|
+
};
|
|
299
|
+
console.log('stepData', stepData);
|
|
300
|
+
this.createStep.emit(stepData);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Handle search event for data profiles
|
|
304
|
+
*/
|
|
305
|
+
onSearchDataProfiles(query) {
|
|
306
|
+
this.searchDataProfiles.emit(query);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Handle loadMore event for data profiles
|
|
310
|
+
*/
|
|
311
|
+
onLoadMoreDataProfiles(event) {
|
|
312
|
+
this.loadMoreDataProfiles.emit(event.query);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Update data profile config when loading state or hasMore changes
|
|
316
|
+
*/
|
|
317
|
+
updateDataProfileConfig() {
|
|
318
|
+
if (this.dataProfileConfig) {
|
|
319
|
+
this.dataProfileConfig = {
|
|
320
|
+
...this.dataProfileConfig,
|
|
321
|
+
hasMore: this.hasMoreDataProfiles,
|
|
322
|
+
isLoading: this.isLoadingDataProfiles
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
resetForm() {
|
|
327
|
+
this.selectedLoopType = 'for';
|
|
328
|
+
this.selectedDataProfile = null;
|
|
329
|
+
this.startArray = [];
|
|
330
|
+
this.endArray = [];
|
|
331
|
+
this.loopForm.reset({
|
|
332
|
+
selectOption: null,
|
|
333
|
+
dataProfile: null,
|
|
334
|
+
loopStart: null,
|
|
335
|
+
loopEnd: null
|
|
336
|
+
});
|
|
337
|
+
this.updateLoopIndexOptions();
|
|
338
|
+
}
|
|
339
|
+
onWhileSearchChange(event) {
|
|
340
|
+
this.whileSearchValue = event;
|
|
341
|
+
this.filterWhileTemplates(event);
|
|
342
|
+
}
|
|
343
|
+
onWhileSearchSubmit(event) {
|
|
344
|
+
this.onWhileSearchChange(event);
|
|
345
|
+
}
|
|
346
|
+
onWhileSearchCleared() {
|
|
347
|
+
this.whileSearchValue = '';
|
|
348
|
+
this.filterWhileTemplates('');
|
|
349
|
+
}
|
|
350
|
+
filterWhileTemplates(query) {
|
|
351
|
+
this.whileTemplates = this.whileTemplates.filter(template => template.htmlGrammar.toLowerCase().includes(query.toLowerCase()) || template.naturalText.toLowerCase().includes(query.toLowerCase()));
|
|
352
|
+
}
|
|
353
|
+
selectWhileTemplate(template) {
|
|
354
|
+
this.selectedWhileTemplate = template;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
StepBuilderLoopComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
358
|
+
StepBuilderLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderLoopComponent, selector: "cqa-step-builder-loop", inputs: { loopType: "loopType", selectOptions: "selectOptions", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", setWhileTemplateVariables: "setWhileTemplateVariables", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles" }, 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 Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4\">\n <cqa-segment-control\n [segments]=\"[\n { label: 'For', value: 'for' },\n { label: 'While', value: 'while' }\n ]\"\n [value]=\"selectedLoopType\"\n (valueChange)=\"onLoopTypeChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action [showHeader]=\"false\" [templates]=\"whileTemplates\" [setTemplateVariables]=\"setWhileTemplateVariables\" [searchPlaceholder]=\"whileSearchPlaceholder\" (templateChanged)=\"selectWhileTemplate($event)\" (createStep)=\"createWhileStep($event)\"></cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", components: [{ type: i1.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled"], outputs: ["valueChange"] }, { type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "templates", "searchPlaceholder", "setTemplateVariables", "preventSelectTemplate"], outputs: ["templateChanged", "createStep", "cancelled"] }, { type: i5.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
359
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, decorators: [{
|
|
360
|
+
type: Component,
|
|
361
|
+
args: [{ selector: 'cqa-step-builder-loop', host: { class: 'cqa-ui-root' }, 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 Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4\">\n <cqa-segment-control\n [segments]=\"[\n { label: 'For', value: 'for' },\n { label: 'While', value: 'while' }\n ]\"\n [value]=\"selectedLoopType\"\n (valueChange)=\"onLoopTypeChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action [showHeader]=\"false\" [templates]=\"whileTemplates\" [setTemplateVariables]=\"setWhileTemplateVariables\" [searchPlaceholder]=\"whileSearchPlaceholder\" (templateChanged)=\"selectWhileTemplate($event)\" (createStep)=\"createWhileStep($event)\"></cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", styles: [] }]
|
|
362
|
+
}], ctorParameters: function () { return []; }, propDecorators: { loopType: [{
|
|
363
|
+
type: Input
|
|
364
|
+
}], selectOptions: [{
|
|
365
|
+
type: Input
|
|
366
|
+
}], dataProfileOptions: [{
|
|
367
|
+
type: Input
|
|
368
|
+
}], hasMoreDataProfiles: [{
|
|
369
|
+
type: Input
|
|
370
|
+
}], isLoadingDataProfiles: [{
|
|
371
|
+
type: Input
|
|
372
|
+
}], setWhileTemplateVariables: [{
|
|
373
|
+
type: Input
|
|
374
|
+
}], createStep: [{
|
|
375
|
+
type: Output
|
|
376
|
+
}], cancelled: [{
|
|
377
|
+
type: Output
|
|
378
|
+
}], loopTypeChange: [{
|
|
379
|
+
type: Output
|
|
380
|
+
}], loadMoreDataProfiles: [{
|
|
381
|
+
type: Output
|
|
382
|
+
}], searchDataProfiles: [{
|
|
383
|
+
type: Output
|
|
384
|
+
}], whileTemplates: [{
|
|
385
|
+
type: Input
|
|
386
|
+
}], whileSearchPlaceholder: [{
|
|
387
|
+
type: Input
|
|
388
|
+
}], whileSearchValue: [{
|
|
389
|
+
type: Input
|
|
390
|
+
}] } });
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7QUFxQ3hELE1BQU0sT0FBTyx3QkFBd0I7SUF3RG5DO1FBdkRBLG1DQUFtQztRQUMxQixhQUFRLEdBQWEsS0FBSyxDQUFDO1FBRXBDLDZDQUE2QztRQUNwQyxrQkFBYSxHQUFVO1lBQzlCLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFDO1lBQzdDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFDO1NBQ3RDLENBQUM7UUFFRixnRkFBZ0Y7UUFDdkUsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQUV0RCxnRUFBZ0U7UUFDdkQsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBRTlDLHNDQUFzQztRQUM3QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDaEQsbUdBQW1HO1FBQzFGLDhCQUF5QixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUU1RixnQ0FBZ0M7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBRXhELDBCQUEwQjtRQUNoQixj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QUFsQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUdHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRSxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3Rpb25UZW1wbGF0ZSB9IGZyb20gJy4uL3N0ZXAtYnVpbGRlci1hY3Rpb24vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBMb29wVHlwZSA9ICdmb3InIHwgJ3doaWxlJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGRhdGEgcHJvZmlsZSBvcHRpb25cbiAqIEJhc2VkIG9uIFRlc3REYXRhIG1vZGVsIHN0cnVjdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFQcm9maWxlT3B0aW9uIHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogQXJyYXkgb2YgZGF0YSBzZXRzIC0gbGVuZ3RoIGRldGVybWluZXMgYXZhaWxhYmxlIGxvb3AgaW5kaWNlcyAqL1xuICBkYXRhPzogYW55W107XG4gIC8qKiBPcHRpb25hbDogZGlyZWN0IGRhdGEgbGVuZ3RoIGlmIGRhdGEgYXJyYXkgaXMgbm90IHByb3ZpZGVkICovXG4gIGRhdGFMZW5ndGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9vcEZvcm1EYXRhIHtcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGU7XG4gIGxvb3BUeXBlOiBMb29wVHlwZTtcbiAgc2VsZWN0T3B0aW9uPzogc3RyaW5nO1xuICBkYXRhUHJvZmlsZT86IHN0cmluZyB8IG51bWJlcjtcbiAgbG9vcFN0YXJ0PzogbnVtYmVyIHwgc3RyaW5nO1xuICBsb29wRW5kPzogbnVtYmVyIHwgc3RyaW5nO1xuICBydW5UaW1lPzogc3RyaW5nO1xuICB3aGlsZVRlbXBsYXRlPzogYW55O1xuICBldmVudD86IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1sb29wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1sb29wLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9XG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyTG9vcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBsb29wIHR5cGUgKi9cbiAgQElucHV0KCkgbG9vcFR5cGU6IExvb3BUeXBlID0gJ2Zvcic7XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBzZWxlY3Qgb3B0aW9uIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIHNlbGVjdE9wdGlvbnM6IGFueVtdID0gW1xuICAgIHt2YWx1ZTogJ2RhdGFQcm9maWxlJywgbGFiZWw6ICdEYXRhIFByb2ZpbGUnfSxcbiAgICB7dmFsdWU6ICdydW5UaW1lJywgbGFiZWw6ICdSdW4gVGltZSd9XG4gIF07XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBkYXRhIHByb2ZpbGUgZHJvcGRvd24gLSBhY2NlcHRzIERhdGFQcm9maWxlT3B0aW9uIG9iamVjdHMgKi9cbiAgQElucHV0KCkgZGF0YVByb2ZpbGVPcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdID0gW107XG5cbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRXaGlsZVRlbXBsYXRlVmFyaWFibGVzOiAodmFyaWFibGVzOiBBY3Rpb25UZW1wbGF0ZSkgPT4gYW55ID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxMb29wRm9ybURhdGE+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdCB3aGVuIGxvb3AgdHlwZSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBsb29wVHlwZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFR5cGU+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBASW5wdXQoKSB3aGlsZVRlbXBsYXRlczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgd2hpbGVTZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBXaGlsZSc7XG4gIEBJbnB1dCgpIHdoaWxlU2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZFdoaWxlVGVtcGxhdGU6IGFueSA9IG51bGw7XG4gIHNlbGVjdGVkTG9vcFR5cGU6IExvb3BUeXBlID0gJ2Zvcic7XG4gIFxuICAvLyBTaW5nbGUgRm9ybUdyb3VwIGNvbnRhaW5pbmcgYWxsIGZvdXIgZmllbGRzXG4gIGxvb3BGb3JtOiBGb3JtR3JvdXA7XG5cbiAgLy8gQ29uZmlncyBmb3IgZHluYW1pYy1zZWxlY3QgY29tcG9uZW50c1xuICBzZWxlY3RPcHRpb25Db25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZGF0YVByb2ZpbGVDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgbG9vcFN0YXJ0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGxvb3BFbmRDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuXG4gIC8vIEludGVybmFsIHN0YXRlIGZvciBtYW5hZ2luZyBsb29wIGluZGljZXNcbiAgcHJpdmF0ZSBzZWxlY3RlZERhdGFQcm9maWxlOiBEYXRhUHJvZmlsZU9wdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXJ0QXJyYXk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZW5kQXJyYXk6IG51bWJlcltdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBzaW5nbGUgRm9ybUdyb3VwIHdpdGggYWxsIGZpZWxkc1xuICAgIHRoaXMubG9vcEZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIHNlbGVjdE9wdGlvbjogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgZGF0YVByb2ZpbGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGxvb3BTdGFydDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgbG9vcEVuZDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgcnVuVGltZTogbmV3IEZvcm1Db250cm9sKG51bGwpXG4gICAgfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbmZpZ3NcbiAgICB0aGlzLnNlbGVjdE9wdGlvbkNvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdE9wdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ3NlbGVjdCBvcHRpb24nLFxuICAgICAgc2VsZWN0ZWRWYWx1ZTogJ2RhdGFQcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5zZWxlY3RPcHRpb25zXG4gICAgfTtcbiAgICB0aGlzLmRhdGFQcm9maWxlQ29uZmlnID0ge1xuICAgICAga2V5OiAnZGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdkYXRhIHByb2ZpbGUnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5IHx8ICcnKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMubG9vcFN0YXJ0Q29uZmlnID0ge1xuICAgICAga2V5OiAnbG9vcFN0YXJ0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnbG9vcCBzdGFydCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Mb29wU3RhcnRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5sb29wRW5kQ29uZmlnID0ge1xuICAgICAga2V5OiAnbG9vcEVuZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ2xvb3AgZW5kJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZSBpZiBuZWVkZWRcbiAgICAgIH1cbiAgICB9OyAgXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSB0aGlzLmxvb3BUeXBlO1xuICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwidGhpcy53aGlsZVRlbXBsYXRlc1wiLHRoaXMud2hpbGVUZW1wbGF0ZXMpO1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGF0YVByb2ZpbGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuICAgICAgLy8gSWYgYSBkYXRhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgdXBkYXRlIGxvb3AgaW5kaWNlc1xuICAgICAgY29uc3QgY3VycmVudFByb2ZpbGVJZCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdkYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgIGlmIChjdXJyZW50UHJvZmlsZUlkKSB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZShjdXJyZW50UHJvZmlsZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hhc01vcmVEYXRhUHJvZmlsZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdEYXRhUHJvZmlsZXMnXSkge1xuICAgICAgdGhpcy51cGRhdGVEYXRhUHJvZmlsZUNvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbG9vcFR5cGUnXSkge1xuICAgICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gdGhpcy5sb29wVHlwZTtcbiAgICB9XG4gICAgLy8gTm90ZTogbG9vcFN0YXJ0T3B0aW9ucyBhbmQgbG9vcEVuZE9wdGlvbnMgYXJlIG5vdyBjYWxjdWxhdGVkIGR5bmFtaWNhbGx5XG4gICAgLy8gc28gdGhleSBkb24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQgZnJvbSBpbnB1dHNcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29uZmlncygpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IERhdGFQcm9maWxlT3B0aW9uW10gdG8gU2VsZWN0T3B0aW9uW11cbiAgICB0aGlzLmRhdGFQcm9maWxlQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5kYXRhUHJvZmlsZUNvbmZpZyxcbiAgICAgIG9wdGlvbnM6IHRoaXMuY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyh0aGlzLmRhdGFQcm9maWxlT3B0aW9ucyksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkgfHwgJycpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gTG9vcCBzdGFydCBhbmQgZW5kIG9wdGlvbnMgYXJlIHVwZGF0ZWQgd2hlbiBkYXRhIHByb2ZpbGUgaXMgc2VsZWN0ZWRcbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyhvcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgIGlkOiBvcHRpb24uaWQsXG4gICAgICB2YWx1ZTogb3B0aW9uLmlkLFxuICAgICAgbmFtZTogb3B0aW9uLm5hbWUsXG4gICAgICBsYWJlbDogb3B0aW9uLm5hbWVcbiAgICB9KSk7XG4gIH1cbiAgLyoqXG4gICAqIEhhbmRsZSBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uIGFuZCB1cGRhdGUgbG9vcCBzdGFydC9lbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChwcm9maWxlID0+IFxuICAgICAgcHJvZmlsZS5pZCA9PT0gcHJvZmlsZUlkIHx8IFN0cmluZyhwcm9maWxlLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZClcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlID0gc2VsZWN0ZWRQcm9maWxlO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kaWNlc0Zyb21Qcm9maWxlKHNlbGVjdGVkUHJvZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IG51bGw7XG4gICAgICB0aGlzLnN0YXJ0QXJyYXkgPSBbXTtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBbXTtcbiAgICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgbG9vcCBpbmRpY2VzIGJhc2VkIG9uIHNlbGVjdGVkIGRhdGEgcHJvZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wSW5kaWNlc0Zyb21Qcm9maWxlKHByb2ZpbGU6IERhdGFQcm9maWxlT3B0aW9uKTogdm9pZCB7XG4gICAgLy8gQ2FsY3VsYXRlIGRhdGEgbGVuZ3RoIGZyb20gZGF0YSBhcnJheSBvciB1c2UgcHJvdmlkZWQgZGF0YUxlbmd0aFxuICAgIGxldCBkYXRhU2V0TGVuZ3RoID0gMTtcbiAgICBpZiAocHJvZmlsZS5kYXRhICYmIEFycmF5LmlzQXJyYXkocHJvZmlsZS5kYXRhKSkge1xuICAgICAgZGF0YVNldExlbmd0aCA9IHByb2ZpbGUuZGF0YS5sZW5ndGg7XG4gICAgfSBlbHNlIGlmIChwcm9maWxlLmRhdGFMZW5ndGggJiYgcHJvZmlsZS5kYXRhTGVuZ3RoID4gMCkge1xuICAgICAgZGF0YVNldExlbmd0aCA9IHByb2ZpbGUuZGF0YUxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RhcnQgYXJyYXkgZnJvbSAxIHRvIGRhdGFTZXRMZW5ndGhcbiAgICB0aGlzLnN0YXJ0QXJyYXkgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBkYXRhU2V0TGVuZ3RoIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gICAgLy8gSW5pdGlhbGl6ZSBlbmQgYXJyYXkgc2FtZSBhcyBzdGFydCBhcnJheVxuICAgIC8vIEVuZCBhcnJheSB3aWxsIGJlIHVwZGF0ZWQgd2hlbiBzdGFydCBpbmRleCBpcyBzZWxlY3RlZFxuICAgIHRoaXMuZW5kQXJyYXkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBpZiBmb3JtIGlzIGVtcHR5XG4gICAgY29uc3QgY3VycmVudFN0YXJ0ID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BTdGFydCcpPy52YWx1ZTtcbiAgICBjb25zdCBjdXJyZW50RW5kID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8udmFsdWU7XG4gICAgXG4gICAgaWYgKCFjdXJyZW50U3RhcnQgJiYgdGhpcy5zdGFydEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8uc2V0VmFsdWUodGhpcy5zdGFydEFycmF5WzBdKTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50RW5kICYmIHRoaXMuZW5kQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUodGhpcy5lbmRBcnJheVt0aGlzLmVuZEFycmF5Lmxlbmd0aCAtIDFdKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9vcCBzdGFydCBjaGFuZ2UgYW5kIHVwZGF0ZSBlbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkxvb3BTdGFydENoYW5nZShzdGFydEluZGV4OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSB8fCAhc3RhcnRJbmRleCkge1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzdGFydEluZGV4KSA6IHN0YXJ0SW5kZXg7XG4gICAgXG4gICAgaWYgKGlzTmFOKHN0YXJ0SWR4KSB8fCBzdGFydElkeCA8IDEpIHtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5kIGFycmF5IHNob3VsZCBiZSBmcm9tIHN0YXJ0SW5kZXggdG8gZW5kIG9mIGRhdGFcbiAgICAgIC8vIEJhc2VkIG9uIHJlZmVyZW5jZTogZW5kQXJyYXkgPSBzdGFydEFycmF5LnNwbGljZShzdGFydEluZGV4IC0gMSwgc3RhcnRBcnJheS5sZW5ndGgpXG4gICAgICBjb25zdCBzdGFydEFycmF5Q29weSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgICAgdGhpcy5lbmRBcnJheSA9IHN0YXJ0QXJyYXlDb3B5LnNsaWNlKHN0YXJ0SWR4IC0gMSk7XG4gICAgfVxuXG4gICAgLy8gQXV0by11cGRhdGUgZW5kIGluZGV4IGlmIGN1cnJlbnQgZW5kIGlzIGludmFsaWRcbiAgICBjb25zdCBjdXJyZW50RW5kID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8udmFsdWU7XG4gICAgY29uc3QgZW5kSWR4ID0gdHlwZW9mIGN1cnJlbnRFbmQgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoY3VycmVudEVuZCkgOiBjdXJyZW50RW5kO1xuICAgIFxuICAgIGlmICghY3VycmVudEVuZCB8fCBpc05hTihlbmRJZHgpIHx8IGVuZElkeCA8IHN0YXJ0SWR4KSB7XG4gICAgICBpZiAodGhpcy5lbmRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnNldFZhbHVlKHRoaXMuZW5kQXJyYXlbdGhpcy5lbmRBcnJheS5sZW5ndGggLSAxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGxvb3Agc3RhcnQgYW5kIGVuZCBjb25maWcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wSW5kZXhPcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgc3RhcnRBcnJheSB0byBTZWxlY3RPcHRpb25zXG4gICAgY29uc3Qgc3RhcnRPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IHRoaXMuc3RhcnRBcnJheS5tYXAoaWR4ID0+ICh7XG4gICAgICBpZDogaWR4LFxuICAgICAgdmFsdWU6IGlkeCxcbiAgICAgIG5hbWU6IFN0cmluZyhpZHgpLFxuICAgICAgbGFiZWw6IFN0cmluZyhpZHgpXG4gICAgfSkpO1xuXG4gICAgLy8gQ29udmVydCBlbmRBcnJheSB0byBTZWxlY3RPcHRpb25zXG4gICAgY29uc3QgZW5kT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmVuZEFycmF5Lm1hcChpZHggPT4gKHtcbiAgICAgIGlkOiBpZHgsXG4gICAgICB2YWx1ZTogaWR4LFxuICAgICAgbmFtZTogU3RyaW5nKGlkeCksXG4gICAgICBsYWJlbDogU3RyaW5nKGlkeClcbiAgICB9KSk7XG5cbiAgICB0aGlzLmxvb3BTdGFydENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubG9vcFN0YXJ0Q29uZmlnLFxuICAgICAgb3B0aW9uczogW3tpZDogLTEsIHZhbHVlOiAtMSwgbmFtZTogJ1N0YXJ0JywgbGFiZWw6ICdTdGFydCd9LCAuLi5zdGFydE9wdGlvbnNdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Mb29wU3RhcnRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmxvb3BFbmRDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmxvb3BFbmRDb25maWcsXG4gICAgICBvcHRpb25zOiBbLi4uZW5kT3B0aW9ucyx7aWQ6IC0xLCB2YWx1ZTogLTEsIG5hbWU6ICdFbmQnLCBsYWJlbDogJ0VuZCd9XSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlIGlmIG5lZWRlZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBvbkxvb3BUeXBlQ2hhbmdlKHR5cGU6IHN0cmluZyB8IExvb3BUeXBlKTogdm9pZCB7XG4gICAgY29uc3QgbG9vcFR5cGUgPSB0eXBlIGFzIExvb3BUeXBlO1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IGxvb3BUeXBlO1xuICAgIHRoaXMubG9vcFR5cGVDaGFuZ2UuZW1pdChsb29wVHlwZSk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmxvb3BGb3JtLnZhbHVlO1xuICAgIGlmKHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RlcERhdGE6IExvb3BGb3JtRGF0YSA9IHtcbiAgICAgIHNlbGVjdGVkTG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGxvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUsXG4gICAgICBzZWxlY3RPcHRpb246IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb24gfHwgdW5kZWZpbmVkLFxuICAgICAgZGF0YVByb2ZpbGU6IGZvcm1WYWx1ZS5kYXRhUHJvZmlsZSB8fCB1bmRlZmluZWQsXG4gICAgICBsb29wU3RhcnQ6IGZvcm1WYWx1ZS5sb29wU3RhcnQgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcEVuZDogZm9ybVZhbHVlLmxvb3BFbmQgfHwgdW5kZWZpbmVkLFxuICAgICAgcnVuVGltZTogZm9ybVZhbHVlLnJ1blRpbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgd2hpbGVUZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUgfHwgdW5kZWZpbmVkXG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgY3JlYXRlV2hpbGVTdGVwKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnY3JlYXRlV2hpbGVTdGVwJywgZXZlbnQpO1xuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzZWFyY2ggZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9hZE1vcmUgZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChldmVudC5xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGEgcHJvZmlsZSBjb25maWcgd2hlbiBsb2FkaW5nIHN0YXRlIG9yIGhhc01vcmUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhUHJvZmlsZUNvbmZpZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhUHJvZmlsZUNvbmZpZykge1xuICAgICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5kYXRhUHJvZmlsZUNvbmZpZyxcbiAgICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9ICdmb3InO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IG51bGw7XG4gICAgdGhpcy5zdGFydEFycmF5ID0gW107XG4gICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgIHRoaXMubG9vcEZvcm0ucmVzZXQoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBudWxsLFxuICAgICAgZGF0YVByb2ZpbGU6IG51bGwsXG4gICAgICBsb29wU3RhcnQ6IG51bGwsXG4gICAgICBsb29wRW5kOiBudWxsXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSBldmVudDtcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKGV2ZW50KTtcbiAgfVxuXG4gIG9uV2hpbGVTZWFyY2hTdWJtaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25XaGlsZVNlYXJjaENoYW5nZShldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2xlYXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKCcnKTtcbiAgfVxuXG4gIGZpbHRlcldoaWxlVGVtcGxhdGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlVGVtcGxhdGVzID0gdGhpcy53aGlsZVRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4gdGVtcGxhdGUuaHRtbEdyYW1tYXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKTtcbiAgfVxuXG4gIHNlbGVjdFdoaWxlVGVtcGxhdGUodGVtcGxhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktMlwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItNFwiPlxuICAgIENyZWF0ZSBMb29wIFRlc3QgU3RlcFxuICA8L2gyPlxuXG4gIDwhLS0gTG9vcCBUeXBlIFNlbGVjdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1tYi00XCI+XG4gICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgIFtzZWdtZW50c109XCJbXG4gICAgICAgIHsgbGFiZWw6ICdGb3InLCB2YWx1ZTogJ2ZvcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1doaWxlJywgdmFsdWU6ICd3aGlsZScgfVxuICAgICAgXVwiXG4gICAgICBbdmFsdWVdPVwic2VsZWN0ZWRMb29wVHlwZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwib25Mb29wVHlwZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICA8L2Rpdj5cblxuICA8IS0tIEZvcm0gRmllbGRzIC0tPlxuICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgIDwhLS0gRHJvcGRvd24gRmllbGRzIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC00IGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgIDwhLS0gU2VsZWN0IE9wdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIFNlbGVjdCBPcHRpb25cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cInNlbGVjdE9wdGlvbkNvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8udmFsdWUgPT09ICdkYXRhUHJvZmlsZSdcIj5cbiAgICAgIDwhLS0gRGF0YSBQcm9maWxlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgRGF0YSBQcm9maWxlXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJsb29wRm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJkYXRhUHJvZmlsZUNvbmZpZ1wiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlYXJjaERhdGFQcm9maWxlcygkZXZlbnQucXVlcnkpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25Mb2FkTW9yZURhdGFQcm9maWxlcygkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9vcCBTdGFydCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIExvb3AgU3RhcnRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BTdGFydENvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExvb3AgRW5kIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgTG9vcCBFbmRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BFbmRDb25maWdcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvb3BGb3JtLmdldCgnc2VsZWN0T3B0aW9uJyk/LnZhbHVlID09PSAncnVuVGltZSdcIj5cbiAgICAgICAgPCEtLSBSdW4gVGltZSBJbnB1dCBGaWVsZCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICAgIFJ1biBUaW1lXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbnRlciBSdW4gVGltZSdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy52YWx1ZVwiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJ1wiPlxuICAgIDxjcWEtc3RlcC1idWlsZGVyLWFjdGlvbiBbc2hvd0hlYWRlcl09XCJmYWxzZVwiIFt0ZW1wbGF0ZXNdPVwid2hpbGVUZW1wbGF0ZXNcIiBbc2V0VGVtcGxhdGVWYXJpYWJsZXNdPVwic2V0V2hpbGVUZW1wbGF0ZVZhcmlhYmxlc1wiIFtzZWFyY2hQbGFjZWhvbGRlcl09XCJ3aGlsZVNlYXJjaFBsYWNlaG9sZGVyXCIgKHRlbXBsYXRlQ2hhbmdlZCk9XCJzZWxlY3RXaGlsZVRlbXBsYXRlKCRldmVudClcIiAoY3JlYXRlU3RlcCk9XCJjcmVhdGVXaGlsZVN0ZXAoJGV2ZW50KVwiPjwvY3FhLXN0ZXAtYnVpbGRlci1hY3Rpb24+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtZ2FwLTIgY3FhLW10LTYgY3FhLXB0LTQgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICA8Y3FhLWJ1dHRvblxuICAgICAgY2xhc3M9XCJjcWEtdy0xLzJcIlxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b25cbiAgICAgIGNsYXNzPVwiY3FhLXctMS8yXCJcbiAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgdGV4dD1cIkNyZWF0ZSBTdGVwXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
|