valtech-components 4.0.982 → 4.0.983

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.
Files changed (24) hide show
  1. package/esm2022/lib/components/atoms/button/button.component.mjs +3 -1
  2. package/esm2022/lib/components/organisms/field-schema-editor/field-schema-editor.component.mjs +332 -0
  3. package/esm2022/lib/components/organisms/field-schema-editor/field-schema-editor.i18n.mjs +71 -0
  4. package/esm2022/lib/components/organisms/field-schema-editor/types.mjs +2 -0
  5. package/esm2022/lib/components/organisms/survey-builder/survey-builder.component.mjs +265 -136
  6. package/esm2022/lib/components/organisms/survey-builder/survey-builder.i18n.mjs +19 -7
  7. package/esm2022/lib/components/organisms/survey-builder/types.mjs +31 -2
  8. package/esm2022/lib/components/organisms/survey-response/survey-response.component.mjs +294 -26
  9. package/esm2022/lib/components/types.mjs +1 -1
  10. package/esm2022/lib/version.mjs +2 -2
  11. package/esm2022/public-api.mjs +3 -1
  12. package/fesm2022/valtech-components.mjs +1052 -231
  13. package/fesm2022/valtech-components.mjs.map +1 -1
  14. package/lib/components/organisms/article/article.component.d.ts +1 -0
  15. package/lib/components/organisms/field-schema-editor/field-schema-editor.component.d.ts +90 -0
  16. package/lib/components/organisms/field-schema-editor/field-schema-editor.i18n.d.ts +2 -0
  17. package/lib/components/organisms/field-schema-editor/types.d.ts +60 -0
  18. package/lib/components/organisms/survey-builder/survey-builder.component.d.ts +26 -14
  19. package/lib/components/organisms/survey-builder/types.d.ts +23 -5
  20. package/lib/components/organisms/survey-response/survey-response.component.d.ts +42 -1
  21. package/lib/components/types.d.ts +6 -0
  22. package/lib/version.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/public-api.d.ts +2 -0
@@ -5,14 +5,18 @@ import { firstValueFrom } from 'rxjs';
5
5
  import { I18nService } from '../../../services/i18n';
6
6
  import { RequestService } from '../../../services/requests/request.service';
7
7
  import { RequestFormBuilderService } from '../../../services/requests/request-form-builder.service';
8
- import { FIELD_TYPE_EMOJI_RATING } from '../../../services/requests/types';
8
+ import { ComponentStates } from '../../types';
9
9
  import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
10
10
  import { TextInputComponent } from '../../molecules/text-input/text-input.component';
11
11
  import { ButtonComponent } from '../../atoms/button/button.component';
12
- import { TitleComponent } from '../../atoms/title/title.component';
12
+ import { FormFieldComponent } from '../../molecules/form-field/form-field.component';
13
+ import { FIELD_TYPES_WITH_OPTIONS, FieldSchemaEditorComponent, } from '../field-schema-editor/field-schema-editor.component';
14
+ import { FIELD_SCHEMA_EDITOR_I18N } from '../field-schema-editor/field-schema-editor.i18n';
15
+ import { SURVEY_QUESTION_TYPES } from './types';
13
16
  import { SURVEY_BUILDER_I18N } from './survey-builder.i18n';
14
17
  import * as i0 from "@angular/core";
15
18
  const NAMESPACE = 'SurveyBuilder';
19
+ const EDITOR_NAMESPACE = 'FieldSchemaEditor';
16
20
  const DEFAULT_TYPE_PREFIX = 'survey';
17
21
  let rowUid = 0;
18
22
  /**
@@ -23,11 +27,14 @@ let rowUid = 0;
23
27
  * true` (cada respuesta se agrega, no se revisa una por una) y el `EntityRef`
24
28
  * que le pasa el consumer (ej. el evento de bingo dueño de la encuesta).
25
29
  *
26
- * v1 solo ofrece los dos tipos de pregunta que `val-survey-response` sabe
27
- * renderizar: emoji-rating y texto libre. Reusa `RequestFormBuilderService`
28
- * (`toToken`/`uniqueFieldName`/`createFieldSchema`) para el nombre de campo
29
- * es la misma primitiva que ya arma el formulario dinámico de `request`, no
30
- * una reimplementación.
30
+ * Cada pregunta se edita con `val-field-schema-editor`, el mismo editor que usa
31
+ * el checkout de bingo de ahí que una pregunta tenga tipo, placeholder, nota
32
+ * y opciones, no solo texto. La v1 de este componente tenía su propio editor
33
+ * pobre (dos tipos, sin opciones); la Fase 5 del ADR-092 lo reemplazó por el
34
+ * organism compartido en vez de mejorarlo por duplicado.
35
+ *
36
+ * El catálogo que ofrece sale de `SURVEY_QUESTION_TYPES` — acotado a lo que
37
+ * `val-survey-response` sabe renderizar, no a lo que el editor sabe editar.
31
38
  */
32
39
  export class SurveyBuilderComponent {
33
40
  constructor() {
@@ -37,15 +44,21 @@ export class SurveyBuilderComponent {
37
44
  this.requests = inject(RequestService);
38
45
  this.formBuilder = inject(RequestFormBuilderService);
39
46
  this.errors = inject(ValtechErrorService);
40
- this.emojiType = FIELD_TYPE_EMOJI_RATING;
41
47
  this.titleControl = new FormControl('', { nonNullable: true });
42
48
  this.subtitleControl = new FormControl('', { nonNullable: true });
43
49
  this.questions = signal([]);
50
+ this.editingId = signal('');
51
+ this.validationError = signal('');
44
52
  this.saving = signal(false);
45
- this.rowControls = new Map();
46
53
  if (!this.i18n.hasNamespace(NAMESPACE)) {
47
54
  this.i18n.registerDefaults(NAMESPACE, SURVEY_BUILDER_I18N);
48
55
  }
56
+ // El nombre del tipo de cada pregunta se muestra en la fila colapsada, que
57
+ // dibuja este componente y no el editor — si nadie montó un editor todavía,
58
+ // el namespace no existiría y la fila mostraría la clave cruda.
59
+ if (!this.i18n.hasNamespace(EDITOR_NAMESPACE)) {
60
+ this.i18n.registerDefaults(EDITOR_NAMESPACE, FIELD_SCHEMA_EDITOR_I18N);
61
+ }
49
62
  }
50
63
  async ngOnInit() {
51
64
  if (!this.props.typeId)
@@ -64,53 +77,129 @@ export class SurveyBuilderComponent {
64
77
  });
65
78
  }
66
79
  }
