@cqa-lib/cqa-ui 1.1.554 → 1.1.555

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.
@@ -0,0 +1,307 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import { DEFAULT_MODULAR_LABELS, } from '../../templates/modular-table-template/modular-table-template.models';
3
+ import { DEFAULT_TEST_SUITE_LABELS } from '../test-suite.models';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../custom-input/custom-input.component";
6
+ import * as i2 from "../../templates/modular-table-template/dialogs/move-to-folder-dialog.component";
7
+ /**
8
+ * Body of the "Move Test Suite" dialog.
9
+ *
10
+ * Reuses `<cqa-move-to-folder-dialog>` as the tree picker (same embedding pattern
11
+ * as `NewFolderDialogComponent`) so consumers get the same folder-tree UX, while
12
+ * adding two read-only rows above it: the suite's **current folder** (source)
13
+ * and the **destination folder** the user has picked (live-updates).
14
+ *
15
+ * Two integration paths:
16
+ *
17
+ * 1. **From within this library** via `DialogService.open(...)`. The outer
18
+ * `cqa-dialog` supplies title/description/Cancel/Move buttons; the Move
19
+ * button reads `pickedFolderId` via `dialogRef.getComponentInstance()` and
20
+ * checks `isValid` before closing.
21
+ *
22
+ * 2. **Host-driven** — host renders `<cqa-move-test-suite-dialog>` inside its
23
+ * own modal and listens to `(submitted)` / `(cancelled)` / `(pickedFolderIdChange)`.
24
+ */
25
+ export class MoveTestSuiteDialogComponent {
26
+ constructor(cdr) {
27
+ this.cdr = cdr;
28
+ // NOTE: `folders` and `labels` are declared as setters (instead of plain @Input fields)
29
+ // because `DialogService.open(...)` assigns the `inputs` map via direct property
30
+ // assignment *after* `attachComponent` has already run the component's lifecycle
31
+ // hooks — direct assignment bypasses `ngOnChanges`, so setters keep derived state
32
+ // in sync no matter the assignment order. Same pattern as `NewFolderDialogComponent`.
33
+ this._folders = [];
34
+ this._labels = { ...DEFAULT_MODULAR_LABELS };
35
+ /** Test-suite-section labels (title, description, button text, field labels,
36
+ * placeholder). Kept separate from `labels` (ModularLabels) so the embedded
37
+ * picker can keep its modular-table-template label model. Same setter
38
+ * pattern as `labels` for DialogService property-assignment compatibility. */
39
+ this._testSuiteLabels = { ...DEFAULT_TEST_SUITE_LABELS };
40
+ /** Folder the suite currently lives in. Used both to gray out the row in the
41
+ * embedded picker and to render the "Current folder" readout. */
42
+ this.currentFolderId = null;
43
+ /** Optional override for the current-folder display name. When not provided,
44
+ * the component resolves the name from `folders` by walking to `currentFolderId`,
45
+ * falling back to `labels.moveDialogRoot` ("Unorganized") when null. */
46
+ this.currentFolderName = null;
47
+ /** Name of the test suite being moved. Rendered as a disabled input at the
48
+ * top of the dialog body so the user can confirm which suite the move
49
+ * applies to. Defaults to empty string. */
50
+ this.suiteName = '';
51
+ /** Destination folder id picked by the user. Two-way-bind friendly. */
52
+ this.pickedFolderId = null;
53
+ /** Height of the embedded picker. Defaults to 240px (matches the parent-folder
54
+ * picker height in `NewFolderDialogComponent`) so the modal stays compact. */
55
+ this.pickerHeight = '240px';
56
+ /** When true (default), both the Current folder and Destination folder inputs
57
+ * render as disabled (read-only via the cqa-custom-input `[disabled]` flag).
58
+ * Set to false if a host needs to re-enable interaction on those fields. */
59
+ this.fieldsDisabled = true;
60
+ this.pickedFolderIdChange = new EventEmitter();
61
+ this.submitted = new EventEmitter();
62
+ this.cancelled = new EventEmitter();
63
+ /** Bubble cqa-custom-input focus/blur events up to hosts. Useful when
64
+ * `fieldsDisabled = false` and the host wants to react to interaction. */
65
+ this.currentFieldFocus = new EventEmitter();
66
+ this.currentFieldBlur = new EventEmitter();
67
+ this.destinationFieldFocus = new EventEmitter();
68
+ this.destinationFieldBlur = new EventEmitter();
69
+ /** Set to true the first time the user picks anything. Lets `isValid` treat
70
+ * the initial pre-touch state as "nothing selected" — important when the
71
+ * suite starts in Unorganized (`currentFolderId = null`) so a fresh dialog
72
+ * doesn't appear valid just because `pickedFolderId` also defaults to null. */
73
+ this.pickedTouched = false;
74
+ }
75
+ set folders(value) {
76
+ this._folders = value || [];
77
+ this.cdr.markForCheck();
78
+ }
79
+ get folders() { return this._folders; }
80
+ set labels(value) {
81
+ this._labels = value || { ...DEFAULT_MODULAR_LABELS };
82
+ this.cdr.markForCheck();
83
+ }
84
+ get labels() { return this._labels; }
85
+ set testSuiteLabels(value) {
86
+ this._testSuiteLabels = value || { ...DEFAULT_TEST_SUITE_LABELS };
87
+ this.cdr.markForCheck();
88
+ }
89
+ get testSuiteLabels() { return this._testSuiteLabels; }
90
+ onParentPicked(id) {
91
+ let next = null;
92
+ if (id != null) {
93
+ const coerced = typeof id === 'number' ? id : Number(id);
94
+ if (Number.isFinite(coerced))
95
+ next = coerced;
96
+ }
97
+ this.pickedFolderId = next;
98
+ this.pickedTouched = true;
99
+ this.pickedFolderIdChange.emit(next);
100
+ this.cdr.markForCheck();
101
+ }
102
+ /** True once the user has picked a destination via the embedded tree. Drives
103
+ * the destination-readout styling (indigo when picked, muted when not). */
104
+ get hasPick() {
105
+ return this.pickedTouched;
106
+ }
107
+ get resolvedCurrentName() {
108
+ if (this.currentFolderName && this.currentFolderName.trim().length) {
109
+ return this.currentFolderName;
110
+ }
111
+ if (this.currentFolderId == null) {
112
+ return this.labels.moveDialogRoot;
113
+ }
114
+ const name = this.findFolderName(this._folders, this.currentFolderId);
115
+ return name ?? this.labels.moveDialogRoot;
116
+ }
117
+ /** Value shown inside the Destination input. Empty until the user picks; once
118
+ * picked, the resolved folder name (or `labels.moveDialogRoot` for Unorganized).
119
+ * Empty state lets the input's `[placeholder]` show through. */
120
+ get destinationFieldValue() {
121
+ if (!this.pickedTouched)
122
+ return '';
123
+ if (this.pickedFolderId == null)
124
+ return this.labels.moveDialogRoot;
125
+ return this.findFolderName(this._folders, this.pickedFolderId) ?? this.labels.moveDialogRoot;
126
+ }
127
+ /** Placeholder shown in the Destination input before the user picks. */
128
+ get destinationFieldPlaceholder() {
129
+ return this._testSuiteLabels.moveTestSuiteDialogDestinationPlaceholder;
130
+ }
131
+ /** Move is valid when the user has picked a destination different from the
132
+ * current folder. Picking the same folder as the source is a no-op, and we
133
+ * also require an explicit interaction (`pickedTouched`). */
134
+ get isValid() {
135
+ if (!this.pickedTouched)
136
+ return false;
137
+ return this.pickedFolderId !== this.currentFolderId;
138
+ }
139
+ submit() {
140
+ if (!this.isValid)
141
+ return;
142
+ this.submitted.emit({ targetFolderId: this.pickedFolderId });
143
+ }
144
+ cancel() {
145
+ this.cancelled.emit();
146
+ }
147
+ /** Hooks for the Current folder cqa-custom-input. Field is disabled by
148
+ * default, so these mostly no-op; they're wired so the component still
149
+ * behaves correctly when `fieldsDisabled = false`. */
150
+ onCurrentFieldValueChange(_value) {
151
+ // Read-only field — ignore programmatic changes.
152
+ }
153
+ onCurrentFieldFocused(event) {
154
+ this.currentFieldFocus.emit(event);
155
+ }
156
+ onCurrentFieldBlurred(event) {
157
+ this.currentFieldBlur.emit(event);
158
+ }
159
+ /** Hooks for the Destination folder cqa-custom-input. Value is driven by the
160
+ * tree picker below, so the input itself is informational. */
161
+ onDestinationFieldValueChange(_value) {
162
+ // Destination is driven by the tree picker, not the input itself.
163
+ }
164
+ onDestinationFieldFocused(event) {
165
+ this.destinationFieldFocus.emit(event);
166
+ }
167
+ onDestinationFieldBlurred(event) {
168
+ this.destinationFieldBlur.emit(event);
169
+ }
170
+ findFolderName(nodes, id) {
171
+ for (const n of nodes || []) {
172
+ if (n.id === id)
173
+ return n.name;
174
+ if (n.children?.length) {
175
+ const hit = this.findFolderName(n.children, id);
176
+ if (hit != null)
177
+ return hit;
178
+ }
179
+ }
180
+ return null;
181
+ }
182
+ }
183
+ MoveTestSuiteDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MoveTestSuiteDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
184
+ MoveTestSuiteDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MoveTestSuiteDialogComponent, selector: "cqa-move-test-suite-dialog", inputs: { folders: "folders", labels: "labels", testSuiteLabels: "testSuiteLabels", currentFolderId: "currentFolderId", currentFolderName: "currentFolderName", suiteName: "suiteName", pickedFolderId: "pickedFolderId", pickerHeight: "pickerHeight", fieldsDisabled: "fieldsDisabled" }, outputs: { pickedFolderIdChange: "pickedFolderIdChange", submitted: "submitted", cancelled: "cancelled", currentFieldFocus: "currentFieldFocus", currentFieldBlur: "currentFieldBlur", destinationFieldFocus: "destinationFieldFocus", destinationFieldBlur: "destinationFieldBlur" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: `
185
+ <div class="cqa-flex cqa-flex-col cqa-gap-2 cqa-w-full">
186
+ <!-- Test suite name (read-only display; surfaces which suite is being moved) -->
187
+ <cqa-custom-input
188
+ [label]="testSuiteLabels.moveTestSuiteDialogSuiteNameLabel"
189
+ [value]="suiteName"
190
+ [disabled]="fieldsDisabled"
191
+ [fullWidth]="true"
192
+ ></cqa-custom-input>
193
+
194
+ <!-- Current folder (rendered as a disabled input) -->
195
+ <cqa-custom-input
196
+ [label]="testSuiteLabels.moveTestSuiteDialogCurrentLabel"
197
+ [value]="resolvedCurrentName"
198
+ [disabled]="fieldsDisabled"
199
+ [fullWidth]="true"
200
+ (valueChange)="onCurrentFieldValueChange($event)"
201
+ (focused)="onCurrentFieldFocused($event)"
202
+ (blurred)="onCurrentFieldBlurred($event)"
203
+ ></cqa-custom-input>
204
+
205
+ <!-- Destination folder (rendered as a disabled input; value driven by the tree picker below) -->
206
+ <cqa-custom-input
207
+ [label]="testSuiteLabels.moveTestSuiteDialogDestinationLabel"
208
+ [value]="destinationFieldValue"
209
+ [placeholder]="destinationFieldPlaceholder"
210
+ [disabled]="fieldsDisabled"
211
+ [fullWidth]="true"
212
+ (valueChange)="onDestinationFieldValueChange($event)"
213
+ (focused)="onDestinationFieldFocused($event)"
214
+ (blurred)="onDestinationFieldBlurred($event)"
215
+ ></cqa-custom-input>
216
+
217
+ <!-- Folder tree picker -->
218
+ <cqa-move-to-folder-dialog
219
+ [folders]="folders"
220
+ [labels]="labels"
221
+ [currentFolderId]="currentFolderId"
222
+ [pickedFolderId]="pickedFolderId"
223
+ [pickerHeight]="pickerHeight"
224
+ (pickedFolderIdChange)="onParentPicked($event)"
225
+ ></cqa-move-to-folder-dialog>
226
+ </div>
227
+ `, isInline: true, 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.MoveToFolderDialogComponent, selector: "cqa-move-to-folder-dialog", inputs: ["folders", "labels", "currentFolderId", "pickedFolderId", "initialExpandedIds", "rootDisabled", "pickerHeight"], outputs: ["folderPicked", "pickedFolderIdChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MoveTestSuiteDialogComponent, decorators: [{
229
+ type: Component,
230
+ args: [{ selector: 'cqa-move-test-suite-dialog', template: `
231
+ <div class="cqa-flex cqa-flex-col cqa-gap-2 cqa-w-full">
232
+ <!-- Test suite name (read-only display; surfaces which suite is being moved) -->
233
+ <cqa-custom-input
234
+ [label]="testSuiteLabels.moveTestSuiteDialogSuiteNameLabel"
235
+ [value]="suiteName"
236
+ [disabled]="fieldsDisabled"
237
+ [fullWidth]="true"
238
+ ></cqa-custom-input>
239
+
240
+ <!-- Current folder (rendered as a disabled input) -->
241
+ <cqa-custom-input
242
+ [label]="testSuiteLabels.moveTestSuiteDialogCurrentLabel"
243
+ [value]="resolvedCurrentName"
244
+ [disabled]="fieldsDisabled"
245
+ [fullWidth]="true"
246
+ (valueChange)="onCurrentFieldValueChange($event)"
247
+ (focused)="onCurrentFieldFocused($event)"
248
+ (blurred)="onCurrentFieldBlurred($event)"
249
+ ></cqa-custom-input>
250
+
251
+ <!-- Destination folder (rendered as a disabled input; value driven by the tree picker below) -->
252
+ <cqa-custom-input
253
+ [label]="testSuiteLabels.moveTestSuiteDialogDestinationLabel"
254
+ [value]="destinationFieldValue"
255
+ [placeholder]="destinationFieldPlaceholder"
256
+ [disabled]="fieldsDisabled"
257
+ [fullWidth]="true"
258
+ (valueChange)="onDestinationFieldValueChange($event)"
259
+ (focused)="onDestinationFieldFocused($event)"
260
+ (blurred)="onDestinationFieldBlurred($event)"
261
+ ></cqa-custom-input>
262
+
263
+ <!-- Folder tree picker -->
264
+ <cqa-move-to-folder-dialog
265
+ [folders]="folders"
266
+ [labels]="labels"
267
+ [currentFolderId]="currentFolderId"
268
+ [pickedFolderId]="pickedFolderId"
269
+ [pickerHeight]="pickerHeight"
270
+ (pickedFolderIdChange)="onParentPicked($event)"
271
+ ></cqa-move-to-folder-dialog>
272
+ </div>
273
+ `, host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, styles: [] }]
274
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { folders: [{
275
+ type: Input
276
+ }], labels: [{
277
+ type: Input
278
+ }], testSuiteLabels: [{
279
+ type: Input
280
+ }], currentFolderId: [{
281
+ type: Input
282
+ }], currentFolderName: [{
283
+ type: Input
284
+ }], suiteName: [{
285
+ type: Input
286
+ }], pickedFolderId: [{
287
+ type: Input
288
+ }], pickerHeight: [{
289
+ type: Input
290
+ }], fieldsDisabled: [{
291
+ type: Input
292
+ }], pickedFolderIdChange: [{
293
+ type: Output
294
+ }], submitted: [{
295
+ type: Output
296
+ }], cancelled: [{
297
+ type: Output
298
+ }], currentFieldFocus: [{
299
+ type: Output
300
+ }], currentFieldBlur: [{
301
+ type: Output
302
+ }], destinationFieldFocus: [{
303
+ type: Output
304
+ }], destinationFieldBlur: [{
305
+ type: Output
306
+ }] } });
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS10ZXN0LXN1aXRlLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3Qtc3VpdGUvbW92ZS10ZXN0LXN1aXRlLWRpYWxvZy9tb3ZlLXRlc3Qtc3VpdGUtZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEdBR3ZCLE1BQU0sc0VBQXNFLENBQUM7QUFDOUUsT0FBTyxFQUFFLHlCQUF5QixFQUFtQixNQUFNLHNCQUFzQixDQUFDOzs7O0FBRWxGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQW1ESCxNQUFNLE9BQU8sNEJBQTRCO0lBMkV2QyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTFFMUMsd0ZBQXdGO1FBQ3hGLGlGQUFpRjtRQUNqRixpRkFBaUY7UUFDakYsa0ZBQWtGO1FBQ2xGLHNGQUFzRjtRQUU5RSxhQUFRLEdBQWlCLEVBQUUsQ0FBQztRQU81QixZQUFPLEdBQWtCLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO1FBTy9EOzs7dUZBRytFO1FBQ3ZFLHFCQUFnQixHQUFvQixFQUFFLEdBQUcseUJBQXlCLEVBQUUsQ0FBQztRQU83RTswRUFDa0U7UUFDekQsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBRS9DOztpRkFFeUU7UUFDaEUsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUVqRDs7b0RBRTRDO1FBQ25DLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFFaEMsdUVBQXVFO1FBQzlELG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUU5Qzt1RkFDK0U7UUFDdEUsaUJBQVksR0FBVyxPQUFPLENBQUM7UUFFeEM7O3FGQUU2RTtR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O3NCQUFsQixLQUFLO2dCQVdPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBUUcsZUFBZTtzQkFBdkIsS0FBSztnQkFLRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csY0FBYztzQkFBdEIsS0FBSztnQkFFSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUlHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgRm9sZGVyTm9kZSxcbiAgTW9kdWxhckxhYmVscyxcbn0gZnJvbSAnLi4vLi4vdGVtcGxhdGVzL21vZHVsYXItdGFibGUtdGVtcGxhdGUvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS5tb2RlbHMnO1xuaW1wb3J0IHsgREVGQVVMVF9URVNUX1NVSVRFX0xBQkVMUywgVGVzdFN1aXRlTGFiZWxzIH0gZnJvbSAnLi4vdGVzdC1zdWl0ZS5tb2RlbHMnO1xuXG4vKipcbiAqIEJvZHkgb2YgdGhlIFwiTW92ZSBUZXN0IFN1aXRlXCIgZGlhbG9nLlxuICpcbiAqIFJldXNlcyBgPGNxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2c+YCBhcyB0aGUgdHJlZSBwaWNrZXIgKHNhbWUgZW1iZWRkaW5nIHBhdHRlcm5cbiAqIGFzIGBOZXdGb2xkZXJEaWFsb2dDb21wb25lbnRgKSBzbyBjb25zdW1lcnMgZ2V0IHRoZSBzYW1lIGZvbGRlci10cmVlIFVYLCB3aGlsZVxuICogYWRkaW5nIHR3byByZWFkLW9ubHkgcm93cyBhYm92ZSBpdDogdGhlIHN1aXRlJ3MgKipjdXJyZW50IGZvbGRlcioqIChzb3VyY2UpXG4gKiBhbmQgdGhlICoqZGVzdGluYXRpb24gZm9sZGVyKiogdGhlIHVzZXIgaGFzIHBpY2tlZCAobGl2ZS11cGRhdGVzKS5cbiAqXG4gKiBUd28gaW50ZWdyYXRpb24gcGF0aHM6XG4gKlxuICogIDEuICoqRnJvbSB3aXRoaW4gdGhpcyBsaWJyYXJ5KiogdmlhIGBEaWFsb2dTZXJ2aWNlLm9wZW4oLi4uKWAuIFRoZSBvdXRlclxuICogICAgIGBjcWEtZGlhbG9nYCBzdXBwbGllcyB0aXRsZS9kZXNjcmlwdGlvbi9DYW5jZWwvTW92ZSBidXR0b25zOyB0aGUgTW92ZVxuICogICAgIGJ1dHRvbiByZWFkcyBgcGlja2VkRm9sZGVySWRgIHZpYSBgZGlhbG9nUmVmLmdldENvbXBvbmVudEluc3RhbmNlKClgIGFuZFxuICogICAgIGNoZWNrcyBgaXNWYWxpZGAgYmVmb3JlIGNsb3NpbmcuXG4gKlxuICogIDIuICoqSG9zdC1kcml2ZW4qKiDigJQgaG9zdCByZW5kZXJzIGA8Y3FhLW1vdmUtdGVzdC1zdWl0ZS1kaWFsb2c+YCBpbnNpZGUgaXRzXG4gKiAgICAgb3duIG1vZGFsIGFuZCBsaXN0ZW5zIHRvIGAoc3VibWl0dGVkKWAgLyBgKGNhbmNlbGxlZClgIC8gYChwaWNrZWRGb2xkZXJJZENoYW5nZSlgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbW92ZS10ZXN0LXN1aXRlLWRpYWxvZycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLXctZnVsbFwiPlxuICAgICAgPCEtLSBUZXN0IHN1aXRlIG5hbWUgKHJlYWQtb25seSBkaXNwbGF5OyBzdXJmYWNlcyB3aGljaCBzdWl0ZSBpcyBiZWluZyBtb3ZlZCkgLS0+XG4gICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICBbbGFiZWxdPVwidGVzdFN1aXRlTGFiZWxzLm1vdmVUZXN0U3VpdGVEaWFsb2dTdWl0ZU5hbWVMYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJzdWl0ZU5hbWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGRzRGlzYWJsZWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgPjwvY3FhLWN1c3RvbS1pbnB1dD5cblxuICAgICAgPCEtLSBDdXJyZW50IGZvbGRlciAocmVuZGVyZWQgYXMgYSBkaXNhYmxlZCBpbnB1dCkgLS0+XG4gICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICBbbGFiZWxdPVwidGVzdFN1aXRlTGFiZWxzLm1vdmVUZXN0U3VpdGVEaWFsb2dDdXJyZW50TGFiZWxcIlxuICAgICAgICBbdmFsdWVdPVwicmVzb2x2ZWRDdXJyZW50TmFtZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZHNEaXNhYmxlZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkN1cnJlbnRGaWVsZFZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXNlZCk9XCJvbkN1cnJlbnRGaWVsZEZvY3VzZWQoJGV2ZW50KVwiXG4gICAgICAgIChibHVycmVkKT1cIm9uQ3VycmVudEZpZWxkQmx1cnJlZCgkZXZlbnQpXCJcbiAgICAgID48L2NxYS1jdXN0b20taW5wdXQ+XG5cbiAgICAgIDwhLS0gRGVzdGluYXRpb24gZm9sZGVyIChyZW5kZXJlZCBhcyBhIGRpc2FibGVkIGlucHV0OyB2YWx1ZSBkcml2ZW4gYnkgdGhlIHRyZWUgcGlja2VyIGJlbG93KSAtLT5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIFtsYWJlbF09XCJ0ZXN0U3VpdGVMYWJlbHMubW92ZVRlc3RTdWl0ZURpYWxvZ0Rlc3RpbmF0aW9uTGFiZWxcIlxuICAgICAgICBbdmFsdWVdPVwiZGVzdGluYXRpb25GaWVsZFZhbHVlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRlc3RpbmF0aW9uRmllbGRQbGFjZWhvbGRlclwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZHNEaXNhYmxlZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkRlc3RpbmF0aW9uRmllbGRWYWx1ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGZvY3VzZWQpPVwib25EZXN0aW5hdGlvbkZpZWxkRm9jdXNlZCgkZXZlbnQpXCJcbiAgICAgICAgKGJsdXJyZWQpPVwib25EZXN0aW5hdGlvbkZpZWxkQmx1cnJlZCgkZXZlbnQpXCJcbiAgICAgID48L2NxYS1jdXN0b20taW5wdXQ+XG5cbiAgICAgIDwhLS0gRm9sZGVyIHRyZWUgcGlja2VyIC0tPlxuICAgICAgPGNxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2dcbiAgICAgICAgW2ZvbGRlcnNdPVwiZm9sZGVyc1wiXG4gICAgICAgIFtsYWJlbHNdPVwibGFiZWxzXCJcbiAgICAgICAgW2N1cnJlbnRGb2xkZXJJZF09XCJjdXJyZW50Rm9sZGVySWRcIlxuICAgICAgICBbcGlja2VkRm9sZGVySWRdPVwicGlja2VkRm9sZGVySWRcIlxuICAgICAgICBbcGlja2VySGVpZ2h0XT1cInBpY2tlckhlaWdodFwiXG4gICAgICAgIChwaWNrZWRGb2xkZXJJZENoYW5nZSk9XCJvblBhcmVudFBpY2tlZCgkZXZlbnQpXCJcbiAgICAgID48L2NxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2c+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1vdmVUZXN0U3VpdGVEaWFsb2dDb21wb25lbnQge1xuICAvLyBOT1RFOiBgZm9sZGVyc2AgYW5kIGBsYWJlbHNgIGFyZSBkZWNsYXJlZCBhcyBzZXR0ZXJzIChpbnN0ZWFkIG9mIHBsYWluIEBJbnB1dCBmaWVsZHMpXG4gIC8vIGJlY2F1c2UgYERpYWxvZ1NlcnZpY2Uub3BlbiguLi4pYCBhc3NpZ25zIHRoZSBgaW5wdXRzYCBtYXAgdmlhIGRpcmVjdCBwcm9wZXJ0eVxuICAvLyBhc3NpZ25tZW50ICphZnRlciogYGF0dGFjaENvbXBvbmVudGAgaGFzIGFscmVhZHkgcnVuIHRoZSBjb21wb25lbnQncyBsaWZlY3ljbGVcbiAgLy8gaG9va3Mg4oCUIGRpcmVjdCBhc3NpZ25tZW50IGJ5cGFzc2VzIGBuZ09uQ2hhbmdlc2AsIHNvIHNldHRlcnMga2VlcCBkZXJpdmVkIHN0YXRlXG4gIC8vIGluIHN5bmMgbm8gbWF0dGVyIHRoZSBhc3NpZ25tZW50IG9yZGVyLiBTYW1lIHBhdHRlcm4gYXMgYE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudGAuXG5cbiAgcHJpdmF0ZSBfZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIEBJbnB1dCgpIHNldCBmb2xkZXJzKHZhbHVlOiBGb2xkZXJOb2RlW10pIHtcbiAgICB0aGlzLl9mb2xkZXJzID0gdmFsdWUgfHwgW107XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IGZvbGRlcnMoKTogRm9sZGVyTm9kZVtdIHsgcmV0dXJuIHRoaXMuX2ZvbGRlcnM7IH1cblxuICBwcml2YXRlIF9sYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgQElucHV0KCkgc2V0IGxhYmVscyh2YWx1ZTogTW9kdWxhckxhYmVscykge1xuICAgIHRoaXMuX2xhYmVscyA9IHZhbHVlIHx8IHsgLi4uREVGQVVMVF9NT0RVTEFSX0xBQkVMUyB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCBsYWJlbHMoKTogTW9kdWxhckxhYmVscyB7IHJldHVybiB0aGlzLl9sYWJlbHM7IH1cblxuICAvKiogVGVzdC1zdWl0ZS1zZWN0aW9uIGxhYmVscyAodGl0bGUsIGRlc2NyaXB0aW9uLCBidXR0b24gdGV4dCwgZmllbGQgbGFiZWxzLFxuICAgKiAgcGxhY2Vob2xkZXIpLiBLZXB0IHNlcGFyYXRlIGZyb20gYGxhYmVsc2AgKE1vZHVsYXJMYWJlbHMpIHNvIHRoZSBlbWJlZGRlZFxuICAgKiAgcGlja2VyIGNhbiBrZWVwIGl0cyBtb2R1bGFyLXRhYmxlLXRlbXBsYXRlIGxhYmVsIG1vZGVsLiBTYW1lIHNldHRlclxuICAgKiAgcGF0dGVybiBhcyBgbGFiZWxzYCBmb3IgRGlhbG9nU2VydmljZSBwcm9wZXJ0eS1hc3NpZ25tZW50IGNvbXBhdGliaWxpdHkuICovXG4gIHByaXZhdGUgX3Rlc3RTdWl0ZUxhYmVsczogVGVzdFN1aXRlTGFiZWxzID0geyAuLi5ERUZBVUxUX1RFU1RfU1VJVEVfTEFCRUxTIH07XG4gIEBJbnB1dCgpIHNldCB0ZXN0U3VpdGVMYWJlbHModmFsdWU6IFRlc3RTdWl0ZUxhYmVscykge1xuICAgIHRoaXMuX3Rlc3RTdWl0ZUxhYmVscyA9IHZhbHVlIHx8IHsgLi4uREVGQVVMVF9URVNUX1NVSVRFX0xBQkVMUyB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB0ZXN0U3VpdGVMYWJlbHMoKTogVGVzdFN1aXRlTGFiZWxzIHsgcmV0dXJuIHRoaXMuX3Rlc3RTdWl0ZUxhYmVsczsgfVxuXG4gIC8qKiBGb2xkZXIgdGhlIHN1aXRlIGN1cnJlbnRseSBsaXZlcyBpbi4gVXNlZCBib3RoIHRvIGdyYXkgb3V0IHRoZSByb3cgaW4gdGhlXG4gICAqICBlbWJlZGRlZCBwaWNrZXIgYW5kIHRvIHJlbmRlciB0aGUgXCJDdXJyZW50IGZvbGRlclwiIHJlYWRvdXQuICovXG4gIEBJbnB1dCgpIGN1cnJlbnRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aGUgY3VycmVudC1mb2xkZXIgZGlzcGxheSBuYW1lLiBXaGVuIG5vdCBwcm92aWRlZCxcbiAgICogIHRoZSBjb21wb25lbnQgcmVzb2x2ZXMgdGhlIG5hbWUgZnJvbSBgZm9sZGVyc2AgYnkgd2Fsa2luZyB0byBgY3VycmVudEZvbGRlcklkYCxcbiAgICogIGZhbGxpbmcgYmFjayB0byBgbGFiZWxzLm1vdmVEaWFsb2dSb290YCAoXCJVbm9yZ2FuaXplZFwiKSB3aGVuIG51bGwuICovXG4gIEBJbnB1dCgpIGN1cnJlbnRGb2xkZXJOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogTmFtZSBvZiB0aGUgdGVzdCBzdWl0ZSBiZWluZyBtb3ZlZC4gUmVuZGVyZWQgYXMgYSBkaXNhYmxlZCBpbnB1dCBhdCB0aGVcbiAgICogIHRvcCBvZiB0aGUgZGlhbG9nIGJvZHkgc28gdGhlIHVzZXIgY2FuIGNvbmZpcm0gd2hpY2ggc3VpdGUgdGhlIG1vdmVcbiAgICogIGFwcGxpZXMgdG8uIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZy4gKi9cbiAgQElucHV0KCkgc3VpdGVOYW1lOiBzdHJpbmcgPSAnJztcblxuICAvKiogRGVzdGluYXRpb24gZm9sZGVyIGlkIHBpY2tlZCBieSB0aGUgdXNlci4gVHdvLXdheS1iaW5kIGZyaWVuZGx5LiAqL1xuICBASW5wdXQoKSBwaWNrZWRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEhlaWdodCBvZiB0aGUgZW1iZWRkZWQgcGlja2VyLiBEZWZhdWx0cyB0byAyNDBweCAobWF0Y2hlcyB0aGUgcGFyZW50LWZvbGRlclxuICAgKiAgcGlja2VyIGhlaWdodCBpbiBgTmV3Rm9sZGVyRGlhbG9nQ29tcG9uZW50YCkgc28gdGhlIG1vZGFsIHN0YXlzIGNvbXBhY3QuICovXG4gIEBJbnB1dCgpIHBpY2tlckhlaWdodDogc3RyaW5nID0gJzI0MHB4JztcblxuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYm90aCB0aGUgQ3VycmVudCBmb2xkZXIgYW5kIERlc3RpbmF0aW9uIGZvbGRlciBpbnB1dHNcbiAgICogIHJlbmRlciBhcyBkaXNhYmxlZCAocmVhZC1vbmx5IHZpYSB0aGUgY3FhLWN1c3RvbS1pbnB1dCBgW2Rpc2FibGVkXWAgZmxhZykuXG4gICAqICBTZXQgdG8gZmFsc2UgaWYgYSBob3N0IG5lZWRzIHRvIHJlLWVuYWJsZSBpbnRlcmFjdGlvbiBvbiB0aG9zZSBmaWVsZHMuICovXG4gIEBJbnB1dCgpIGZpZWxkc0Rpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgcGlja2VkRm9sZGVySWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdGFyZ2V0Rm9sZGVySWQ6IG51bWJlciB8IG51bGwgfT4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogQnViYmxlIGNxYS1jdXN0b20taW5wdXQgZm9jdXMvYmx1ciBldmVudHMgdXAgdG8gaG9zdHMuIFVzZWZ1bCB3aGVuXG4gICAqICBgZmllbGRzRGlzYWJsZWQgPSBmYWxzZWAgYW5kIHRoZSBob3N0IHdhbnRzIHRvIHJlYWN0IHRvIGludGVyYWN0aW9uLiAqL1xuICBAT3V0cHV0KCkgY3VycmVudEZpZWxkRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjdXJyZW50RmllbGRCbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZGVzdGluYXRpb25GaWVsZEZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZGVzdGluYXRpb25GaWVsZEJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgLyoqIFNldCB0byB0cnVlIHRoZSBmaXJzdCB0aW1lIHRoZSB1c2VyIHBpY2tzIGFueXRoaW5nLiBMZXRzIGBpc1ZhbGlkYCB0cmVhdFxuICAgKiAgdGhlIGluaXRpYWwgcHJlLXRvdWNoIHN0YXRlIGFzIFwibm90aGluZyBzZWxlY3RlZFwiIOKAlCBpbXBvcnRhbnQgd2hlbiB0aGVcbiAgICogIHN1aXRlIHN0YXJ0cyBpbiBVbm9yZ2FuaXplZCAoYGN1cnJlbnRGb2xkZXJJZCA9IG51bGxgKSBzbyBhIGZyZXNoIGRpYWxvZ1xuICAgKiAgZG9lc24ndCBhcHBlYXIgdmFsaWQganVzdCBiZWNhdXNlIGBwaWNrZWRGb2xkZXJJZGAgYWxzbyBkZWZhdWx0cyB0byBudWxsLiAqL1xuICBwcml2YXRlIHBpY2tlZFRvdWNoZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgb25QYXJlbnRQaWNrZWQoaWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBsZXQgbmV4dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWQgPSB0eXBlb2YgaWQgPT09ICdudW1iZXInID8gaWQgOiBOdW1iZXIoaWQpO1xuICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShjb2VyY2VkKSkgbmV4dCA9IGNvZXJjZWQ7XG4gICAgfVxuICAgIHRoaXMucGlja2VkRm9sZGVySWQgPSBuZXh0O1xuICAgIHRoaXMucGlja2VkVG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy5waWNrZWRGb2xkZXJJZENoYW5nZS5lbWl0KG5leHQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRydWUgb25jZSB0aGUgdXNlciBoYXMgcGlja2VkIGEgZGVzdGluYXRpb24gdmlhIHRoZSBlbWJlZGRlZCB0cmVlLiBEcml2ZXNcbiAgICogIHRoZSBkZXN0aW5hdGlvbi1yZWFkb3V0IHN0eWxpbmcgKGluZGlnbyB3aGVuIHBpY2tlZCwgbXV0ZWQgd2hlbiBub3QpLiAqL1xuICBnZXQgaGFzUGljaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWNrZWRUb3VjaGVkO1xuICB9XG5cbiAgZ2V0IHJlc29sdmVkQ3VycmVudE5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVyTmFtZSAmJiB0aGlzLmN1cnJlbnRGb2xkZXJOYW1lLnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRGb2xkZXJOYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVySWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWxzLm1vdmVEaWFsb2dSb290O1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gdGhpcy5maW5kRm9sZGVyTmFtZSh0aGlzLl9mb2xkZXJzLCB0aGlzLmN1cnJlbnRGb2xkZXJJZCk7XG4gICAgcmV0dXJuIG5hbWUgPz8gdGhpcy5sYWJlbHMubW92ZURpYWxvZ1Jvb3Q7XG4gIH1cblxuICAvKiogVmFsdWUgc2hvd24gaW5zaWRlIHRoZSBEZXN0aW5hdGlvbiBpbnB1dC4gRW1wdHkgdW50aWwgdGhlIHVzZXIgcGlja3M7IG9uY2VcbiAgICogIHBpY2tlZCwgdGhlIHJlc29sdmVkIGZvbGRlciBuYW1lIChvciBgbGFiZWxzLm1vdmVEaWFsb2dSb290YCBmb3IgVW5vcmdhbml6ZWQpLlxuICAgKiAgRW1wdHkgc3RhdGUgbGV0cyB0aGUgaW5wdXQncyBgW3BsYWNlaG9sZGVyXWAgc2hvdyB0aHJvdWdoLiAqL1xuICBnZXQgZGVzdGluYXRpb25GaWVsZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnBpY2tlZFRvdWNoZWQpIHJldHVybiAnJztcbiAgICBpZiAodGhpcy5waWNrZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gdGhpcy5sYWJlbHMubW92ZURpYWxvZ1Jvb3Q7XG4gICAgcmV0dXJuIHRoaXMuZmluZEZvbGRlck5hbWUodGhpcy5fZm9sZGVycywgdGhpcy5waWNrZWRGb2xkZXJJZCkgPz8gdGhpcy5sYWJlbHMubW92ZURpYWxvZ1Jvb3Q7XG4gIH1cblxuICAvKiogUGxhY2Vob2xkZXIgc2hvd24gaW4gdGhlIERlc3RpbmF0aW9uIGlucHV0IGJlZm9yZSB0aGUgdXNlciBwaWNrcy4gKi9cbiAgZ2V0IGRlc3RpbmF0aW9uRmllbGRQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90ZXN0U3VpdGVMYWJlbHMubW92ZVRlc3RTdWl0ZURpYWxvZ0Rlc3RpbmF0aW9uUGxhY2Vob2xkZXI7XG4gIH1cblxuICAvKiogTW92ZSBpcyB2YWxpZCB3aGVuIHRoZSB1c2VyIGhhcyBwaWNrZWQgYSBkZXN0aW5hdGlvbiBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICogIGN1cnJlbnQgZm9sZGVyLiBQaWNraW5nIHRoZSBzYW1lIGZvbGRlciBhcyB0aGUgc291cmNlIGlzIGEgbm8tb3AsIGFuZCB3ZVxuICAgKiAgYWxzbyByZXF1aXJlIGFuIGV4cGxpY2l0IGludGVyYWN0aW9uIChgcGlja2VkVG91Y2hlZGApLiAqL1xuICBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucGlja2VkVG91Y2hlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnBpY2tlZEZvbGRlcklkICE9PSB0aGlzLmN1cnJlbnRGb2xkZXJJZDtcbiAgfVxuXG4gIHN1Ym1pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuO1xuICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoeyB0YXJnZXRGb2xkZXJJZDogdGhpcy5waWNrZWRGb2xkZXJJZCB9KTtcbiAgfVxuXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICAvKiogSG9va3MgZm9yIHRoZSBDdXJyZW50IGZvbGRlciBjcWEtY3VzdG9tLWlucHV0LiBGaWVsZCBpcyBkaXNhYmxlZCBieVxuICAgKiAgZGVmYXVsdCwgc28gdGhlc2UgbW9zdGx5IG5vLW9wOyB0aGV5J3JlIHdpcmVkIHNvIHRoZSBjb21wb25lbnQgc3RpbGxcbiAgICogIGJlaGF2ZXMgY29ycmVjdGx5IHdoZW4gYGZpZWxkc0Rpc2FibGVkID0gZmFsc2VgLiAqL1xuICBvbkN1cnJlbnRGaWVsZFZhbHVlQ2hhbmdlKF92YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVhZC1vbmx5IGZpZWxkIOKAlCBpZ25vcmUgcHJvZ3JhbW1hdGljIGNoYW5nZXMuXG4gIH1cbiAgb25DdXJyZW50RmllbGRGb2N1c2VkKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50RmllbGRGb2N1cy5lbWl0KGV2ZW50KTtcbiAgfVxuICBvbkN1cnJlbnRGaWVsZEJsdXJyZWQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRGaWVsZEJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKiogSG9va3MgZm9yIHRoZSBEZXN0aW5hdGlvbiBmb2xkZXIgY3FhLWN1c3RvbS1pbnB1dC4gVmFsdWUgaXMgZHJpdmVuIGJ5IHRoZVxuICAgKiAgdHJlZSBwaWNrZXIgYmVsb3csIHNvIHRoZSBpbnB1dCBpdHNlbGYgaXMgaW5mb3JtYXRpb25hbC4gKi9cbiAgb25EZXN0aW5hdGlvbkZpZWxkVmFsdWVDaGFuZ2UoX3ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBEZXN0aW5hdGlvbiBpcyBkcml2ZW4gYnkgdGhlIHRyZWUgcGlja2VyLCBub3QgdGhlIGlucHV0IGl0c2VsZi5cbiAgfVxuICBvbkRlc3RpbmF0aW9uRmllbGRGb2N1c2VkKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbkZpZWxkRm9jdXMuZW1pdChldmVudCk7XG4gIH1cbiAgb25EZXN0aW5hdGlvbkZpZWxkQmx1cnJlZChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdGluYXRpb25GaWVsZEJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRGb2xkZXJOYW1lKG5vZGVzOiBGb2xkZXJOb2RlW10sIGlkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGlmIChuLmlkID09PSBpZCkgcmV0dXJuIG4ubmFtZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgaGl0ID0gdGhpcy5maW5kRm9sZGVyTmFtZShuLmNoaWxkcmVuLCBpZCk7XG4gICAgICAgIGlmIChoaXQgIT0gbnVsbCkgcmV0dXJuIGhpdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ export const DEFAULT_TEST_SUITE_LABELS = {
2
+ moveTestSuiteDialogTitle: 'Move test suite',
3
+ moveTestSuiteDialogDescription: 'Pick a destination folder for this test suite.',
4
+ moveTestSuiteDialogSuiteNameLabel: 'Test suite',
5
+ moveTestSuiteDialogCurrentLabel: 'Current folder',
6
+ moveTestSuiteDialogDestinationLabel: 'Destination folder',
7
+ moveTestSuiteDialogDestinationPlaceholder: 'Select a folder below',
8
+ moveTestSuiteDialogCancel: 'Cancel',
9
+ moveTestSuiteDialogConfirm: 'Move',
10
+ };
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1zdWl0ZS5tb2RlbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3Qtc3VpdGUvdGVzdC1zdWl0ZS5tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUJBLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFvQjtJQUN4RCx3QkFBd0IsRUFBRSxpQkFBaUI7SUFDM0MsOEJBQThCLEVBQUUsZ0RBQWdEO0lBQ2hGLGlDQUFpQyxFQUFFLFlBQVk7SUFDL0MsK0JBQStCLEVBQUUsZ0JBQWdCO0lBQ2pELG1DQUFtQyxFQUFFLG9CQUFvQjtJQUN6RCx5Q0FBeUMsRUFBRSx1QkFBdUI7SUFDbEUseUJBQXlCLEVBQUUsUUFBUTtJQUNuQywwQkFBMEIsRUFBRSxNQUFNO0NBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExhYmVscyBmb3IgdGhlIFRlc3QgU3VpdGUgc2VjdGlvbidzIGRpYWxvZ3MuIEtlcHQgc2VwYXJhdGUgZnJvbVxuICogYE1vZHVsYXJMYWJlbHNgIGJlY2F1c2UgdGhlc2UgYXJlIHRlc3Qtc3VpdGUtc3BlY2lmaWMgY29weSDigJQgdGhlIG1vZHVsYXJcbiAqIHRhYmxlIHRlbXBsYXRlIGRvZXNuJ3QgKGFuZCBzaG91bGRuJ3QpIG5lZWQgdGhlbS5cbiAqXG4gKiBDdXJyZW50bHkgY29uc3VtZWQgYnkgYE1vdmVUZXN0U3VpdGVEaWFsb2dDb21wb25lbnRgIGZvciBpdHMgb3duIGZpZWxkXG4gKiBsYWJlbHMgYW5kIGJ5IHRoZSBvdXRlciBkaWFsb2cgc2hlbGwgKHRpdGxlIC8gZGVzY3JpcHRpb24gLyBDYW5jZWwgLyBNb3ZlKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0U3VpdGVMYWJlbHMge1xuICBtb3ZlVGVzdFN1aXRlRGlhbG9nVGl0bGU6IHN0cmluZztcbiAgbW92ZVRlc3RTdWl0ZURpYWxvZ0Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIG1vdmVUZXN0U3VpdGVEaWFsb2dTdWl0ZU5hbWVMYWJlbDogc3RyaW5nO1xuICBtb3ZlVGVzdFN1aXRlRGlhbG9nQ3VycmVudExhYmVsOiBzdHJpbmc7XG4gIG1vdmVUZXN0U3VpdGVEaWFsb2dEZXN0aW5hdGlvbkxhYmVsOiBzdHJpbmc7XG4gIG1vdmVUZXN0U3VpdGVEaWFsb2dEZXN0aW5hdGlvblBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIG1vdmVUZXN0U3VpdGVEaWFsb2dDYW5jZWw6IHN0cmluZztcbiAgbW92ZVRlc3RTdWl0ZURpYWxvZ0NvbmZpcm06IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVEVTVF9TVUlURV9MQUJFTFM6IFRlc3RTdWl0ZUxhYmVscyA9IHtcbiAgbW92ZVRlc3RTdWl0ZURpYWxvZ1RpdGxlOiAnTW92ZSB0ZXN0IHN1aXRlJyxcbiAgbW92ZVRlc3RTdWl0ZURpYWxvZ0Rlc2NyaXB0aW9uOiAnUGljayBhIGRlc3RpbmF0aW9uIGZvbGRlciBmb3IgdGhpcyB0ZXN0IHN1aXRlLicsXG4gIG1vdmVUZXN0U3VpdGVEaWFsb2dTdWl0ZU5hbWVMYWJlbDogJ1Rlc3Qgc3VpdGUnLFxuICBtb3ZlVGVzdFN1aXRlRGlhbG9nQ3VycmVudExhYmVsOiAnQ3VycmVudCBmb2xkZXInLFxuICBtb3ZlVGVzdFN1aXRlRGlhbG9nRGVzdGluYXRpb25MYWJlbDogJ0Rlc3RpbmF0aW9uIGZvbGRlcicsXG4gIG1vdmVUZXN0U3VpdGVEaWFsb2dEZXN0aW5hdGlvblBsYWNlaG9sZGVyOiAnU2VsZWN0IGEgZm9sZGVyIGJlbG93JyxcbiAgbW92ZVRlc3RTdWl0ZURpYWxvZ0NhbmNlbDogJ0NhbmNlbCcsXG4gIG1vdmVUZXN0U3VpdGVEaWFsb2dDb25maXJtOiAnTW92ZScsXG59O1xuIl19