@cqa-lib/cqa-ui 1.1.188 → 1.1.190
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/add-prerequisite-cases-section/add-prerequisite-cases-section.component.mjs +1 -1
- package/esm2020/lib/button/button.component.mjs +3 -3
- package/esm2020/lib/compare-runs/compare-runs.component.mjs +1 -1
- package/esm2020/lib/custom-textarea/custom-textarea.component.mjs +3 -6
- package/esm2020/lib/dashboards/dashboard-header/dashboard-header.component.mjs +1 -1
- package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +82 -3
- package/esm2020/lib/filters/dynamic-filter/dynamic-filter.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.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-api/step-builder-api.component.mjs +3 -2
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.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-loop/step-builder-loop.component.mjs +1 -1
- package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +1122 -0
- package/esm2020/lib/test-case-details/api-step/api-step.component.mjs +48 -9
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/custom-edit-step/custom-edit-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/element-popup/element-popup.component.mjs +1 -1
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-data.mjs +3 -0
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-field.config.mjs +188 -0
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-ref.mjs +28 -0
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.component.mjs +291 -0
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.service.mjs +67 -0
- package/esm2020/lib/ui-kit.module.mjs +13 -3
- package/esm2020/lib/utils/tw-overlay-container.mjs +6 -3
- package/esm2020/public-api.mjs +7 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +2066 -227
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +1898 -112
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/custom-textarea/custom-textarea.component.d.ts +1 -2
- package/lib/dynamic-select/dynamic-select-field.component.d.ts +19 -1
- package/lib/test-case-details/api-edit-step/api-edit-step.component.d.ts +346 -0
- package/lib/test-case-details/api-step/api-step.component.d.ts +18 -2
- package/lib/test-case-details/step-details-drawer/step-details-drawer-data.d.ts +7 -0
- package/lib/test-case-details/step-details-drawer/step-details-drawer-field.config.d.ts +51 -0
- package/lib/test-case-details/step-details-drawer/step-details-drawer-ref.d.ts +13 -0
- package/lib/test-case-details/step-details-drawer/step-details-drawer.component.d.ts +60 -0
- package/lib/test-case-details/step-details-drawer/step-details-drawer.service.d.ts +22 -0
- package/lib/ui-kit.module.d.ts +35 -33
- package/package.json +1 -1
- package/public-api.d.ts +6 -0
- package/src/lib/assets/images/delete.svg +3 -0
- package/styles.css +1 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core';
|
|
2
|
+
import { getStepDetailsStepType, STEP_DETAILS_FIELDS_BY_TYPE, STEP_DETAILS_FIELD_META, ADVANCED_TOGGLE_KEYS, ADVANCED_SUBFIELDS_BY_TYPE, } from './step-details-drawer-field.config';
|
|
3
|
+
import { STEP_DETAILS_DRAWER_REF } from './step-details-drawer-ref';
|
|
4
|
+
import { STEP_DETAILS_DRAWER_DATA } from './step-details-drawer-data';
|
|
5
|
+
import { isNormalStepConfig, isApiStepConfig, isAiAgentStepConfig, } from '../test-case-step.models';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/forms";
|
|
8
|
+
import * as i2 from "@angular/material/icon";
|
|
9
|
+
import * as i3 from "../../custom-toggle/custom-toggle.component";
|
|
10
|
+
import * as i4 from "../../dynamic-select/dynamic-select-field.component";
|
|
11
|
+
import * as i5 from "../../custom-input/custom-input.component";
|
|
12
|
+
import * as i6 from "../../custom-textarea/custom-textarea.component";
|
|
13
|
+
import * as i7 from "../../button/button.component";
|
|
14
|
+
import * as i8 from "@angular/common";
|
|
15
|
+
import * as i9 from "./step-details-drawer-ref";
|
|
16
|
+
/**
|
|
17
|
+
* Step Details Drawer (Edit In Depth).
|
|
18
|
+
* Single reusable component; form is dynamic by Step Type via configuration.
|
|
19
|
+
* No Priority section. Uses CQA components only.
|
|
20
|
+
*/
|
|
21
|
+
export class StepDetailsDrawerComponent {
|
|
22
|
+
constructor(ref, fb, cdr, data) {
|
|
23
|
+
this.ref = ref;
|
|
24
|
+
this.fb = fb;
|
|
25
|
+
this.cdr = cdr;
|
|
26
|
+
this.saveChanges = new EventEmitter();
|
|
27
|
+
this.cancel = new EventEmitter();
|
|
28
|
+
this.saveAsTemplate = new EventEmitter();
|
|
29
|
+
/** Optional: when provided (e.g. from Storybook Controls), use instead of STEP_DETAILS_DRAWER_DATA. */
|
|
30
|
+
this.stepData = null;
|
|
31
|
+
this.stepNumberInput = null;
|
|
32
|
+
this.stepType = null;
|
|
33
|
+
this.visibleFields = [];
|
|
34
|
+
this.fieldMeta = STEP_DETAILS_FIELD_META;
|
|
35
|
+
this.advancedToggleKeys = ADVANCED_TOGGLE_KEYS;
|
|
36
|
+
this.advancedExpanded = false;
|
|
37
|
+
this.agentTaskExpanded = true;
|
|
38
|
+
/** Cached select configs (stable references per key) to avoid infinite change detection in template. */
|
|
39
|
+
this.selectConfigMap = this.buildSelectConfigMap();
|
|
40
|
+
this.step = data?.step ?? {};
|
|
41
|
+
this.stepNumber = data?.stepNumber ?? 1;
|
|
42
|
+
this.form = this.fb.group({});
|
|
43
|
+
this.syncStepTypeAndForm();
|
|
44
|
+
}
|
|
45
|
+
/** Subfields to show inside Advanced section for current step type. */
|
|
46
|
+
get advancedSubfields() {
|
|
47
|
+
return this.stepType ? ADVANCED_SUBFIELDS_BY_TYPE[this.stepType] : [];
|
|
48
|
+
}
|
|
49
|
+
ngOnInit() {
|
|
50
|
+
if (this.stepData != null) {
|
|
51
|
+
this.step = this.stepData;
|
|
52
|
+
this.stepNumber = this.stepNumberInput ?? this.stepData.stepNumber ?? 1;
|
|
53
|
+
this.syncStepTypeAndForm();
|
|
54
|
+
this.cdr.markForCheck();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
ngOnChanges(changes) {
|
|
58
|
+
if (changes['stepData'] || changes['stepNumberInput']) {
|
|
59
|
+
if (this.stepData != null) {
|
|
60
|
+
this.step = this.stepData;
|
|
61
|
+
this.stepNumber = this.stepNumberInput ?? this.stepData.stepNumber ?? 1;
|
|
62
|
+
}
|
|
63
|
+
this.syncStepTypeAndForm();
|
|
64
|
+
this.cdr.detectChanges();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
syncStepTypeAndForm() {
|
|
68
|
+
this.stepType = getStepDetailsStepType(this.step);
|
|
69
|
+
this.visibleFields = this.stepType ? STEP_DETAILS_FIELDS_BY_TYPE[this.stepType] : [];
|
|
70
|
+
this.buildFormFromStep();
|
|
71
|
+
}
|
|
72
|
+
buildFormFromStep() {
|
|
73
|
+
const group = {};
|
|
74
|
+
for (const key of this.visibleFields) {
|
|
75
|
+
if (key === 'advanced')
|
|
76
|
+
continue;
|
|
77
|
+
group[key] = [this.getStepValue(key)];
|
|
78
|
+
}
|
|
79
|
+
for (const key of ADVANCED_TOGGLE_KEYS) {
|
|
80
|
+
if (!(key in group))
|
|
81
|
+
group[key] = [this.getStepValue(key)];
|
|
82
|
+
}
|
|
83
|
+
this.form = this.fb.group(group);
|
|
84
|
+
}
|
|
85
|
+
getStepValue(key) {
|
|
86
|
+
const step = this.step;
|
|
87
|
+
if (isNormalStepConfig(this.step) && this.step.eventType === 'custom') {
|
|
88
|
+
if (key === 'description') {
|
|
89
|
+
const params = this.step.parameters;
|
|
90
|
+
return params?.[0]?.value ?? this.step.description ?? '';
|
|
91
|
+
}
|
|
92
|
+
if (key === 'metadata') {
|
|
93
|
+
const params = this.step.parameters;
|
|
94
|
+
return params?.[1]?.value ?? '';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (isApiStepConfig(this.step)) {
|
|
98
|
+
const api = this.step;
|
|
99
|
+
if (key === 'method')
|
|
100
|
+
return api.method ?? 'GET';
|
|
101
|
+
if (key === 'url')
|
|
102
|
+
return api.baseUrl ? `${api.baseUrl}${api.endpoint || ''}` : api.endpoint ?? '';
|
|
103
|
+
if (key === 'headers')
|
|
104
|
+
return api.headers ? JSON.stringify(api.headers, null, 2) : '';
|
|
105
|
+
if (key === 'body')
|
|
106
|
+
return api.requestBody ?? '';
|
|
107
|
+
if (key === 'saveOutputAsVariable')
|
|
108
|
+
return api.saveTo ?? '';
|
|
109
|
+
}
|
|
110
|
+
if (isAiAgentStepConfig(this.step)) {
|
|
111
|
+
const ai = this.step;
|
|
112
|
+
if (key === 'agentTask')
|
|
113
|
+
return ai.instructions ?? '';
|
|
114
|
+
if (key === 'description')
|
|
115
|
+
return ai.description ?? '';
|
|
116
|
+
if (key === 'metadata')
|
|
117
|
+
return step.metadata ?? '';
|
|
118
|
+
}
|
|
119
|
+
if (key === 'onlyUseAttachedContext' ||
|
|
120
|
+
key === 'takeScreenshotsWhenVerifying' ||
|
|
121
|
+
key === 'continueOnError' ||
|
|
122
|
+
key === 'disabled') {
|
|
123
|
+
return step[key] === true;
|
|
124
|
+
}
|
|
125
|
+
return step[key] ?? '';
|
|
126
|
+
}
|
|
127
|
+
setStepValue(key, value) {
|
|
128
|
+
const step = this.step;
|
|
129
|
+
if (isNormalStepConfig(this.step) && this.step.eventType === 'custom') {
|
|
130
|
+
if (key === 'description') {
|
|
131
|
+
const params = this.step.parameters;
|
|
132
|
+
if (params?.[0])
|
|
133
|
+
params[0].value = String(value);
|
|
134
|
+
else
|
|
135
|
+
this.step.description = String(value);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (key === 'metadata') {
|
|
139
|
+
const params = this.step.parameters;
|
|
140
|
+
if (params?.[1])
|
|
141
|
+
params[1].value = String(value);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (isApiStepConfig(this.step)) {
|
|
146
|
+
const api = this.step;
|
|
147
|
+
if (key === 'method') {
|
|
148
|
+
api.method = value;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (key === 'url') {
|
|
152
|
+
api.endpoint = String(value);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (key === 'headers') {
|
|
156
|
+
try {
|
|
157
|
+
api.headers = JSON.parse(String(value) || '{}');
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
api.headers = {};
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (key === 'body') {
|
|
165
|
+
api.requestBody = String(value);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (key === 'saveOutputAsVariable') {
|
|
169
|
+
api.saveTo = String(value);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (isAiAgentStepConfig(this.step)) {
|
|
174
|
+
const ai = this.step;
|
|
175
|
+
if (key === 'agentTask') {
|
|
176
|
+
ai.instructions = String(value);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (key === 'description') {
|
|
180
|
+
ai.description = String(value);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (key === 'metadata') {
|
|
184
|
+
step.metadata = value;
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
step[key] = value;
|
|
189
|
+
}
|
|
190
|
+
onBack() {
|
|
191
|
+
this.cancel.emit();
|
|
192
|
+
this.ref.close(undefined);
|
|
193
|
+
}
|
|
194
|
+
onClose() {
|
|
195
|
+
this.cancel.emit();
|
|
196
|
+
this.ref.close(undefined);
|
|
197
|
+
}
|
|
198
|
+
onCancel() {
|
|
199
|
+
this.cancel.emit();
|
|
200
|
+
this.ref.close(undefined);
|
|
201
|
+
}
|
|
202
|
+
onSaveAsTemplate() {
|
|
203
|
+
this.applyFormToStep();
|
|
204
|
+
this.saveAsTemplate.emit(this.step);
|
|
205
|
+
this.ref.close({ action: 'saveAsTemplate', step: this.step });
|
|
206
|
+
}
|
|
207
|
+
onSaveChanges() {
|
|
208
|
+
this.applyFormToStep();
|
|
209
|
+
this.saveChanges.emit(this.step);
|
|
210
|
+
this.ref.close({ action: 'saveChanges', step: this.step });
|
|
211
|
+
}
|
|
212
|
+
applyFormToStep() {
|
|
213
|
+
for (const key of this.visibleFields) {
|
|
214
|
+
if (key === 'advanced')
|
|
215
|
+
continue;
|
|
216
|
+
if (this.form.contains(key))
|
|
217
|
+
this.setStepValue(key, this.form.get(key)?.value);
|
|
218
|
+
}
|
|
219
|
+
for (const key of ADVANCED_TOGGLE_KEYS) {
|
|
220
|
+
if (this.form.contains(key))
|
|
221
|
+
this.setStepValue(key, this.form.get(key)?.value);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/** Build cached map of select configs from field meta (stable refs to prevent CD loops). */
|
|
225
|
+
buildSelectConfigMap() {
|
|
226
|
+
const map = {};
|
|
227
|
+
const keys = Object.keys(STEP_DETAILS_FIELD_META);
|
|
228
|
+
for (const key of keys) {
|
|
229
|
+
const meta = STEP_DETAILS_FIELD_META[key];
|
|
230
|
+
if (!meta || meta.controlType !== 'dropdown' || !meta.options?.length)
|
|
231
|
+
continue;
|
|
232
|
+
const options = meta.options.map((o) => ({ value: o.value, label: o.label }));
|
|
233
|
+
map[key] = {
|
|
234
|
+
key: meta.key,
|
|
235
|
+
placeholder: meta.placeholder ?? meta.label,
|
|
236
|
+
options,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
return map;
|
|
240
|
+
}
|
|
241
|
+
/** Return cached select config for key (for template use; same reference every time). */
|
|
242
|
+
getSelectConfig(key) {
|
|
243
|
+
return this.selectConfigMap[key] ?? null;
|
|
244
|
+
}
|
|
245
|
+
/** Whether this key is the first in its section (for showing section headings). */
|
|
246
|
+
isFirstInSection(key, section) {
|
|
247
|
+
const meta = STEP_DETAILS_FIELD_META[key];
|
|
248
|
+
if (!meta || meta.section !== section)
|
|
249
|
+
return false;
|
|
250
|
+
const idx = this.visibleFields.indexOf(key);
|
|
251
|
+
if (idx <= 0)
|
|
252
|
+
return true;
|
|
253
|
+
const prevMeta = STEP_DETAILS_FIELD_META[this.visibleFields[idx - 1]];
|
|
254
|
+
return !prevMeta || prevMeta.section !== section;
|
|
255
|
+
}
|
|
256
|
+
/** Dynamic drawer title by step type (e.g. "AI Agent Step Details"). */
|
|
257
|
+
get drawerTitle() {
|
|
258
|
+
if (this.stepType === 'custom')
|
|
259
|
+
return 'Custom Step Details';
|
|
260
|
+
if (this.stepType === 'api')
|
|
261
|
+
return 'API Step Details';
|
|
262
|
+
if (this.stepType === 'aiAgent')
|
|
263
|
+
return 'AI Agent Step Details';
|
|
264
|
+
return 'Step Details';
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
StepDetailsDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, deps: [{ token: STEP_DETAILS_DRAWER_REF }, { token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: STEP_DETAILS_DRAWER_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
268
|
+
StepDetailsDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepDetailsDrawerComponent, selector: "cqa-step-details-drawer", inputs: { stepData: "stepData", stepNumberInput: "stepNumberInput" }, outputs: { saveChanges: "saveChanges", cancel: "cancel", saveAsTemplate: "saveAsTemplate" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<!-- Step Details Drawer \u2013 Edit In Depth. No Priority. Fully config-driven. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, dynamic title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ drawerTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: Attributes + dynamic fields from config -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"stepType\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <ng-container *ngFor=\"let key of visibleFields\">\n <!-- Section heading: Constraints (first constraints field only) -->\n <ng-container *ngIf=\"key !== 'advanced' && isFirstInSection(key, 'constraints')\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n </ng-container>\n\n <!-- Advanced: expandable section with config-driven toggles + subfields -->\n <ng-container *ngIf=\"key === 'advanced'\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <!-- Advanced toggles from config -->\n <ng-container *ngFor=\"let toggleKey of advancedToggleKeys\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"fieldMeta[toggleKey]\">\n <cqa-custom-toggle\n [checked]=\"form.get(toggleKey)?.value\"\n (checkedChange)=\"form.get(toggleKey)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ fieldMeta[toggleKey].label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"fieldMeta[toggleKey].subLabel\">{{ fieldMeta[toggleKey].subLabel }}</span>\n </div>\n </div>\n </ng-container>\n <!-- Advanced subfields (e.g. Retry Count, Iframe locator, Other Locators for aiAgent) -->\n <ng-container *ngFor=\"let subKey of advancedSubfields\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\" *ngIf=\"fieldMeta[subKey]?.controlType === 'dropdown' && getSelectConfig(subKey) && form.contains(subKey)\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[subKey].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(subKey)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Skip: advanced key (already rendered) and fields that are rendered inside advanced for this step type -->\n <ng-container *ngIf=\"key !== 'advanced' && !(stepType === 'aiAgent' && advancedSubfields.includes(key))\">\n <!-- text -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'text'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-input\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea (including agentTask with optional required + tip) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <span *ngIf=\"fieldMeta[key].required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <p *ngIf=\"key === 'agentTask'\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">What should the agent achieve?</p>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"fieldMeta[key].rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"fieldMeta[key].tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ fieldMeta[key].tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- dropdown (main + constraints; advanced-only dropdowns rendered inside Advanced section) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'dropdown' && form.contains(key) && getSelectConfig(key) && !advancedSubfields.includes(key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(key)!\">\n </cqa-dynamic-select>\n </div>\n\n <!-- toggle (e.g. onlyUseAttachedContext, takeScreenshotsWhenVerifying) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'toggle'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ fieldMeta[key].label }}</p>\n <span *ngIf=\"fieldMeta[key].subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(key)?.value\"\n (checkedChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!stepType\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">This step type is not supported in the drawer.</p>\n </div>\n<div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
269
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, decorators: [{
|
|
270
|
+
type: Component,
|
|
271
|
+
args: [{ selector: 'cqa-step-details-drawer', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Step Details Drawer \u2013 Edit In Depth. No Priority. Fully config-driven. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, dynamic title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ drawerTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: Attributes + dynamic fields from config -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"stepType\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <ng-container *ngFor=\"let key of visibleFields\">\n <!-- Section heading: Constraints (first constraints field only) -->\n <ng-container *ngIf=\"key !== 'advanced' && isFirstInSection(key, 'constraints')\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n </ng-container>\n\n <!-- Advanced: expandable section with config-driven toggles + subfields -->\n <ng-container *ngIf=\"key === 'advanced'\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <!-- Advanced toggles from config -->\n <ng-container *ngFor=\"let toggleKey of advancedToggleKeys\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"fieldMeta[toggleKey]\">\n <cqa-custom-toggle\n [checked]=\"form.get(toggleKey)?.value\"\n (checkedChange)=\"form.get(toggleKey)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ fieldMeta[toggleKey].label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"fieldMeta[toggleKey].subLabel\">{{ fieldMeta[toggleKey].subLabel }}</span>\n </div>\n </div>\n </ng-container>\n <!-- Advanced subfields (e.g. Retry Count, Iframe locator, Other Locators for aiAgent) -->\n <ng-container *ngFor=\"let subKey of advancedSubfields\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\" *ngIf=\"fieldMeta[subKey]?.controlType === 'dropdown' && getSelectConfig(subKey) && form.contains(subKey)\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[subKey].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(subKey)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Skip: advanced key (already rendered) and fields that are rendered inside advanced for this step type -->\n <ng-container *ngIf=\"key !== 'advanced' && !(stepType === 'aiAgent' && advancedSubfields.includes(key))\">\n <!-- text -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'text'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-input\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea (including agentTask with optional required + tip) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <span *ngIf=\"fieldMeta[key].required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <p *ngIf=\"key === 'agentTask'\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">What should the agent achieve?</p>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"fieldMeta[key].rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"fieldMeta[key].tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ fieldMeta[key].tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- dropdown (main + constraints; advanced-only dropdowns rendered inside Advanced section) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'dropdown' && form.contains(key) && getSelectConfig(key) && !advancedSubfields.includes(key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(key)!\">\n </cqa-dynamic-select>\n </div>\n\n <!-- toggle (e.g. onlyUseAttachedContext, takeScreenshotsWhenVerifying) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'toggle'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ fieldMeta[key].label }}</p>\n <span *ngIf=\"fieldMeta[key].subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(key)?.value\"\n (checkedChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!stepType\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">This step type is not supported in the drawer.</p>\n </div>\n<div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n" }]
|
|
272
|
+
}], ctorParameters: function () { return [{ type: i9.StepDetailsDrawerRef, decorators: [{
|
|
273
|
+
type: Inject,
|
|
274
|
+
args: [STEP_DETAILS_DRAWER_REF]
|
|
275
|
+
}] }, { type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
276
|
+
type: Optional
|
|
277
|
+
}, {
|
|
278
|
+
type: Inject,
|
|
279
|
+
args: [STEP_DETAILS_DRAWER_DATA]
|
|
280
|
+
}] }]; }, propDecorators: { saveChanges: [{
|
|
281
|
+
type: Output
|
|
282
|
+
}], cancel: [{
|
|
283
|
+
type: Output
|
|
284
|
+
}], saveAsTemplate: [{
|
|
285
|
+
type: Output
|
|
286
|
+
}], stepData: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], stepNumberInput: [{
|
|
289
|
+
type: Input
|
|
290
|
+
}] } });
|
|
291
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxzQkFBc0IsRUFJdEIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsMEJBQTBCLEdBQzNCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUF3QixNQUFNLDJCQUEyQixDQUFDO0FBQzFGLE9BQU8sRUFBRSx3QkFBd0IsRUFBeUIsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RixPQUFPLEVBS0wsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixtQkFBbUIsR0FDcEIsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7QUFNbEM7Ozs7R0FJRztBQU9ILE1BQU0sT0FBTywwQkFBMEI7SUEyQnJDLFlBQzJDLEdBQXlCLEVBQzFELEVBQWUsRUFDZixHQUFzQixFQUNnQixJQUE0QjtRQUhqQyxRQUFHLEdBQUgsR0FBRyxDQUFzQjtRQUMxRCxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE3QnRCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDckQsV0FBTSxHQUFH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QixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsbUJBQ2IsdUJBQXVCLENBQUMsTUFBTTs7MEJBOEI1QyxNQUFNOzJCQUFDLHVCQUF1Qjs7MEJBRzlCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsd0JBQXdCOzRDQTlCcEMsV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFHRSxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgZ2V0U3RlcERldGFpbHNTdGVwVHlwZSxcbiAgU3RlcERldGFpbHNGaWVsZEtleSxcbiAgU3RlcERldGFpbHNTdGVwVHlwZSxcbiAgU3RlcERldGFpbHNGaWVsZFNlY3Rpb24sXG4gIFNURVBfREVUQUlMU19GSUVMRFNfQllfVFlQRSxcbiAgU1RFUF9ERVRBSUxTX0ZJRUxEX01FVEEsXG4gIEFEVkFOQ0VEX1RPR0dMRV9LRVlTLFxuICBBRFZBTkNFRF9TVUJGSUVMRFNfQllfVFlQRSxcbn0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWZpZWxkLmNvbmZpZyc7XG5pbXBvcnQgeyBTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRiwgU3RlcERldGFpbHNEcmF3ZXJSZWYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWRhdGEnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VTdGVwQ29uZmlnLFxuICBOb3JtYWxTdGVwQ29uZmlnLFxuICBBcGlTdGVwQ29uZmlnLFxuICBBaUFnZW50U3RlcENvbmZpZyxcbiAgaXNOb3JtYWxTdGVwQ29uZmlnLFxuICBpc0FwaVN0ZXBDb25maWcsXG4gIGlzQWlBZ2VudFN0ZXBDb25maWcsXG59IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgdHlwZSB7XG4gIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyxcbiAgU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFN0ZXAgRGV0YWlscyBEcmF3ZXIgKEVkaXQgSW4gRGVwdGgpLlxuICogU2luZ2xlIHJldXNhYmxlIGNvbXBvbmVudDsgZm9ybSBpcyBkeW5hbWljIGJ5IFN0ZXAgVHlwZSB2aWEgY29uZmlndXJhdGlvbi5cbiAqIE5vIFByaW9yaXR5IHNlY3Rpb24uIFVzZXMgQ1FBIGNvbXBvbmVudHMgb25seS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBAT3V0cHV0KCkgc2F2ZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNhdmVBc1RlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZVN0ZXBDb25maWc+KCk7XG5cbiAgLyoqIE9wdGlvbmFsOiB3aGVuIHByb3ZpZGVkIChlLmcuIGZyb20gU3Rvcnlib29rIENvbnRyb2xzKSwgdXNlIGluc3RlYWQgb2YgU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLiAqL1xuICBASW5wdXQoKSBzdGVwRGF0YTogVGVzdENhc2VTdGVwQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXJJbnB1dDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnO1xuICBzdGVwTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0ZXBUeXBlOiBTdGVwRGV0YWlsc1N0ZXBUeXBlIHwgbnVsbCA9IG51bGw7XG4gIHZpc2libGVGaWVsZHM6IFN0ZXBEZXRhaWxzRmllbGRLZXlbXSA9IFtdO1xuICBmaWVsZE1ldGEgPSBTVEVQX0RFVEFJTFNfRklFTERfTUVUQTtcbiAgYWR2YW5jZWRUb2dnbGVLZXlzID0gQURWQU5DRURfVE9HR0xFX0tFWVM7XG4gIGFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgYWdlbnRUYXNrRXhwYW5kZWQgPSB0cnVlO1xuICBmb3JtOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZmVyZW5jZXMgcGVyIGtleSkgdG8gYXZvaWQgaW5maW5pdGUgY2hhbmdlIGRldGVjdGlvbiBpbiB0ZW1wbGF0ZS4gKi9cbiAgcmVhZG9ubHkgc2VsZWN0Q29uZmlnTWFwOiBSZWNvcmQ8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gdGhpcy5idWlsZFNlbGVjdENvbmZpZ01hcCgpO1xuXG4gIC8qKiBTdWJmaWVsZHMgdG8gc2hvdyBpbnNpZGUgQWR2YW5jZWQgc2VjdGlvbiBmb3IgY3VycmVudCBzdGVwIHR5cGUuICovXG4gIGdldCBhZHZhbmNlZFN1YmZpZWxkcygpOiBTdGVwRGV0YWlsc0ZpZWxkS2V5W10ge1xuICAgIHJldHVybiB0aGlzLnN0ZXBUeXBlID8gQURWQU5DRURfU1VCRklFTERTX0JZX1RZUEVbdGhpcy5zdGVwVHlwZV0gOiBbXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYpIHByaXZhdGUgcmVmOiBTdGVwRGV0YWlsc0RyYXdlclJlZixcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTVEVQX0RFVEFJTFNfRFJBV0VSX0RBVEEpIGRhdGE/OiBTdGVwRGV0YWlsc0RyYXdlckRhdGFcbiAgKSB7XG4gICAgdGhpcy5zdGVwID0gZGF0YT8uc3RlcCA/PyAoe30gYXMgVGVzdENhc2VTdGVwQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBOdW1iZXIgPSBkYXRhPy5zdGVwTnVtYmVyID8/IDE7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5zeW5jU3RlcFR5cGVBbmRGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGVwRGF0YSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVySW5wdXQgPz8gKHRoaXMuc3RlcERhdGEgYXMgYW55KS5zdGVwTnVtYmVyID8/IDE7XG4gICAgICB0aGlzLnN5bmNTdGVwVHlwZUFuZEZvcm0oKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc3RlcERhdGEnXSB8fCBjaGFuZ2VzWydzdGVwTnVtYmVySW5wdXQnXSkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY1N0ZXBUeXBlQW5kRm9ybSgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY1N0ZXBUeXBlQW5kRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXBUeXBlID0gZ2V0U3RlcERldGFpbHNTdGVwVHlwZSh0aGlzLnN0ZXApO1xuICAgIHRoaXMudmlzaWJsZUZpZWxkcyA9IHRoaXMuc3RlcFR5cGUgPyBTVEVQX0RFVEFJTFNfRklFTERTX0JZX1RZUEVbdGhpcy5zdGVwVHlwZV0gOiBbXTtcbiAgICB0aGlzLmJ1aWxkRm9ybUZyb21TdGVwKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybUZyb21TdGVwKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMudmlzaWJsZUZpZWxkcykge1xuICAgICAgaWYgKGtleSA9PT0gJ2FkdmFuY2VkJykgY29udGludWU7XG4gICAgICBncm91cFtrZXldID0gW3RoaXMuZ2V0U3RlcFZhbHVlKGtleSldO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBBRFZBTkNFRF9UT0dHTEVfS0VZUykge1xuICAgICAgaWYgKCEoa2V5IGluIGdyb3VwKSkgZ3JvdXBba2V5XSA9IFt0aGlzLmdldFN0ZXBWYWx1ZShrZXkpXTtcbiAgICB9XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChncm91cCk7XG4gIH1cblxuICBnZXRTdGVwVmFsdWUoa2V5OiBTdGVwRGV0YWlsc0ZpZWxkS2V5KTogdW5rbm93biB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChpc05vcm1hbFN0ZXBDb25maWcodGhpcy5zdGVwKSAmJiAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLmV2ZW50VHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIGlmIChrZXkgPT09ICdkZXNjcmlwdGlvbicpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gKHRoaXMuc3RlcCBhcyBOb3JtYWxTdGVwQ29uZmlnKS5wYXJhbWV0ZXJzO1xuICAgICAgICByZXR1cm4gcGFyYW1zPy5bMF0/LnZhbHVlID8/ICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9ICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykucGFyYW1ldGVycztcbiAgICAgICAgcmV0dXJuIHBhcmFtcz8uWzFdPy52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQXBpU3RlcENvbmZpZyh0aGlzLnN0ZXApKSB7XG4gICAgICBjb25zdCBhcGkgPSB0aGlzLnN0ZXAgYXMgQXBpU3RlcENvbmZpZztcbiAgICAgIGlmIChrZXkgPT09ICdtZXRob2QnKSByZXR1cm4gYXBpLm1ldGhvZCA/PyAnR0VUJztcbiAgICAgIGlmIChrZXkgPT09ICd1cmwnKSByZXR1cm4gYXBpLmJhc2VVcmwgPyBgJHthcGkuYmFzZVVybH0ke2FwaS5lbmRwb2ludCB8fCAnJ31gIDogYXBpLmVuZHBvaW50ID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ2hlYWRlcnMnKSByZXR1cm4gYXBpLmhlYWRlcnMgPyBKU09OLnN0cmluZ2lmeShhcGkuaGVhZGVycywgbnVsbCwgMikgOiAnJztcbiAgICAgIGlmIChrZXkgPT09ICdib2R5JykgcmV0dXJuIGFwaS5yZXF1ZXN0Qm9keSA/PyAnJztcbiAgICAgIGlmIChrZXkgPT09ICdzYXZlT3V0cHV0QXNWYXJpYWJsZScpIHJldHVybiBhcGkuc2F2ZVRvID8/ICcnO1xuICAgIH1cbiAgICBpZiAoaXNBaUFnZW50U3RlcENvbmZpZyh0aGlzLnN0ZXApKSB7XG4gICAgICBjb25zdCBhaSA9IHRoaXMuc3RlcCBhcyBBaUFnZW50U3RlcENvbmZpZztcbiAgICAgIGlmIChrZXkgPT09ICdhZ2VudFRhc2snKSByZXR1cm4gYWkuaW5zdHJ1Y3Rpb25zID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ2Rlc2NyaXB0aW9uJykgcmV0dXJuIChhaSBhcyBhbnkpLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ21ldGFkYXRhJykgcmV0dXJuIChzdGVwIGFzIGFueSkubWV0YWRhdGEgPz8gJyc7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGtleSA9PT0gJ29ubHlVc2VBdHRhY2hlZENvbnRleHQnIHx8XG4gICAgICBrZXkgPT09ICd0YWtlU2NyZWVuc2hvdHNXaGVuVmVyaWZ5aW5nJyB8fFxuICAgICAga2V5ID09PSAnY29udGludWVPbkVycm9yJyB8fFxuICAgICAga2V5ID09PSAnZGlzYWJsZWQnXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHN0ZXAgYXMgYW55KVtrZXldID09PSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KVtrZXldID8/ICcnO1xuICB9XG5cbiAgc2V0U3RlcFZhbHVlKGtleTogU3RlcERldGFpbHNGaWVsZEtleSwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGlzTm9ybWFsU3RlcENvbmZpZyh0aGlzLnN0ZXApICYmICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykuZXZlbnRUeXBlID09PSAnY3VzdG9tJykge1xuICAgICAgaWYgKGtleSA9PT0gJ2Rlc2NyaXB0aW9uJykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLnBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChwYXJhbXM/LlswXSkgcGFyYW1zWzBdLnZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZWxzZSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLmRlc2NyaXB0aW9uID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ21ldGFkYXRhJykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLnBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChwYXJhbXM/LlsxXSkgcGFyYW1zWzFdLnZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNBcGlTdGVwQ29uZmlnKHRoaXMuc3RlcCkpIHtcbiAgICAgIGNvbnN0IGFwaSA9IHRoaXMuc3RlcCBhcyBBcGlTdGVwQ29uZmlnO1xuICAgICAgaWYgKGtleSA9PT0gJ21ldGhvZCcpIHsgYXBpLm1ldGhvZCA9IHZhbHVlIGFzIEFwaVN0ZXBDb25maWdbJ21ldGhvZCddOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICd1cmwnKSB7IGFwaS5lbmRwb2ludCA9IFN0cmluZyh2YWx1ZSk7IHJldHVybjsgfVxuICAgICAgaWYgKGtleSA9PT0gJ2hlYWRlcnMnKSB7XG4gICAgICAgIHRyeSB7IGFwaS5oZWFkZXJzID0gSlNPTi5wYXJzZShTdHJpbmcodmFsdWUpIHx8ICd7fScpOyB9IGNhdGNoIHsgYXBpLmhlYWRlcnMgPSB7fTsgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnYm9keScpIHsgYXBpLnJlcXVlc3RCb2R5ID0gU3RyaW5nKHZhbHVlKTsgcmV0dXJuOyB9XG4gICAgICBpZiAoa2V5ID09PSAnc2F2ZU91dHB1dEFzVmFyaWFibGUnKSB7IGFwaS5zYXZlVG8gPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICB9XG4gICAgaWYgKGlzQWlBZ2VudFN0ZXBDb25maWcodGhpcy5zdGVwKSkge1xuICAgICAgY29uc3QgYWkgPSB0aGlzLnN0ZXAgYXMgQWlBZ2VudFN0ZXBDb25maWc7XG4gICAgICBpZiAoa2V5ID09PSAnYWdlbnRUYXNrJykgeyBhaS5pbnN0cnVjdGlvbnMgPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICdkZXNjcmlwdGlvbicpIHsgKGFpIGFzIGFueSkuZGVzY3JpcHRpb24gPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICdtZXRhZGF0YScpIHsgKHN0ZXAgYXMgYW55KS5tZXRhZGF0YSA9IHZhbHVlOyByZXR1cm47IH1cbiAgICB9XG4gICAgKHN0ZXAgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gIH1cblxuICBvbkJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvblNhdmVBc1RlbXBsYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlGb3JtVG9TdGVwKCk7XG4gICAgdGhpcy5zYXZlQXNUZW1wbGF0ZS5lbWl0KHRoaXMuc3RlcCk7XG4gICAgdGhpcy5yZWYuY2xvc2UoeyBhY3Rpb246ICdzYXZlQXNUZW1wbGF0ZScsIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgfVxuXG4gIG9uU2F2ZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUZvcm1Ub1N0ZXAoKTtcbiAgICB0aGlzLnNhdmVDaGFuZ2VzLmVtaXQodGhpcy5zdGVwKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh7IGFjdGlvbjogJ3NhdmVDaGFuZ2VzJywgc3RlcDogdGhpcy5zdGVwIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1Ub1N0ZXAoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy52aXNpYmxlRmllbGRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAnYWR2YW5jZWQnKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udGFpbnMoa2V5KSkgdGhpcy5zZXRTdGVwVmFsdWUoa2V5LCB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQURWQU5DRURfVE9HR0xFX0tFWVMpIHtcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udGFpbnMoa2V5KSkgdGhpcy5zZXRTdGVwVmFsdWUoa2V5LCB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgY2FjaGVkIG1hcCBvZiBzZWxlY3QgY29uZmlncyBmcm9tIGZpZWxkIG1ldGEgKHN0YWJsZSByZWZzIHRvIHByZXZlbnQgQ0QgbG9vcHMpLiAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlnTWFwKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4ge1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IHt9O1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhTVEVQX0RFVEFJTFNfRklFTERfTUVUQSkgYXMgU3RlcERldGFpbHNGaWVsZEtleVtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBTVEVQX0RFVEFJTFNfRklFTERfTUVUQVtrZXldO1xuICAgICAgaWYgKCFtZXRhIHx8IG1ldGEuY29udHJvbFR5cGUgIT09ICdkcm9wZG93bicgfHwgIW1ldGEub3B0aW9ucz8ubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gbWV0YS5vcHRpb25zLm1hcCgobykgPT4gKHsgdmFsdWU6IG8udmFsdWUsIGxhYmVsOiBvLmxhYmVsIH0pKTtcbiAgICAgIG1hcFtrZXldID0ge1xuICAgICAgICBrZXk6IG1ldGEua2V5LFxuICAgICAgICBwbGFjZWhvbGRlcjogbWV0YS5wbGFjZWhvbGRlciA/PyBtZXRhLmxhYmVsLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gY2FjaGVkIHNlbGVjdCBjb25maWcgZm9yIGtleSAoZm9yIHRlbXBsYXRlIHVzZTsgc2FtZSByZWZlcmVuY2UgZXZlcnkgdGltZSkuICovXG4gIGdldFNlbGVjdENvbmZpZyhrZXk6IFN0ZXBEZXRhaWxzRmllbGRLZXkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdNYXBba2V5XSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBrZXkgaXMgdGhlIGZpcnN0IGluIGl0cyBzZWN0aW9uIChmb3Igc2hvd2luZyBzZWN0aW9uIGhlYWRpbmdzKS4gKi9cbiAgaXNGaXJzdEluU2VjdGlvbihrZXk6IFN0ZXBEZXRhaWxzRmllbGRLZXksIHNlY3Rpb246IFN0ZXBEZXRhaWxzRmllbGRTZWN0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWV0YSA9IFNURVBfREVUQUlMU19GSUVMRF9NRVRBW2tleV07XG4gICAgaWYgKCFtZXRhIHx8IG1ldGEuc2VjdGlvbiAhPT0gc2VjdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMudmlzaWJsZUZpZWxkcy5pbmRleE9mKGtleSk7XG4gICAgaWYgKGlkeCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwcmV2TWV0YSA9IFNURVBfREVUQUlMU19GSUVMRF9NRVRBW3RoaXMudmlzaWJsZUZpZWxkc1tpZHggLSAxXV07XG4gICAgcmV0dXJuICFwcmV2TWV0YSB8fCBwcmV2TWV0YS5zZWN0aW9uICE9PSBzZWN0aW9uO1xuICB9XG5cbiAgLyoqIER5bmFtaWMgZHJhd2VyIHRpdGxlIGJ5IHN0ZXAgdHlwZSAoZS5nLiBcIkFJIEFnZW50IFN0ZXAgRGV0YWlsc1wiKS4gKi9cbiAgZ2V0IGRyYXdlclRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3RlcFR5cGUgPT09ICdjdXN0b20nKSByZXR1cm4gJ0N1c3RvbSBTdGVwIERldGFpbHMnO1xuICAgIGlmICh0aGlzLnN0ZXBUeXBlID09PSAnYXBpJykgcmV0dXJuICdBUEkgU3RlcCBEZXRhaWxzJztcbiAgICBpZiAodGhpcy5zdGVwVHlwZSA9PT0gJ2FpQWdlbnQnKSByZXR1cm4gJ0FJIEFnZW50IFN0ZXAgRGV0YWlscyc7XG4gICAgcmV0dXJuICdTdGVwIERldGFpbHMnO1xuICB9XG59XG4iLCI8IS0tIFN0ZXAgRGV0YWlscyBEcmF3ZXIg4oCTIEVkaXQgSW4gRGVwdGguIE5vIFByaW9yaXR5LiBGdWxseSBjb25maWctZHJpdmVuLiAtLT5cbjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNDgwcHhdIGNxYS1ib3gtYm9yZGVyXCI+XG4gIDwhLS0gSGVhZGVyOiBiYWNrIGNoZXZyb24sIGR5bmFtaWMgdGl0bGUsIFN0ZXAgTiBwaWxsLCBjbG9zZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXB4LTQgY3FhLXB5LTQgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLXQtWzEycHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0U1RTVFNV1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkJhY2soKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctOCBjcWEtaC04IGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtYmctWyNGM0Y0RjZdIGNxYS1wLTBcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQmFja1wiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdXCI+Y2hldnJvbl9sZWZ0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsyNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtZmxleC0xXCI+XG4gICAgICAgIHt7IGRyYXdlclRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMi41IGNxYS1weS0xIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0VERTlGRV0gY3FhLXRleHQtWyM3QzNBRURdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgU3RlcCB7eyBzdGVwTnVtYmVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4taC1bMjhweF0gY3FhLW1pbi13LVsyOHB4XSBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgIHRpdGxlPVwiQ2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+IDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudDogQXR0cmlidXRlcyArIGR5bmFtaWMgZmllbGRzIGZyb20gY29uZmlnIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktNFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGVwVHlwZVwiPlxuICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMyBjcWEtbXQtMFwiPkF0dHJpYnV0ZXM8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiB2aXNpYmxlRmllbGRzXCI+XG4gICAgICAgICAgPCEtLSBTZWN0aW9uIGhlYWRpbmc6IENvbnN0cmFpbnRzIChmaXJzdCBjb25zdHJhaW50cyBmaWVsZCBvbmx5KSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwia2V5ICE9PSAnYWR2YW5jZWQnICYmIGlzRmlyc3RJblNlY3Rpb24oa2V5LCAnY29uc3RyYWludHMnKVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMiBjcWEtbXQtMFwiPkNvbnN0cmFpbnRzPC9wPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBBZHZhbmNlZDogZXhwYW5kYWJsZSBzZWN0aW9uIHdpdGggY29uZmlnLWRyaXZlbiB0b2dnbGVzICsgc3ViZmllbGRzIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJrZXkgPT09ICdhZHZhbmNlZCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1bI0U1RTdFQl1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMjBweF0gY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgZXhwYW5kX2xlc3NcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB0LTJcIj5cbiAgICAgICAgICAgICAgPCEtLSBBZHZhbmNlZCB0b2dnbGVzIGZyb20gY29uZmlnIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0b2dnbGVLZXkgb2YgYWR2YW5jZWRUb2dnbGVLZXlzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCIgKm5nSWY9XCJmaWVsZE1ldGFbdG9nZ2xlS2V5XVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImZvcm0uZ2V0KHRvZ2dsZUtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiZm9ybS5nZXQodG9nZ2xlS2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNzM3MzczXVwiPnt7IGZpZWxkTWV0YVt0b2dnbGVLZXldLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzBBMEEwQV1cIiAqbmdJZj1cImZpZWxkTWV0YVt0b2dnbGVLZXldLnN1YkxhYmVsXCI+e3sgZmllbGRNZXRhW3RvZ2dsZUtleV0uc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gQWR2YW5jZWQgc3ViZmllbGRzIChlLmcuIFJldHJ5IENvdW50LCBJZnJhbWUgbG9jYXRvciwgT3RoZXIgTG9jYXRvcnMgZm9yIGFpQWdlbnQpIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJLZXkgb2YgYWR2YW5jZWRTdWJmaWVsZHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1zdGVwLWRldGFpbHMtZHJhd2VyLXNlbGVjdFwiICpuZ0lmPVwiZmllbGRNZXRhW3N1YktleV0/LmNvbnRyb2xUeXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhzdWJLZXkpICYmIGZvcm0uY29udGFpbnMoc3ViS2V5KVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZE1ldGFbc3ViS2V5XS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhzdWJLZXkpIVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFNraXA6IGFkdmFuY2VkIGtleSAoYWxyZWFkeSByZW5kZXJlZCkgYW5kIGZpZWxkcyB0aGF0IGFyZSByZW5kZXJlZCBpbnNpZGUgYWR2YW5jZWQgZm9yIHRoaXMgc3RlcCB0eXBlIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJrZXkgIT09ICdhZHZhbmNlZCcgJiYgIShzdGVwVHlwZSA9PT0gJ2FpQWdlbnQnICYmIGFkdmFuY2VkU3ViZmllbGRzLmluY2x1ZGVzKGtleSkpXCI+XG4gICAgICAgICAgICA8IS0tIHRleHQgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGRNZXRhW2tleV0/LmNvbnRyb2xUeXBlID09PSAndGV4dCdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGRNZXRhW2tleV0ucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChrZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoa2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSB0ZXh0YXJlYSAoaW5jbHVkaW5nIGFnZW50VGFzayB3aXRoIG9wdGlvbmFsIHJlcXVpcmVkICsgdGlwKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZE1ldGFba2V5XT8uY29udHJvbFR5cGUgPT09ICd0ZXh0YXJlYSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkTWV0YVtrZXldLnJlcXVpcmVkXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRkVFMkUyXSBjcWEtdGV4dC1bI0RDMjYyNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bVwiPlJlcXVpcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCJrZXkgPT09ICdhZ2VudFRhc2snXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTBcIj5XaGF0IHNob3VsZCB0aGUgYWdlbnQgYWNoaWV2ZT88L3A+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkTWV0YVtrZXldLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoa2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiZmllbGRNZXRhW2tleV0ucm93cyB8fCA0XCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpZWxkTWV0YVtrZXldLnRpcFwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wXCI+e3sgZmllbGRNZXRhW2tleV0udGlwIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gY29kZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZE1ldGFba2V5XT8uY29udHJvbFR5cGUgPT09ICdjb2RlJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGRNZXRhW2tleV0ubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZE1ldGFba2V5XS5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtyb3dzXT1cIjhcIlxuICAgICAgICAgICAgICAgIHJlc2l6ZT1cInZlcnRpY2FsXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gZHJvcGRvd24gKG1haW4gKyBjb25zdHJhaW50czsgYWR2YW5jZWQtb25seSBkcm9wZG93bnMgcmVuZGVyZWQgaW5zaWRlIEFkdmFuY2VkIHNlY3Rpb24pIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkTWV0YVtrZXldPy5jb250cm9sVHlwZSA9PT0gJ2Ryb3Bkb3duJyAmJiBmb3JtLmNvbnRhaW5zKGtleSkgJiYgZ2V0U2VsZWN0Q29uZmlnKGtleSkgJiYgIWFkdmFuY2VkU3ViZmllbGRzLmluY2x1ZGVzKGtleSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZE1ldGFba2V5XS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZm9ybVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKGtleSkhXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gdG9nZ2xlIChlLmcuIG9ubHlVc2VBdHRhY2hlZENvbnRleHQsIHRha2VTY3JlZW5zaG90c1doZW5WZXJpZnlpbmcpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkTWV0YVtrZXldPy5jb250cm9sVHlwZSA9PT0gJ3RvZ2dsZSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMFwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9wPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGRNZXRhW2tleV0uc3ViTGFiZWxcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGRNZXRhW2tleV0uc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJmb3JtLmdldChrZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiZm9ybS5nZXQoa2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8cCAqbmdJZj1cIiFzdGVwVHlwZVwiIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlRoaXMgc3RlcCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGRyYXdlci48L3A+XG4gIDwvZGl2PlxuPGRpdiBjbGFzcz1cImNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFNUU1XVwiPiA8L2Rpdj5cbiAgPCEtLSBGb290ZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1nYXAtMiBjcWEtcHgtNCBjcWEtcHktNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLWJnLVsjRjVGNUY1NERdXCI+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cInRleHRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS10ZXh0LVsjMzc0MTUxXSdcIj48L2NxYS1idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj48L2Rpdj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInU2F2ZSBhcyBUZW1wbGF0ZSdcIiAoY2xpY2tlZCk9XCJvblNhdmVBc1RlbXBsYXRlKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ1NhdmUgQ2hhbmdlcydcIiAoY2xpY2tlZCk9XCJvblNhdmVDaGFuZ2VzKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1iZy1bIzNGNDNFRV0gY3FhLWJvcmRlci1bIzNGNDNFRV0nXCI+PC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Injectable, Injector } from '@angular/core';
|
|
2
|
+
import { OverlayConfig } from '@angular/cdk/overlay';
|
|
3
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
4
|
+
import { filter } from 'rxjs/operators';
|
|
5
|
+
import { StepDetailsDrawerComponent } from './step-details-drawer.component';
|
|
6
|
+
import { StepDetailsDrawerRef } from './step-details-drawer-ref';
|
|
7
|
+
import { STEP_DETAILS_DRAWER_REF } from './step-details-drawer-ref';
|
|
8
|
+
import { STEP_DETAILS_DRAWER_DATA } from './step-details-drawer-data';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/cdk/overlay";
|
|
11
|
+
/**
|
|
12
|
+
* Opens the Step Details Drawer (Edit In Depth) from the right.
|
|
13
|
+
*/
|
|
14
|
+
export class StepDetailsDrawerService {
|
|
15
|
+
constructor(overlay, injector) {
|
|
16
|
+
this.overlay = overlay;
|
|
17
|
+
this.injector = injector;
|
|
18
|
+
this.currentRef = null;
|
|
19
|
+
}
|
|
20
|
+
open(data) {
|
|
21
|
+
if (this.currentRef)
|
|
22
|
+
return this.currentRef;
|
|
23
|
+
const drawerWidth = 480;
|
|
24
|
+
const positionStrategy = this.overlay
|
|
25
|
+
.position()
|
|
26
|
+
.global()
|
|
27
|
+
.right('0')
|
|
28
|
+
.top('0')
|
|
29
|
+
.bottom('0')
|
|
30
|
+
.width(`${drawerWidth}px`);
|
|
31
|
+
const overlayRef = this.overlay.create(new OverlayConfig({
|
|
32
|
+
hasBackdrop: true,
|
|
33
|
+
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
34
|
+
scrollStrategy: this.overlay.scrollStrategies.block(),
|
|
35
|
+
positionStrategy,
|
|
36
|
+
panelClass: ['cqa-step-details-drawer-panel', 'cqa-ui-root'],
|
|
37
|
+
width: `${drawerWidth}px`,
|
|
38
|
+
maxWidth: '100vw',
|
|
39
|
+
height: '100%',
|
|
40
|
+
}));
|
|
41
|
+
const drawerRef = new StepDetailsDrawerRef(overlayRef);
|
|
42
|
+
const injector = Injector.create({
|
|
43
|
+
parent: this.injector,
|
|
44
|
+
providers: [
|
|
45
|
+
{ provide: STEP_DETAILS_DRAWER_REF, useValue: drawerRef },
|
|
46
|
+
{ provide: STEP_DETAILS_DRAWER_DATA, useValue: data },
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
const portal = new ComponentPortal(StepDetailsDrawerComponent, undefined, injector);
|
|
50
|
+
overlayRef.attach(portal);
|
|
51
|
+
this.currentRef = drawerRef;
|
|
52
|
+
drawerRef.afterClosed().subscribe(() => { this.currentRef = null; });
|
|
53
|
+
overlayRef.backdropClick().subscribe(() => drawerRef.close({ action: 'cancel' }));
|
|
54
|
+
overlayRef
|
|
55
|
+
.keydownEvents()
|
|
56
|
+
.pipe(filter((e) => e.key === 'Escape' || e.key === 'Esc'))
|
|
57
|
+
.subscribe(() => drawerRef.close({ action: 'cancel' }));
|
|
58
|
+
return drawerRef;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
StepDetailsDrawerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerService, deps: [{ token: i1.Overlay }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
62
|
+
StepDetailsDrawerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerService, providedIn: 'root' });
|
|
63
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerService, decorators: [{
|
|
64
|
+
type: Injectable,
|
|
65
|
+
args: [{ providedIn: 'root' }]
|
|
66
|
+
}], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }]; } });
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9zdGVwLWRldGFpbHMtZHJhd2VyL3N0ZXAtZGV0YWlscy1kcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQXlCLE1BQU0sNEJBQTRCLENBQUM7OztBQU83Rjs7R0FFRztBQUVILE1BQU0sT0FBTyx3QkFBd0I7SUFHbkMsWUFBNkIsT0FBZ0IsRUFBbUIsUUFBa0I7UUFBckQsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUFtQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRjFFLGVBQVUsR0FBeUQsSUFBSSxDQUFDO0lBRUssQ0FBQztJQUV0RixJQUFJLENBQUMsSUFBMkI7UUFDOUIsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUU1QyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTzthQUNsQyxRQUFRLEVBQUU7YUFDVixNQUFNLEVBQUU7YUFDUixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxLQUFLLENBQUMsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBRTdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNwQyxJQUFJLGFBQWEsQ0FBQztZQUNoQixXQUFXLEVBQUUsSUFBSTtZQUNqQixhQUFhLEVBQUUsa0NBQWtDO1lBQ2pELGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUNyRCxnQkFBZ0I7WUFDaEIsVUFBVSxFQUFFLENBQUMsK0JBQStCLEVBQUUsYUFBYSxDQUFDO1lBQzVELEtBQUssRUFBRSxHQUFHLFdBQVcsSUFBSTtZQUN6QixRQUFRLEVBQUUsT0FBTztZQUNqQixNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQkFBb0IsQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFDaEYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDckIsU0FBUyxFQUFFO2dCQUNULEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7Z0JBQ3pELEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDdEQ7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQywwQkFBMEIsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixVQUFVO2FBQ1AsYUFBYSxFQUFFO2FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7YUFDekUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7O3FIQW5EVSx3QkFBd0I7eUhBQXhCLHdCQUF3QixjQURYLE1BQU07MkZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVGVzdENhc2VTdGVwQ29uZmlnIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdGVwRGV0YWlsc0RyYXdlclJlZiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWRhdGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0IHtcbiAgYWN0aW9uOiAnc2F2ZUNoYW5nZXMnIHwgJ3NhdmVBc1RlbXBsYXRlJyB8ICdjYW5jZWwnO1xuICBzdGVwPzogVGVzdENhc2VTdGVwQ29uZmlnO1xufVxuXG4vKipcbiAqIE9wZW5zIHRoZSBTdGVwIERldGFpbHMgRHJhd2VyIChFZGl0IEluIERlcHRoKSBmcm9tIHRoZSByaWdodC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTdGVwRGV0YWlsc0RyYXdlclNlcnZpY2Uge1xuICBwcml2YXRlIGN1cnJlbnRSZWY6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmPFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheTogT3ZlcmxheSwgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgb3BlbihkYXRhOiBTdGVwRGV0YWlsc0RyYXdlckRhdGEpOiBTdGVwRGV0YWlsc0RyYXdlclJlZjxTdGVwRGV0YWlsc0RyYXdlclJlc3VsdD4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRSZWYpIHJldHVybiB0aGlzLmN1cnJlbnRSZWY7XG5cbiAgICBjb25zdCBkcmF3ZXJXaWR0aCA9IDQ4MDtcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmdsb2JhbCgpXG4gICAgICAucmlnaHQoJzAnKVxuICAgICAgLnRvcCgnMCcpXG4gICAgICAuYm90dG9tKCcwJylcbiAgICAgIC53aWR0aChgJHtkcmF3ZXJXaWR0aH1weGApO1xuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgICAgcGFuZWxDbGFzczogWydjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1wYW5lbCcsICdjcWEtdWktcm9vdCddLFxuICAgICAgICB3aWR0aDogYCR7ZHJhd2VyV2lkdGh9cHhgLFxuICAgICAgICBtYXhXaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBkcmF3ZXJSZWYgPSBuZXcgU3RlcERldGFpbHNEcmF3ZXJSZWY8U3RlcERldGFpbHNEcmF3ZXJSZXN1bHQ+KG92ZXJsYXlSZWYpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IFNURVBfREVUQUlMU19EUkFXRVJfUkVGLCB1c2VWYWx1ZTogZHJhd2VyUmVmIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCB1c2VWYWx1ZTogZGF0YSB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQsIHVuZGVmaW5lZCwgaW5qZWN0b3IpO1xuICAgIG92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG5cbiAgICB0aGlzLmN1cnJlbnRSZWYgPSBkcmF3ZXJSZWY7XG4gICAgZHJhd2VyUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5jdXJyZW50UmVmID0gbnVsbDsgfSk7XG4gICAgb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IGRyYXdlclJlZi5jbG9zZSh7IGFjdGlvbjogJ2NhbmNlbCcgfSkpO1xuICAgIG92ZXJsYXlSZWZcbiAgICAgIC5rZXlkb3duRXZlbnRzKClcbiAgICAgIC5waXBlKGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnRXNjJykpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGRyYXdlclJlZi5jbG9zZSh7IGFjdGlvbjogJ2NhbmNlbCcgfSkpO1xuXG4gICAgcmV0dXJuIGRyYXdlclJlZjtcbiAgfVxufVxuIl19
|