67
- rowFromField(f) {
68
- const id = `row-${rowUid++}`;
69
- this.rowControls.set(id, new FormControl(f.label ?? '', { nonNullable: true }));
80
+ t(key) {
81
+ this.i18n.lang();
82
+ return this.i18n.t(key, NAMESPACE);
83
+ }
84
+ typeLabel(type) {
85
+ this.i18n.lang();
86
+ return this.i18n.t(`type${type}`, EDITOR_NAMESPACE);
87
+ }
88
+ questionTypes() {
89
+ return this.props.questionTypes?.length ? this.props.questionTypes : SURVEY_QUESTION_TYPES;
90
+ }
91
+ editorProps(row) {
92
+ return { mode: 'edit', field: row, allowedTypes: this.questionTypes() };
93
+ }
94
+ iconAction(token, icon, label, disabled = false, color = 'dark') {
70
95
  return {
71
- id,
72
- label: f.label ?? '',
73
- type: f.type === FIELD_TYPE_EMOJI_RATING ? 'EMOJI_RATING' : 'TEXTAREA',
74
- required: !!f.required,
96
+ token,
97
+ text: '',
98
+ ariaLabel: label,
99
+ color,
100
+ fill: 'clear',
101
+ shape: 'round',
102
+ size: 'small',
103
+ type: 'button',
104
+ state: disabled ? ComponentStates.DISABLED : ComponentStates.ENABLED,
105
+ icon: { name: icon, slot: 'icon-only' },
75
106
  };
76
107
  }
77
- rowLabelControl(row) {
78
- let control = this.rowControls.get(row.id);
79
- if (!control) {
80
- control = new FormControl(row.label, { nonNullable: true });
81
- this.rowControls.set(row.id, control);
82
- }
83
- return control;
84
- }
85
108
  addQuestion() {
86
- const id = `row-${rowUid++}`;
87
- this.rowControls.set(id, new FormControl('', { nonNullable: true }));
88
- this.questions.update(rows => [...rows, { id, label: '', type: 'TEXTAREA', required: true }]);
109
+ const row = {
110
+ id: `row-${rowUid++}`,
111
+ name: '',
112
+ label: '',
113
+ placeholderText: '',
114
+ hintText: '',
115
+ type: this.questionTypes()[0],
116
+ required: true,
117
+ };
118
+ this.questions.update(rows => [...rows, row]);
119
+ // Una pregunta recién agregada está vacía: abrirla es el único paso
120
+ // siguiente posible, y dejarla cerrada la haría ver como una fila rota.
121
+ this.editingId.set(row.id);
122
+ }
123
+ toggleEdit(row) {
124
+ this.editingId.update(current => (current === row.id ? '' : row.id));
89
125
  }
90
126
  removeQuestion(row) {
91
- this.rowControls.delete(row.id);
92
127
  this.questions.update(rows => rows.filter(r => r.id !== row.id));
128
+ if (this.editingId() === row.id)
129
+ this.editingId.set('');
93
130
  }
94
- setType(row, type) {
95
- this.questions.update(rows => rows.map(r => (r.id === row.id ? { ...r, type } : r)));
131
+ duplicate(row) {
132
+ const copy = {
133
+ ...row,
134
+ id: `row-${rowUid++}`,
135
+ // Sin token propio la copia pisaría las respuestas del original: dos
136
+ // campos con el mismo `name` son el mismo campo para el backend.
137
+ name: this.formBuilder.uniqueFieldName(row.name || row.label, this.questions()),
138
+ options: row.options ? row.options.map(o => ({ ...o })) : undefined,
139
+ };
140
+ this.questions.update(rows => {
141
+ const index = rows.findIndex(r => r.id === row.id);
142
+ return [...rows.slice(0, index + 1), copy, ...rows.slice(index + 1)];
143
+ });
144
+ }
145
+ move(index, delta) {
146
+ const target = index + delta;
147
+ this.questions.update(rows => {
148
+ if (target < 0 || target >= rows.length)
149
+ return rows;
150
+ const next = [...rows];
151
+ [next[index], next[target]] = [next[target], next[index]];
152
+ return next;
153
+ });
154
+ }
155
+ applyQuestion(field) {
156
+ this.questions.update(rows => rows.map(r => r.id === field.id
157
+ ? {
158
+ ...field,
159
+ name: this.formBuilder.uniqueFieldName(field.name || field.label, rows.filter(o => o.id !== r.id)),
160
+ }
161
+ : r));
162
+ this.editingId.set('');
163
+ this.validationError.set('');
96
164
  }
97
165
  async save() {
98
166
  if (this.saving())
99
167
  return;
168
+ this.validationError.set('');
100
169
  const title = this.titleControl.value.trim();
101
170
  if (!title) {
102
171
  this.titleControl.markAsTouched();
172
+ this.validationError.set(this.t('noTitle'));
103
173
  return;
104
174
  }
105
175
  const rows = this.questions();
106
- const labels = rows.map(r => (this.rowControls.get(r.id)?.value ?? '').trim());
107
- if (rows.length === 0 || labels.some(l => !l))
176
+ if (!rows.length) {
177
+ this.validationError.set(this.t('noQuestions'));
178
+ return;
179
+ }
180
+ if (rows.some(r => !r.label.trim())) {
181
+ this.validationError.set(this.t('emptyQuestionLabel'));
182
+ return;
183
+ }
184
+ // El editor ya lo valida al cerrar cada pregunta, pero una pregunta abierta
185
+ // (o cargada de una encuesta vieja) puede llegar acá sin opciones.
186
+ if (rows.some(r => FIELD_TYPES_WITH_OPTIONS.includes(r.type) && !r.options?.length)) {
187
+ this.validationError.set(this.t('missingOptions'));
108
188
  return;
189
+ }
109
190
  this.saving.set(true);
110
191
  const fieldSchema = [];
111
192
  rows.forEach((row, index) => {
112
- const name = this.formBuilder.uniqueFieldName(labels[index], fieldSchema);
113
- fieldSchema.push(this.formBuilder.createFieldSchema({ name, label: labels[index], type: row.type, required: row.required }, index));
193
+ const name = this.formBuilder.uniqueFieldName(row.name || row.label, fieldSchema);
194
+ fieldSchema.push(this.formBuilder.createFieldSchema({
195
+ name,
196
+ label: row.label.trim(),
197
+ type: row.type,
198
+ required: row.required,
199
+ placeholderText: row.placeholderText,
200
+ hintText: row.hintText,
201
+ options: row.options,
202
+ }, index));
114
203
  });
115
204
  const typeId = this.props.typeId ?? `${this.props.typePrefix ?? DEFAULT_TYPE_PREFIX}:${this.formBuilder.toToken(title)}`;
116
205
  const subtitle = this.subtitleControl.value.trim();
@@ -140,68 +229,84 @@ export class SurveyBuilderComponent {
140
229
  });
141
230
  }
142
231
  }
