@cqa-lib/cqa-ui 1.1.548-gamma.20 → 1.1.548-gamma.21
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/custom-input/custom-input.component.mjs +20 -4
- package/esm2020/lib/dialogs/name-prompt-modal.component.mjs +1 -1
- package/esm2020/lib/export-code-modal/export-code-modal.component.mjs +1 -1
- package/esm2020/lib/manage-columns-dialog/manage-columns-dialog.component.mjs +1 -1
- package/esm2020/lib/new-db-config-dialog/new-db-config-dialog.component.mjs +1 -1
- package/esm2020/lib/new-environment-dialog/new-environment-dialog.component.mjs +1 -1
- package/esm2020/lib/new-environment-variable-dialog/new-environment-variable-dialog.component.mjs +5 -13
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.component.mjs +1 -1
- package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.mjs +172 -13
- package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.mjs +1 -1
- package/esm2020/lib/questionnaire-list/questionnaire-list.component.mjs +1 -1
- package/esm2020/lib/step-builder/advanced-variables-form/advanced-variables-form.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-document/step-builder-document.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-group/step-builder-group.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +1 -1
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +1 -1
- package/esm2020/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.mjs +1 -1
- package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/create-step-group/create-step-group.component.mjs +1 -1
- package/esm2020/lib/test-case-details/data-library-panel/data-library-panel.component.mjs +3 -3
- package/esm2020/lib/test-case-details/element-popup/element-form/element-form.component.mjs +1 -1
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.component.mjs +1 -1
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +1 -1
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +1 -1
- package/esm2020/lib/viewport-selector/viewport-selector.component.mjs +1 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +218 -53
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +217 -53
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/custom-input/custom-input.component.d.ts +6 -1
- package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.d.ts +39 -5
- package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.d.ts +18 -0
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
2
2
|
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
|
+
import { Subject, of } from 'rxjs';
|
|
4
|
+
import { catchError, debounceTime, distinctUntilChanged, switchMap, takeUntil } from 'rxjs/operators';
|
|
3
5
|
import * as i0 from "@angular/core";
|
|
4
6
|
import * as i1 from "../custom-input/custom-input.component";
|
|
5
7
|
import * as i2 from "../permission-toggle/permission-toggle.component";
|
|
@@ -12,6 +14,7 @@ export class NewTestDataProfileDialogComponent {
|
|
|
12
14
|
this.mode = 'create';
|
|
13
15
|
this.existingNames = [];
|
|
14
16
|
this.environments = [];
|
|
17
|
+
this.pageSize = 50;
|
|
15
18
|
this.name = '';
|
|
16
19
|
this.description = '';
|
|
17
20
|
this.readWriteMode = 'RW';
|
|
@@ -20,10 +23,23 @@ export class NewTestDataProfileDialogComponent {
|
|
|
20
23
|
this.envForm = new FormGroup({
|
|
21
24
|
environmentIds: new FormControl([]),
|
|
22
25
|
});
|
|
23
|
-
this.envConfig = this.
|
|
26
|
+
this.envConfig = this.buildStaticEnvConfig([]);
|
|
24
27
|
this.nameError = null;
|
|
25
28
|
this.matrixError = null;
|
|
26
29
|
this.envsError = null;
|
|
30
|
+
// Server-search state — populated only when `searchFn` is provided.
|
|
31
|
+
this.currentEnvOptions = [];
|
|
32
|
+
this.totalEnvElements = 0;
|
|
33
|
+
this.currentSearchTerm = '';
|
|
34
|
+
this.currentPageIndex = 0;
|
|
35
|
+
this.isLoadingEnvs = false;
|
|
36
|
+
/** Cache of every env the user has selected at any point during this dialog
|
|
37
|
+
* session — keyed by id. Merged into the visible options on every page
|
|
38
|
+
* refresh so the multi-select trigger always shows the right names even
|
|
39
|
+
* after the user types a search that filters the selection out. */
|
|
40
|
+
this.selectedEnvCache = new Map();
|
|
41
|
+
this.searchInput$ = new Subject();
|
|
42
|
+
this.destroy$ = new Subject();
|
|
27
43
|
}
|
|
28
44
|
ngOnInit() {
|
|
29
45
|
if (this.initialValue) {
|
|
@@ -37,15 +53,38 @@ export class NewTestDataProfileDialogComponent {
|
|
|
37
53
|
const ids = this.initialValue.environmentIds ?? [];
|
|
38
54
|
this.envForm.get('environmentIds').setValue(ids);
|
|
39
55
|
}
|
|
40
|
-
|
|
56
|
+
if (this.searchFn) {
|
|
57
|
+
this.envConfig = this.buildServerSearchEnvConfig();
|
|
58
|
+
// Debounced typing pipeline. Each new term resets to page 0 and replaces
|
|
59
|
+
// the visible options. switchMap drops in-flight responses for stale terms.
|
|
60
|
+
this.searchInput$
|
|
61
|
+
.pipe(debounceTime(300), distinctUntilChanged(), switchMap(term => this.fetchPage(term, 0)), takeUntil(this.destroy$))
|
|
62
|
+
.subscribe(({ term, page, payload }) => {
|
|
63
|
+
this.applyPage(term, page, /* append */ false, payload);
|
|
64
|
+
});
|
|
65
|
+
// Pre-fetch page 0 so the dropdown is populated by the time the user opens it.
|
|
66
|
+
this.runFetch('', 0, /* append */ false);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this.envConfig = this.buildStaticEnvConfig(this.environments ?? []);
|
|
70
|
+
}
|
|
41
71
|
// Clear envs error as soon as the user picks something.
|
|
42
|
-
this.envForm.get('environmentIds').valueChanges
|
|
72
|
+
this.envForm.get('environmentIds').valueChanges
|
|
73
|
+
.pipe(takeUntil(this.destroy$))
|
|
74
|
+
.subscribe(value => {
|
|
43
75
|
if (this.envsError) {
|
|
44
76
|
this.envsError = null;
|
|
45
77
|
this.cdr.markForCheck();
|
|
46
78
|
}
|
|
79
|
+
if (this.searchFn) {
|
|
80
|
+
this.rememberSelectedEnvs(value);
|
|
81
|
+
}
|
|
47
82
|
});
|
|
48
83
|
}
|
|
84
|
+
ngOnDestroy() {
|
|
85
|
+
this.destroy$.next();
|
|
86
|
+
this.destroy$.complete();
|
|
87
|
+
}
|
|
49
88
|
get title() {
|
|
50
89
|
return this.mode === 'edit' ? 'Edit test data profile' : 'New test data profile';
|
|
51
90
|
}
|
|
@@ -144,14 +183,9 @@ export class NewTestDataProfileDialogComponent {
|
|
|
144
183
|
this.matrixError = null;
|
|
145
184
|
return { rows, cols };
|
|
146
185
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
value: e.id,
|
|
151
|
-
name: e.name,
|
|
152
|
-
label: e.name,
|
|
153
|
-
statusColor: e.color,
|
|
154
|
-
}));
|
|
186
|
+
// -- Static-options mode (legacy) ---------------------------------------
|
|
187
|
+
buildStaticEnvConfig(envs) {
|
|
188
|
+
const options = (envs || []).map(e => this.toSelectOption(e));
|
|
155
189
|
return {
|
|
156
190
|
key: 'environmentIds',
|
|
157
191
|
label: '',
|
|
@@ -163,6 +197,127 @@ export class NewTestDataProfileDialogComponent {
|
|
|
163
197
|
options,
|
|
164
198
|
};
|
|
165
199
|
}
|
|
200
|
+
// -- Server-search mode ---------------------------------------------------
|
|
201
|
+
buildServerSearchEnvConfig() {
|
|
202
|
+
const merged = this.mergeSelectedIntoOptions(this.currentEnvOptions);
|
|
203
|
+
return {
|
|
204
|
+
key: 'environmentIds',
|
|
205
|
+
label: '',
|
|
206
|
+
placeholder: 'Select environments…',
|
|
207
|
+
multiple: true,
|
|
208
|
+
searchable: true,
|
|
209
|
+
optionStyle: 'checkbox',
|
|
210
|
+
showSelectAll: false,
|
|
211
|
+
serverSearch: true,
|
|
212
|
+
isLoading: this.isLoadingEnvs,
|
|
213
|
+
hasMore: this.currentEnvOptions.length < this.totalEnvElements,
|
|
214
|
+
options: merged,
|
|
215
|
+
onSearch: (q) => this.searchInput$.next(q ?? ''),
|
|
216
|
+
onLoadMore: () => this.onEnvLoadMore(),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
onEnvLoadMore() {
|
|
220
|
+
if (this.isLoadingEnvs) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (this.currentEnvOptions.length >= this.totalEnvElements) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
this.runFetch(this.currentSearchTerm, this.currentPageIndex + 1, /* append */ true);
|
|
227
|
+
}
|
|
228
|
+
runFetch(term, page, append) {
|
|
229
|
+
this.isLoadingEnvs = true;
|
|
230
|
+
this.envConfig = this.buildServerSearchEnvConfig();
|
|
231
|
+
this.cdr.markForCheck();
|
|
232
|
+
this.fetchPage(term, page)
|
|
233
|
+
.pipe(takeUntil(this.destroy$))
|
|
234
|
+
.subscribe(({ term: t, page: p, payload }) => {
|
|
235
|
+
this.applyPage(t, p, append, payload);
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
fetchPage(term, page) {
|
|
239
|
+
if (!this.searchFn) {
|
|
240
|
+
return of({ term, page, payload: { items: [], total: 0 } });
|
|
241
|
+
}
|
|
242
|
+
return this.searchFn(term, page, this.pageSize).pipe(catchError(() => of({ items: [], total: 0 })), switchMap(payload => of({ term, page, payload })));
|
|
243
|
+
}
|
|
244
|
+
applyPage(term, page, append, payload) {
|
|
245
|
+
// Drop stale load-more responses — if the user typed a new search term
|
|
246
|
+
// while a load-more was in flight, this append is for an old term and
|
|
247
|
+
// would corrupt the freshly-replaced options list. The search$ pipeline
|
|
248
|
+
// already drops stale typing-debounce responses via switchMap.
|
|
249
|
+
if (append && term !== this.currentSearchTerm) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (!append) {
|
|
253
|
+
this.currentSearchTerm = term;
|
|
254
|
+
}
|
|
255
|
+
const items = (payload?.items ?? []).map(e => this.toSelectOption(e));
|
|
256
|
+
const total = payload?.total ?? items.length;
|
|
257
|
+
if (append) {
|
|
258
|
+
// Dedupe by id so a re-fetch can't double up an already-rendered env.
|
|
259
|
+
const seen = new Set(this.currentEnvOptions.map(o => Number(o.id)));
|
|
260
|
+
const fresh = items.filter(o => !seen.has(Number(o.id)));
|
|
261
|
+
this.currentEnvOptions = [...this.currentEnvOptions, ...fresh];
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
this.currentEnvOptions = items;
|
|
265
|
+
}
|
|
266
|
+
this.totalEnvElements = total;
|
|
267
|
+
this.currentPageIndex = page;
|
|
268
|
+
this.isLoadingEnvs = false;
|
|
269
|
+
this.envConfig = this.buildServerSearchEnvConfig();
|
|
270
|
+
this.cdr.markForCheck();
|
|
271
|
+
}
|
|
272
|
+
/** Merge cached selected options with the visible page so the multi-select
|
|
273
|
+
* trigger always shows the right names — even when the user types a query
|
|
274
|
+
* that filters previously selected envs out of view. Selected ones come
|
|
275
|
+
* first to keep the state visible. */
|
|
276
|
+
mergeSelectedIntoOptions(visible) {
|
|
277
|
+
if (this.selectedEnvCache.size === 0) {
|
|
278
|
+
return visible;
|
|
279
|
+
}
|
|
280
|
+
const visibleIds = new Set(visible.map(o => Number(o.id)));
|
|
281
|
+
const onlyCached = [];
|
|
282
|
+
for (const opt of this.selectedEnvCache.values()) {
|
|
283
|
+
if (!visibleIds.has(Number(opt.id))) {
|
|
284
|
+
onlyCached.push(opt);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return [...onlyCached, ...visible];
|
|
288
|
+
}
|
|
289
|
+
/** Update the selected-env cache from the FormControl value so the trigger
|
|
290
|
+
* display + future merges reflect the latest selection. We cache the full
|
|
291
|
+
* SelectOption (id + name) by looking up either the visible page or the
|
|
292
|
+
* prior cache. Selections are accumulated, never removed — even unselect →
|
|
293
|
+
* reselect works without a fresh fetch. */
|
|
294
|
+
rememberSelectedEnvs(value) {
|
|
295
|
+
const ids = Array.isArray(value)
|
|
296
|
+
? value.map(v => Number(v)).filter(n => !Number.isNaN(n))
|
|
297
|
+
: [];
|
|
298
|
+
if (ids.length === 0) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
for (const id of ids) {
|
|
302
|
+
if (this.selectedEnvCache.has(id)) {
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
const fromVisible = this.currentEnvOptions.find(o => Number(o.id) === id);
|
|
306
|
+
if (fromVisible) {
|
|
307
|
+
this.selectedEnvCache.set(id, fromVisible);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// -- Helpers --------------------------------------------------------------
|
|
312
|
+
toSelectOption(e) {
|
|
313
|
+
return {
|
|
314
|
+
id: e.id,
|
|
315
|
+
value: e.id,
|
|
316
|
+
name: e.name,
|
|
317
|
+
label: e.name,
|
|
318
|
+
statusColor: e.color,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
166
321
|
isDuplicateName(candidate) {
|
|
167
322
|
const existing = (this.existingNames ?? []).map(n => (n ?? '').trim().toLowerCase());
|
|
168
323
|
const lowered = candidate.toLowerCase();
|
|
@@ -176,7 +331,7 @@ export class NewTestDataProfileDialogComponent {
|
|
|
176
331
|
NewTestDataProfileDialogComponent.INTEGER_REGEX = /^\s*(\d+)\s*$/;
|
|
177
332
|
NewTestDataProfileDialogComponent.MAX_DIM = 100;
|
|
178
333
|
NewTestDataProfileDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewTestDataProfileDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
179
|
-
NewTestDataProfileDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NewTestDataProfileDialogComponent, selector: "cqa-new-test-data-profile-dialog", inputs: { mode: "mode", initialValue: "initialValue", existingNames: "existingNames", environments: "environments" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name + Permission -->\n <div class=\"cqa-grid cqa-grid-cols-[1fr_auto] cqa-gap-4 cqa-items-start\">\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Profile name\"\n placeholder=\"e.g. Guest Personas\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Description\"\n placeholder=\"What data is this profile for?\"\n type=\"text\"\n [value]=\"description\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Rows + Columns matrix -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <cqa-custom-input\n label=\"Rows\"\n placeholder=\"e.g. 2\"\n type=\"number\"\n [value]=\"rowsInput\"\n [fullWidth]=\"true\"\n (valueChange)=\"onRowsChange($event)\">\n </cqa-custom-input>\n <cqa-custom-input\n label=\"Columns\"\n placeholder=\"e.g. 3\"\n type=\"number\"\n [value]=\"columnsInput\"\n [fullWidth]=\"true\"\n (valueChange)=\"onColumnsChange($event)\">\n </cqa-custom-input>\n </div>\n <span *ngIf=\"matrixError\" class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-xs cqa-text-red-600\">\n <mat-icon class=\"cqa-flex-none\" style=\"font-size:14px;width:14px;height:14px;line-height:14px;\">error</mat-icon>\n <span>{{ matrixError }}</span>\n </span>\n </div>\n\n <!-- Assign to environments -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n Assign to environments <span class=\"cqa-text-red-600\">*</span>\n </label>\n <cqa-dynamic-select\n [form]=\"envForm\"\n [config]=\"envConfig\">\n </cqa-dynamic-select>\n <span *ngIf=\"envsError\" class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-xs cqa-text-red-600\">\n <mat-icon class=\"cqa-flex-none\" style=\"font-size:14px;width:14px;height:14px;line-height:14px;\">error</mat-icon>\n <span>{{ envsError }}</span>\n </span>\n <span *ngIf=\"!envsError\" class=\"cqa-text-xs cqa-text-gray-500\">\n Each environment gets an independent copy of the data (same columns, separate rows).\n </span>\n </div>\n\n</div>\n", components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.PermissionToggleComponent, selector: "cqa-permission-toggle", inputs: ["value", "disabled", "displayOnly", "roTooltip", "rwTooltip"], outputs: ["valueChange"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
334
|
+
NewTestDataProfileDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NewTestDataProfileDialogComponent, selector: "cqa-new-test-data-profile-dialog", inputs: { mode: "mode", initialValue: "initialValue", existingNames: "existingNames", environments: "environments", searchFn: "searchFn", pageSize: "pageSize" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name + Permission -->\n <div class=\"cqa-grid cqa-grid-cols-[1fr_auto] cqa-gap-4 cqa-items-start\">\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Profile name\"\n placeholder=\"e.g. Guest Personas\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Description\"\n placeholder=\"What data is this profile for?\"\n type=\"text\"\n [value]=\"description\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Rows + Columns matrix -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <cqa-custom-input\n label=\"Rows\"\n placeholder=\"e.g. 2\"\n type=\"number\"\n [value]=\"rowsInput\"\n [fullWidth]=\"true\"\n (valueChange)=\"onRowsChange($event)\">\n </cqa-custom-input>\n <cqa-custom-input\n label=\"Columns\"\n placeholder=\"e.g. 3\"\n type=\"number\"\n [value]=\"columnsInput\"\n [fullWidth]=\"true\"\n (valueChange)=\"onColumnsChange($event)\">\n </cqa-custom-input>\n </div>\n <span *ngIf=\"matrixError\" class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-xs cqa-text-red-600\">\n <mat-icon class=\"cqa-flex-none\" style=\"font-size:14px;width:14px;height:14px;line-height:14px;\">error</mat-icon>\n <span>{{ matrixError }}</span>\n </span>\n </div>\n\n <!-- Assign to environments -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n Assign to environments <span class=\"cqa-text-red-600\">*</span>\n </label>\n <cqa-dynamic-select\n [form]=\"envForm\"\n [config]=\"envConfig\">\n </cqa-dynamic-select>\n <span *ngIf=\"envsError\" class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-xs cqa-text-red-600\">\n <mat-icon class=\"cqa-flex-none\" style=\"font-size:14px;width:14px;height:14px;line-height:14px;\">error</mat-icon>\n <span>{{ envsError }}</span>\n </span>\n <span *ngIf=\"!envsError\" class=\"cqa-text-xs cqa-text-gray-500\">\n Each environment gets an independent copy of the data (same columns, separate rows).\n </span>\n </div>\n\n</div>\n", components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle", "showPasswordToggle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.PermissionToggleComponent, selector: "cqa-permission-toggle", inputs: ["value", "disabled", "displayOnly", "roTooltip", "rwTooltip"], outputs: ["valueChange"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
180
335
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewTestDataProfileDialogComponent, decorators: [{
|
|
181
336
|
type: Component,
|
|
182
337
|
args: [{ selector: 'cqa-new-test-data-profile-dialog', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root', style: 'display:block;width:100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name + Permission -->\n <div class=\"cqa-grid cqa-grid-cols-[1fr_auto] cqa-gap-4 cqa-items-start\">\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Profile name\"\n placeholder=\"e.g. Guest Personas\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Description\"\n placeholder=\"What data is this profile for?\"\n type=\"text\"\n [value]=\"description\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Rows + Columns matrix -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <cqa-custom-input\n label=\"Rows\"\n placeholder=\"e.g. 2\"\n type=\"number\"\n [value]=\"rowsInput\"\n [fullWidth]=\"true\"\n (valueChange)=\"onRowsChange($event)\">\n </cqa-custom-input>\n <cqa-custom-input\n label=\"Columns\"\n placeholder=\"e.g. 3\"\n type=\"number\"\n [value]=\"columnsInput\"\n [fullWidth]=\"true\"\n (valueChange)=\"onColumnsChange($event)\">\n </cqa-custom-input>\n </div>\n <span *ngIf=\"matrixError\" class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-xs cqa-text-red-600\">\n <mat-icon class=\"cqa-flex-none\" style=\"font-size:14px;width:14px;height:14px;line-height:14px;\">error</mat-icon>\n <span>{{ matrixError }}</span>\n </span>\n </div>\n\n <!-- Assign to environments -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n Assign to environments <span class=\"cqa-text-red-600\">*</span>\n </label>\n <cqa-dynamic-select\n [form]=\"envForm\"\n [config]=\"envConfig\">\n </cqa-dynamic-select>\n <span *ngIf=\"envsError\" class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-xs cqa-text-red-600\">\n <mat-icon class=\"cqa-flex-none\" style=\"font-size:14px;width:14px;height:14px;line-height:14px;\">error</mat-icon>\n <span>{{ envsError }}</span>\n </span>\n <span *ngIf=\"!envsError\" class=\"cqa-text-xs cqa-text-gray-500\">\n Each environment gets an independent copy of the data (same columns, separate rows).\n </span>\n </div>\n\n</div>\n" }]
|
|
@@ -188,5 +343,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
188
343
|
type: Input
|
|
189
344
|
}], environments: [{
|
|
190
345
|
type: Input
|
|
346
|
+
}], searchFn: [{
|
|
347
|
+
type: Input
|
|
348
|
+
}], pageSize: [{
|
|
349
|
+
type: Input
|
|
191
350
|
}] } });
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL25ldy10ZXN0LWRhdGEtcHJvZmlsZS1kaWFsb2cvbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL25ldy10ZXN0LWRhdGEtcHJvZmlsZS1kaWFsb2cvbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQWtCeEQsTUFBTSxPQUFPLGlDQUFpQztJQXdCNUMsWUFBNkIsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFwQjFDLFNBQUksR0FBc0IsUUFBUSxDQUFDO1FBRW5DLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBQzdCLGlCQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUU1QyxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1YsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBQzFDLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFDaEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFFVixZQUFPLEdBQUcsSUFBSSxTQUFTLENBQUM7WUFDdEMsY0FBYyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztTQUNwQyxDQUFDLENBQUM7UUFDSSxjQUFTLEdBQTZCLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFOUQsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsZ0JBQVcsR0FBa0Is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USxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O0FBNUx1QiwrQ0FBYSxHQUFHLGVBQWdCLENBQUE7QUFDaEMseUNBQU8sR0FBRyxHQUFJLENBQUE7OEhBRjNCLGlDQUFpQztrSEFBakMsaUNBQWlDLG9SQ25COUMseTZGQWtGQTsyRkQvRGEsaUNBQWlDO2tCQU43QyxTQUFTOytCQUNFLGtDQUFrQyxtQkFFM0IsdUJBQXVCLENBQUMsTUFBTSxRQUN6QyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFO3dHQU16RCxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLFxuICBTZWxlY3RPcHRpb24sXG59IGZyb20gJy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBUZHBEaWFsb2dQZXJtaXNzaW9uLFxuICBUZHBEaWFsb2dWYWx1ZSxcbiAgVGRwRW52aXJvbm1lbnRPcHRpb24sXG59IGZyb20gJy4vbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXctdGVzdC1kYXRhLXByb2ZpbGUtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcsIHN0eWxlOiAnZGlzcGxheTpibG9jazt3aWR0aDoxMDAlOycgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmV3VGVzdERhdGFQcm9maWxlRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSU5URUdFUl9SRUdFWCA9IC9eXFxzKihcXGQrKVxccyokLztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0RJTSA9IDEwMDtcblxuICBASW5wdXQoKSBtb2RlOiAnY3JlYXRlJyB8ICdlZGl0JyA9ICdjcmVhdGUnO1xuICBASW5wdXQoKSBpbml0aWFsVmFsdWU/OiBQYXJ0aWFsPFRkcERpYWxvZ1ZhbHVlPjtcbiAgQElucHV0KCkgZXhpc3RpbmdOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgZW52aXJvbm1lbnRzOiBUZHBFbnZpcm9ubWVudE9wdGlvbltdID0gW107XG5cbiAgcHVibGljIG5hbWUgPSAnJztcbiAgcHVibGljIGRlc2NyaXB0aW9uID0gJyc7XG4gIHB1YmxpYyByZWFkV3JpdGVNb2RlOiBUZHBEaWFsb2dQZXJtaXNzaW9uID0gJ1JXJztcbiAgcHVibGljIHJvd3NJbnB1dCA9ICcxJztcbiAgcHVibGljIGNvbHVtbnNJbnB1dCA9ICcxJztcblxuICBwdWJsaWMgcmVhZG9ubHkgZW52Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIGVudmlyb25tZW50SWRzOiBuZXcgRm9ybUNvbnRyb2woW10pLFxuICB9KTtcbiAgcHVibGljIGVudkNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0gdGhpcy5idWlsZEVudkNvbmZpZyhbXSk7XG5cbiAgcHVibGljIG5hbWVFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBtYXRyaXhFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBlbnZzRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsVmFsdWUpIHtcbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuaW5pdGlhbFZhbHVlLm5hbWUgPz8gJyc7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uID0gdGhpcy5pbml0aWFsVmFsdWUuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgICB0aGlzLnJlYWRXcml0ZU1vZGUgPSB0aGlzLmluaXRpYWxWYWx1ZS5yZWFkV3JpdGVNb2RlID8/ICdSVyc7XG4gICAgICBjb25zdCBjb2xDb3VudCA9IHRoaXMuaW5pdGlhbFZhbHVlLmNvbHVtbnM/Lmxlbmd0aCA/PyAxO1xuICAgICAgY29uc3Qgcm93Q291bnQgPSB0aGlzLmluaXRpYWxWYWx1ZS5yb3dzPy5sZW5ndGggPz8gMTtcbiAgICAgIHRoaXMucm93c0lucHV0ID0gU3RyaW5nKHJvd0NvdW50KTtcbiAgICAgIHRoaXMuY29sdW1uc0lucHV0ID0gU3RyaW5nKGNvbENvdW50KTtcbiAgICAgIGNvbnN0IGlkcyA9IHRoaXMuaW5pdGlhbFZhbHVlLmVudmlyb25tZW50SWRzID8/IFtdO1xuICAgICAgdGhpcy5lbnZGb3JtLmdldCgnZW52aXJvbm1lbnRJZHMnKSEuc2V0VmFsdWUoaWRzKTtcbiAgICB9XG4gICAgdGhpcy5lbnZDb25maWcgPSB0aGlzLmJ1aWxkRW52Q29uZmlnKHRoaXMuZW52aXJvbm1lbnRzID8/IFtdKTtcblxuICAgIC8vIENsZWFyIGVudnMgZXJyb3IgYXMgc29vbiBhcyB0aGUgdXNlciBwaWNrcyBzb21ldGhpbmcuXG4gICAgdGhpcy5lbnZGb3JtLmdldCgnZW52aXJvbm1lbnRJZHMnKSEudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5lbnZzRXJyb3IpIHtcbiAgICAgICAgdGhpcy5lbnZzRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZWRpdCcgPyAnRWRpdCB0ZXN0IGRhdGEgcHJvZmlsZScgOiAnTmV3IHRlc3QgZGF0YSBwcm9maWxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3VidGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0RlZmluZSB0aGUgbWF0cml4OyBkYXRhIHZhbHVlcyBjYW4gYmUgYWRkZWQgcGVyIGVudmlyb25tZW50IGFmdGVyIGNyZWF0aW9uLic7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHByaW1hcnlCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdlZGl0JyA/ICdTYXZlIGNoYW5nZXMnIDogJ0NyZWF0ZSBwcm9maWxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZUVycm9yc0FycmF5KCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMubmFtZUVycm9yID8gW3RoaXMubmFtZUVycm9yXSA6IFtdOyB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZEVudklkcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5lbnZGb3JtLmdldCgnZW52aXJvbm1lbnRJZHMnKSEudmFsdWUgPz8gW107XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFtdO1xuICB9XG5cbiAgcHVibGljIG9uTmFtZUNoYW5nZShuZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5hbWUgPSBuZXh0O1xuICAgIHRoaXMubmFtZUVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRlc2NyaXB0aW9uQ2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBuZXh0O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG9uUGVybWlzc2lvbkNoYW5nZShuZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRXcml0ZU1vZGUgPSBuZXh0ID09PSAnUk8nID8gJ1JPJyA6ICdSVyc7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgb25Sb3dzQ2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm93c0lucHV0ID0gbmV4dCA/PyAnJztcbiAgICB0aGlzLm1hdHJpeEVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbHVtbnNDaGFuZ2UobmV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5zSW5wdXQgPSBuZXh0ID8/ICcnO1xuICAgIHRoaXMubWF0cml4RXJyb3IgPSBudWxsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlKCk6IFRkcERpYWxvZ1ZhbHVlIHwgbnVsbCB7XG4gICAgY29uc3QgdHJpbW1lZE5hbWUgPSB0aGlzLm5hbWUudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZE5hbWUpIHtcbiAgICAgIHRoaXMubmFtZUVycm9yID0gJ05hbWUgaXMgcmVxdWlyZWQuJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEdXBsaWNhdGVOYW1lKHRyaW1tZWROYW1lKSkge1xuICAgICAgdGhpcy5uYW1lRXJyb3IgPSAnQSBwcm9maWxlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmFtZUVycm9yID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlTWF0cml4KCk7XG5cbiAgICBjb25zdCBlbnZJZHMgPSB0aGlzLnNlbGVjdGVkRW52SWRzO1xuICAgIGlmICghZW52SWRzIHx8IGVudklkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW52c0Vycm9yID0gJ1NlbGVjdCBhdCBsZWFzdCBvbmUgZW52aXJvbm1lbnQgdG8gYXNzaWduIHRoaXMgcHJvZmlsZSB0by4nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVudnNFcnJvciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmFtZUVycm9yIHx8IHRoaXMubWF0cml4RXJyb3IgfHwgdGhpcy5lbnZzRXJyb3IgfHwgIXBhcnNlZCkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogcGFyc2VkLmNvbHMgfSwgKF8sIGkpID0+IGBjb2xfJHtpICsgMX1gKTtcbiAgICBjb25zdCByb3dzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogcGFyc2VkLnJvd3MgfSwgKF8sIGkpID0+IGByb3dfJHtpICsgMX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0cmltbWVkTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLnRyaW0oKSB8fCBudWxsLFxuICAgICAgcmVhZFdyaXRlTW9kZTogdGhpcy5yZWFkV3JpdGVNb2RlLFxuICAgICAgY29sdW1uczogY29scyxcbiAgICAgIHJvd3MsXG4gICAgICBlbnZpcm9ubWVudElkczogdGhpcy5zZWxlY3RlZEVudklkcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1hdHJpeCgpOiB7IHJvd3M6IG51bWJlcjsgY29sczogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCByYXdSb3dzID0gKHRoaXMucm93c0lucHV0ID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgcmF3Q29scyA9ICh0aGlzLmNvbHVtbnNJbnB1dCA/PyAnJykudHJpbSgpO1xuICAgIGlmICghcmF3Um93cyB8fCAhcmF3Q29scykge1xuICAgICAgdGhpcy5tYXRyaXhFcnJvciA9ICdSb3dzIGFuZCBjb2x1bW5zIGFyZSByZXF1aXJlZC4nO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJvd3NNYXRjaCA9IE5ld1Rlc3REYXRhUHJvZmlsZURpYWxvZ0NvbXBvbmVudC5JTlRFR0VSX1JFR0VYLmV4ZWMocmF3Um93cyk7XG4gICAgY29uc3QgY29sc01hdGNoID0gTmV3VGVzdERhdGFQcm9maWxlRGlhbG9nQ29tcG9uZW50LklOVEVHRVJfUkVHRVguZXhlYyhyYXdDb2xzKTtcbiAgICBpZiAoIXJvd3NNYXRjaCB8fCAhY29sc01hdGNoKSB7XG4gICAgICB0aGlzLm1hdHJpeEVycm9yID0gJ1Jvd3MgYW5kIGNvbHVtbnMgbXVzdCBiZSB3aG9sZSBudW1iZXJzLic7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IHBhcnNlSW50KHJvd3NNYXRjaFsxXSwgMTApO1xuICAgIGNvbnN0IGNvbHMgPSBwYXJzZUludChjb2xzTWF0Y2hbMV0sIDEwKTtcbiAgICBpZiAocm93cyA8IDEgfHwgY29scyA8IDEpIHtcbiAgICAgIHRoaXMubWF0cml4RXJyb3IgPSAnUm93cyBhbmQgY29sdW1ucyBtdXN0IGJlIGF0IGxlYXN0IDEuJztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAocm93cyA+IE5ld1Rlc3REYXRhUHJvZmlsZURpYWxvZ0NvbXBvbmVudC5NQVhfRElNXG4gICAgICB8fCBjb2xzID4gTmV3VGVzdERhdGFQcm9maWxlRGlhbG9nQ29tcG9uZW50Lk1BWF9ESU0pIHtcbiAgICAgIHRoaXMubWF0cml4RXJyb3IgPSBgUm93cyBhbmQgY29sdW1ucyBjYW4gYmUgYXQgbW9zdCAke05ld1Rlc3REYXRhUHJvZmlsZURpYWxvZ0NvbXBvbmVudC5NQVhfRElNfS5gO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMubWF0cml4RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiB7IHJvd3MsIGNvbHMgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFbnZDb25maWcoZW52czogVGRwRW52aXJvbm1lbnRPcHRpb25bXSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAoZW52cyB8fCBbXSkubWFwKGUgPT4gKHtcbiAgICAgIGlkOiBlLmlkLFxuICAgICAgdmFsdWU6IGUuaWQsXG4gICAgICBuYW1lOiBlLm5hbWUsXG4gICAgICBsYWJlbDogZS5uYW1lLFxuICAgICAgc3RhdHVzQ29sb3I6IGUuY29sb3IsXG4gICAgfSkpO1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICdlbnZpcm9ubWVudElkcycsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBlbnZpcm9ubWVudHPigKYnLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uU3R5bGU6ICdjaGVja2JveCcsXG4gICAgICBzaG93U2VsZWN0QWxsOiBmYWxzZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEdXBsaWNhdGVOYW1lKGNhbmRpZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSAodGhpcy5leGlzdGluZ05hbWVzID8/IFtdKS5tYXAobiA9PiAobiA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IGxvd2VyZWQgPSBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZWRpdCcpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gKHRoaXMuaW5pdGlhbFZhbHVlPy5uYW1lID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBsb3dlcmVkICE9PSBvcmlnaW5hbCAmJiBleGlzdGluZy5pbmNsdWRlcyhsb3dlcmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4aXN0aW5nLmluY2x1ZGVzKGxvd2VyZWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNCBjcWEtdy1mdWxsXCI+XG5cbiAgPCEtLSBOYW1lICsgUGVybWlzc2lvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1ncmlkIGNxYS1ncmlkLWNvbHMtWzFmcl9hdXRvXSBjcWEtZ2FwLTQgY3FhLWl0ZW1zLXN0YXJ0XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgbGFiZWw9XCJQcm9maWxlIG5hbWVcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gR3Vlc3QgUGVyc29uYXNcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFt2YWx1ZV09XCJuYW1lXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbZXJyb3JzXT1cIm5hbWVFcnJvcnNBcnJheVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbk5hbWVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1tYi0xLjUgY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwXCI+UGVybWlzc2lvbjwvbGFiZWw+XG4gICAgICA8Y3FhLXBlcm1pc3Npb24tdG9nZ2xlXG4gICAgICAgIFt2YWx1ZV09XCJyZWFkV3JpdGVNb2RlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUGVybWlzc2lvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1wZXJtaXNzaW9uLXRvZ2dsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICBsYWJlbD1cIkRlc2NyaXB0aW9uXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiV2hhdCBkYXRhIGlzIHRoaXMgcHJvZmlsZSBmb3I/XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIFt2YWx1ZV09XCJkZXNjcmlwdGlvblwiXG4gICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRGVzY3JpcHRpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBSb3dzICsgQ29sdW1ucyBtYXRyaXggLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1ncmlkIGNxYS1ncmlkLWNvbHMtMiBjcWEtZ2FwLTRcIj5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIGxhYmVsPVwiUm93c1wiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAyXCJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgIFt2YWx1ZV09XCJyb3dzSW5wdXRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25Sb3dzQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIGxhYmVsPVwiQ29sdW1uc1wiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAzXCJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgIFt2YWx1ZV09XCJjb2x1bW5zSW5wdXRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25Db2x1bW5zQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiAqbmdJZj1cIm1hdHJpeEVycm9yXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtdGV4dC14cyBjcWEtdGV4dC1yZWQtNjAwXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtZmxleC1ub25lXCIgc3R5bGU9XCJmb250LXNpemU6MTRweDt3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2xpbmUtaGVpZ2h0OjE0cHg7XCI+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgPHNwYW4+e3sgbWF0cml4RXJyb3IgfX08L3NwYW4+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8IS0tIEFzc2lnbiB0byBlbnZpcm9ubWVudHMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgICBBc3NpZ24gdG8gZW52aXJvbm1lbnRzIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTYwMFwiPio8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICBbZm9ybV09XCJlbnZGb3JtXCJcbiAgICAgIFtjb25maWddPVwiZW52Q29uZmlnXCI+XG4gICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgPHNwYW4gKm5nSWY9XCJlbnZzRXJyb3JcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LXhzIGNxYS10ZXh0LXJlZC02MDBcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1mbGV4LW5vbmVcIiBzdHlsZT1cImZvbnQtc2l6ZToxNHB4O3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7bGluZS1oZWlnaHQ6MTRweDtcIj5lcnJvcjwvbWF0LWljb24+XG4gICAgICA8c3Bhbj57eyBlbnZzRXJyb3IgfX08L3NwYW4+XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiIWVudnNFcnJvclwiIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtZ3JheS01MDBcIj5cbiAgICAgIEVhY2ggZW52aXJvbm1lbnQgZ2V0cyBhbiBpbmRlcGVuZGVudCBjb3B5IG9mIHRoZSBkYXRhIChzYW1lIGNvbHVtbnMsIHNlcGFyYXRlIHJvd3MpLlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuIl19
|
|
351
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL25ldy10ZXN0LWRhdGEtcHJvZmlsZS1kaWFsb2cvbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL25ldy10ZXN0LWRhdGEtcHJvZmlsZS1kaWFsb2cvbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBb0J0RyxNQUFNLE9BQU8saUNBQWlDO0lBMkM1QyxZQUE2QixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXZDMUMsU0FBSSxHQUFzQixRQUFRLENBQUM7UUFFbkMsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDN0IsaUJBQVksR0FBMkIsRUFBRSxDQUFDO1FBSTFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFaEIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLGtCQUFhLEdBQXdCLElBQUksQ0FBQztRQUMxQyxjQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLGlCQUFZLEdBQUcsR0FBRyxDQUFDO1FBRVYsWUFBTyxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ3RDLGNBQWMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7U0FDcEMsQ0FBQyxDQUFDO1FBQ0ksY0FBUyxHQUE2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLGNBQVMsR0FBa0IsSUFBSSxDQUFDO1FBRXZDLG9FQUFvRTtRQUM1RCxzQkFBaUIsR0FBbUIsRUFBRSxDQUFDO1FBQ3ZDLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUNyQixzQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDdkIscUJBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzlCOzs7NEVBR29FO1FBQ25ELHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBRW5ELGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUNyQyxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVNLENBQUM7SUFFdkQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQztZQUM3RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQ3hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25EO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDbkQseUVBQXlFO1lBQ3pFLDRFQUE0RTtZQUM1RSxJQUFJLENBQUMsWUFBWTtpQkFDZCxJQUFJLENBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixvQkFBb0IsRUFBRSxFQUN0QixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUMxQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUN6QjtpQkFDQSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtnQkFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDLENBQUM7WUFDTCwrRUFBK0U7WUFDL0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQzthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNyRTtRQUVELHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBRSxDQUFDLFlBQVk7YUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDekI7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQztJQUNuRixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sNkVBQTZFLENBQUM7SUFDdkYsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7SUFDbEUsQ0FBQztJQUVELElBQVcsZUFBZSxLQUFlLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFekYsSUFBVyxjQUFjO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM1RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxZQUFZLENBQUMsSUFBWTtRQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxJQUFZO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLGtCQUFrQixDQUFDLElBQVk7UUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxZQUFZLENBQUMsSUFBWTtRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sZUFBZSxDQUFDLElBQVk7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLFFBQVE7UUFDYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztTQUN0QzthQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLDBDQUEwQyxDQUFDO1NBQzdEO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUN2QjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyw0REFBNEQsQ0FBQztTQUMvRTthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ25FLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0UsT0FBTztZQUNMLElBQUksRUFBRSxXQUFXO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUk7WUFDNUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLE9BQU8sRUFBRSxJQUFJO1lBQ2IsSUFBSTtZQUNKLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztTQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVPLFdBQVc7UUFDakIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0NBQWdDLENBQUM7WUFDcEQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU0sU0FBUyxHQUFHLGlDQUFpQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEYsTUFBTSxTQUFTLEdBQUcsaUNBQWlDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcseUNBQXlDLENBQUM7WUFDN0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLHNDQUFzQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLElBQUksR0FBRyxpQ0FBaUMsQ0FBQyxPQUFPO2VBQy9DLElBQUksR0FBRyxpQ0FBaUMsQ0FBQyxPQUFPLEVBQUU7WUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxtQ0FBbUMsaUNBQWlDLENBQUMsT0FBTyxHQUFHLENBQUM7WUFDbkcsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELDBFQUEwRTtJQUVsRSxvQkFBb0IsQ0FBQyxJQUE0QjtRQUN2RCxNQUFNLE9BQU8sR0FBbUIsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE9BQU87WUFDTCxHQUFHLEVBQUUsZ0JBQWdCO1lBQ3JCLEtBQUssRUFBRSxFQUFFO1lBQ1QsV0FBVyxFQUFFLHNCQUFzQjtZQUNuQyxRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQztJQUVELDRFQUE0RTtJQUVwRSwwQkFBMEI7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JFLE9BQU87WUFDTCxHQUFHLEVBQUUsZ0JBQWdCO1lBQ3JCLEtBQUssRUFBRSxFQUFFO1lBQ1QsV0FBVyxFQUFFLHNCQUFzQjtZQUNuQyxRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUM3QixPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCO1lBQzlELE9BQU8sRUFBRSxNQUFNO1lBQ2YsUUFBUSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1NBQ3ZDLENBQUM7SUFDSixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDbkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU8sUUFBUSxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsTUFBZTtRQUMxRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO2FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBWSxFQUFFLElBQVk7UUFLMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM3RDtRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ2xELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQW1CLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUMvRCxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFTyxTQUFTLENBQ2YsSUFBWSxFQUNaLElBQVksRUFDWixNQUFlLEVBQ2YsT0FBMEI7UUFFMUIsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUsK0RBQStEO1FBQy9ELElBQUksTUFBTSxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFMUQsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDL0I7UUFFRCxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUU3QyxJQUFJLE1BQU0sRUFBRTtZQUNWLHNFQUFzRTtZQUN0RSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQ2hFO2FBQU07WUFDTCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OzsyQ0FHdUM7SUFDL0Isd0JBQXdCLENBQUMsT0FBdUI7UUFDdEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUFFLE9BQU8sT0FBTyxDQUFDO1NBQUU7UUFDekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFtQixFQUFFLENBQUM7UUFDdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUMvRDtRQUNELE9BQU8sQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztnREFJNEM7SUFDcEMsb0JBQW9CLENBQUMsS0FBVTtRQUNyQyxNQUFNLEdBQUcsR0FBYSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN4QyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNqQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBQ2hELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLElBQUksV0FBVyxFQUFFO2dCQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQUU7U0FDakU7SUFDSCxDQUFDO0lBRUQsNEVBQTRFO0lBRXBFLGNBQWMsQ0FBQyxDQUF1QjtRQUM1QyxPQUFPO1lBQ0wsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1IsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ2IsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLO1NBQ3JCLENBQUM7SUFDSixDQUFDO0lBRU8sZUFBZSxDQUFDLFNBQWlCO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3hCLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEUsT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0Q7UUFDRCxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQzs7QUExV3VCLCtDQUFhLEdBQUcsZUFBZ0IsQ0FBQTtBQUNoQyx5Q0FBTyxHQUFHLEdBQUksQ0FBQTs4SEFGM0IsaUNBQWlDO2tIQUFqQyxpQ0FBaUMsZ1VDdkI5Qyx5NkZBa0ZBOzJGRDNEYSxpQ0FBaUM7a0JBTjdDLFNBQVM7K0JBQ0Usa0NBQWtDLG1CQUUzQix1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUU7d0dBTXpELElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSAnLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFRkcERpYWxvZ1Blcm1pc3Npb24sXG4gIFRkcERpYWxvZ1ZhbHVlLFxuICBUZHBFbnZTZWFyY2hGbixcbiAgVGRwRW52U2VhcmNoUGFnZSxcbiAgVGRwRW52aXJvbm1lbnRPcHRpb24sXG59IGZyb20gJy4vbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXctdGVzdC1kYXRhLXByb2ZpbGUtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcsIHN0eWxlOiAnZGlzcGxheTpibG9jazt3aWR0aDoxMDAlOycgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmV3VGVzdERhdGFQcm9maWxlRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTlRFR0VSX1JFR0VYID0gL15cXHMqKFxcZCspXFxzKiQvO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfRElNID0gMTAwO1xuXG4gIEBJbnB1dCgpIG1vZGU6ICdjcmVhdGUnIHwgJ2VkaXQnID0gJ2NyZWF0ZSc7XG4gIEBJbnB1dCgpIGluaXRpYWxWYWx1ZT86IFBhcnRpYWw8VGRwRGlhbG9nVmFsdWU+O1xuICBASW5wdXQoKSBleGlzdGluZ05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudHM6IFRkcEVudmlyb25tZW50T3B0aW9uW10gPSBbXTtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHRoZSBlbnYgZHJvcGRvd24gdXNlcyBwYWdpbmF0ZWQgc2VydmVyLXNlYXJjaCBpbnN0ZWFkIG9mXG4gICAqICB0aGUgc3RhdGljIGBlbnZpcm9ubWVudHNgIGxpc3QuICovXG4gIEBJbnB1dCgpIHNlYXJjaEZuPzogVGRwRW52U2VhcmNoRm47XG4gIEBJbnB1dCgpIHBhZ2VTaXplID0gNTA7XG5cbiAgcHVibGljIG5hbWUgPSAnJztcbiAgcHVibGljIGRlc2NyaXB0aW9uID0gJyc7XG4gIHB1YmxpYyByZWFkV3JpdGVNb2RlOiBUZHBEaWFsb2dQZXJtaXNzaW9uID0gJ1JXJztcbiAgcHVibGljIHJvd3NJbnB1dCA9ICcxJztcbiAgcHVibGljIGNvbHVtbnNJbnB1dCA9ICcxJztcblxuICBwdWJsaWMgcmVhZG9ubHkgZW52Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIGVudmlyb25tZW50SWRzOiBuZXcgRm9ybUNvbnRyb2woW10pLFxuICB9KTtcbiAgcHVibGljIGVudkNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0gdGhpcy5idWlsZFN0YXRpY0VudkNvbmZpZyhbXSk7XG5cbiAgcHVibGljIG5hbWVFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBtYXRyaXhFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBlbnZzRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFNlcnZlci1zZWFyY2ggc3RhdGUg4oCUIHBvcHVsYXRlZCBvbmx5IHdoZW4gYHNlYXJjaEZuYCBpcyBwcm92aWRlZC5cbiAgcHJpdmF0ZSBjdXJyZW50RW52T3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSB0b3RhbEVudkVsZW1lbnRzID0gMDtcbiAgcHJpdmF0ZSBjdXJyZW50U2VhcmNoVGVybSA9ICcnO1xuICBwcml2YXRlIGN1cnJlbnRQYWdlSW5kZXggPSAwO1xuICBwcml2YXRlIGlzTG9hZGluZ0VudnMgPSBmYWxzZTtcbiAgLyoqIENhY2hlIG9mIGV2ZXJ5IGVudiB0aGUgdXNlciBoYXMgc2VsZWN0ZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGlzIGRpYWxvZ1xuICAgKiAgc2Vzc2lvbiDigJQga2V5ZWQgYnkgaWQuIE1lcmdlZCBpbnRvIHRoZSB2aXNpYmxlIG9wdGlvbnMgb24gZXZlcnkgcGFnZVxuICAgKiAgcmVmcmVzaCBzbyB0aGUgbXVsdGktc2VsZWN0IHRyaWdnZXIgYWx3YXlzIHNob3dzIHRoZSByaWdodCBuYW1lcyBldmVuXG4gICAqICBhZnRlciB0aGUgdXNlciB0eXBlcyBhIHNlYXJjaCB0aGF0IGZpbHRlcnMgdGhlIHNlbGVjdGlvbiBvdXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRFbnZDYWNoZSA9IG5ldyBNYXA8bnVtYmVyLCBTZWxlY3RPcHRpb24+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZWFyY2hJbnB1dCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsVmFsdWUpIHtcbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuaW5pdGlhbFZhbHVlLm5hbWUgPz8gJyc7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uID0gdGhpcy5pbml0aWFsVmFsdWUuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgICB0aGlzLnJlYWRXcml0ZU1vZGUgPSB0aGlzLmluaXRpYWxWYWx1ZS5yZWFkV3JpdGVNb2RlID8/ICdSVyc7XG4gICAgICBjb25zdCBjb2xDb3VudCA9IHRoaXMuaW5pdGlhbFZhbHVlLmNvbHVtbnM/Lmxlbmd0aCA/PyAxO1xuICAgICAgY29uc3Qgcm93Q291bnQgPSB0aGlzLmluaXRpYWxWYWx1ZS5yb3dzPy5sZW5ndGggPz8gMTtcbiAgICAgIHRoaXMucm93c0lucHV0ID0gU3RyaW5nKHJvd0NvdW50KTtcbiAgICAgIHRoaXMuY29sdW1uc0lucHV0ID0gU3RyaW5nKGNvbENvdW50KTtcbiAgICAgIGNvbnN0IGlkcyA9IHRoaXMuaW5pdGlhbFZhbHVlLmVudmlyb25tZW50SWRzID8/IFtdO1xuICAgICAgdGhpcy5lbnZGb3JtLmdldCgnZW52aXJvbm1lbnRJZHMnKSEuc2V0VmFsdWUoaWRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWFyY2hGbikge1xuICAgICAgdGhpcy5lbnZDb25maWcgPSB0aGlzLmJ1aWxkU2VydmVyU2VhcmNoRW52Q29uZmlnKCk7XG4gICAgICAvLyBEZWJvdW5jZWQgdHlwaW5nIHBpcGVsaW5lLiBFYWNoIG5ldyB0ZXJtIHJlc2V0cyB0byBwYWdlIDAgYW5kIHJlcGxhY2VzXG4gICAgICAvLyB0aGUgdmlzaWJsZSBvcHRpb25zLiBzd2l0Y2hNYXAgZHJvcHMgaW4tZmxpZ2h0IHJlc3BvbnNlcyBmb3Igc3RhbGUgdGVybXMuXG4gICAgICB0aGlzLnNlYXJjaElucHV0JFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHN3aXRjaE1hcCh0ZXJtID0+IHRoaXMuZmV0Y2hQYWdlKHRlcm0sIDApKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoeyB0ZXJtLCBwYWdlLCBwYXlsb2FkIH0pID0+IHtcbiAgICAgICAgICB0aGlzLmFwcGx5UGFnZSh0ZXJtLCBwYWdlLCAvKiBhcHBlbmQgKi8gZmFsc2UsIHBheWxvYWQpO1xuICAgICAgICB9KTtcbiAgICAgIC8vIFByZS1mZXRjaCBwYWdlIDAgc28gdGhlIGRyb3Bkb3duIGlzIHBvcHVsYXRlZCBieSB0aGUgdGltZSB0aGUgdXNlciBvcGVucyBpdC5cbiAgICAgIHRoaXMucnVuRmV0Y2goJycsIDAsIC8qIGFwcGVuZCAqLyBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW52Q29uZmlnID0gdGhpcy5idWlsZFN0YXRpY0VudkNvbmZpZyh0aGlzLmVudmlyb25tZW50cyA/PyBbXSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZW52cyBlcnJvciBhcyBzb29uIGFzIHRoZSB1c2VyIHBpY2tzIHNvbWV0aGluZy5cbiAgICB0aGlzLmVudkZvcm0uZ2V0KCdlbnZpcm9ubWVudElkcycpIS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICBpZiAodGhpcy5lbnZzRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmVudnNFcnJvciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoRm4pIHtcbiAgICAgICAgICB0aGlzLnJlbWVtYmVyU2VsZWN0ZWRFbnZzKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ2VkaXQnID8gJ0VkaXQgdGVzdCBkYXRhIHByb2ZpbGUnIDogJ05ldyB0ZXN0IGRhdGEgcHJvZmlsZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN1YnRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdEZWZpbmUgdGhlIG1hdHJpeDsgZGF0YSB2YWx1ZXMgY2FuIGJlIGFkZGVkIHBlciBlbnZpcm9ubWVudCBhZnRlciBjcmVhdGlvbi4nO1xuICB9XG5cbiAgcHVibGljIGdldCBwcmltYXJ5QnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZWRpdCcgPyAnU2F2ZSBjaGFuZ2VzJyA6ICdDcmVhdGUgcHJvZmlsZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWVFcnJvcnNBcnJheSgpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLm5hbWVFcnJvciA/IFt0aGlzLm5hbWVFcnJvcl0gOiBbXTsgfVxuXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRFbnZJZHMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZW52Rm9ybS5nZXQoJ2Vudmlyb25tZW50SWRzJykhLnZhbHVlID8/IFtdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBvbk5hbWVDaGFuZ2UobmV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5uYW1lID0gbmV4dDtcbiAgICB0aGlzLm5hbWVFcnJvciA9IG51bGw7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgb25EZXNjcmlwdGlvbkNoYW5nZShuZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gbmV4dDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBvblBlcm1pc3Npb25DaGFuZ2UobmV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkV3JpdGVNb2RlID0gbmV4dCA9PT0gJ1JPJyA/ICdSTycgOiAnUlcnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG9uUm93c0NoYW5nZShuZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvd3NJbnB1dCA9IG5leHQgPz8gJyc7XG4gICAgdGhpcy5tYXRyaXhFcnJvciA9IG51bGw7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgb25Db2x1bW5zQ2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uc0lucHV0ID0gbmV4dCA/PyAnJztcbiAgICB0aGlzLm1hdHJpeEVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYWx1ZSgpOiBUZHBEaWFsb2dWYWx1ZSB8IG51bGwge1xuICAgIGNvbnN0IHRyaW1tZWROYW1lID0gdGhpcy5uYW1lLnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWROYW1lKSB7XG4gICAgICB0aGlzLm5hbWVFcnJvciA9ICdOYW1lIGlzIHJlcXVpcmVkLic7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRHVwbGljYXRlTmFtZSh0cmltbWVkTmFtZSkpIHtcbiAgICAgIHRoaXMubmFtZUVycm9yID0gJ0EgcHJvZmlsZSB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hbWVFcnJvciA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZU1hdHJpeCgpO1xuXG4gICAgY29uc3QgZW52SWRzID0gdGhpcy5zZWxlY3RlZEVudklkcztcbiAgICBpZiAoIWVudklkcyB8fCBlbnZJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVudnNFcnJvciA9ICdTZWxlY3QgYXQgbGVhc3Qgb25lIGVudmlyb25tZW50IHRvIGFzc2lnbiB0aGlzIHByb2ZpbGUgdG8uJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnZzRXJyb3IgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hbWVFcnJvciB8fCB0aGlzLm1hdHJpeEVycm9yIHx8IHRoaXMuZW52c0Vycm9yIHx8ICFwYXJzZWQpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29scyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHBhcnNlZC5jb2xzIH0sIChfLCBpKSA9PiBgY29sXyR7aSArIDF9YCk7XG4gICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHBhcnNlZC5yb3dzIH0sIChfLCBpKSA9PiBgcm93XyR7aSArIDF9YCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdHJpbW1lZE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbi50cmltKCkgfHwgbnVsbCxcbiAgICAgIHJlYWRXcml0ZU1vZGU6IHRoaXMucmVhZFdyaXRlTW9kZSxcbiAgICAgIGNvbHVtbnM6IGNvbHMsXG4gICAgICByb3dzLFxuICAgICAgZW52aXJvbm1lbnRJZHM6IHRoaXMuc2VsZWN0ZWRFbnZJZHMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VNYXRyaXgoKTogeyByb3dzOiBudW1iZXI7IGNvbHM6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgcmF3Um93cyA9ICh0aGlzLnJvd3NJbnB1dCA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IHJhd0NvbHMgPSAodGhpcy5jb2x1bW5zSW5wdXQgPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoIXJhd1Jvd3MgfHwgIXJhd0NvbHMpIHtcbiAgICAgIHRoaXMubWF0cml4RXJyb3IgPSAnUm93cyBhbmQgY29sdW1ucyBhcmUgcmVxdWlyZWQuJztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByb3dzTWF0Y2ggPSBOZXdUZXN0RGF0YVByb2ZpbGVEaWFsb2dDb21wb25lbnQuSU5URUdFUl9SRUdFWC5leGVjKHJhd1Jvd3MpO1xuICAgIGNvbnN0IGNvbHNNYXRjaCA9IE5ld1Rlc3REYXRhUHJvZmlsZURpYWxvZ0NvbXBvbmVudC5JTlRFR0VSX1JFR0VYLmV4ZWMocmF3Q29scyk7XG4gICAgaWYgKCFyb3dzTWF0Y2ggfHwgIWNvbHNNYXRjaCkge1xuICAgICAgdGhpcy5tYXRyaXhFcnJvciA9ICdSb3dzIGFuZCBjb2x1bW5zIG11c3QgYmUgd2hvbGUgbnVtYmVycy4nO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSBwYXJzZUludChyb3dzTWF0Y2hbMV0sIDEwKTtcbiAgICBjb25zdCBjb2xzID0gcGFyc2VJbnQoY29sc01hdGNoWzFdLCAxMCk7XG4gICAgaWYgKHJvd3MgPCAxIHx8IGNvbHMgPCAxKSB7XG4gICAgICB0aGlzLm1hdHJpeEVycm9yID0gJ1Jvd3MgYW5kIGNvbHVtbnMgbXVzdCBiZSBhdCBsZWFzdCAxLic7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHJvd3MgPiBOZXdUZXN0RGF0YVByb2ZpbGVEaWFsb2dDb21wb25lbnQuTUFYX0RJTVxuICAgICAgfHwgY29scyA+IE5ld1Rlc3REYXRhUHJvZmlsZURpYWxvZ0NvbXBvbmVudC5NQVhfRElNKSB7XG4gICAgICB0aGlzLm1hdHJpeEVycm9yID0gYFJvd3MgYW5kIGNvbHVtbnMgY2FuIGJlIGF0IG1vc3QgJHtOZXdUZXN0RGF0YVByb2ZpbGVEaWFsb2dDb21wb25lbnQuTUFYX0RJTX0uYDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aGlzLm1hdHJpeEVycm9yID0gbnVsbDtcbiAgICByZXR1cm4geyByb3dzLCBjb2xzIH07XG4gIH1cblxuICAvLyAtLSBTdGF0aWMtb3B0aW9ucyBtb2RlIChsZWdhY3kpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgYnVpbGRTdGF0aWNFbnZDb25maWcoZW52czogVGRwRW52aXJvbm1lbnRPcHRpb25bXSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAoZW52cyB8fCBbXSkubWFwKGUgPT4gdGhpcy50b1NlbGVjdE9wdGlvbihlKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogJ2Vudmlyb25tZW50SWRzJyxcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGVudmlyb25tZW50c+KApicsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBvcHRpb25TdHlsZTogJ2NoZWNrYm94JyxcbiAgICAgIHNob3dTZWxlY3RBbGw6IGZhbHNlLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLy8gLS0gU2VydmVyLXNlYXJjaCBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJTZWFyY2hFbnZDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBtZXJnZWQgPSB0aGlzLm1lcmdlU2VsZWN0ZWRJbnRvT3B0aW9ucyh0aGlzLmN1cnJlbnRFbnZPcHRpb25zKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiAnZW52aXJvbm1lbnRJZHMnLFxuICAgICAgbGFiZWw6ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgZW52aXJvbm1lbnRz4oCmJyxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvblN0eWxlOiAnY2hlY2tib3gnLFxuICAgICAgc2hvd1NlbGVjdEFsbDogZmFsc2UsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRW52cyxcbiAgICAgIGhhc01vcmU6IHRoaXMuY3VycmVudEVudk9wdGlvbnMubGVuZ3RoIDwgdGhpcy50b3RhbEVudkVsZW1lbnRzLFxuICAgICAgb3B0aW9uczogbWVyZ2VkLFxuICAgICAgb25TZWFyY2g6IChxOiBzdHJpbmcpID0+IHRoaXMuc2VhcmNoSW5wdXQkLm5leHQocSA/PyAnJyksXG4gICAgICBvbkxvYWRNb3JlOiAoKSA9PiB0aGlzLm9uRW52TG9hZE1vcmUoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBvbkVudkxvYWRNb3JlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0VudnMpIHsgcmV0dXJuOyB9XG4gICAgaWYgKHRoaXMuY3VycmVudEVudk9wdGlvbnMubGVuZ3RoID49IHRoaXMudG90YWxFbnZFbGVtZW50cykgeyByZXR1cm47IH1cbiAgICB0aGlzLnJ1bkZldGNoKHRoaXMuY3VycmVudFNlYXJjaFRlcm0sIHRoaXMuY3VycmVudFBhZ2VJbmRleCArIDEsIC8qIGFwcGVuZCAqLyB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcnVuRmV0Y2godGVybTogc3RyaW5nLCBwYWdlOiBudW1iZXIsIGFwcGVuZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNMb2FkaW5nRW52cyA9IHRydWU7XG4gICAgdGhpcy5lbnZDb25maWcgPSB0aGlzLmJ1aWxkU2VydmVyU2VhcmNoRW52Q29uZmlnKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLmZldGNoUGFnZSh0ZXJtLCBwYWdlKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoeyB0ZXJtOiB0LCBwYWdlOiBwLCBwYXlsb2FkIH0pID0+IHtcbiAgICAgICAgdGhpcy5hcHBseVBhZ2UodCwgcCwgYXBwZW5kLCBwYXlsb2FkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFBhZ2UodGVybTogc3RyaW5nLCBwYWdlOiBudW1iZXIpOiBPYnNlcnZhYmxlPHtcbiAgICB0ZXJtOiBzdHJpbmc7XG4gICAgcGFnZTogbnVtYmVyO1xuICAgIHBheWxvYWQ6IFRkcEVudlNlYXJjaFBhZ2U7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoRm4pIHtcbiAgICAgIHJldHVybiBvZih7IHRlcm0sIHBhZ2UsIHBheWxvYWQ6IHsgaXRlbXM6IFtdLCB0b3RhbDogMCB9IH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWFyY2hGbih0ZXJtLCBwYWdlLCB0aGlzLnBhZ2VTaXplKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZjxUZHBFbnZTZWFyY2hQYWdlPih7IGl0ZW1zOiBbXSwgdG90YWw6IDAgfSkpLFxuICAgICAgc3dpdGNoTWFwKHBheWxvYWQgPT4gb2YoeyB0ZXJtLCBwYWdlLCBwYXlsb2FkIH0pKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVBhZ2UoXG4gICAgdGVybTogc3RyaW5nLFxuICAgIHBhZ2U6IG51bWJlcixcbiAgICBhcHBlbmQ6IGJvb2xlYW4sXG4gICAgcGF5bG9hZD86IFRkcEVudlNlYXJjaFBhZ2UsXG4gICk6IHZvaWQge1xuICAgIC8vIERyb3Agc3RhbGUgbG9hZC1tb3JlIHJlc3BvbnNlcyDigJQgaWYgdGhlIHVzZXIgdHlwZWQgYSBuZXcgc2VhcmNoIHRlcm1cbiAgICAvLyB3aGlsZSBhIGxvYWQtbW9yZSB3YXMgaW4gZmxpZ2h0LCB0aGlzIGFwcGVuZCBpcyBmb3IgYW4gb2xkIHRlcm0gYW5kXG4gICAgLy8gd291bGQgY29ycnVwdCB0aGUgZnJlc2hseS1yZXBsYWNlZCBvcHRpb25zIGxpc3QuIFRoZSBzZWFyY2gkIHBpcGVsaW5lXG4gICAgLy8gYWxyZWFkeSBkcm9wcyBzdGFsZSB0eXBpbmctZGVib3VuY2UgcmVzcG9uc2VzIHZpYSBzd2l0Y2hNYXAuXG4gICAgaWYgKGFwcGVuZCAmJiB0ZXJtICE9PSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSB0ZXJtO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zID0gKHBheWxvYWQ/Lml0ZW1zID8/IFtdKS5tYXAoZSA9PiB0aGlzLnRvU2VsZWN0T3B0aW9uKGUpKTtcbiAgICBjb25zdCB0b3RhbCA9IHBheWxvYWQ/LnRvdGFsID8/IGl0ZW1zLmxlbmd0aDtcblxuICAgIGlmIChhcHBlbmQpIHtcbiAgICAgIC8vIERlZHVwZSBieSBpZCBzbyBhIHJlLWZldGNoIGNhbid0IGRvdWJsZSB1cCBhbiBhbHJlYWR5LXJlbmRlcmVkIGVudi5cbiAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KHRoaXMuY3VycmVudEVudk9wdGlvbnMubWFwKG8gPT4gTnVtYmVyKG8uaWQpKSk7XG4gICAgICBjb25zdCBmcmVzaCA9IGl0ZW1zLmZpbHRlcihvID0+ICFzZWVuLmhhcyhOdW1iZXIoby5pZCkpKTtcbiAgICAgIHRoaXMuY3VycmVudEVudk9wdGlvbnMgPSBbLi4udGhpcy5jdXJyZW50RW52T3B0aW9ucywgLi4uZnJlc2hdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZPcHRpb25zID0gaXRlbXM7XG4gICAgfVxuICAgIHRoaXMudG90YWxFbnZFbGVtZW50cyA9IHRvdGFsO1xuICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleCA9IHBhZ2U7XG4gICAgdGhpcy5pc0xvYWRpbmdFbnZzID0gZmFsc2U7XG4gICAgdGhpcy5lbnZDb25maWcgPSB0aGlzLmJ1aWxkU2VydmVyU2VhcmNoRW52Q29uZmlnKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogTWVyZ2UgY2FjaGVkIHNlbGVjdGVkIG9wdGlvbnMgd2l0aCB0aGUgdmlzaWJsZSBwYWdlIHNvIHRoZSBtdWx0aS1zZWxlY3RcbiAgICogIHRyaWdnZXIgYWx3YXlzIHNob3dzIHRoZSByaWdodCBuYW1lcyDigJQgZXZlbiB3aGVuIHRoZSB1c2VyIHR5cGVzIGEgcXVlcnlcbiAgICogIHRoYXQgZmlsdGVycyBwcmV2aW91c2x5IHNlbGVjdGVkIGVudnMgb3V0IG9mIHZpZXcuIFNlbGVjdGVkIG9uZXMgY29tZVxuICAgKiAgZmlyc3QgdG8ga2VlcCB0aGUgc3RhdGUgdmlzaWJsZS4gKi9cbiAgcHJpdmF0ZSBtZXJnZVNlbGVjdGVkSW50b09wdGlvbnModmlzaWJsZTogU2VsZWN0T3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbnZDYWNoZS5zaXplID09PSAwKSB7IHJldHVybiB2aXNpYmxlOyB9XG4gICAgY29uc3QgdmlzaWJsZUlkcyA9IG5ldyBTZXQodmlzaWJsZS5tYXAobyA9PiBOdW1iZXIoby5pZCkpKTtcbiAgICBjb25zdCBvbmx5Q2FjaGVkOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3B0IG9mIHRoaXMuc2VsZWN0ZWRFbnZDYWNoZS52YWx1ZXMoKSkge1xuICAgICAgaWYgKCF2aXNpYmxlSWRzLmhhcyhOdW1iZXIob3B0LmlkKSkpIHsgb25seUNhY2hlZC5wdXNoKG9wdCk7IH1cbiAgICB9XG4gICAgcmV0dXJuIFsuLi5vbmx5Q2FjaGVkLCAuLi52aXNpYmxlXTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgdGhlIHNlbGVjdGVkLWVudiBjYWNoZSBmcm9tIHRoZSBGb3JtQ29udHJvbCB2YWx1ZSBzbyB0aGUgdHJpZ2dlclxuICAgKiAgZGlzcGxheSArIGZ1dHVyZSBtZXJnZXMgcmVmbGVjdCB0aGUgbGF0ZXN0IHNlbGVjdGlvbi4gV2UgY2FjaGUgdGhlIGZ1bGxcbiAgICogIFNlbGVjdE9wdGlvbiAoaWQgKyBuYW1lKSBieSBsb29raW5nIHVwIGVpdGhlciB0aGUgdmlzaWJsZSBwYWdlIG9yIHRoZVxuICAgKiAgcHJpb3IgY2FjaGUuIFNlbGVjdGlvbnMgYXJlIGFjY3VtdWxhdGVkLCBuZXZlciByZW1vdmVkIOKAlCBldmVuIHVuc2VsZWN0IOKGklxuICAgKiAgcmVzZWxlY3Qgd29ya3Mgd2l0aG91dCBhIGZyZXNoIGZldGNoLiAqL1xuICBwcml2YXRlIHJlbWVtYmVyU2VsZWN0ZWRFbnZzKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpZHM6IG51bWJlcltdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUubWFwKHYgPT4gTnVtYmVyKHYpKS5maWx0ZXIobiA9PiAhTnVtYmVyLmlzTmFOKG4pKVxuICAgICAgOiBbXTtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRFbnZDYWNoZS5oYXMoaWQpKSB7IGNvbnRpbnVlOyB9XG4gICAgICBjb25zdCBmcm9tVmlzaWJsZSA9IHRoaXMuY3VycmVudEVudk9wdGlvbnMuZmluZChvID0+IE51bWJlcihvLmlkKSA9PT0gaWQpO1xuICAgICAgaWYgKGZyb21WaXNpYmxlKSB7IHRoaXMuc2VsZWN0ZWRFbnZDYWNoZS5zZXQoaWQsIGZyb21WaXNpYmxlKTsgfVxuICAgIH1cbiAgfVxuXG4gIC8vIC0tIEhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIHRvU2VsZWN0T3B0aW9uKGU6IFRkcEVudmlyb25tZW50T3B0aW9uKTogU2VsZWN0T3B0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGUuaWQsXG4gICAgICB2YWx1ZTogZS5pZCxcbiAgICAgIG5hbWU6IGUubmFtZSxcbiAgICAgIGxhYmVsOiBlLm5hbWUsXG4gICAgICBzdGF0dXNDb2xvcjogZS5jb2xvcixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0R1cGxpY2F0ZU5hbWUoY2FuZGlkYXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBleGlzdGluZyA9ICh0aGlzLmV4aXN0aW5nTmFtZXMgPz8gW10pLm1hcChuID0+IChuID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3QgbG93ZXJlZCA9IGNhbmRpZGF0ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdlZGl0Jykge1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSAodGhpcy5pbml0aWFsVmFsdWU/Lm5hbWUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIGxvd2VyZWQgIT09IG9yaWdpbmFsICYmIGV4aXN0aW5nLmluY2x1ZGVzKGxvd2VyZWQpO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3RpbmcuaW5jbHVkZXMobG93ZXJlZCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS13LWZ1bGxcIj5cblxuICA8IS0tIE5hbWUgKyBQZXJtaXNzaW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy1bMWZyX2F1dG9dIGNxYS1nYXAtNCBjcWEtaXRlbXMtc3RhcnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICBsYWJlbD1cIlByb2ZpbGUgbmFtZVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBHdWVzdCBQZXJzb25hc1wiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW3ZhbHVlXT1cIm5hbWVcIlxuICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtlcnJvcnNdPVwibmFtZUVycm9yc0FycmF5XCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTmFtZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLW1iLTEuNSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDBcIj5QZXJtaXNzaW9uPC9sYWJlbD5cbiAgICAgIDxjcWEtcGVybWlzc2lvbi10b2dnbGVcbiAgICAgICAgW3ZhbHVlXT1cInJlYWRXcml0ZU1vZGVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QZXJtaXNzaW9uQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDwvY3FhLXBlcm1pc3Npb24tdG9nZ2xlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgIGxhYmVsPVwiRGVzY3JpcHRpb25cIlxuICAgICAgcGxhY2Vob2xkZXI9XCJXaGF0IGRhdGEgaXMgdGhpcyBwcm9maWxlIGZvcj9cIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwib25EZXNjcmlwdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cblxuICA8IS0tIFJvd3MgKyBDb2x1bW5zIG1hdHJpeCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtNFwiPlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgbGFiZWw9XCJSb3dzXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIDJcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgW3ZhbHVlXT1cInJvd3NJbnB1dFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblJvd3NDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgbGFiZWw9XCJDb2x1bW5zXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIDNcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgW3ZhbHVlXT1cImNvbHVtbnNJbnB1dFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNvbHVtbnNDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwibWF0cml4RXJyb3JcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LXhzIGNxYS10ZXh0LXJlZC02MDBcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1mbGV4LW5vbmVcIiBzdHlsZT1cImZvbnQtc2l6ZToxNHB4O3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7bGluZS1oZWlnaHQ6MTRweDtcIj5lcnJvcjwvbWF0LWljb24+XG4gICAgICA8c3Bhbj57eyBtYXRyaXhFcnJvciB9fTwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQXNzaWduIHRvIGVudmlyb25tZW50cyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgIEFzc2lnbiB0byBlbnZpcm9ubWVudHMgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNjAwXCI+Kjwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgIFtmb3JtXT1cImVudkZvcm1cIlxuICAgICAgW2NvbmZpZ109XCJlbnZDb25maWdcIj5cbiAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8c3BhbiAqbmdJZj1cImVudnNFcnJvclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXRleHQteHMgY3FhLXRleHQtcmVkLTYwMFwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLWZsZXgtbm9uZVwiIHN0eWxlPVwiZm9udC1zaXplOjE0cHg7d2lkdGg6MTRweDtoZWlnaHQ6MTRweDtsaW5lLWhlaWdodDoxNHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPnt7IGVudnNFcnJvciB9fTwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCIhZW52c0Vycm9yXCIgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgRWFjaCBlbnZpcm9ubWVudCBnZXRzIGFuIGluZGVwZW5kZW50IGNvcHkgb2YgdGhlIGRhdGEgKHNhbWUgY29sdW1ucywgc2VwYXJhdGUgcm93cykuXG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuPC9kaXY+XG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5tb2RlbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL25ldy10ZXN0LWRhdGEtcHJvZmlsZS1kaWFsb2cvbmV3LXRlc3QtZGF0YS1wcm9maWxlLWRpYWxvZy5tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHR5cGUgVGRwRGlhbG9nUGVybWlzc2lvbiA9ICdSTycgfCAnUlcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRkcERpYWxvZ1ZhbHVlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgcmVhZFdyaXRlTW9kZTogVGRwRGlhbG9nUGVybWlzc2lvbjtcbiAgY29sdW1uczogc3RyaW5nW107XG4gIHJvd3M6IHN0cmluZ1tdO1xuICBlbnZpcm9ubWVudElkczogbnVtYmVyW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGRwRW52aXJvbm1lbnRPcHRpb24ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRkcEVudlNlYXJjaFBhZ2Uge1xuICBpdGVtczogVGRwRW52aXJvbm1lbnRPcHRpb25bXTtcbiAgdG90YWw6IG51bWJlcjtcbn1cblxuLyoqIFBhZ2luYXRlZCwgZGVib3VuY2VkIHNlcnZlci1zZWFyY2ggY2FsbGJhY2sgZm9yIHRoZSBBc3NpZ24tdG8tZW52aXJvbm1lbnRzXG4gKiAgZHJvcGRvd24uIFRoZSBkaWFsb2cgY2FsbHMgYCgnJywgMCwgcGFnZVNpemUpYCBvbiBpbml0IGFuZCBlYWNoIHBhbmVsIG9wZW4sXG4gKiAgYWdhaW4gd2l0aCBhIGZyZXNoIHRlcm0gd2hlbmV2ZXIgdGhlIHVzZXIgdHlwZXMgKGRlYm91bmNlZCAzMDBtcyksIGFuZCBhZ2FpblxuICogIG9uIHNjcm9sbC1uZWFyLWJvdHRvbSBmb3IgcGFnaW5hdGlvbi4gQ2FsbGVyIHdyYXBzIHRoZSB3b3Jrc3BhY2UgZW52IGxpc3RcbiAqICBzZXJ2aWNlLiAqL1xuZXhwb3J0IHR5cGUgVGRwRW52U2VhcmNoRm4gPVxuICAodGVybTogc3RyaW5nLCBwYWdlOiBudW1iZXIsIHNpemU6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxUZHBFbnZTZWFyY2hQYWdlPjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXdUZXN0RGF0YVByb2ZpbGVEaWFsb2dJbnB1dHMge1xuICBtb2RlPzogJ2NyZWF0ZScgfCAnZWRpdCc7XG4gIGluaXRpYWxWYWx1ZT86IFBhcnRpYWw8VGRwRGlhbG9nVmFsdWU+O1xuICBleGlzdGluZ05hbWVzPzogc3RyaW5nW107XG4gIC8qKiBTdGF0aWMgZW52IGxpc3QuIEtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkg4oCUIHByZWZlciBgc2VhcmNoRm5gXG4gICAqICBmb3Igd29ya3NwYWNlcyB3aXRoIG1vcmUgdGhhbiBhIGNvdXBsZSBkb3plbiBlbnZpcm9ubWVudHMuICovXG4gIGVudmlyb25tZW50cz86IFRkcEVudmlyb25tZW50T3B0aW9uW107XG4gIC8qKiBTZXJ2ZXItc2VhcmNoIHNvdXJjZS4gV2hlbiBwcm92aWRlZCwgdGhlIGVudiBkcm9wZG93biBzd2l0Y2hlcyB0b1xuICAgKiAgcGFnaW5hdGVkIHNlcnZlci1zaWRlIHNlYXJjaCBhbmQgYGVudmlyb25tZW50c2AgaXMgaWdub3JlZC4gKi9cbiAgc2VhcmNoRm4/OiBUZHBFbnZTZWFyY2hGbjtcbiAgLyoqIFBhZ2Ugc2l6ZSBmb3IgYHNlYXJjaEZuYC4gRGVmYXVsdHMgdG8gNTAuICovXG4gIHBhZ2VTaXplPzogbnVtYmVyO1xufVxuIl19
|
|
@@ -86,7 +86,7 @@ export class QuestionnaireListComponent {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
QuestionnaireListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: QuestionnaireListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
89
|
-
QuestionnaireListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: QuestionnaireListComponent, selector: "cqa-questionnaire-list", inputs: { items: "items", defaultPageSize: "defaultPageSize", pageSizeOptions: "pageSizeOptions", inputPlaceholder: "inputPlaceholder" }, outputs: { answerChange: "answerChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "pageSizeDropdownContainer", first: true, predicate: ["pageSizeDropdownContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-rounded-xl cqa-shadow-[0_1px_2px_rgba(0,0,0,0.05)] cqa-font-inter\" role=\"region\" aria-label=\"Clarification Questionnaire\">\n\n <!-- Header -->\n <div class=\"cqa-py-3 cqa-px-6 cqa-bg-[#EEF2FF80]\">\n <h2 class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#0F172A] cqa-leading-[22px] cqa-m-0 cqa-mb-1\">Clarification Questionnaire</h2>\n <p class=\"cqa-text-[14px] cqa-text-[#475569] cqa-leading-[18px] cqa-m-0\">\n The AI has generated these questions to resolve ambiguities in the requirement.\n Answering these will regenerate specific test cases.\n </p>\n </div>\n\n <div class=\"cqa-px-6 cqa-py-3\">\n <!-- Question rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <ng-container *ngIf=\"visibleItems.length; else emptyState\">\n <div *ngFor=\"let item of visibleItems; last as isLast; trackBy: trackById\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2.5 cqa-mb-2\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-[24px] cqa-h-[24px] cqa-min-w-[24px] cqa-rounded-full cqa-bg-[#EEF2FF] cqa-text-[#4F46E5] cqa-text-[12px] cqa-leading-[18px] cqa-font-bold cqa-shrink-0\">{{ item.index }}</span>\n <label class=\"cqa-text-[12px] cqa-leading-[15px] cqa-text-[#0F172A]\" [for]=\"getInputId(item.id)\">{{ item.question }}</label>\n </div>\n <cqa-custom-input\n [inputId]=\"getInputId(item.id)\"\n [value]=\"item.answer\"\n [placeholder]=\"inputPlaceholder\"\n [fullWidth]=\"true\"\n (valueChange)=\"onAnswerInput(item.id, $event)\"\n class=\"cqa-w-full\"\n ></cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #emptyState>\n <div class=\"cqa-py-6 cqa-text-[13px] cqa-text-[#6B7280] cqa-text-center\">No questions available.</div>\n </ng-template>\n </div>\n\n <!-- Footer: aligned with table pagination design -->\n <div class=\"cqa-mt-3 table-footer-pagination cqa-text-[#717182] cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-flex-wrap cqa-px-[21px] cqa-py-1.5\" aria-live=\"polite\" style=\"border-top: 1px solid #E5E7EB;\">\n <div class=\"pagination-info cqa-flex cqa-items-center cqa-gap-[7px] cqa-relative\">\n <span class=\"rows-label\">Questions per page</span>\n <div class=\"cqa-relative\" #pageSizeDropdownContainer>\n <button\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[24px] cqa-text-[#0A0A0A] cqa-px-[11.5px] cqa-py-[6.75px]\"\n (click)=\"togglePageSizeMenu()\"\n [attr.aria-expanded]=\"pageSizeOpen\"\n aria-haspopup=\"listbox\"\n aria-label=\"Questions per page\"\n >\n {{ pageSize }}\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g opacity=\"0.5\"><path d=\"M3.5 5.25L7 8.75L10.5 5.25\" stroke=\"#717182\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g></svg>\n </button>\n <div\n *ngIf=\"pageSizeOpen\"\n class=\"cqa-absolute cqa-z-[100] cqa-bottom-[calc(100%+8px)] cqa-left-0 cqa-w-[75px] cqa-max-h-[170px] cqa-overflow-auto cqa-rounded-lg cqa-border cqa-border-[#E5E7EB] cqa-bg-white cqa-shadow-[0px_4px_6px_-1px_rgba(0,0,0,0.1)] cqa-p-[5px]\"\n role=\"listbox\"\n [attr.aria-activedescendant]=\"'question-pagesize-' + pageSize\"\n >\n <button\n *ngFor=\"let opt of pageSizeOptions\"\n type=\"button\"\n class=\"cqa-w-full cqa-px-2 cqa-py-[6px] hover:cqa-bg-[#F7F8FA] cqa-text-left cqa-rounded-md cqa-text-black-100\"\n [attr.id]=\"'question-pagesize-' + opt\"\n role=\"option\"\n [attr.aria-selected]=\"pageSize === opt\"\n (click)=\"selectPageSize(opt)\"\n >\n {{ opt }}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"pagination-right cqa-flex cqa-items-center cqa-gap-[21px]\">\n <div class=\"pagination-range\">\n {{ totalItems ? startIndex + 1 : 0 }}–{{ endIndex }} of {{ totalItems }}\n </div>\n <div class=\"pagination-controls cqa-flex cqa-items-stretch cqa-gap-[3.5px]\">\n <button class=\"pagination-btn cqa-w-[28px] cqa-h-[28px] cqa-min-w-[28px] cqa-rounded-[5px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-bg-[#F7F8FA] cqa-flex cqa-items-center cqa-justify-center disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed\" [disabled]=\"isPrevDisabled\" (click)=\"prevPage()\" aria-label=\"Previous page\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.75 10.5L5.25 7L8.75 3.5\" stroke=\"#0A0A0A\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n <button class=\"pagination-btn cqa-w-[28px] cqa-h-[28px] cqa-min-w-[28px] cqa-rounded-[5px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-bg-[#F7F8FA] cqa-flex cqa-items-center cqa-justify-center disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed\" [disabled]=\"isNextDisabled\" (click)=\"nextPage()\" aria-label=\"Next page\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M5.25 10.5L8.75 7L5.25 3.5\" stroke=\"#0A0A0A\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n</div>\n", components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
89
|
+
QuestionnaireListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: QuestionnaireListComponent, selector: "cqa-questionnaire-list", inputs: { items: "items", defaultPageSize: "defaultPageSize", pageSizeOptions: "pageSizeOptions", inputPlaceholder: "inputPlaceholder" }, outputs: { answerChange: "answerChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "pageSizeDropdownContainer", first: true, predicate: ["pageSizeDropdownContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-rounded-xl cqa-shadow-[0_1px_2px_rgba(0,0,0,0.05)] cqa-font-inter\" role=\"region\" aria-label=\"Clarification Questionnaire\">\n\n <!-- Header -->\n <div class=\"cqa-py-3 cqa-px-6 cqa-bg-[#EEF2FF80]\">\n <h2 class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#0F172A] cqa-leading-[22px] cqa-m-0 cqa-mb-1\">Clarification Questionnaire</h2>\n <p class=\"cqa-text-[14px] cqa-text-[#475569] cqa-leading-[18px] cqa-m-0\">\n The AI has generated these questions to resolve ambiguities in the requirement.\n Answering these will regenerate specific test cases.\n </p>\n </div>\n\n <div class=\"cqa-px-6 cqa-py-3\">\n <!-- Question rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <ng-container *ngIf=\"visibleItems.length; else emptyState\">\n <div *ngFor=\"let item of visibleItems; last as isLast; trackBy: trackById\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2.5 cqa-mb-2\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-[24px] cqa-h-[24px] cqa-min-w-[24px] cqa-rounded-full cqa-bg-[#EEF2FF] cqa-text-[#4F46E5] cqa-text-[12px] cqa-leading-[18px] cqa-font-bold cqa-shrink-0\">{{ item.index }}</span>\n <label class=\"cqa-text-[12px] cqa-leading-[15px] cqa-text-[#0F172A]\" [for]=\"getInputId(item.id)\">{{ item.question }}</label>\n </div>\n <cqa-custom-input\n [inputId]=\"getInputId(item.id)\"\n [value]=\"item.answer\"\n [placeholder]=\"inputPlaceholder\"\n [fullWidth]=\"true\"\n (valueChange)=\"onAnswerInput(item.id, $event)\"\n class=\"cqa-w-full\"\n ></cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #emptyState>\n <div class=\"cqa-py-6 cqa-text-[13px] cqa-text-[#6B7280] cqa-text-center\">No questions available.</div>\n </ng-template>\n </div>\n\n <!-- Footer: aligned with table pagination design -->\n <div class=\"cqa-mt-3 table-footer-pagination cqa-text-[#717182] cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-flex-wrap cqa-px-[21px] cqa-py-1.5\" aria-live=\"polite\" style=\"border-top: 1px solid #E5E7EB;\">\n <div class=\"pagination-info cqa-flex cqa-items-center cqa-gap-[7px] cqa-relative\">\n <span class=\"rows-label\">Questions per page</span>\n <div class=\"cqa-relative\" #pageSizeDropdownContainer>\n <button\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[24px] cqa-text-[#0A0A0A] cqa-px-[11.5px] cqa-py-[6.75px]\"\n (click)=\"togglePageSizeMenu()\"\n [attr.aria-expanded]=\"pageSizeOpen\"\n aria-haspopup=\"listbox\"\n aria-label=\"Questions per page\"\n >\n {{ pageSize }}\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g opacity=\"0.5\"><path d=\"M3.5 5.25L7 8.75L10.5 5.25\" stroke=\"#717182\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g></svg>\n </button>\n <div\n *ngIf=\"pageSizeOpen\"\n class=\"cqa-absolute cqa-z-[100] cqa-bottom-[calc(100%+8px)] cqa-left-0 cqa-w-[75px] cqa-max-h-[170px] cqa-overflow-auto cqa-rounded-lg cqa-border cqa-border-[#E5E7EB] cqa-bg-white cqa-shadow-[0px_4px_6px_-1px_rgba(0,0,0,0.1)] cqa-p-[5px]\"\n role=\"listbox\"\n [attr.aria-activedescendant]=\"'question-pagesize-' + pageSize\"\n >\n <button\n *ngFor=\"let opt of pageSizeOptions\"\n type=\"button\"\n class=\"cqa-w-full cqa-px-2 cqa-py-[6px] hover:cqa-bg-[#F7F8FA] cqa-text-left cqa-rounded-md cqa-text-black-100\"\n [attr.id]=\"'question-pagesize-' + opt\"\n role=\"option\"\n [attr.aria-selected]=\"pageSize === opt\"\n (click)=\"selectPageSize(opt)\"\n >\n {{ opt }}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"pagination-right cqa-flex cqa-items-center cqa-gap-[21px]\">\n <div class=\"pagination-range\">\n {{ totalItems ? startIndex + 1 : 0 }}–{{ endIndex }} of {{ totalItems }}\n </div>\n <div class=\"pagination-controls cqa-flex cqa-items-stretch cqa-gap-[3.5px]\">\n <button class=\"pagination-btn cqa-w-[28px] cqa-h-[28px] cqa-min-w-[28px] cqa-rounded-[5px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-bg-[#F7F8FA] cqa-flex cqa-items-center cqa-justify-center disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed\" [disabled]=\"isPrevDisabled\" (click)=\"prevPage()\" aria-label=\"Previous page\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.75 10.5L5.25 7L8.75 3.5\" stroke=\"#0A0A0A\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n <button class=\"pagination-btn cqa-w-[28px] cqa-h-[28px] cqa-min-w-[28px] cqa-rounded-[5px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-bg-[#F7F8FA] cqa-flex cqa-items-center cqa-justify-center disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed\" [disabled]=\"isNextDisabled\" (click)=\"nextPage()\" aria-label=\"Next page\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M5.25 10.5L8.75 7L5.25 3.5\" stroke=\"#0A0A0A\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n</div>\n", components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle", "showPasswordToggle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
90
90
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: QuestionnaireListComponent, decorators: [{
|
|
91
91
|
type: Component,
|
|
92
92
|
args: [{ selector: 'cqa-questionnaire-list', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-rounded-xl cqa-shadow-[0_1px_2px_rgba(0,0,0,0.05)] cqa-font-inter\" role=\"region\" aria-label=\"Clarification Questionnaire\">\n\n <!-- Header -->\n <div class=\"cqa-py-3 cqa-px-6 cqa-bg-[#EEF2FF80]\">\n <h2 class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#0F172A] cqa-leading-[22px] cqa-m-0 cqa-mb-1\">Clarification Questionnaire</h2>\n <p class=\"cqa-text-[14px] cqa-text-[#475569] cqa-leading-[18px] cqa-m-0\">\n The AI has generated these questions to resolve ambiguities in the requirement.\n Answering these will regenerate specific test cases.\n </p>\n </div>\n\n <div class=\"cqa-px-6 cqa-py-3\">\n <!-- Question rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <ng-container *ngIf=\"visibleItems.length; else emptyState\">\n <div *ngFor=\"let item of visibleItems; last as isLast; trackBy: trackById\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2.5 cqa-mb-2\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-[24px] cqa-h-[24px] cqa-min-w-[24px] cqa-rounded-full cqa-bg-[#EEF2FF] cqa-text-[#4F46E5] cqa-text-[12px] cqa-leading-[18px] cqa-font-bold cqa-shrink-0\">{{ item.index }}</span>\n <label class=\"cqa-text-[12px] cqa-leading-[15px] cqa-text-[#0F172A]\" [for]=\"getInputId(item.id)\">{{ item.question }}</label>\n </div>\n <cqa-custom-input\n [inputId]=\"getInputId(item.id)\"\n [value]=\"item.answer\"\n [placeholder]=\"inputPlaceholder\"\n [fullWidth]=\"true\"\n (valueChange)=\"onAnswerInput(item.id, $event)\"\n class=\"cqa-w-full\"\n ></cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #emptyState>\n <div class=\"cqa-py-6 cqa-text-[13px] cqa-text-[#6B7280] cqa-text-center\">No questions available.</div>\n </ng-template>\n </div>\n\n <!-- Footer: aligned with table pagination design -->\n <div class=\"cqa-mt-3 table-footer-pagination cqa-text-[#717182] cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-flex-wrap cqa-px-[21px] cqa-py-1.5\" aria-live=\"polite\" style=\"border-top: 1px solid #E5E7EB;\">\n <div class=\"pagination-info cqa-flex cqa-items-center cqa-gap-[7px] cqa-relative\">\n <span class=\"rows-label\">Questions per page</span>\n <div class=\"cqa-relative\" #pageSizeDropdownContainer>\n <button\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[24px] cqa-text-[#0A0A0A] cqa-px-[11.5px] cqa-py-[6.75px]\"\n (click)=\"togglePageSizeMenu()\"\n [attr.aria-expanded]=\"pageSizeOpen\"\n aria-haspopup=\"listbox\"\n aria-label=\"Questions per page\"\n >\n {{ pageSize }}\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g opacity=\"0.5\"><path d=\"M3.5 5.25L7 8.75L10.5 5.25\" stroke=\"#717182\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g></svg>\n </button>\n <div\n *ngIf=\"pageSizeOpen\"\n class=\"cqa-absolute cqa-z-[100] cqa-bottom-[calc(100%+8px)] cqa-left-0 cqa-w-[75px] cqa-max-h-[170px] cqa-overflow-auto cqa-rounded-lg cqa-border cqa-border-[#E5E7EB] cqa-bg-white cqa-shadow-[0px_4px_6px_-1px_rgba(0,0,0,0.1)] cqa-p-[5px]\"\n role=\"listbox\"\n [attr.aria-activedescendant]=\"'question-pagesize-' + pageSize\"\n >\n <button\n *ngFor=\"let opt of pageSizeOptions\"\n type=\"button\"\n class=\"cqa-w-full cqa-px-2 cqa-py-[6px] hover:cqa-bg-[#F7F8FA] cqa-text-left cqa-rounded-md cqa-text-black-100\"\n [attr.id]=\"'question-pagesize-' + opt\"\n role=\"option\"\n [attr.aria-selected]=\"pageSize === opt\"\n (click)=\"selectPageSize(opt)\"\n >\n {{ opt }}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"pagination-right cqa-flex cqa-items-center cqa-gap-[21px]\">\n <div class=\"pagination-range\">\n {{ totalItems ? startIndex + 1 : 0 }}–{{ endIndex }} of {{ totalItems }}\n </div>\n <div class=\"pagination-controls cqa-flex cqa-items-stretch cqa-gap-[3.5px]\">\n <button class=\"pagination-btn cqa-w-[28px] cqa-h-[28px] cqa-min-w-[28px] cqa-rounded-[5px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-bg-[#F7F8FA] cqa-flex cqa-items-center cqa-justify-center disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed\" [disabled]=\"isPrevDisabled\" (click)=\"prevPage()\" aria-label=\"Previous page\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.75 10.5L5.25 7L8.75 3.5\" stroke=\"#0A0A0A\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n <button class=\"pagination-btn cqa-w-[28px] cqa-h-[28px] cqa-min-w-[28px] cqa-rounded-[5px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-bg-[#F7F8FA] cqa-flex cqa-items-center cqa-justify-center disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed\" [disabled]=\"isNextDisabled\" (click)=\"nextPage()\" aria-label=\"Next page\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M5.25 10.5L8.75 7L5.25 3.5\" stroke=\"#0A0A0A\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n</div>\n", styles: [] }]
|
package/esm2020/lib/step-builder/advanced-variables-form/advanced-variables-form.component.mjs
CHANGED
|
@@ -150,7 +150,7 @@ export class AdvancedVariablesFormComponent {
|
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
AdvancedVariablesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AdvancedVariablesFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
153
|
-
AdvancedVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: { advancedVariables: "advancedVariables", advancedVariableForm: "advancedVariableForm" }, outputs: { variableBooleanChange: "variableBooleanChange", variableValueChange: "variableValueChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap advanced-variables-form cqa-mb-4\">\n <ng-container *ngFor=\"let variable of advancedVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"isBooleanType(variable)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: 100%\">\n <mat-slide-toggle \n [checked]=\"getBooleanValue(variable, i)\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" \n color=\"primary\">\n </mat-slide-toggle>\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n </div>\n </ng-container>\n\n <!-- str_list variables with dynamic list -->\n <ng-container *ngIf=\"isStrListType(variable)\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <ng-container *ngIf=\"getStrListFormArray(variable, i) as formArray\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-1\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <!-- Empty-state add button: no rows exist yet, so the usual per-row add icon isn't rendered.\n Placing the add button next to the label is the only way to get the first entry back. -->\n <div\n *ngIf=\"formArray.length === 0\"\n class=\"cqa-cursor-pointer cqa-text-blue-600 cqa-flex cqa-items-center cqa-justify-center\"\n (click)=\"addStrListItem(variable, i)\">\n <mat-icon style=\"display: flex; align-items: center; justify-content: center; font-size: 20px;\">add</mat-icon>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let control of formArray.controls; let itemIndex = index; trackBy: trackByControl\" class=\"cqa-flex cqa-gap-2 cqa-items-center\">\n <cqa-custom-input\n [placeholder]=\"'Enter locator'\"\n [value]=\"control.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"onStrListItemChange(variable, i, itemIndex, $event)\">\n </cqa-custom-input>\n <!-- Delete icon is always available so the user can remove ANY row, including the last one. -->\n <div class=\"cqa-cursor-pointer cqa-text-red-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"removeStrListItem(variable, i, itemIndex)\">\n <mat-icon style=\"font-size: 24px;\">delete</mat-icon>\n </div>\n <div *ngIf=\"itemIndex === formArray.length - 1\" class=\"cqa-cursor-pointer cqa-text-blue-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"addStrListItem(variable, i)\">\n <mat-icon style=\"font-size: 24px;\">add</mat-icon>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n", components: [{ type: i1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
153
|
+
AdvancedVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: { advancedVariables: "advancedVariables", advancedVariableForm: "advancedVariableForm" }, outputs: { variableBooleanChange: "variableBooleanChange", variableValueChange: "variableValueChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap advanced-variables-form cqa-mb-4\">\n <ng-container *ngFor=\"let variable of advancedVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"isBooleanType(variable)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: 100%\">\n <mat-slide-toggle \n [checked]=\"getBooleanValue(variable, i)\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" \n color=\"primary\">\n </mat-slide-toggle>\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n </div>\n </ng-container>\n\n <!-- str_list variables with dynamic list -->\n <ng-container *ngIf=\"isStrListType(variable)\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <ng-container *ngIf=\"getStrListFormArray(variable, i) as formArray\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-1\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <!-- Empty-state add button: no rows exist yet, so the usual per-row add icon isn't rendered.\n Placing the add button next to the label is the only way to get the first entry back. -->\n <div\n *ngIf=\"formArray.length === 0\"\n class=\"cqa-cursor-pointer cqa-text-blue-600 cqa-flex cqa-items-center cqa-justify-center\"\n (click)=\"addStrListItem(variable, i)\">\n <mat-icon style=\"display: flex; align-items: center; justify-content: center; font-size: 20px;\">add</mat-icon>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let control of formArray.controls; let itemIndex = index; trackBy: trackByControl\" class=\"cqa-flex cqa-gap-2 cqa-items-center\">\n <cqa-custom-input\n [placeholder]=\"'Enter locator'\"\n [value]=\"control.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"onStrListItemChange(variable, i, itemIndex, $event)\">\n </cqa-custom-input>\n <!-- Delete icon is always available so the user can remove ANY row, including the last one. -->\n <div class=\"cqa-cursor-pointer cqa-text-red-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"removeStrListItem(variable, i, itemIndex)\">\n <mat-icon style=\"font-size: 24px;\">delete</mat-icon>\n </div>\n <div *ngIf=\"itemIndex === formArray.length - 1\" class=\"cqa-cursor-pointer cqa-text-blue-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"addStrListItem(variable, i)\">\n <mat-icon style=\"font-size: 24px;\">add</mat-icon>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n", components: [{ type: i1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle", "showPasswordToggle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
154
154
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AdvancedVariablesFormComponent, decorators: [{
|
|
155
155
|
type: Component,
|
|
156
156
|
args: [{ selector: 'cqa-advanced-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap advanced-variables-form cqa-mb-4\">\n <ng-container *ngFor=\"let variable of advancedVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"isBooleanType(variable)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: 100%\">\n <mat-slide-toggle \n [checked]=\"getBooleanValue(variable, i)\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" \n color=\"primary\">\n </mat-slide-toggle>\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n </div>\n </ng-container>\n\n <!-- str_list variables with dynamic list -->\n <ng-container *ngIf=\"isStrListType(variable)\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <ng-container *ngIf=\"getStrListFormArray(variable, i) as formArray\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-1\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <!-- Empty-state add button: no rows exist yet, so the usual per-row add icon isn't rendered.\n Placing the add button next to the label is the only way to get the first entry back. -->\n <div\n *ngIf=\"formArray.length === 0\"\n class=\"cqa-cursor-pointer cqa-text-blue-600 cqa-flex cqa-items-center cqa-justify-center\"\n (click)=\"addStrListItem(variable, i)\">\n <mat-icon style=\"display: flex; align-items: center; justify-content: center; font-size: 20px;\">add</mat-icon>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let control of formArray.controls; let itemIndex = index; trackBy: trackByControl\" class=\"cqa-flex cqa-gap-2 cqa-items-center\">\n <cqa-custom-input\n [placeholder]=\"'Enter locator'\"\n [value]=\"control.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"onStrListItemChange(variable, i, itemIndex, $event)\">\n </cqa-custom-input>\n <!-- Delete icon is always available so the user can remove ANY row, including the last one. -->\n <div class=\"cqa-cursor-pointer cqa-text-red-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"removeStrListItem(variable, i, itemIndex)\">\n <mat-icon style=\"font-size: 24px;\">delete</mat-icon>\n </div>\n <div *ngIf=\"itemIndex === formArray.length - 1\" class=\"cqa-cursor-pointer cqa-text-blue-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"addStrListItem(variable, i)\">\n <mat-icon style=\"font-size: 24px;\">add</mat-icon>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n", styles: [] }]
|