143
- t(key) {
144
- return this.i18n.t(key, NAMESPACE);
232
+ rowFromField(f) {
233
+ return {
234
+ id: `row-${rowUid++}`,
235
+ name: f.name,
236
+ label: f.label ?? '',
237
+ placeholderText: f.placeholderText ?? '',
238
+ hintText: f.hintText ?? '',
239
+ type: f.type,
240
+ required: !!f.required,
241
+ options: f.options,
242
+ };
145
243
  }
146
244
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
147
245
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SurveyBuilderComponent, isStandalone: true, selector: "val-survey-builder", inputs: { props: "props" }, outputs: { saved: "saved" }, ngImport: i0, template: `
148
246
  <div class="survey-builder">
149
- <div class="survey-builder__field">
150
- <val-title [props]="{ content: t('titleLabel'), size: 'small', color: 'dark', bold: false }" />
247
+ <val-form-field [label]="t('titleLabel')">
151
248
  <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
152
- </div>
153
- <div class="survey-builder__field">
154
- <val-title [props]="{ content: t('subtitleLabel'), size: 'small', color: 'dark', bold: false }" />
249
+ </val-form-field>
250
+ <val-form-field [label]="t('subtitleLabel')">
155
251
  <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
156
- </div>
252
+ </val-form-field>
157
253
 
158
254
  <div class="survey-builder__questions">
159
255
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
160
256
 
161
- @for (row of questions(); track row.id) {
257
+ @if (!questions().length) {
258
+ <p class="survey-builder__empty">{{ t('noQuestions') }}</p>
259
+ }
260
+
261
+ @for (row of questions(); track row.id; let i = $index; let first = $first; let last = $last) {
162
262
  <div class="survey-builder__row">
163
- <val-text-input [props]="{ control: rowLabelControl(row), placeholder: t('questionLabelPlaceholder') }" />
164
- <div class="survey-builder__row-actions">
165
- <val-button
166
- [props]="{
167
- token: 'q-type-emoji-' + row.id,
168
- text: t('typeEmoji'),
169
- color: row.type === emojiType ? 'primary' : 'medium',
170
- fill: row.type === emojiType ? 'solid' : 'outline',
171
- shape: 'round',
172
- size: 'small',
173
- type: 'button',
174
- state: 'ENABLED',
175
- }"
176
- (onClick)="setType(row, emojiType)"
177
- />
178
- <val-button
179
- [props]="{
180
- token: 'q-type-text-' + row.id,
181
- text: t('typeText'),
182
- color: row.type === 'TEXTAREA' ? 'primary' : 'medium',
183
- fill: row.type === 'TEXTAREA' ? 'solid' : 'outline',
184
- shape: 'round',
185
- size: 'small',
186
- type: 'button',
187
- state: 'ENABLED',
188
- }"
189
- (onClick)="setType(row, 'TEXTAREA')"
190
- />
191
- <val-button
192
- [props]="{
193
- token: 'q-remove-' + row.id,
194
- text: t('removeQuestion'),
195
- color: 'danger',
196
- fill: 'clear',
197
- shape: 'round',
198
- size: 'small',
199
- type: 'button',
200
- state: 'ENABLED',
201
- }"
202
- (onClick)="removeQuestion(row)"
203
- />
263
+ <div class="survey-builder__row-head">
264
+ <div class="survey-builder__row-text">
265
+ <strong>{{ row.label || t('untitledQuestion') }}</strong>
266
+ <span>{{ typeLabel(row.type) }}{{ row.required ? ' · ' + t('requiredTag') : '' }}</span>
267
+ </div>
268
+ <div class="survey-builder__row-actions">
269
+ <val-button
270
+ [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
271
+ (onClick)="move(i, -1)"
272
+ />
273
+ <val-button
274
+ [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
275
+ (onClick)="move(i, 1)"
276
+ />
277
+ <val-button
278
+ [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
279
+ (onClick)="duplicate(row)"
280
+ />
281
+ <val-button
282
+ [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
283
+ (onClick)="toggleEdit(row)"
284
+ />
285
+ <val-button
286
+ [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
287
+ (onClick)="removeQuestion(row)"
288
+ />
289
+ </div>
204
290
  </div>
291
+
292
+ @if (editingId() === row.id) {
293
+ <div class="survey-builder__row-editor">
294
+ <val-field-schema-editor #editor [props]="editorProps(row)" (save)="applyQuestion($event)" />
295
+ <val-button
296
+ [props]="{
297
+ token: 'q-done-' + row.id,
298
+ text: t('doneEditing'),
299
+ color: 'dark',
300
+ fill: 'solid',
301
+ shape: 'round',
302
+ size: 'default',
303
+ type: 'button',
304
+ state: 'ENABLED',
305
+ }"
306
+ (onClick)="editor.submit()"
307
+ />
308
+ </div>
309
+ }
205
310
  </div>
206
311
  }
207
312
 
@@ -221,6 +326,10 @@ export class SurveyBuilderComponent {
221
326
  />
222
327
  </div>
223
328
 
329
+ @if (validationError()) {
330
+ <p class="survey-builder__error">{{ validationError() }}</p>
331
+ }
332
+
224
333
  <val-button
225
334
  [props]="{
226
335
  token: 'survey-builder-save',
@@ -228,6 +337,7 @@ export class SurveyBuilderComponent {
228
337
  color: 'dark',
229
338
  fill: 'solid',
230
339
  shape: 'round',
340
+ size: 'large',
231
341
  expand: 'block',
232
342
  type: 'button',
233
343
  state: saving() ? 'WORKING' : 'ENABLED',
@@ -235,68 +345,82 @@ export class SurveyBuilderComponent {
235
345
  (onClick)="save()"
236
346
  />
237
347
  </div>
238
- `, isInline: true, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__field{display:flex;flex-direction:column;gap:6px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__row{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:12px;background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-actions{display:flex;gap:8px;flex-wrap:wrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
348
+ `, isInline: true, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__empty{margin:0;font-size:.875rem;color:var(--ion-color-medium, #92949c)}.survey-builder__row{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-head{display:flex;flex-direction:column;gap:8px}.survey-builder__row-text{display:flex;flex-direction:column;gap:2px;min-width:0}.survey-builder__row-text strong{color:var(--ion-text-color, #000);font-size:.9375rem}.survey-builder__row-text span{color:var(--ion-color-medium, #92949c);font-size:.8125rem}.survey-builder__row-actions{display:flex;gap:4px;flex-wrap:wrap}.survey-builder__row-editor{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.survey-builder__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}@media (min-width: 576px){.survey-builder__row-head{flex-direction:row;align-items:flex-start;justify-content:space-between}.survey-builder__row-text{flex:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: FormFieldComponent, selector: "val-form-field", inputs: ["label"] }, { kind: "component", type: FieldSchemaEditorComponent, selector: "val-field-schema-editor", inputs: ["props"], outputs: ["save"] }] }); }
239
349
  }
240
350
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, decorators: [{
241
351
  type: Component,
242
- args: [{ selector: 'val-survey-builder', standalone: true, imports: [CommonModule, ReactiveFormsModule, TextInputComponent, ButtonComponent, TitleComponent], template: `
352
+ args: [{ selector: 'val-survey-builder', standalone: true, imports: [
353
+ CommonModule,
354
+ ReactiveFormsModule,
355
+ TextInputComponent,
356
+ ButtonComponent,
357
+ FormFieldComponent,
358
+ FieldSchemaEditorComponent,
359
+ ], template: `
243
360
  <div class="survey-builder">
244
- <div class="survey-builder__field">
245
- <val-title [props]="{ content: t('titleLabel'), size: 'small', color: 'dark', bold: false }" />
361
+ <val-form-field [label]="t('titleLabel')">
246
362
  <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
247
- </div>
248
- <div class="survey-builder__field">
249
- <val-title [props]="{ content: t('subtitleLabel'), size: 'small', color: 'dark', bold: false }" />
363
+ </val-form-field>
364
+ <val-form-field [label]="t('subtitleLabel')">
250
365
  <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
251
- </div>
366
+ </val-form-field>
252
367
 
253
368
  <div class="survey-builder__questions">
254
369
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
255
370
 
256
- @for (row of questions(); track row.id) {
371
+ @if (!questions().length) {
372
+ <p class="survey-builder__empty">{{ t('noQuestions') }}</p>
373
+ }
374
+
375
+ @for (row of questions(); track row.id; let i = $index; let first = $first; let last = $last) {
257
376
  <div class="survey-builder__row">
258
- <val-text-input [props]="{ control: rowLabelControl(row), placeholder: t('questionLabelPlaceholder') }" />
259
- <div class="survey-builder__row-actions">
260
- <val-button
261
- [props]="{
262
- token: 'q-type-emoji-' + row.id,
263
- text: t('typeEmoji'),
264
- color: row.type === emojiType ? 'primary' : 'medium',
265
- fill: row.type === emojiType ? 'solid' : 'outline',
266
- shape: 'round',
267
- size: 'small',
268
- type: 'button',
269
- state: 'ENABLED',
270
- }"
271
- (onClick)="setType(row, emojiType)"
272
- />
273
- <val-button
274
- [props]="{
275
- token: 'q-type-text-' + row.id,
276
- text: t('typeText'),
277
- color: row.type === 'TEXTAREA' ? 'primary' : 'medium',
278
- fill: row.type === 'TEXTAREA' ? 'solid' : 'outline',
279
- shape: 'round',
280
- size: 'small',
281
- type: 'button',
282
- state: 'ENABLED',
283
- }"
284
- (onClick)="setType(row, 'TEXTAREA')"
285
- />
286
- <val-button
287
- [props]="{
288
- token: 'q-remove-' + row.id,
289
- text: t('removeQuestion'),
290
- color: 'danger',
291
- fill: 'clear',
292
- shape: 'round',
293
- size: 'small',
294
- type: 'button',
295
- state: 'ENABLED',
296
- }"
297
- (onClick)="removeQuestion(row)"
298
- />
377
+ <div class="survey-builder__row-head">
378
+ <div class="survey-builder__row-text">
379
+ <strong>{{ row.label || t('untitledQuestion') }}</strong>
380
+ <span>{{ typeLabel(row.type) }}{{ row.required ? ' · ' + t('requiredTag') : '' }}</span>
381
+ </div>
382
+ <div class="survey-builder__row-actions">
383
+ <val-button
384
+ [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
385
+ (onClick)="move(i, -1)"
386
+ />
387
+ <val-button
388
+ [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
389
+ (onClick)="move(i, 1)"
390
+ />
391
+ <val-button
392
+ [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
393
+ (onClick)="duplicate(row)"
394
+ />
395
+ <val-button
396
+ [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
397
+ (onClick)="toggleEdit(row)"
398
+ />
399
+ <val-button
400
+ [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
401
+ (onClick)="removeQuestion(row)"
402
+ />
403
+ </div>
299
404
  </div>
405
+
406
+ @if (editingId() === row.id) {
407
+ <div class="survey-builder__row-editor">
408
+ <val-field-schema-editor #editor [props]="editorProps(row)" (save)="applyQuestion($event)" />
409
+ <val-button
410
+ [props]="{
411
+ token: 'q-done-' + row.id,
412
+ text: t('doneEditing'),
413
+ color: 'dark',
414
+ fill: 'solid',
415
+ shape: 'round',
416
+ size: 'default',
417
+ type: 'button',
418
+ state: 'ENABLED',
419
+ }"
420
+ (onClick)="editor.submit()"
421
+ />
422
+ </div>
423
+ }
300
424
  </div>
301
425
  }
302
426
 
@@ -316,6 +440,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
316
440
  />
317
441
  </div>
318
442
 
443
+ @if (validationError()) {
444
+ <p class="survey-builder__error">{{ validationError() }}</p>
445
+ }
446
+
319
447
  <val-button
320
448
  [props]="{
321
449
  token: 'survey-builder-save',
@@ -323,6 +451,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
323
451
  color: 'dark',
324
452
  fill: 'solid',
325
453
  shape: 'round',
454
+ size: 'large',
326
455
  expand: 'block',
327
456
  type: 'button',
328
457
  state: saving() ? 'WORKING' : 'ENABLED',
@@ -330,10 +459,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
330
459
  (onClick)="save()"
331
460
  />
332
461
  </div>
333
- `, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__field{display:flex;flex-direction:column;gap:6px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__row{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:12px;background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-actions{display:flex;gap:8px;flex-wrap:wrap}\n"] }]
462
+ `, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__empty{margin:0;font-size:.875rem;color:var(--ion-color-medium, #92949c)}.survey-builder__row{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-head{display:flex;flex-direction:column;gap:8px}.survey-builder__row-text{display:flex;flex-direction:column;gap:2px;min-width:0}.survey-builder__row-text strong{color:var(--ion-text-color, #000);font-size:.9375rem}.survey-builder__row-text span{color:var(--ion-color-medium, #92949c);font-size:.8125rem}.survey-builder__row-actions{display:flex;gap:4px;flex-wrap:wrap}.survey-builder__row-editor{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.survey-builder__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}@media (min-width: 576px){.survey-builder__row-head{flex-direction:row;align-items:flex-start;justify-content:space-between}.survey-builder__row-text{flex:1}}\n"] }]
334
463
  }], ctorParameters: () => [], propDecorators: { props: [{
335
464
  type: Input
336
465
  }], saved: [{
337
466
  type: Output
338
467
  }] } });
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VydmV5LWJ1aWxkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9zdXJ2ZXktYnVpbGRlci9zdXJ2ZXktYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ3BHLE9BQU8sRUFBa0IsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUU1RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7QUFDbEMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUM7QUFFckMsSUFBSSxN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RSxrQkFBa0Isd0ZBQUUsZUFBZSwwR0FBRSxjQUFjOzs0RkF5SXJGLHNCQUFzQjtrQkE1SWxDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLFlBQ3ZGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkZUO3dEQThDUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ2EsS0FBSztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3JlcXVlc3QtZm9ybS1idWlsZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRTY2hlbWFEZWYsIEZJRUxEX1RZUEVfRU1PSklfUkFUSU5HIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVxdWVzdHMvdHlwZXMnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3RleHQtaW5wdXQvdGV4dC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3VydmV5QnVpbGRlck1ldGFkYXRhLCBTdXJ2ZXlCdWlsZGVyU2F2ZUV2ZW50LCBTdXJ2ZXlRdWVzdGlvblJvdyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU1VSVkVZX0JVSUxERVJfSTE4TiB9IGZyb20gJy4vc3VydmV5LWJ1aWxkZXIuaTE4bic7XG5cbmNvbnN0IE5BTUVTUEFDRSA9ICdTdXJ2ZXlCdWlsZGVyJztcbmNvbnN0IERFRkFVTFRfVFlQRV9QUkVGSVggPSAnc3VydmV5JztcblxubGV0IHJvd1VpZCA9IDA7XG5cbi8qKlxuICogdmFsLXN1cnZleS1idWlsZGVyXG4gKlxuICogQXV0b3LDrWEgZGUgdW5hIGVuY3Vlc3RhOiB0w610dWxvLCBzdWJ0w610dWxvLCBwcmVndW50YXMg4oCUIGFybWEgbyBhY3R1YWxpemEgdW5cbiAqIGBSZXF1ZXN0VHlwZUNvbmZpZ2AgY29uIGBUeXBlOiBcIjxwcmVmaXg+OjxzbHVnPlwiYCAoQURSLTA5MiksIGBza2lwUmV2aWV3OlxuICogdHJ1ZWAgKGNhZGEgcmVzcHVlc3RhIHNlIGFncmVnYSwgbm8gc2UgcmV2aXNhIHVuYSBwb3IgdW5hKSB5IGVsIGBFbnRpdHlSZWZgXG4gKiBxdWUgbGUgcGFzYSBlbCBjb25zdW1lciAoZWouIGVsIGV2ZW50byBkZSBiaW5nbyBkdWXDsW8gZGUgbGEgZW5jdWVzdGEpLlxuICpcbiAqIHYxIHNvbG8gb2ZyZWNlIGxvcyBkb3MgdGlwb3MgZGUgcHJlZ3VudGEgcXVlIGB2YWwtc3VydmV5LXJlc3BvbnNlYCBzYWJlXG4gKiByZW5kZXJpemFyOiBlbW9qaS1yYXRpbmcgeSB0ZXh0byBsaWJyZS4gUmV1c2EgYFJlcXVlc3RGb3JtQnVpbGRlclNlcnZpY2VgXG4gKiAoYHRvVG9rZW5gL2B1bmlxdWVGaWVsZE5hbWVgL2BjcmVhdGVGaWVsZFNjaGVtYWApIHBhcmEgZWwgbm9tYnJlIGRlIGNhbXBvIOKAlFxuICogZXMgbGEgbWlzbWEgcHJpbWl0aXZhIHF1ZSB5YSBhcm1hIGVsIGZvcm11bGFyaW8gZGluw6FtaWNvIGRlIGByZXF1ZXN0YCwgbm9cbiAqIHVuYSByZWltcGxlbWVudGFjacOzbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXN1cnZleS1idWlsZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVGV4dElucHV0Q29tcG9uZW50LCBCdXR0b25Db21wb25lbnQsIFRpdGxlQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fZmllbGRcIj5cbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCd0aXRsZUxhYmVsJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogdGl0bGVDb250cm9sLCBwbGFjZWhvbGRlcjogdCgndGl0bGVQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ZpZWxkXCI+XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnc3VidGl0bGVMYWJlbCcpLCBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHN1YnRpdGxlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3N1YnRpdGxlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9uc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMtbGFiZWxcIj57eyB0KCdxdWVzdGlvbnNMYWJlbCcpIH19PC9zcGFuPlxuXG4gICAgICAgIEBmb3IgKHJvdyBvZiBxdWVzdGlvbnMoKTsgdHJhY2sgcm93LmlkKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3dcIj5cbiAgICAgICAgICAgIDx2YWwtdGV4dC1pbnB1dCBbcHJvcHNdPVwieyBjb250cm9sOiByb3dMYWJlbENvbnRyb2wocm93KSwgcGxhY2Vob2xkZXI6IHQoJ3F1ZXN0aW9uTGFiZWxQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogJ3EtdHlwZS1lbW9qaS0nICsgcm93LmlkLFxuICAgICAgICAgICAgICAgICAgdGV4dDogdCgndHlwZUVtb2ppJyksXG4gICAgICAgICAgICAgICAgICBjb2xvcjogcm93LnR5cGUgPT09IGVtb2ppVHlwZSA/ICdwcmltYXJ5JyA6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICAgICAgZmlsbDogcm93LnR5cGUgPT09IGVtb2ppVHlwZSA/ICdzb2xpZCcgOiAnb3V0bGluZScsXG4gICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2V0VHlwZShyb3csIGVtb2ppVHlwZSlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogJ3EtdHlwZS10ZXh0LScgKyByb3cuaWQsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0KCd0eXBlVGV4dCcpLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IHJvdy50eXBlID09PSAnVEVYVEFSRUEnID8gJ3ByaW1hcnknIDogJ21lZGl1bScsXG4gICAgICAgICAgICAgICAgICBmaWxsOiByb3cudHlwZSA9PT0gJ1RFWFRBUkVBJyA/ICdzb2xpZCcgOiAnb3V0bGluZScsXG4gICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2V0VHlwZShyb3csICdURVhUQVJFQScpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgdG9rZW46ICdxLXJlbW92ZS0nICsgcm93LmlkLFxuICAgICAgICAgICAgICAgICAgdGV4dDogdCgncmVtb3ZlUXVlc3Rpb24nKSxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFuZ2VyJyxcbiAgICAgICAgICAgICAgICAgIGZpbGw6ICdjbGVhcicsXG4gICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwicmVtb3ZlUXVlc3Rpb24ocm93KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHRva2VuOiAnc3VydmV5LWJ1aWxkZXItYWRkLXF1ZXN0aW9uJyxcbiAgICAgICAgICAgIHRleHQ6IHQoJ2FkZFF1ZXN0aW9uJyksXG4gICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgZmlsbDogJ291dGxpbmUnLFxuICAgICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICBpY29uOiB7IG5hbWU6ICdhZGQtb3V0bGluZScsIHNsb3Q6ICdzdGFydCcgfSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgICAob25DbGljayk9XCJhZGRRdWVzdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8dmFsLWJ1dHRvblxuICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgIHRva2VuOiAnc3VydmV5LWJ1aWxkZXItc2F2ZScsXG4gICAgICAgICAgdGV4dDogdCgnc2F2ZScpLFxuICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgc3RhdGU6IHNhdmluZygpID8gJ1dPUktJTkcnIDogJ0VOQUJMRUQnLFxuICAgICAgICB9XCJcbiAgICAgICAgKG9uQ2xpY2spPVwic2F2ZSgpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2ZpZWxkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zLWxhYmVsIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy1hY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlCdWlsZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcHJvcHM6IFN1cnZleUJ1aWxkZXJNZXRhZGF0YSA9IHt9O1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2F2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN1cnZleUJ1aWxkZXJTYXZlRXZlbnQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0cyA9IGluamVjdChSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXIgPSBpbmplY3QoUmVxdWVzdEZvcm1CdWlsZGVyU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JzID0gaW5qZWN0KFZhbHRlY2hFcnJvclNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IGVtb2ppVHlwZSA9IEZJRUxEX1RZUEVfRU1PSklfUkFUSU5HO1xuICByZWFkb25seSB0aXRsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgcXVlc3Rpb25zID0gc2lnbmFsPFN1cnZleVF1ZXN0aW9uUm93W10+KFtdKTtcbiAgcmVhZG9ubHkgc2F2aW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJvd0NvbnRyb2xzID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1Db250cm9sPHN0cmluZz4+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKE5BTUVTUEFDRSkpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckRlZmF1bHRzKE5BTUVTUEFDRSwgU1VSVkVZX0JVSUxERVJfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnByb3BzLnR5cGVJZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjZmcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcXVlc3RzLmdldFJlcXVlc3RUeXBlKHRoaXMucHJvcHMudHlwZUlkKSk7XG4gICAgICB0aGlzLnRpdGxlQ29udHJvbC5zZXRWYWx1ZShjZmcubGFiZWwpO1xuICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRyb2wuc2V0VmFsdWUoY2ZnLnN1YnRpdGxlID8/ICcnKTtcbiAgICAgIHRoaXMucXVlc3Rpb25zLnNldChbLi4uY2ZnLmZpZWxkU2NoZW1hXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikubWFwKGYgPT4gdGhpcy5yb3dGcm9tRmllbGQoZikpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgY29udGV4dDogJ3N1cnZleUJ1aWxkZXIubG9hZCcsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAnbG9hZEVycm9yJyxcbiAgICAgICAgaTE4bk5hbWVzcGFjZTogTkFNRVNQQUNFLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByb3dGcm9tRmllbGQoZjogRmllbGRTY2hlbWFEZWYpOiBTdXJ2ZXlRdWVzdGlvblJvdyB7XG4gICAgY29uc3QgaWQgPSBgcm93LSR7cm93VWlkKyt9YDtcbiAgICB0aGlzLnJvd0NvbnRyb2xzLnNldChpZCwgbmV3IEZvcm1Db250cm9sKGYubGFiZWwgPz8gJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSkpO1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIGxhYmVsOiBmLmxhYmVsID8/ICcnLFxuICAgICAgdHlwZTogZi50eXBlID09PSBGSUVMRF9UWVBFX0VNT0pJX1JBVElORyA/ICdFTU9KSV9SQVRJTkcnIDogJ1RFWFRBUkVBJyxcbiAgICAgIHJlcXVpcmVkOiAhIWYucmVxdWlyZWQsXG4gICAgfTtcbiAgfVxuXG4gIHJvd0xhYmVsQ29udHJvbChyb3c6IFN1cnZleVF1ZXN0aW9uUm93KTogRm9ybUNvbnRyb2w8c3RyaW5nPiB7XG4gICAgbGV0IGNvbnRyb2wgPSB0aGlzLnJvd0NvbnRyb2xzLmdldChyb3cuaWQpO1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChyb3cubGFiZWwsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gICAgICB0aGlzLnJvd0NvbnRyb2xzLnNldChyb3cuaWQsIGNvbnRyb2wpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxuXG4gIGFkZFF1ZXN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gYHJvdy0ke3Jvd1VpZCsrfWA7XG4gICAgdGhpcy5yb3dDb250cm9scy5zZXQoaWQsIG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSk7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4gWy4uLnJvd3MsIHsgaWQsIGxhYmVsOiAnJywgdHlwZTogJ1RFWFRBUkVBJywgcmVxdWlyZWQ6IHRydWUgfV0pO1xuICB9XG5cbiAgcmVtb3ZlUXVlc3Rpb24ocm93OiBTdXJ2ZXlRdWVzdGlvblJvdyk6IHZvaWQge1xuICAgIHRoaXMucm93Q29udHJvbHMuZGVsZXRlKHJvdy5pZCk7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4gcm93cy5maWx0ZXIociA9PiByLmlkICE9PSByb3cuaWQpKTtcbiAgfVxuXG4gIHNldFR5cGUocm93OiBTdXJ2ZXlRdWVzdGlvblJvdywgdHlwZTogU3VydmV5UXVlc3Rpb25Sb3dbJ3R5cGUnXSk6IHZvaWQge1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IHJvd3MubWFwKHIgPT4gKHIuaWQgPT09IHJvdy5pZCA/IHsgLi4uciwgdHlwZSB9IDogcikpKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2F2aW5nKCkpIHJldHVybjtcblxuICAgIGNvbnN0IHRpdGxlID0gdGhpcy50aXRsZUNvbnRyb2wudmFsdWUudHJpbSgpO1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHRoaXMudGl0bGVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5xdWVzdGlvbnMoKTtcbiAgICBjb25zdCBsYWJlbHMgPSByb3dzLm1hcChyID0+ICh0aGlzLnJvd0NvbnRyb2xzLmdldChyLmlkKT8udmFsdWUgPz8gJycpLnRyaW0oKSk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwIHx8IGxhYmVscy5zb21lKGwgPT4gIWwpKSByZXR1cm47XG5cbiAgICB0aGlzLnNhdmluZy5zZXQodHJ1ZSk7XG5cbiAgICBjb25zdCBmaWVsZFNjaGVtYTogRmllbGRTY2hlbWFEZWZbXSA9IFtdO1xuICAgIHJvd3MuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZm9ybUJ1aWxkZXIudW5pcXVlRmllbGROYW1lKGxhYmVsc1tpbmRleF0sIGZpZWxkU2NoZW1hKTtcbiAgICAgIGZpZWxkU2NoZW1hLnB1c2goXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY3JlYXRlRmllbGRTY2hlbWEoXG4gICAgICAgICAgeyBuYW1lLCBsYWJlbDogbGFiZWxzW2luZGV4XSwgdHlwZTogcm93LnR5cGUsIHJlcXVpcmVkOiByb3cucmVxdWlyZWQgfSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZUlkID1cbiAgICAgIHRoaXMucHJvcHMudHlwZUlkID8/IGAke3RoaXMucHJvcHMudHlwZVByZWZpeCA/PyBERUZBVUxUX1RZUEVfUFJFRklYfToke3RoaXMuZm9ybUJ1aWxkZXIudG9Ub2tlbih0aXRsZSl9YDtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuc3VidGl0bGVDb250cm9sLnZhbHVlLnRyaW0oKTtcblxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBsYWJlbDogdGl0bGUsXG4gICAgICBzdWJ0aXRsZSxcbiAgICAgIGVudGl0eVJlZjogdGhpcy5wcm9wcy5lbnRpdHlSZWYsXG4gICAgICBza2lwUmV2aWV3OiB0cnVlLFxuICAgICAgZmllbGRTY2hlbWEsXG4gICAgICBhbGxvd0Fub255bW91czogdGhpcy5wcm9wcy5hbGxvd0Fub255bW91cyA/PyB0cnVlLFxuICAgICAgdmlzaWJpbGl0eTogdGhpcy5wcm9wcy52aXNpYmlsaXR5ID8/ICgnUFVCTElDJyBhcyBjb25zdCksXG4gICAgfTtcblxuICAgIGNvbnN0IGNhbGwkID0gdGhpcy5wcm9wcy50eXBlSWRcbiAgICAgID8gdGhpcy5yZXF1ZXN0cy51cGRhdGVSZXF1ZXN0VHlwZSh0aGlzLnByb3BzLnR5cGVJZCwgcGF5bG9hZClcbiAgICAgIDogdGhpcy5yZXF1ZXN0cy5jcmVhdGVSZXF1ZXN0VHlwZSh7IC4uLnBheWxvYWQsIHR5cGVJZCB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eXBlQ29uZmlnID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oY2FsbCQpO1xuICAgICAgdGhpcy5zYXZpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2F2ZWQuZW1pdCh7IHR5cGVDb25maWcgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNhdmluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnc3VydmV5QnVpbGRlci5zYXZlJyxcbiAgICAgICAgZmFsbGJhY2tLZXk6ICdzYXZlRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiBOQU1FU1BBQ0UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCBOQU1FU1BBQ0UpO1xuICB9XG59XG4iXX0=
468
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VydmV5LWJ1aWxkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9zdXJ2ZXktYnVpbGRlci9zdXJ2ZXktYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRXBHLE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLDBCQUEwQixHQUMzQixNQUFNLHNEQUFzRCxDQUFDO0FBQzlELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRTNGLE9BQU8sRUFBaUQscUJB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Q0FBQyxJQUFJO1lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNwQixlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWUsSUFBSSxFQUFFO1lBQ3hDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFDMUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUN0QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87U0FDbkIsQ0FBQztJQUNKLENBQUM7K0dBbFBVLHNCQUFzQjttR0FBdEIsc0JBQXNCLHVJQWpNdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1R1QsNitDQTlHQyxZQUFZLDhCQUNaLG1CQUFtQiwrQkFDbkIsa0JBQWtCLHdGQUNsQixlQUFlLDBHQUNmLGtCQUFrQiw4RUFDbEIsMEJBQTBCOzs0RkFtTWpCLHNCQUFzQjtrQkE1TWxDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsMEJBQTBCO3FCQUMzQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUdUO3dEQTJGUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ2EsS0FBSztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3JlcXVlc3QtZm9ybS1idWlsZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRTY2hlbWFEZWYgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy90eXBlcyc7XG5pbXBvcnQgeyBCdXR0b25NZXRhZGF0YSwgQ29tcG9uZW50U3RhdGVzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBDb2xvciB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IFZhbHRlY2hFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lcnJvcnMvdmFsdGVjaC1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IFRleHRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy90ZXh0LWlucHV0L3RleHQtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9mb3JtLWZpZWxkL2Zvcm0tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIEZJRUxEX1RZUEVTX1dJVEhfT1BUSU9OUyxcbiAgRmllbGRTY2hlbWFFZGl0b3JDb21wb25lbnQsXG59IGZyb20gJy4uL2ZpZWxkLXNjaGVtYS1lZGl0b3IvZmllbGQtc2NoZW1hLWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRklFTERfU0NIRU1BX0VESVRPUl9JMThOIH0gZnJvbSAnLi4vZmllbGQtc2NoZW1hLWVkaXRvci9maWVsZC1zY2hlbWEtZWRpdG9yLmkxOG4nO1xuaW1wb3J0IHsgRWRpdGFibGVGaWVsZERlZiwgRmllbGRTY2hlbWFFZGl0b3JNZXRhZGF0YSB9IGZyb20gJy4uL2ZpZWxkLXNjaGVtYS1lZGl0b3IvdHlwZXMnO1xuaW1wb3J0IHsgU3VydmV5QnVpbGRlck1ldGFkYXRhLCBTdXJ2ZXlCdWlsZGVyU2F2ZUV2ZW50LCBTVVJWRVlfUVVFU1RJT05fVFlQRVMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFNVUlZFWV9CVUlMREVSX0kxOE4gfSBmcm9tICcuL3N1cnZleS1idWlsZGVyLmkxOG4nO1xuXG5jb25zdCBOQU1FU1BBQ0UgPSAnU3VydmV5QnVpbGRlcic7XG5jb25zdCBFRElUT1JfTkFNRVNQQUNFID0gJ0ZpZWxkU2NoZW1hRWRpdG9yJztcbmNvbnN0IERFRkFVTFRfVFlQRV9QUkVGSVggPSAnc3VydmV5JztcblxubGV0IHJvd1VpZCA9IDA7XG5cbi8qKlxuICogdmFsLXN1cnZleS1idWlsZGVyXG4gKlxuICogQXV0b3LDrWEgZGUgdW5hIGVuY3Vlc3RhOiB0w610dWxvLCBzdWJ0w610dWxvLCBwcmVndW50YXMg4oCUIGFybWEgbyBhY3R1YWxpemEgdW5cbiAqIGBSZXF1ZXN0VHlwZUNvbmZpZ2AgY29uIGBUeXBlOiBcIjxwcmVmaXg+OjxzbHVnPlwiYCAoQURSLTA5MiksIGBza2lwUmV2aWV3OlxuICogdHJ1ZWAgKGNhZGEgcmVzcHVlc3RhIHNlIGFncmVnYSwgbm8gc2UgcmV2aXNhIHVuYSBwb3IgdW5hKSB5IGVsIGBFbnRpdHlSZWZgXG4gKiBxdWUgbGUgcGFzYSBlbCBjb25zdW1lciAoZWouIGVsIGV2ZW50byBkZSBiaW5nbyBkdWXDsW8gZGUgbGEgZW5jdWVzdGEpLlxuICpcbiAqIENhZGEgcHJlZ3VudGEgc2UgZWRpdGEgY29uIGB2YWwtZmllbGQtc2NoZW1hLWVkaXRvcmAsIGVsIG1pc21vIGVkaXRvciBxdWUgdXNhXG4gKiBlbCBjaGVja291dCBkZSBiaW5nbyDigJQgZGUgYWjDrSBxdWUgdW5hIHByZWd1bnRhIHRlbmdhIHRpcG8sIHBsYWNlaG9sZGVyLCBub3RhXG4gKiB5IG9wY2lvbmVzLCBubyBzb2xvIHRleHRvLiBMYSB2MSBkZSBlc3RlIGNvbXBvbmVudGUgdGVuw61hIHN1IHByb3BpbyBlZGl0b3JcbiAqIHBvYnJlIChkb3MgdGlwb3MsIHNpbiBvcGNpb25lcyk7IGxhIEZhc2UgNSBkZWwgQURSLTA5MiBsbyByZWVtcGxhesOzIHBvciBlbFxuICogb3JnYW5pc20gY29tcGFydGlkbyBlbiB2ZXogZGUgbWVqb3JhcmxvIHBvciBkdXBsaWNhZG8uXG4gKlxuICogRWwgY2F0w6Fsb2dvIHF1ZSBvZnJlY2Ugc2FsZSBkZSBgU1VSVkVZX1FVRVNUSU9OX1RZUEVTYCDigJQgYWNvdGFkbyBhIGxvIHF1ZVxuICogYHZhbC1zdXJ2ZXktcmVzcG9uc2VgIHNhYmUgcmVuZGVyaXphciwgbm8gYSBsbyBxdWUgZWwgZWRpdG9yIHNhYmUgZWRpdGFyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtc3VydmV5LWJ1aWxkZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVGV4dElucHV0Q29tcG9uZW50LFxuICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICBGb3JtRmllbGRDb21wb25lbnQsXG4gICAgRmllbGRTY2hlbWFFZGl0b3JDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyXCI+XG4gICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ3RpdGxlTGFiZWwnKVwiPlxuICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogdGl0bGVDb250cm9sLCBwbGFjZWhvbGRlcjogdCgndGl0bGVQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgPC92YWwtZm9ybS1maWVsZD5cbiAgICAgIDx2YWwtZm9ybS1maWVsZCBbbGFiZWxdPVwidCgnc3VidGl0bGVMYWJlbCcpXCI+XG4gICAgICAgIDx2YWwtdGV4dC1pbnB1dCBbcHJvcHNdPVwieyBjb250cm9sOiBzdWJ0aXRsZUNvbnRyb2wsIHBsYWNlaG9sZGVyOiB0KCdzdWJ0aXRsZVBsYWNlaG9sZGVyJykgfVwiIC8+XG4gICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9uc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMtbGFiZWxcIj57eyB0KCdxdWVzdGlvbnNMYWJlbCcpIH19PC9zcGFuPlxuXG4gICAgICAgIEBpZiAoIXF1ZXN0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICAgIDxwIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2VtcHR5XCI+e3sgdCgnbm9RdWVzdGlvbnMnKSB9fTwvcD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBmb3IgKHJvdyBvZiBxdWVzdGlvbnMoKTsgdHJhY2sgcm93LmlkOyBsZXQgaSA9ICRpbmRleDsgbGV0IGZpcnN0ID0gJGZpcnN0OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcm93LWhlYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3ctdGV4dFwiPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgcm93LmxhYmVsIHx8IHQoJ3VudGl0bGVkUXVlc3Rpb24nKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHR5cGVMYWJlbChyb3cudHlwZSkgfX17eyByb3cucmVxdWlyZWQgPyAnIMK3ICcgKyB0KCdyZXF1aXJlZFRhZycpIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3Jvdy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJpY29uQWN0aW9uKCdxLXVwLScgKyByb3cuaWQsICdhcnJvdy11cC1vdXRsaW5lJywgdCgnbW92ZVVwJyksIGZpcnN0KVwiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJtb3ZlKGksIC0xKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImljb25BY3Rpb24oJ3EtZG93bi0nICsgcm93LmlkLCAnYXJyb3ctZG93bi1vdXRsaW5lJywgdCgnbW92ZURvd24nKSwgbGFzdClcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwibW92ZShpLCAxKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImljb25BY3Rpb24oJ3EtY29weS0nICsgcm93LmlkLCAnY29weS1vdXRsaW5lJywgdCgnZHVwbGljYXRlUXVlc3Rpb24nKSlcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiZHVwbGljYXRlKHJvdylcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJpY29uQWN0aW9uKCdxLWVkaXQtJyArIHJvdy5pZCwgJ2NyZWF0ZS1vdXRsaW5lJywgdCgnZWRpdFF1ZXN0aW9uJykpXCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInRvZ2dsZUVkaXQocm93KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImljb25BY3Rpb24oJ3EtcmVtb3ZlLScgKyByb3cuaWQsICd0cmFzaC1vdXRsaW5lJywgdCgncmVtb3ZlUXVlc3Rpb24nKSwgZmFsc2UsICdkYW5nZXInKVwiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJyZW1vdmVRdWVzdGlvbihyb3cpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGVkaXRpbmdJZCgpID09PSByb3cuaWQpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3ctZWRpdG9yXCI+XG4gICAgICAgICAgICAgICAgPHZhbC1maWVsZC1zY2hlbWEtZWRpdG9yICNlZGl0b3IgW3Byb3BzXT1cImVkaXRvclByb3BzKHJvdylcIiAoc2F2ZSk9XCJhcHBseVF1ZXN0aW9uKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICB0b2tlbjogJ3EtZG9uZS0nICsgcm93LmlkLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0KCdkb25lRWRpdGluZycpLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiZWRpdG9yLnN1Ym1pdCgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHRva2VuOiAnc3VydmV5LWJ1aWxkZXItYWRkLXF1ZXN0aW9uJyxcbiAgICAgICAgICAgIHRleHQ6IHQoJ2FkZFF1ZXN0aW9uJyksXG4gICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgZmlsbDogJ291dGxpbmUnLFxuICAgICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICBpY29uOiB7IG5hbWU6ICdhZGQtb3V0bGluZScsIHNsb3Q6ICdzdGFydCcgfSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgICAob25DbGljayk9XCJhZGRRdWVzdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHZhbGlkYXRpb25FcnJvcigpKSB7XG4gICAgICAgIDxwIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2Vycm9yXCI+e3sgdmFsaWRhdGlvbkVycm9yKCkgfX08L3A+XG4gICAgICB9XG5cbiAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgdG9rZW46ICdzdXJ2ZXktYnVpbGRlci1zYXZlJyxcbiAgICAgICAgICB0ZXh0OiB0KCdzYXZlJyksXG4gICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgIHN0YXRlOiBzYXZpbmcoKSA/ICdXT1JLSU5HJyA6ICdFTkFCTEVEJyxcbiAgICAgICAgfVwiXG4gICAgICAgIChvbkNsaWNrKT1cInNhdmUoKVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxNnB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9ucy1sYWJlbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2VtcHR5IHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3JvdyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgICAgcGFkZGluZzogMTJweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjEpKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdmFsLXJhZGl1cy1tZCwgMTJweCk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICB9XG4gICAgICAvKiBNb2JpbGUtZmlyc3Q6IGVsIHRleHRvIGRlIGxhIHByZWd1bnRhIHkgc3VzIGFjY2lvbmVzIGFwaWxhZG9zLiBFbiBmaWxhXG4gICAgICAgICBmaWphLCBjaW5jbyBib3RvbmVzIGxlIGNvbWVuIGVsIGFuY2hvIGFsIHRleHRvIHkgbG8gcGFydGVuIGVuIG11Y2hhc1xuICAgICAgICAgbMOtbmVhcyBhbmdvc3RhcyDigJQganVzdG8gZW4gZWwgdmlld3BvcnQgZG9uZGUgbcOhcyBzZSB1c2EuICovXG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy1oZWFkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcm93LXRleHQgc3Ryb25nIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yLCAjMDAwKTtcbiAgICAgICAgZm9udC1zaXplOiAwLjkzNzVyZW07XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0IHNwYW4ge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctYWN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy1lZGl0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmctdG9wOiAxMnB4O1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjEpKTtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fZXJyb3Ige1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyKTtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIH1cbiAgICAgIEBtZWRpYSAobWluLXdpZHRoOiA1NzZweCkge1xuICAgICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy1oZWFkIHtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgfVxuICAgICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0IHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3VydmV5QnVpbGRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHByb3BzOiBTdXJ2ZXlCdWlsZGVyTWV0YWRhdGEgPSB7fTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNhdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxTdXJ2ZXlCdWlsZGVyU2F2ZUV2ZW50PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdHMgPSBpbmplY3QoUmVxdWVzdFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1CdWlsZGVyID0gaW5qZWN0KFJlcXVlc3RGb3JtQnVpbGRlclNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcblxuICByZWFkb25seSB0aXRsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgcXVlc3Rpb25zID0gc2lnbmFsPEVkaXRhYmxlRmllbGREZWZbXT4oW10pO1xuICByZWFkb25seSBlZGl0aW5nSWQgPSBzaWduYWwoJycpO1xuICByZWFkb25seSB2YWxpZGF0aW9uRXJyb3IgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBzYXZpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShOQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cyhOQU1FU1BBQ0UsIFNVUlZFWV9CVUlMREVSX0kxOE4pO1xuICAgIH1cbiAgICAvLyBFbCBub21icmUgZGVsIHRpcG8gZGUgY2FkYSBwcmVndW50YSBzZSBtdWVzdHJhIGVuIGxhIGZpbGEgY29sYXBzYWRhLCBxdWVcbiAgICAvLyBkaWJ1amEgZXN0ZSBjb21wb25lbnRlIHkgbm8gZWwgZWRpdG9yIOKAlCBzaSBuYWRpZSBtb250w7MgdW4gZWRpdG9yIHRvZGF2w61hLFxuICAgIC8vIGVsIG5hbWVzcGFjZSBubyBleGlzdGlyw61hIHkgbGEgZmlsYSBtb3N0cmFyw61hIGxhIGNsYXZlIGNydWRhLlxuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShFRElUT1JfTkFNRVNQQUNFKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoRURJVE9SX05BTUVTUEFDRSwgRklFTERfU0NIRU1BX0VESVRPUl9JMThOKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucHJvcHMudHlwZUlkKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNmZyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMucmVxdWVzdHMuZ2V0UmVxdWVzdFR5cGUodGhpcy5wcm9wcy50eXBlSWQpKTtcbiAgICAgIHRoaXMudGl0bGVDb250cm9sLnNldFZhbHVlKGNmZy5sYWJlbCk7XG4gICAgICB0aGlzLnN1YnRpdGxlQ29udHJvbC5zZXRWYWx1ZShjZmcuc3VidGl0bGUgPz8gJycpO1xuICAgICAgdGhpcy5xdWVzdGlvbnMuc2V0KFsuLi5jZmcuZmllbGRTY2hlbWFdLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKS5tYXAoZiA9PiB0aGlzLnJvd0Zyb21GaWVsZChmKSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnc3VydmV5QnVpbGRlci5sb2FkJyxcbiAgICAgICAgZmFsbGJhY2tLZXk6ICdsb2FkRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiBOQU1FU1BBQ0UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIE5BTUVTUEFDRSk7XG4gIH1cblxuICB0eXBlTGFiZWwodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB0aGlzLmkxOG4udChgdHlwZSR7dHlwZX1gLCBFRElUT1JfTkFNRVNQQUNFKTtcbiAgfVxuXG4gIHF1ZXN0aW9uVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnF1ZXN0aW9uVHlwZXM/Lmxlbmd0aCA/IHRoaXMucHJvcHMucXVlc3Rpb25UeXBlcyA6IFNVUlZFWV9RVUVTVElPTl9UWVBFUztcbiAgfVxuXG4gIGVkaXRvclByb3BzKHJvdzogRWRpdGFibGVGaWVsZERlZik6IEZpZWxkU2NoZW1hRWRpdG9yTWV0YWRhdGEge1xuICAgIHJldHVybiB7IG1vZGU6ICdlZGl0JywgZmllbGQ6IHJvdywgYWxsb3dlZFR5cGVzOiB0aGlzLnF1ZXN0aW9uVHlwZXMoKSB9O1xuICB9XG5cbiAgaWNvbkFjdGlvbihcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIGljb246IHN0cmluZyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgY29sb3I6IENvbG9yID0gJ2RhcmsnXG4gICk6IEJ1dHRvbk1ldGFkYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICB0ZXh0OiAnJyxcbiAgICAgIGFyaWFMYWJlbDogbGFiZWwsXG4gICAgICBjb2xvcixcbiAgICAgIGZpbGw6ICdjbGVhcicsXG4gICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIHN0YXRlOiBkaXNhYmxlZCA/IENvbXBvbmVudFN0YXRlcy5ESVNBQkxFRCA6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgaWNvbjogeyBuYW1lOiBpY29uLCBzbG90OiAnaWNvbi1vbmx5JyB9LFxuICAgIH07XG4gIH1cblxuICBhZGRRdWVzdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCByb3c6IEVkaXRhYmxlRmllbGREZWYgPSB7XG4gICAgICBpZDogYHJvdy0ke3Jvd1VpZCsrfWAsXG4gICAgICBuYW1lOiAnJyxcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIHBsYWNlaG9sZGVyVGV4dDogJycsXG4gICAgICBoaW50VGV4dDogJycsXG4gICAgICB0eXBlOiB0aGlzLnF1ZXN0aW9uVHlwZXMoKVswXSxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH07XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4gWy4uLnJvd3MsIHJvd10pO1xuICAgIC8vIFVuYSBwcmVndW50YSByZWNpw6luIGFncmVnYWRhIGVzdMOhIHZhY8OtYTogYWJyaXJsYSBlcyBlbCDDum5pY28gcGFzb1xuICAgIC8vIHNpZ3VpZW50ZSBwb3NpYmxlLCB5IGRlamFybGEgY2VycmFkYSBsYSBoYXLDrWEgdmVyIGNvbW8gdW5hIGZpbGEgcm90YS5cbiAgICB0aGlzLmVkaXRpbmdJZC5zZXQocm93LmlkKTtcbiAgfVxuXG4gIHRvZ2dsZUVkaXQocm93OiBFZGl0YWJsZUZpZWxkRGVmKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0aW5nSWQudXBkYXRlKGN1cnJlbnQgPT4gKGN1cnJlbnQgPT09IHJvdy5pZCA/ICcnIDogcm93LmlkKSk7XG4gIH1cblxuICByZW1vdmVRdWVzdGlvbihyb3c6IEVkaXRhYmxlRmllbGREZWYpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXN0aW9ucy51cGRhdGUocm93cyA9PiByb3dzLmZpbHRlcihyID0+IHIuaWQgIT09IHJvdy5pZCkpO1xuICAgIGlmICh0aGlzLmVkaXRpbmdJZCgpID09PSByb3cuaWQpIHRoaXMuZWRpdGluZ0lkLnNldCgnJyk7XG4gIH1cblxuICBkdXBsaWNhdGUocm93OiBFZGl0YWJsZUZpZWxkRGVmKTogdm9pZCB7XG4gICAgY29uc3QgY29weTogRWRpdGFibGVGaWVsZERlZiA9IHtcbiAgICAgIC4uLnJvdyxcbiAgICAgIGlkOiBgcm93LSR7cm93VWlkKyt9YCxcbiAgICAgIC8vIFNpbiB0b2tlbiBwcm9waW8gbGEgY29waWEgcGlzYXLDrWEgbGFzIHJlc3B1ZXN0YXMgZGVsIG9yaWdpbmFsOiBkb3NcbiAgICAgIC8vIGNhbXBvcyBjb24gZWwgbWlzbW8gYG5hbWVgIHNvbiBlbCBtaXNtbyBjYW1wbyBwYXJhIGVsIGJhY2tlbmQuXG4gICAgICBuYW1lOiB0aGlzLmZvcm1CdWlsZGVyLnVuaXF1ZUZpZWxkTmFtZShyb3cubmFtZSB8fCByb3cubGFiZWwsIHRoaXMucXVlc3Rpb25zKCkpLFxuICAgICAgb3B0aW9uczogcm93Lm9wdGlvbnMgPyByb3cub3B0aW9ucy5tYXAobyA9PiAoeyAuLi5vIH0pKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcm93cy5maW5kSW5kZXgociA9PiByLmlkID09PSByb3cuaWQpO1xuICAgICAgcmV0dXJuIFsuLi5yb3dzLnNsaWNlKDAsIGluZGV4ICsgMSksIGNvcHksIC4uLnJvd3Muc2xpY2UoaW5kZXggKyAxKV07XG4gICAgfSk7XG4gIH1cblxuICBtb3ZlKGluZGV4OiBudW1iZXIsIGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBpbmRleCArIGRlbHRhO1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IHtcbiAgICAgIGlmICh0YXJnZXQgPCAwIHx8IHRhcmdldCA+PSByb3dzLmxlbmd0aCkgcmV0dXJuIHJvd3M7XG4gICAgICBjb25zdCBuZXh0ID0gWy4uLnJvd3NdO1xuICAgICAgW25leHRbaW5kZXhdLCBuZXh0W3RhcmdldF1dID0gW25leHRbdGFyZ2V0XSwgbmV4dFtpbmRleF1dO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSk7XG4gIH1cblxuICBhcHBseVF1ZXN0aW9uKGZpZWxkOiBFZGl0YWJsZUZpZWxkRGVmKTogdm9pZCB7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT5cbiAgICAgIHJvd3MubWFwKHIgPT5cbiAgICAgICAgci5pZCA9PT0gZmllbGQuaWRcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgICAgIG5hbWU6IHRoaXMuZm9ybUJ1aWxkZXIudW5pcXVlRmllbGROYW1lKFxuICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUgfHwgZmllbGQubGFiZWwsXG4gICAgICAgICAgICAgICAgcm93cy5maWx0ZXIobyA9PiBvLmlkICE9PSByLmlkKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogclxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5lZGl0aW5nSWQuc2V0KCcnKTtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQoJycpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zYXZpbmcoKSkgcmV0dXJuO1xuICAgIHRoaXMudmFsaWRhdGlvbkVycm9yLnNldCgnJyk7XG5cbiAgICBjb25zdCB0aXRsZSA9IHRoaXMudGl0bGVDb250cm9sLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQodGhpcy50KCdub1RpdGxlJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnF1ZXN0aW9ucygpO1xuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yLnNldCh0aGlzLnQoJ25vUXVlc3Rpb25zJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocm93cy5zb21lKHIgPT4gIXIubGFiZWwudHJpbSgpKSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KHRoaXMudCgnZW1wdHlRdWVzdGlvbkxhYmVsJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBFbCBlZGl0b3IgeWEgbG8gdmFsaWRhIGFsIGNlcnJhciBjYWRhIHByZWd1bnRhLCBwZXJvIHVuYSBwcmVndW50YSBhYmllcnRhXG4gICAgLy8gKG8gY2FyZ2FkYSBkZSB1bmEgZW5jdWVzdGEgdmllamEpIHB1ZWRlIGxsZWdhciBhY8OhIHNpbiBvcGNpb25lcy5cbiAgICBpZiAocm93cy5zb21lKHIgPT4gRklFTERfVFlQRVNfV0lUSF9PUFRJT05TLmluY2x1ZGVzKHIudHlwZSkgJiYgIXIub3B0aW9ucz8ubGVuZ3RoKSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KHRoaXMudCgnbWlzc2luZ09wdGlvbnMnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zYXZpbmcuc2V0KHRydWUpO1xuXG4gICAgY29uc3QgZmllbGRTY2hlbWE6IEZpZWxkU2NoZW1hRGVmW10gPSBbXTtcbiAgICByb3dzLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmZvcm1CdWlsZGVyLnVuaXF1ZUZpZWxkTmFtZShyb3cubmFtZSB8fCByb3cubGFiZWwsIGZpZWxkU2NoZW1hKTtcbiAgICAgIGZpZWxkU2NoZW1hLnB1c2goXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY3JlYXRlRmllbGRTY2hlbWEoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGxhYmVsOiByb3cubGFiZWwudHJpbSgpLFxuICAgICAgICAgICAgdHlwZTogcm93LnR5cGUsXG4gICAgICAgICAgICByZXF1aXJlZDogcm93LnJlcXVpcmVkLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0OiByb3cucGxhY2Vob2xkZXJUZXh0LFxuICAgICAgICAgICAgaGludFRleHQ6IHJvdy5oaW50VGV4dCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHJvdy5vcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5kZXhcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHR5cGVJZCA9XG4gICAgICB0aGlzLnByb3BzLnR5cGVJZCA/PyBgJHt0aGlzLnByb3BzLnR5cGVQcmVmaXggPz8gREVGQVVMVF9UWVBFX1BSRUZJWH06JHt0aGlzLmZvcm1CdWlsZGVyLnRvVG9rZW4odGl0bGUpfWA7XG4gICAgY29uc3Qgc3VidGl0bGUgPSB0aGlzLnN1YnRpdGxlQ29udHJvbC52YWx1ZS50cmltKCk7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgbGFiZWw6IHRpdGxlLFxuICAgICAgc3VidGl0bGUsXG4gICAgICBlbnRpdHlSZWY6IHRoaXMucHJvcHMuZW50aXR5UmVmLFxuICAgICAgc2tpcFJldmlldzogdHJ1ZSxcbiAgICAgIGZpZWxkU2NoZW1hLFxuICAgICAgYWxsb3dBbm9ueW1vdXM6IHRoaXMucHJvcHMuYWxsb3dBbm9ueW1vdXMgPz8gdHJ1ZSxcbiAgICAgIHZpc2liaWxpdHk6IHRoaXMucHJvcHMudmlzaWJpbGl0eSA/PyAoJ1BVQkxJQycgYXMgY29uc3QpLFxuICAgIH07XG5cbiAgICBjb25zdCBjYWxsJCA9IHRoaXMucHJvcHMudHlwZUlkXG4gICAgICA/IHRoaXMucmVxdWVzdHMudXBkYXRlUmVxdWVzdFR5cGUodGhpcy5wcm9wcy50eXBlSWQsIHBheWxvYWQpXG4gICAgICA6IHRoaXMucmVxdWVzdHMuY3JlYXRlUmVxdWVzdFR5cGUoeyAuLi5wYXlsb2FkLCB0eXBlSWQgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdHlwZUNvbmZpZyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGNhbGwkKTtcbiAgICAgIHRoaXMuc2F2aW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLnNhdmVkLmVtaXQoeyB0eXBlQ29uZmlnIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zYXZpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgY29udGV4dDogJ3N1cnZleUJ1aWxkZXIuc2F2ZScsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAnc2F2ZUVycm9yJyxcbiAgICAgICAgaTE4bk5hbWVzcGFjZTogTkFNRVNQQUNFLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByb3dGcm9tRmllbGQoZjogRmllbGRTY2hlbWFEZWYpOiBFZGl0YWJsZUZpZWxkRGVmIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGByb3ctJHtyb3dVaWQrK31gLFxuICAgICAgbmFtZTogZi5uYW1lLFxuICAgICAgbGFiZWw6IGYubGFiZWwgPz8gJycsXG4gICAgICBwbGFjZWhvbGRlclRleHQ6IGYucGxhY2Vob2xkZXJUZXh0ID8/ICcnLFxuICAgICAgaGludFRleHQ6IGYuaGludFRleHQgPz8gJycsXG4gICAgICB0eXBlOiBmLnR5cGUsXG4gICAgICByZXF1aXJlZDogISFmLnJlcXVpcmVkLFxuICAgICAgb3B0aW9uczogZi5vcHRpb25zLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==