@fovestta2/web-angular 1.0.1 → 1.0.4

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 (32) hide show
  1. package/esm2022/lib/add-update-form/add-update-form.component.mjs +1044 -0
  2. package/esm2022/lib/fv-controls.module.mjs +16 -4
  3. package/esm2022/lib/fv-dropdown/fv-dropdown.component.mjs +116 -17
  4. package/esm2022/lib/fv-entry-field/fv-entry-field.component.mjs +29 -3
  5. package/esm2022/lib/fv-esi-field/fv-esi-field.component.mjs +63 -0
  6. package/esm2022/lib/fv-iban-field/fv-iban-field.component.mjs +63 -0
  7. package/esm2022/lib/fv-ifsc-field/fv-ifsc-field.component.mjs +63 -0
  8. package/esm2022/lib/fv-micr-field/fv-micr-field.component.mjs +63 -0
  9. package/esm2022/lib/fv-name-code/fv-name-code.component.mjs +273 -0
  10. package/esm2022/lib/fv-pf-field/fv-pf-field.component.mjs +63 -0
  11. package/esm2022/lib/fv-phone-field/fv-phone-field.component.mjs +105 -0
  12. package/esm2022/lib/fv-radio-group/fv-radio-group.component.mjs +3 -3
  13. package/esm2022/lib/fv-uan-field/fv-uan-field.component.mjs +65 -0
  14. package/esm2022/lib/query-form/query-form.component.mjs +569 -0
  15. package/esm2022/public-api.mjs +15 -5
  16. package/fesm2022/fovestta2-web-angular.mjs +2492 -88
  17. package/fesm2022/fovestta2-web-angular.mjs.map +1 -1
  18. package/lib/add-update-form/add-update-form.component.d.ts +102 -0
  19. package/lib/fv-controls.module.d.ts +3 -1
  20. package/lib/fv-dropdown/fv-dropdown.component.d.ts +14 -2
  21. package/lib/fv-entry-field/fv-entry-field.component.d.ts +4 -1
  22. package/lib/fv-esi-field/fv-esi-field.component.d.ts +21 -0
  23. package/lib/fv-iban-field/fv-iban-field.component.d.ts +21 -0
  24. package/lib/fv-ifsc-field/fv-ifsc-field.component.d.ts +21 -0
  25. package/lib/fv-micr-field/fv-micr-field.component.d.ts +21 -0
  26. package/lib/fv-name-code/fv-name-code.component.d.ts +41 -0
  27. package/lib/fv-pf-field/fv-pf-field.component.d.ts +21 -0
  28. package/lib/fv-phone-field/fv-phone-field.component.d.ts +25 -0
  29. package/lib/fv-uan-field/fv-uan-field.component.d.ts +21 -0
  30. package/lib/query-form/query-form.component.d.ts +53 -0
  31. package/package.json +2 -2
  32. package/public-api.d.ts +14 -4
@@ -0,0 +1,1044 @@
1
+ // add-update-form.component.ts
2
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { ReactiveFormsModule, Validators, } from '@angular/forms';
5
+ import { distinctUntilChanged } from 'rxjs/operators';
6
+ // Import your library modules
7
+ import { FvEntryFieldComponent } from '../fv-entry-field/fv-entry-field.component';
8
+ import { FvNumberFieldComponent } from '../fv-number-field/fv-number-field.component';
9
+ import { FvDropdownComponent } from '../fv-dropdown/fv-dropdown.component';
10
+ import { FvRadioGroupComponent } from '../fv-radio-group/fv-radio-group.component';
11
+ import { FvCheckboxComponent } from '../fv-checkbox/fv-checkbox.component';
12
+ import { FvDateFieldComponent } from '../fv-date-field/fv-date-field.component';
13
+ import { FvMonthYearFieldComponent } from '../fv-month-year-field/fv-month-year-field.component';
14
+ import { FvFileSelectorComponent } from '../fv-file-selector/fv-file-selector.component';
15
+ import { FvImageSelectorComponent } from '../fv-image-selector/fv-image-selector.component';
16
+ import { FvRichTextEditorComponent } from '../fv-rich-text-editor/fv-rich-text-editor.component';
17
+ import { FvNameCodeComponent } from '../fv-name-code/fv-name-code.component';
18
+ import { FvPhoneFieldComponent } from '../fv-phone-field/fv-phone-field.component';
19
+ import { FvUanFieldComponent } from '../fv-uan-field/fv-uan-field.component';
20
+ import { FvPfFieldComponent } from '../fv-pf-field/fv-pf-field.component';
21
+ import { FvEsiFieldComponent } from '../fv-esi-field/fv-esi-field.component';
22
+ import { FvIfscFieldComponent } from '../fv-ifsc-field/fv-ifsc-field.component';
23
+ import { FvMicrFieldComponent } from '../fv-micr-field/fv-micr-field.component';
24
+ import { FvIbanFieldComponent } from '../fv-iban-field/fv-iban-field.component';
25
+ import * as i0 from "@angular/core";
26
+ import * as i1 from "@angular/forms";
27
+ import * as i2 from "@angular/common";
28
+ export class AddUpdateFormComponent {
29
+ fb;
30
+ hostRef;
31
+ config;
32
+ validationError = new EventEmitter();
33
+ form;
34
+ submitted = false;
35
+ filePreviews = new Map();
36
+ fileNames = new Map();
37
+ valueChangeSubscriptions = [];
38
+ passwordVisibility = new Map();
39
+ searchQueries = new Map();
40
+ constructor(fb, hostRef) {
41
+ this.fb = fb;
42
+ this.hostRef = hostRef;
43
+ }
44
+ ngOnInit() {
45
+ this.initializeForm();
46
+ }
47
+ ngAfterViewInit() {
48
+ // Lifecycle hook - can be used for datepicker initialization if needed
49
+ }
50
+ getColumnWidth(column) {
51
+ const maxCols = this.config.maxColsPerRow || 5;
52
+ const colSpan = Math.min(column.colSpan || 1, maxCols);
53
+ return `calc(${(colSpan / maxCols) * 100}% - 16px)`;
54
+ }
55
+ getControl(name) {
56
+ return this.form.get(name);
57
+ }
58
+ // 2. HELPER: Convert your FieldValidation[] to the library's ValidationSchema
59
+ getSchema(column) {
60
+ const rules = [];
61
+ const errorPriority = [];
62
+ if (column.validations) {
63
+ column.validations.forEach((v) => {
64
+ switch (v.type) {
65
+ case 'required':
66
+ rules.push({
67
+ name: 'required',
68
+ params: { enabled: true },
69
+ errorKey: 'ERR_REQUIRED',
70
+ });
71
+ errorPriority.push('required');
72
+ break;
73
+ case 'email':
74
+ rules.push({
75
+ name: 'regex',
76
+ params: {
77
+ pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$',
78
+ },
79
+ errorKey: 'ERR_REGEX_MISMATCH',
80
+ });
81
+ errorPriority.push('regex');
82
+ break;
83
+ case 'minLength':
84
+ rules.push({
85
+ name: 'minLength',
86
+ params: { value: v.value },
87
+ errorKey: 'ERR_MIN_LENGTH',
88
+ });
89
+ errorPriority.push('minLength');
90
+ break;
91
+ case 'maxLength':
92
+ rules.push({
93
+ name: 'maxLength',
94
+ params: { value: v.value },
95
+ errorKey: 'ERR_MAX_LENGTH',
96
+ });
97
+ errorPriority.push('maxLength');
98
+ break;
99
+ case 'pattern':
100
+ rules.push({
101
+ name: 'regex',
102
+ params: { pattern: v.value },
103
+ errorKey: 'ERR_REGEX_MISMATCH',
104
+ });
105
+ errorPriority.push('regex');
106
+ break;
107
+ case 'min':
108
+ rules.push({
109
+ name: 'min',
110
+ params: { value: v.value },
111
+ errorKey: 'ERR_MIN_VALUE',
112
+ });
113
+ errorPriority.push('min');
114
+ break;
115
+ case 'max':
116
+ rules.push({
117
+ name: 'max',
118
+ params: { value: v.value },
119
+ errorKey: 'ERR_MAX_VALUE',
120
+ });
121
+ errorPriority.push('max');
122
+ break;
123
+ }
124
+ });
125
+ }
126
+ // Map 'name-code' to 'Dropdown' or similar for validation schema purposes if needed
127
+ let controlType = column.type;
128
+ if (column.type === 'name-code') {
129
+ controlType = 'select'; // Treat as select for schema lookup if library expects 'select' or 'Dropdown'
130
+ }
131
+ return {
132
+ controlType: controlType,
133
+ errorPriority: errorPriority,
134
+ rules: rules,
135
+ };
136
+ }
137
+ isImageField(column) {
138
+ return (column.type === 'file' &&
139
+ (column.accept?.startsWith('image') || column.filePreview === true));
140
+ }
141
+ initializeForm() {
142
+ this.submitted = false;
143
+ const formGroupConfig = {};
144
+ this.config.sections.forEach((section) => {
145
+ section.fields.forEach((column) => {
146
+ let initialValue = column.value || '';
147
+ // Format month-year fields to YYYY-MM format
148
+ if (column.type === 'month-year' && initialValue) {
149
+ initialValue = this.formatMonthYearValue(initialValue);
150
+ }
151
+ formGroupConfig[column.name] = [
152
+ { value: initialValue, disabled: column.disabled || false },
153
+ null, // We'll set validators after form creation
154
+ ];
155
+ // If it's a file field with an existing value, set the preview
156
+ if (column.type === 'file' && column.value) {
157
+ this.filePreviews.set(column.name, column.value);
158
+ // Extract filename from URL or base64
159
+ const fileName = this.extractFileName(column.value);
160
+ if (fileName) {
161
+ this.fileNames.set(column.name, fileName);
162
+ }
163
+ }
164
+ // Initialize search display for name-code fields - No longer needed as FvNameCode handles display internally
165
+ /* if (column.type === 'name-code' && initialValue && column.options) {
166
+ // Logic moved to component
167
+ } */
168
+ });
169
+ });
170
+ this.form = this.fb.group(formGroupConfig);
171
+ this.config.sections.forEach((section) => {
172
+ section.fields.forEach((column) => {
173
+ const validators = this.buildValidators(column.validations, this.form);
174
+ if (validators.length > 0) {
175
+ this.form.get(column.name)?.setValidators(validators);
176
+ this.form.get(column.name)?.updateValueAndValidity();
177
+ }
178
+ });
179
+ });
180
+ // Subscribe to value changes for all fields to trigger onChange handlers
181
+ Object.keys(this.form.controls).forEach((key) => {
182
+ const control = this.form.get(key);
183
+ if (control) {
184
+ const subscription = control.valueChanges
185
+ .pipe(distinctUntilChanged())
186
+ .subscribe((value) => {
187
+ const column = this.getColumnByName(key);
188
+ if (column?.onChange) {
189
+ column.onChange(value, this.form);
190
+ }
191
+ });
192
+ this.valueChangeSubscriptions.push(subscription);
193
+ }
194
+ });
195
+ }
196
+ ngOnDestroy() {
197
+ // Clean up all subscriptions to prevent memory leaks
198
+ this.valueChangeSubscriptions.forEach((sub) => sub.unsubscribe());
199
+ this.valueChangeSubscriptions = [];
200
+ }
201
+ handleFieldChange(fieldName, eventValue) {
202
+ const column = this.getColumnByName(fieldName);
203
+ const formControl = this.form.get(fieldName);
204
+ // Format month-year fields (especially expiryDate) to YYYY-MM
205
+ if (column?.type === 'month-year' && eventValue) {
206
+ const formattedValue = this.formatMonthYearValue(eventValue);
207
+ if (formControl && formattedValue !== eventValue) {
208
+ formControl.setValue(formattedValue, { emitEvent: false });
209
+ eventValue = formattedValue;
210
+ }
211
+ }
212
+ if (column?.onChange) {
213
+ // Use the event value directly (what the user just selected/typed)
214
+ // This ensures we have the correct value even if form control hasn't updated yet
215
+ const valueToPass = eventValue !== undefined ? eventValue : this.form.get(fieldName)?.value;
216
+ const onChangeFn = column.onChange; // Store the function reference
217
+ // Store the selected value - this is what the user chose
218
+ const selectedValue = valueToPass;
219
+ // Ensure the form control has the selected value before calling onChange
220
+ if (formControl && selectedValue !== undefined) {
221
+ if (formControl.value !== selectedValue) {
222
+ formControl.setValue(selectedValue, { emitEvent: false });
223
+ }
224
+ }
225
+ // Call onChange with the selected value
226
+ if (onChangeFn) {
227
+ onChangeFn(selectedValue, this.form);
228
+ }
229
+ // Restore the value for the field that triggered the change if it was cleared by onChange
230
+ // This is critical: if onChange clears the field that was just changed, we restore it
231
+ // Only restore if we had a non-empty value (empty string, null, undefined are not restored)
232
+ if (formControl &&
233
+ selectedValue !== undefined &&
234
+ selectedValue !== null &&
235
+ selectedValue !== '') {
236
+ // Use setTimeout with 0 delay to run after any synchronous operations in onChange
237
+ setTimeout(() => {
238
+ // Check if the value was cleared or changed
239
+ const currentValue = formControl.value;
240
+ // If the value doesn't match what was selected, restore it
241
+ // This handles the case where onChange cleared the field unintentionally
242
+ if (currentValue !== selectedValue) {
243
+ formControl.setValue(selectedValue, { emitEvent: false });
244
+ }
245
+ }, 0);
246
+ }
247
+ }
248
+ }
249
+ formatMonthYearValue(value) {
250
+ if (!value)
251
+ return value;
252
+ // Normalize to YYYY-MM
253
+ if (value.match(/^\d{2}-\d{4}$/)) {
254
+ const [month, year] = value.split('-');
255
+ return `${year}-${month}`;
256
+ }
257
+ // If already in YYYY-MM format, return as is
258
+ return value;
259
+ }
260
+ parseMonthYearValue(value) {
261
+ if (!value)
262
+ return value;
263
+ // Display and picker both use YYYY-MM; normalize MM-YYYY if present
264
+ if (value.match(/^\d{2}-\d{4}$/)) {
265
+ const [month, year] = value.split('-');
266
+ return `${year}-${month}`;
267
+ }
268
+ return value;
269
+ }
270
+ handleMonthYearChange(fieldName, value) {
271
+ // Format the input value to YYYY-MM format
272
+ let formattedValue = value;
273
+ // If it's in MM-YYYY format, convert to YYYY-MM
274
+ if (formattedValue.match(/^\d{2}-\d{4}$/)) {
275
+ const [month, year] = formattedValue.split('-');
276
+ formattedValue = `${year}-${month}`;
277
+ }
278
+ // If it's in YYYYMM format (no dash), convert to YYYY-MM
279
+ else if (formattedValue.match(/^\d{6}$/)) {
280
+ const year = formattedValue.substring(0, 4);
281
+ const month = formattedValue.substring(4, 6);
282
+ formattedValue = `${year}-${month}`;
283
+ }
284
+ // If it's already in YYYY-MM format, leave as is
285
+ else if (formattedValue.match(/^\d{4}-\d{2}$/)) {
286
+ // Already in correct format
287
+ }
288
+ // If user is typing, allow partial input
289
+ else if (formattedValue.match(/^\d{1,6}$/)) {
290
+ // Allow partial input while typing
291
+ }
292
+ const formControl = this.form.get(fieldName);
293
+ if (formControl && formattedValue !== value) {
294
+ formControl.setValue(formattedValue, { emitEvent: false });
295
+ }
296
+ this.handleFieldChange(fieldName, formattedValue);
297
+ }
298
+ handleMonthYearBlur(fieldName) {
299
+ const formControl = this.form.get(fieldName);
300
+ if (!formControl)
301
+ return;
302
+ const value = formControl.value || '';
303
+ // Ensure the value is in YYYY-MM format on blur
304
+ if (value && !value.match(/^\d{4}-\d{2}$/)) {
305
+ // Try to parse and format
306
+ const formatted = this.formatMonthYearValue(value);
307
+ if (formatted !== value) {
308
+ formControl.setValue(formatted, { emitEvent: false });
309
+ }
310
+ }
311
+ }
312
+ handleMonthYearPickerChange(fieldName, value) {
313
+ // Month picker outputs YYYY-MM; just normalize
314
+ const formattedValue = this.formatMonthYearValue(value);
315
+ const formControl = this.form.get(fieldName);
316
+ if (formControl) {
317
+ formControl.setValue(formattedValue, { emitEvent: false });
318
+ this.handleFieldChange(fieldName, formattedValue);
319
+ }
320
+ }
321
+ getMonthYearPickerValue(fieldName) {
322
+ const formControl = this.form.get(fieldName);
323
+ if (!formControl)
324
+ return '';
325
+ const value = formControl.value || '';
326
+ // Display and picker both expect YYYY-MM
327
+ return this.parseMonthYearValue(value);
328
+ }
329
+ openMonthPicker(fieldName) {
330
+ const monthInput = document.getElementById(fieldName + '_picker');
331
+ if (monthInput && monthInput.type === 'month') {
332
+ // Update the picker value before opening
333
+ const currentValue = this.getMonthYearPickerValue(fieldName);
334
+ if (currentValue) {
335
+ monthInput.value = currentValue;
336
+ }
337
+ // Try modern showPicker API first, fallback to click
338
+ if (monthInput.showPicker) {
339
+ monthInput.showPicker();
340
+ }
341
+ else {
342
+ monthInput.focus();
343
+ monthInput.click();
344
+ }
345
+ }
346
+ }
347
+ getColumnByName(name) {
348
+ return this.config.sections
349
+ .flatMap((s) => s.fields)
350
+ .find((c) => c.name === name);
351
+ }
352
+ getFileFields(fields) {
353
+ return fields.filter((f) => f.type === 'file');
354
+ }
355
+ getNonFileFields(fields) {
356
+ return fields.filter((f) => f.type !== 'file');
357
+ }
358
+ togglePasswordVisibility(fieldName) {
359
+ const current = this.passwordVisibility.get(fieldName) || false;
360
+ this.passwordVisibility.set(fieldName, !current);
361
+ }
362
+ hasRequiredValidation(column) {
363
+ return column.validations?.some((v) => v.type === 'required') || false;
364
+ }
365
+ isPasswordVisible(fieldName) {
366
+ return this.passwordVisibility.get(fieldName) || false;
367
+ }
368
+ buildValidators(validations, formGroup) {
369
+ if (!validations)
370
+ return [];
371
+ const validators = [];
372
+ validations.forEach((validation) => {
373
+ switch (validation.type) {
374
+ case 'required':
375
+ validators.push(Validators.required);
376
+ break;
377
+ case 'email':
378
+ validators.push(Validators.email);
379
+ break;
380
+ case 'minLength':
381
+ validators.push(Validators.minLength(validation.value));
382
+ break;
383
+ case 'maxLength':
384
+ validators.push(Validators.maxLength(validation.value));
385
+ break;
386
+ case 'min':
387
+ validators.push(Validators.min(validation.value));
388
+ break;
389
+ case 'max':
390
+ validators.push(Validators.max(validation.value));
391
+ break;
392
+ case 'pattern':
393
+ validators.push(Validators.pattern(validation.value));
394
+ break;
395
+ case 'custom':
396
+ if (validation.validator) {
397
+ validators.push((control) => {
398
+ const isValid = validation.validator(control.value, formGroup);
399
+ return isValid ? null : { custom: true };
400
+ });
401
+ }
402
+ break;
403
+ }
404
+ });
405
+ return validators;
406
+ }
407
+ triggerFileUpload(fieldName) {
408
+ document.getElementById('fileInput_' + fieldName)?.click();
409
+ }
410
+ openTimePicker(fieldName) {
411
+ const timeInput = document.getElementById(fieldName);
412
+ if (timeInput && timeInput.type === 'time') {
413
+ // Try modern showPicker API first, fallback to click
414
+ if (timeInput.showPicker) {
415
+ timeInput.showPicker();
416
+ }
417
+ else {
418
+ timeInput.focus();
419
+ timeInput.click();
420
+ }
421
+ }
422
+ }
423
+ onFileChange(event, fieldName) {
424
+ const file = event.target.files[0];
425
+ if (file) {
426
+ this.fileNames.set(fieldName, file.name);
427
+ const reader = new FileReader();
428
+ reader.readAsDataURL(file);
429
+ reader.onload = () => {
430
+ const base64String = reader.result;
431
+ this.filePreviews.set(fieldName, base64String);
432
+ this.form.get(fieldName)?.setValue(base64String);
433
+ // Trigger onChange handler for file fields
434
+ const column = this.getColumnByName(fieldName);
435
+ if (column?.onChange) {
436
+ column.onChange(base64String, this.form);
437
+ }
438
+ };
439
+ }
440
+ }
441
+ extractFileName(value) {
442
+ if (!value)
443
+ return '';
444
+ // If it's a URL, extract filename from URL
445
+ if (value.startsWith('http')) {
446
+ const parts = value.split('/');
447
+ return parts[parts.length - 1];
448
+ }
449
+ // If it's base64, return a generic name
450
+ if (value.startsWith(`data:image`)) {
451
+ return 'uploaded-image.jpg';
452
+ }
453
+ return 'existing-photo.jpg';
454
+ }
455
+ getFilePreview(fieldName) {
456
+ return this.filePreviews.get(fieldName) || null;
457
+ }
458
+ getFileName(fieldName) {
459
+ return this.fileNames.get(fieldName) || null;
460
+ }
461
+ mapSearchOptions(options) {
462
+ return options.map(opt => ({
463
+ code: opt.code || opt.value,
464
+ name: opt.name || opt.label || opt.value,
465
+ value: opt.value
466
+ }));
467
+ }
468
+ deleteFile(fieldName) {
469
+ this.filePreviews.delete(fieldName);
470
+ this.fileNames.delete(fieldName);
471
+ this.form.get(fieldName)?.setValue('');
472
+ // Trigger onChange handler when file is deleted
473
+ const column = this.getColumnByName(fieldName);
474
+ if (column?.onChange) {
475
+ column.onChange('', this.form);
476
+ }
477
+ }
478
+ handleSubmit() {
479
+ this.submitted = true;
480
+ if (this.form.invalid) {
481
+ // Mark all fields as touched to show red borders
482
+ Object.keys(this.form.controls).forEach((key) => {
483
+ this.form.get(key)?.markAsTouched();
484
+ });
485
+ // Count only required fields that are invalid
486
+ const allColumns = this.config.sections.flatMap((s) => s.fields);
487
+ const invalidRequiredCount = Object.keys(this.form.controls).filter((key) => {
488
+ const control = this.form.get(key);
489
+ if (!control?.invalid)
490
+ return false;
491
+ // Check if this field has required validation
492
+ const column = allColumns.find((c) => c.name === key);
493
+ return (column?.validations?.some((v) => v.type === 'required') || false);
494
+ }).length;
495
+ // Only emit if there are required fields missing
496
+ if (invalidRequiredCount > 0) {
497
+ this.validationError.emit(`Please fill all required fields marked with *. ${invalidRequiredCount} field(s) need attention.`);
498
+ }
499
+ return;
500
+ }
501
+ const formData = this.form.getRawValue();
502
+ this.config.onSubmit(formData);
503
+ }
504
+ handleReset() {
505
+ this.submitted = false;
506
+ this.form.reset();
507
+ if (this.config.onReset) {
508
+ this.config.onReset();
509
+ }
510
+ }
511
+ isFieldInvalid(fieldName) {
512
+ const field = this.form.get(fieldName);
513
+ return !!(field && field.invalid && this.submitted);
514
+ }
515
+ getErrorMessage(fieldName) {
516
+ const field = this.form.get(fieldName);
517
+ if (!field?.errors)
518
+ return '';
519
+ // Check if there's a custom message from validations
520
+ const allColumns = this.config.sections.flatMap((s) => s.fields);
521
+ const column = allColumns.find((c) => c.name === fieldName);
522
+ // Check for custom validation error
523
+ if (field.errors['custom']) {
524
+ const customValidation = column?.validations?.find((v) => v.type === 'custom');
525
+ return customValidation?.message || 'Invalid field';
526
+ }
527
+ // Check if there's a custom message from validations
528
+ const errorKeys = Object.keys(field.errors);
529
+ for (const key of errorKeys) {
530
+ const validation = column?.validations?.find((v) => v.type === key);
531
+ if (validation?.message) {
532
+ return validation.message;
533
+ }
534
+ }
535
+ // Default error messages
536
+ if (field.errors['required']) {
537
+ return `${column?.label} is required`;
538
+ }
539
+ if (field.errors['email'])
540
+ return 'Invalid email format';
541
+ if (field.errors['minlength'])
542
+ return `Minimum length is ${field.errors['minlength'].requiredLength}`;
543
+ if (field.errors['maxlength'])
544
+ return `Maximum length is ${field.errors['maxlength'].requiredLength}`;
545
+ if (field.errors['min'])
546
+ return `Minimum value is ${field.errors['min'].min}`;
547
+ if (field.errors['max'])
548
+ return `Maximum value is ${field.errors['max'].max}`;
549
+ if (field.errors['pattern'])
550
+ return 'Invalid format';
551
+ return 'Invalid field';
552
+ }
553
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddUpdateFormComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
554
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AddUpdateFormComponent, isStandalone: true, selector: "lib-add-update-form", inputs: { config: "config" }, outputs: { validationError: "validationError" }, ngImport: i0, template: `
555
+ <div class="form-container">
556
+ <div class="form-header" *ngIf="config.formTitle">
557
+ <h2>{{ config.formTitle }}</h2>
558
+ </div>
559
+
560
+ <form [formGroup]="form" (ngSubmit)="handleSubmit()" class="dynamic-form">
561
+ <div *ngFor="let section of config.sections" class="form-section">
562
+ <h3 class="section-title" *ngIf="section.title">
563
+ {{ section.title }}
564
+ </h3>
565
+
566
+ <div class="fields-row">
567
+ <ng-container *ngFor="let column of section.fields">
568
+ <div
569
+ class="form-field-wrapper"
570
+ [ngClass]="'field-' + column.type"
571
+ [ngStyle]="column.hidden ? { display: 'none' } : {}"
572
+ [style.grid-column]="'span ' + (column.colSpan || 1)"
573
+ >
574
+ <ng-container
575
+ *ngIf="
576
+ ['text', 'email', 'password'].includes(column.type) &&
577
+ !column.hidden
578
+ "
579
+ >
580
+ <fv-entry-field
581
+ [label]="column.label"
582
+ [placeholder]="column.placeholder || ''"
583
+ [type]="
584
+ column.type === 'password'
585
+ ? 'password'
586
+ : column.type === 'email'
587
+ ? 'email'
588
+ : 'text'
589
+ "
590
+ [control]="getControl(column.name)"
591
+ [schema]="getSchema(column)"
592
+ [disabled]="column.disabled || false"
593
+ [readonly]="false"
594
+ [allowAlphabetsOnly]="column.allowAlphabetsOnly || false"
595
+ [maxLength]="column.maxLength || null"
596
+ (valueChange)="handleFieldChange(column.name, $event)"
597
+ >
598
+ </fv-entry-field>
599
+ </ng-container>
600
+
601
+ <ng-container
602
+ *ngIf="column.type === 'number' && !column.hidden"
603
+ >
604
+ <fv-number-field
605
+ [label]="column.label"
606
+ [placeholder]="column.placeholder || ''"
607
+ [control]="getControl(column.name)"
608
+ [schema]="getSchema(column)"
609
+ [disabled]="column.disabled || false"
610
+ (valueChange)="handleFieldChange(column.name, $event)"
611
+ >
612
+ </fv-number-field>
613
+ </ng-container>
614
+
615
+ <ng-container
616
+ *ngIf="column.type === 'select' && !column.hidden"
617
+ >
618
+ <fv-dropdown
619
+ [label]="column.label"
620
+ [placeholder]="column.placeholder || 'Select option'"
621
+ [options]="column.options || []"
622
+ [control]="getControl(column.name)"
623
+ [schema]="getSchema(column)"
624
+ [disabled]="column.disabled || false"
625
+ (valueChange)="handleFieldChange(column.name, $event)"
626
+ >
627
+ </fv-dropdown>
628
+ </ng-container>
629
+
630
+ <ng-container
631
+ *ngIf="column.type === 'checkbox' && !column.hidden"
632
+ >
633
+ <fv-checkbox
634
+ [label]="column.label"
635
+ [control]="getControl(column.name)"
636
+ [disabled]="column.disabled || false"
637
+ (valueChange)="handleFieldChange(column.name, $event)"
638
+ >
639
+ </fv-checkbox>
640
+ </ng-container>
641
+
642
+ <ng-container *ngIf="column.type === 'radio' && !column.hidden">
643
+ <fv-radio-group
644
+ [label]="column.label"
645
+ [options]="column.options || []"
646
+ [control]="getControl(column.name)"
647
+ [disabled]="column.disabled || false"
648
+ (valueChange)="handleFieldChange(column.name, $event)"
649
+ >
650
+ </fv-radio-group>
651
+ </ng-container>
652
+
653
+ <ng-container *ngIf="column.type === 'date' && !column.hidden">
654
+ <fv-date-field
655
+ [label]="column.label"
656
+ [control]="getControl(column.name)"
657
+ [schema]="getSchema(column)"
658
+ [disabled]="column.disabled || false"
659
+ (valueChange)="handleFieldChange(column.name, $event)"
660
+ >
661
+ </fv-date-field>
662
+ </ng-container>
663
+
664
+ <ng-container
665
+ *ngIf="column.type === 'month-year' && !column.hidden"
666
+ >
667
+ <fv-month-year-field
668
+ [label]="column.label"
669
+ [control]="getControl(column.name)"
670
+ [schema]="getSchema(column)"
671
+ [disabled]="column.disabled || false"
672
+ (valueChange)="handleMonthYearChange(column.name, $event)"
673
+ >
674
+ </fv-month-year-field>
675
+ </ng-container>
676
+
677
+ <ng-container
678
+ *ngIf="column.type === 'textarea' && !column.hidden"
679
+ >
680
+ <fv-rich-text-editor
681
+ [label]="column.label"
682
+ [placeholder]="column.placeholder || ''"
683
+ [control]="getControl(column.name)"
684
+ [schema]="getSchema(column)"
685
+ [disabled]="column.disabled || false"
686
+ (valueChange)="handleFieldChange(column.name, $event)"
687
+ >
688
+ </fv-rich-text-editor>
689
+ </ng-container>
690
+
691
+ <ng-container *ngIf="column.type === 'file' && !column.hidden">
692
+ <ng-container *ngIf="isImageField(column); else standardFile">
693
+ <fv-image-selector
694
+ [label]="column.label"
695
+ [placeholder]="column.placeholder || 'Select image'"
696
+ [control]="getControl(column.name)"
697
+ [schema]="getSchema(column)"
698
+ [disabled]="column.disabled || false"
699
+ (valueChange)="onFileChange($event, column.name)"
700
+ >
701
+ </fv-image-selector>
702
+ </ng-container>
703
+
704
+ <ng-template #standardFile>
705
+ <fv-file-selector
706
+ [label]="column.label"
707
+ [placeholder]="column.placeholder || 'Select file'"
708
+ [accept]="column.accept || '*/*'"
709
+ [control]="getControl(column.name)"
710
+ [schema]="getSchema(column)"
711
+ [disabled]="column.disabled || false"
712
+ (valueChange)="onFileChange($event, column.name)"
713
+ >
714
+ </fv-file-selector>
715
+ </ng-template>
716
+ </ng-container>
717
+
718
+ <ng-container
719
+ *ngIf="column.type === 'name-code' && !column.hidden"
720
+ >
721
+ <fv-name-code
722
+ [label]="column.label"
723
+ [placeholder]="column.placeholder || 'Search by Code or Name'"
724
+ [options]="column.options ? mapSearchOptions(column.options) : []"
725
+ [control]="getControl(column.name)"
726
+ [schema]="getSchema(column)"
727
+ [disabled]="column.disabled || false"
728
+ >
729
+ </fv-name-code>
730
+ </ng-container>
731
+
732
+ <ng-container *ngIf="column.type === 'phone' && !column.hidden">
733
+ <fv-phone-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-phone-field>
734
+ </ng-container>
735
+
736
+ <ng-container *ngIf="column.type === 'uan' && !column.hidden">
737
+ <fv-uan-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-uan-field>
738
+ </ng-container>
739
+
740
+ <ng-container *ngIf="column.type === 'pf' && !column.hidden">
741
+ <fv-pf-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-pf-field>
742
+ </ng-container>
743
+
744
+ <ng-container *ngIf="column.type === 'esi' && !column.hidden">
745
+ <fv-esi-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-esi-field>
746
+ </ng-container>
747
+
748
+ <ng-container *ngIf="column.type === 'ifsc' && !column.hidden">
749
+ <fv-ifsc-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-ifsc-field>
750
+ </ng-container>
751
+
752
+ <ng-container *ngIf="column.type === 'micr' && !column.hidden">
753
+ <fv-micr-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-micr-field>
754
+ </ng-container>
755
+
756
+ <ng-container *ngIf="column.type === 'iban' && !column.hidden">
757
+ <fv-iban-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-iban-field>
758
+ </ng-container>
759
+ </div>
760
+ </ng-container>
761
+ </div>
762
+ </div>
763
+
764
+
765
+ <div class="form-actions">
766
+ <button
767
+ type="submit"
768
+ class="btn btn-primary"
769
+ [disabled]="form.invalid && submitted"
770
+ >
771
+ {{ config.submitLabel || 'Save' }}
772
+ </button>
773
+ <button
774
+ type="button"
775
+ class="btn btn-outline"
776
+ (click)="config.onCancel()"
777
+ >
778
+ {{ config.cancelLabel || 'Cancel' }}
779
+ </button>
780
+ </div>
781
+ </form>
782
+ </div>
783
+ `, isInline: true, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins!important}.form-container{background:#f5f5f5;padding:10px;border-radius:8px;margin:0 auto;max-width:100%;box-sizing:border-box}.error-border{border-color:red!important}.hidden{display:none!important}.form-header{margin-bottom:10px}.form-header h2{margin:0;font-size:20px;font-weight:700;color:#303030}.dynamic-form{background:#fff;padding:10px;border-radius:6px;box-shadow:0 1px 3px #0000001a;max-width:100%;box-sizing:border-box}.form-section{margin-bottom:10px}.section-title{font-size:16px;font-weight:700;color:#303030;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.fields-row{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;width:100%;box-sizing:border-box;overflow:visible}.form-field-wrapper{display:flex;position:relative;flex-direction:column;min-width:0;width:100%;box-sizing:border-box;overflow:visible}.password-toggle-btn{position:absolute;right:10px;top:32px;background:none;border:none;cursor:pointer;padding:4px;color:#666}.password-toggle-btn:hover{color:#333}.password-toggle-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}@media (min-width: 1200px) and (max-width: 1400px){.fields-row{grid-template-columns:repeat(5,1fr)}.form-control{width:180px;max-width:180px}}@media (max-width: 1200px){.fields-row{grid-template-columns:repeat(3,1fr)}.form-control{width:100%;max-width:100%}}@media (max-width: 992px){.fields-row{grid-template-columns:repeat(2,1fr);gap:12px}}@media (max-width: 768px){.fields-row{grid-template-columns:repeat(2,1fr);gap:10px}}@media (max-width: 640px){.fields-row{grid-template-columns:1fr;gap:12px}.form-field-wrapper{width:100%}}label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px}.required{color:#e74c3c;margin-left:2px}.form-control{padding:5px 10px;width:100%;max-width:100%;border:1px solid #8CBBA8;border-radius:8px;background-color:#fff;font-size:14px;font-weight:400;font-family:inherit;color:#1f2b41;transition:border-color .2s,box-shadow .2s;box-sizing:border-box}.form-control:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.form-control:disabled{background-color:#ecf0f1;cursor:not-allowed}textarea.form-control{resize:vertical;min-height:100px}select.form-control{cursor:pointer;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;padding-right:40px}.checkbox-wrapper{display:flex;align-items:center;gap:8px}input[type=checkbox]{width:18px;height:18px;cursor:pointer}.checkbox-label{cursor:pointer;margin:0}.file-upload-container{display:flex;align-items:center;gap:20px;padding:20px;background:#fff;max-width:100%;box-sizing:border-box;flex-wrap:wrap}.material-icons{font-family:Material Icons!important;border-radius:4px;display:inline-block;width:40px;padding:8px;height:40px}.file-field-wrapper{width:100%;margin-top:16px;max-width:100%;box-sizing:border-box}.photo-preview-circle{width:100px;height:100px;border-radius:50%;overflow:hidden;border:2px solid #ddd;cursor:pointer;transition:border-color .2s}.photo-preview-circle:hover{border-color:#3498db}.preview-image,.default-photo{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.preview-image img{width:100%;height:100%;object-fit:cover}.default-photo{background:#f0f0f0;color:#999;font-size:40px}.file-info{display:flex;flex-direction:column;gap:8px}.btn-delete{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:0}.upload-btn-group{display:flex;align-items:center;border:1px solid #d3d3d3;border-radius:8px;background:#fff;overflow:hidden;width:fit-content}.btn-upload{background:#fff;color:#222;border:none;padding:0 18px;font-size:16px;border-right:1px solid #e0e0e0;border-radius:8px 0 0 8px;outline:none;box-shadow:none;cursor:pointer;height:40px;transition:background .2s}.btn-upload-icon{background:#f5f5f5;border:none;border-radius:0 8px 8px 0;display:flex;align-items:center;justify-content:center;width:48px;height:40px;cursor:pointer;transition:background .2s}.btn-upload-icon i.material-icons{font-size:22px;color:#222}.btn-upload:hover,.btn-upload-icon:hover{background:#f0f0f0}.btn-delete{background:#fff;color:red}.btn-delete:hover{background:#f0f0f0}.file-name{font-size:12px;color:#666;margin:10px 8px 8px}.file-label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px;display:block}.radio-label{font-weight:600;margin-bottom:15px;color:#151d48;font-size:14px;display:block}.radio-group{display:flex;gap:20px;align-items:center}.radio-item{display:flex;align-items:center;gap:6px}input[type=radio]{width:18px;height:18px;cursor:pointer;accent-color:#3498db}.radio-option-label{cursor:pointer;margin:0;font-weight:400}.hint{font-size:12px;color:#7f8c8d;margin-top:4px}.error-message{color:#e74c3c;font-size:12px;margin-top:4px}.form-actions{display:flex;gap:8px;align-items:center;justify-content:space-between;gap:12px;padding-top:5px}.btn{padding:8px 20px;border:none;border-radius:7px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s}.btn-primary{background-color:#006aff;color:#fff}.btn-primary:hover:not(:disabled){background-color:#2980b9}.btn-primary:disabled{background-color:#bdc3c7;cursor:not-allowed}.btn-secondary{background-color:#95a5a6;color:#fff}.btn-secondary:hover{background-color:#7f8c8d}.btn-outline{background-color:#303030;color:#fff}.btn-outline:hover{background-color:#2b2b2b;color:#fff}.month-year-wrapper{position:relative;display:flex;align-items:center;width:100%}.month-year-wrapper .form-control{padding-right:45px}.month-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0;border:none;padding:0;margin:0}.month-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.month-picker-btn:hover:not(:disabled){color:#3498db}.month-picker-btn:disabled{cursor:not-allowed;opacity:.5}.month-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}.search-select-wrapper{position:relative;width:100%}.search-select-input{padding-right:10px}.search-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:auto;min-width:100%;max-width:calc(100vw - 16px);background:#fff;border:1px solid #d3d3d3;border-radius:8px;max-height:220px;overflow-y:auto;box-shadow:0 4px 10px #00000014;z-index:5;padding:6px 0;transform:translate(0);transition:transform .1s ease-out}.search-select-option{padding:8px 12px;cursor:pointer;display:flex;gap:8px;align-items:center;border-bottom:1px solid #f2f2f2}.search-select-option:last-child{border-bottom:none}.search-select-option:hover{background:#f5f9ff}.option-code{color:#0052cc;font-weight:700;min-width:90px}.option-name{color:#151d48;font-weight:500}.time-picker-wrapper{position:relative;display:flex;align-items:center;width:100%}.time-input{padding-right:45px;flex:1}.time-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.time-picker-btn:hover:not(:disabled){color:#3498db}.time-picker-btn:disabled{cursor:not-allowed;opacity:.5}.time-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}input[type=time]{cursor:pointer}input[type=time]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:0;position:absolute;right:0;width:100%;height:100%}.date-picker-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-form-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-text-field-wrapper{background-color:#fff}.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__trailing{border-color:#3498db}.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:red!important}.date-picker-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.date-picker-field ::ng-deep .mat-mdc-form-field-input-control input{font-family:Poppins!important;font-size:14px;font-weight:400;color:#1f2b41}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FvEntryFieldComponent, selector: "fv-entry-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "type", "allowAlphabetsOnly", "maxLength"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvNumberFieldComponent, selector: "fv-number-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "min", "max", "step"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvDropdownComponent, selector: "fv-dropdown", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvRadioGroupComponent, selector: "fv-radio-group", inputs: ["label", "control", "options", "disabled", "required", "name"], outputs: ["valueChange"] }, { kind: "component", type: FvCheckboxComponent, selector: "fv-checkbox", inputs: ["label", "control", "disabled", "required"], outputs: ["valueChange"] }, { kind: "component", type: FvDateFieldComponent, selector: "fv-date-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvMonthYearFieldComponent, selector: "fv-month-year-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvFileSelectorComponent, selector: "fv-file-selector", inputs: ["label", "placeholder", "schema", "control", "disabled", "accept", "maxSize"], outputs: ["valueChange", "blur"] }, { kind: "component", type: FvImageSelectorComponent, selector: "fv-image-selector", inputs: ["label", "placeholder", "schema", "control", "disabled", "maxSize"], outputs: ["valueChange", "blur"] }, { kind: "component", type: FvRichTextEditorComponent, selector: "fv-rich-text-editor", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "minHeight", "showToolbar"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvNameCodeComponent, selector: "fv-name-code", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["selectionChange"] }, { kind: "component", type: FvPhoneFieldComponent, selector: "fv-phone-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvUanFieldComponent, selector: "fv-uan-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvPfFieldComponent, selector: "fv-pf-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvEsiFieldComponent, selector: "fv-esi-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIfscFieldComponent, selector: "fv-ifsc-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvMicrFieldComponent, selector: "fv-micr-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIbanFieldComponent, selector: "fv-iban-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }] });
784
+ }
785
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddUpdateFormComponent, decorators: [{
786
+ type: Component,
787
+ args: [{ selector: 'lib-add-update-form', standalone: true, imports: [
788
+ CommonModule,
789
+ ReactiveFormsModule,
790
+ FvEntryFieldComponent,
791
+ FvNumberFieldComponent,
792
+ FvDropdownComponent,
793
+ FvRadioGroupComponent,
794
+ FvCheckboxComponent,
795
+ FvDateFieldComponent,
796
+ FvMonthYearFieldComponent,
797
+ FvFileSelectorComponent,
798
+ FvImageSelectorComponent,
799
+ FvRichTextEditorComponent,
800
+ FvRichTextEditorComponent,
801
+ FvNameCodeComponent,
802
+ FvPhoneFieldComponent,
803
+ FvUanFieldComponent,
804
+ FvPfFieldComponent,
805
+ FvEsiFieldComponent,
806
+ FvIfscFieldComponent,
807
+ FvMicrFieldComponent,
808
+ FvIbanFieldComponent,
809
+ ], template: `
810
+ <div class="form-container">
811
+ <div class="form-header" *ngIf="config.formTitle">
812
+ <h2>{{ config.formTitle }}</h2>
813
+ </div>
814
+
815
+ <form [formGroup]="form" (ngSubmit)="handleSubmit()" class="dynamic-form">
816
+ <div *ngFor="let section of config.sections" class="form-section">
817
+ <h3 class="section-title" *ngIf="section.title">
818
+ {{ section.title }}
819
+ </h3>
820
+
821
+ <div class="fields-row">
822
+ <ng-container *ngFor="let column of section.fields">
823
+ <div
824
+ class="form-field-wrapper"
825
+ [ngClass]="'field-' + column.type"
826
+ [ngStyle]="column.hidden ? { display: 'none' } : {}"
827
+ [style.grid-column]="'span ' + (column.colSpan || 1)"
828
+ >
829
+ <ng-container
830
+ *ngIf="
831
+ ['text', 'email', 'password'].includes(column.type) &&
832
+ !column.hidden
833
+ "
834
+ >
835
+ <fv-entry-field
836
+ [label]="column.label"
837
+ [placeholder]="column.placeholder || ''"
838
+ [type]="
839
+ column.type === 'password'
840
+ ? 'password'
841
+ : column.type === 'email'
842
+ ? 'email'
843
+ : 'text'
844
+ "
845
+ [control]="getControl(column.name)"
846
+ [schema]="getSchema(column)"
847
+ [disabled]="column.disabled || false"
848
+ [readonly]="false"
849
+ [allowAlphabetsOnly]="column.allowAlphabetsOnly || false"
850
+ [maxLength]="column.maxLength || null"
851
+ (valueChange)="handleFieldChange(column.name, $event)"
852
+ >
853
+ </fv-entry-field>
854
+ </ng-container>
855
+
856
+ <ng-container
857
+ *ngIf="column.type === 'number' && !column.hidden"
858
+ >
859
+ <fv-number-field
860
+ [label]="column.label"
861
+ [placeholder]="column.placeholder || ''"
862
+ [control]="getControl(column.name)"
863
+ [schema]="getSchema(column)"
864
+ [disabled]="column.disabled || false"
865
+ (valueChange)="handleFieldChange(column.name, $event)"
866
+ >
867
+ </fv-number-field>
868
+ </ng-container>
869
+
870
+ <ng-container
871
+ *ngIf="column.type === 'select' && !column.hidden"
872
+ >
873
+ <fv-dropdown
874
+ [label]="column.label"
875
+ [placeholder]="column.placeholder || 'Select option'"
876
+ [options]="column.options || []"
877
+ [control]="getControl(column.name)"
878
+ [schema]="getSchema(column)"
879
+ [disabled]="column.disabled || false"
880
+ (valueChange)="handleFieldChange(column.name, $event)"
881
+ >
882
+ </fv-dropdown>
883
+ </ng-container>
884
+
885
+ <ng-container
886
+ *ngIf="column.type === 'checkbox' && !column.hidden"
887
+ >
888
+ <fv-checkbox
889
+ [label]="column.label"
890
+ [control]="getControl(column.name)"
891
+ [disabled]="column.disabled || false"
892
+ (valueChange)="handleFieldChange(column.name, $event)"
893
+ >
894
+ </fv-checkbox>
895
+ </ng-container>
896
+
897
+ <ng-container *ngIf="column.type === 'radio' && !column.hidden">
898
+ <fv-radio-group
899
+ [label]="column.label"
900
+ [options]="column.options || []"
901
+ [control]="getControl(column.name)"
902
+ [disabled]="column.disabled || false"
903
+ (valueChange)="handleFieldChange(column.name, $event)"
904
+ >
905
+ </fv-radio-group>
906
+ </ng-container>
907
+
908
+ <ng-container *ngIf="column.type === 'date' && !column.hidden">
909
+ <fv-date-field
910
+ [label]="column.label"
911
+ [control]="getControl(column.name)"
912
+ [schema]="getSchema(column)"
913
+ [disabled]="column.disabled || false"
914
+ (valueChange)="handleFieldChange(column.name, $event)"
915
+ >
916
+ </fv-date-field>
917
+ </ng-container>
918
+
919
+ <ng-container
920
+ *ngIf="column.type === 'month-year' && !column.hidden"
921
+ >
922
+ <fv-month-year-field
923
+ [label]="column.label"
924
+ [control]="getControl(column.name)"
925
+ [schema]="getSchema(column)"
926
+ [disabled]="column.disabled || false"
927
+ (valueChange)="handleMonthYearChange(column.name, $event)"
928
+ >
929
+ </fv-month-year-field>
930
+ </ng-container>
931
+
932
+ <ng-container
933
+ *ngIf="column.type === 'textarea' && !column.hidden"
934
+ >
935
+ <fv-rich-text-editor
936
+ [label]="column.label"
937
+ [placeholder]="column.placeholder || ''"
938
+ [control]="getControl(column.name)"
939
+ [schema]="getSchema(column)"
940
+ [disabled]="column.disabled || false"
941
+ (valueChange)="handleFieldChange(column.name, $event)"
942
+ >
943
+ </fv-rich-text-editor>
944
+ </ng-container>
945
+
946
+ <ng-container *ngIf="column.type === 'file' && !column.hidden">
947
+ <ng-container *ngIf="isImageField(column); else standardFile">
948
+ <fv-image-selector
949
+ [label]="column.label"
950
+ [placeholder]="column.placeholder || 'Select image'"
951
+ [control]="getControl(column.name)"
952
+ [schema]="getSchema(column)"
953
+ [disabled]="column.disabled || false"
954
+ (valueChange)="onFileChange($event, column.name)"
955
+ >
956
+ </fv-image-selector>
957
+ </ng-container>
958
+
959
+ <ng-template #standardFile>
960
+ <fv-file-selector
961
+ [label]="column.label"
962
+ [placeholder]="column.placeholder || 'Select file'"
963
+ [accept]="column.accept || '*/*'"
964
+ [control]="getControl(column.name)"
965
+ [schema]="getSchema(column)"
966
+ [disabled]="column.disabled || false"
967
+ (valueChange)="onFileChange($event, column.name)"
968
+ >
969
+ </fv-file-selector>
970
+ </ng-template>
971
+ </ng-container>
972
+
973
+ <ng-container
974
+ *ngIf="column.type === 'name-code' && !column.hidden"
975
+ >
976
+ <fv-name-code
977
+ [label]="column.label"
978
+ [placeholder]="column.placeholder || 'Search by Code or Name'"
979
+ [options]="column.options ? mapSearchOptions(column.options) : []"
980
+ [control]="getControl(column.name)"
981
+ [schema]="getSchema(column)"
982
+ [disabled]="column.disabled || false"
983
+ >
984
+ </fv-name-code>
985
+ </ng-container>
986
+
987
+ <ng-container *ngIf="column.type === 'phone' && !column.hidden">
988
+ <fv-phone-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-phone-field>
989
+ </ng-container>
990
+
991
+ <ng-container *ngIf="column.type === 'uan' && !column.hidden">
992
+ <fv-uan-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-uan-field>
993
+ </ng-container>
994
+
995
+ <ng-container *ngIf="column.type === 'pf' && !column.hidden">
996
+ <fv-pf-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-pf-field>
997
+ </ng-container>
998
+
999
+ <ng-container *ngIf="column.type === 'esi' && !column.hidden">
1000
+ <fv-esi-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-esi-field>
1001
+ </ng-container>
1002
+
1003
+ <ng-container *ngIf="column.type === 'ifsc' && !column.hidden">
1004
+ <fv-ifsc-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-ifsc-field>
1005
+ </ng-container>
1006
+
1007
+ <ng-container *ngIf="column.type === 'micr' && !column.hidden">
1008
+ <fv-micr-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-micr-field>
1009
+ </ng-container>
1010
+
1011
+ <ng-container *ngIf="column.type === 'iban' && !column.hidden">
1012
+ <fv-iban-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-iban-field>
1013
+ </ng-container>
1014
+ </div>
1015
+ </ng-container>
1016
+ </div>
1017
+ </div>
1018
+
1019
+
1020
+ <div class="form-actions">
1021
+ <button
1022
+ type="submit"
1023
+ class="btn btn-primary"
1024
+ [disabled]="form.invalid && submitted"
1025
+ >
1026
+ {{ config.submitLabel || 'Save' }}
1027
+ </button>
1028
+ <button
1029
+ type="button"
1030
+ class="btn btn-outline"
1031
+ (click)="config.onCancel()"
1032
+ >
1033
+ {{ config.cancelLabel || 'Cancel' }}
1034
+ </button>
1035
+ </div>
1036
+ </form>
1037
+ </div>
1038
+ `, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins!important}.form-container{background:#f5f5f5;padding:10px;border-radius:8px;margin:0 auto;max-width:100%;box-sizing:border-box}.error-border{border-color:red!important}.hidden{display:none!important}.form-header{margin-bottom:10px}.form-header h2{margin:0;font-size:20px;font-weight:700;color:#303030}.dynamic-form{background:#fff;padding:10px;border-radius:6px;box-shadow:0 1px 3px #0000001a;max-width:100%;box-sizing:border-box}.form-section{margin-bottom:10px}.section-title{font-size:16px;font-weight:700;color:#303030;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.fields-row{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;width:100%;box-sizing:border-box;overflow:visible}.form-field-wrapper{display:flex;position:relative;flex-direction:column;min-width:0;width:100%;box-sizing:border-box;overflow:visible}.password-toggle-btn{position:absolute;right:10px;top:32px;background:none;border:none;cursor:pointer;padding:4px;color:#666}.password-toggle-btn:hover{color:#333}.password-toggle-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}@media (min-width: 1200px) and (max-width: 1400px){.fields-row{grid-template-columns:repeat(5,1fr)}.form-control{width:180px;max-width:180px}}@media (max-width: 1200px){.fields-row{grid-template-columns:repeat(3,1fr)}.form-control{width:100%;max-width:100%}}@media (max-width: 992px){.fields-row{grid-template-columns:repeat(2,1fr);gap:12px}}@media (max-width: 768px){.fields-row{grid-template-columns:repeat(2,1fr);gap:10px}}@media (max-width: 640px){.fields-row{grid-template-columns:1fr;gap:12px}.form-field-wrapper{width:100%}}label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px}.required{color:#e74c3c;margin-left:2px}.form-control{padding:5px 10px;width:100%;max-width:100%;border:1px solid #8CBBA8;border-radius:8px;background-color:#fff;font-size:14px;font-weight:400;font-family:inherit;color:#1f2b41;transition:border-color .2s,box-shadow .2s;box-sizing:border-box}.form-control:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.form-control:disabled{background-color:#ecf0f1;cursor:not-allowed}textarea.form-control{resize:vertical;min-height:100px}select.form-control{cursor:pointer;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;padding-right:40px}.checkbox-wrapper{display:flex;align-items:center;gap:8px}input[type=checkbox]{width:18px;height:18px;cursor:pointer}.checkbox-label{cursor:pointer;margin:0}.file-upload-container{display:flex;align-items:center;gap:20px;padding:20px;background:#fff;max-width:100%;box-sizing:border-box;flex-wrap:wrap}.material-icons{font-family:Material Icons!important;border-radius:4px;display:inline-block;width:40px;padding:8px;height:40px}.file-field-wrapper{width:100%;margin-top:16px;max-width:100%;box-sizing:border-box}.photo-preview-circle{width:100px;height:100px;border-radius:50%;overflow:hidden;border:2px solid #ddd;cursor:pointer;transition:border-color .2s}.photo-preview-circle:hover{border-color:#3498db}.preview-image,.default-photo{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.preview-image img{width:100%;height:100%;object-fit:cover}.default-photo{background:#f0f0f0;color:#999;font-size:40px}.file-info{display:flex;flex-direction:column;gap:8px}.btn-delete{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:0}.upload-btn-group{display:flex;align-items:center;border:1px solid #d3d3d3;border-radius:8px;background:#fff;overflow:hidden;width:fit-content}.btn-upload{background:#fff;color:#222;border:none;padding:0 18px;font-size:16px;border-right:1px solid #e0e0e0;border-radius:8px 0 0 8px;outline:none;box-shadow:none;cursor:pointer;height:40px;transition:background .2s}.btn-upload-icon{background:#f5f5f5;border:none;border-radius:0 8px 8px 0;display:flex;align-items:center;justify-content:center;width:48px;height:40px;cursor:pointer;transition:background .2s}.btn-upload-icon i.material-icons{font-size:22px;color:#222}.btn-upload:hover,.btn-upload-icon:hover{background:#f0f0f0}.btn-delete{background:#fff;color:red}.btn-delete:hover{background:#f0f0f0}.file-name{font-size:12px;color:#666;margin:10px 8px 8px}.file-label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px;display:block}.radio-label{font-weight:600;margin-bottom:15px;color:#151d48;font-size:14px;display:block}.radio-group{display:flex;gap:20px;align-items:center}.radio-item{display:flex;align-items:center;gap:6px}input[type=radio]{width:18px;height:18px;cursor:pointer;accent-color:#3498db}.radio-option-label{cursor:pointer;margin:0;font-weight:400}.hint{font-size:12px;color:#7f8c8d;margin-top:4px}.error-message{color:#e74c3c;font-size:12px;margin-top:4px}.form-actions{display:flex;gap:8px;align-items:center;justify-content:space-between;gap:12px;padding-top:5px}.btn{padding:8px 20px;border:none;border-radius:7px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s}.btn-primary{background-color:#006aff;color:#fff}.btn-primary:hover:not(:disabled){background-color:#2980b9}.btn-primary:disabled{background-color:#bdc3c7;cursor:not-allowed}.btn-secondary{background-color:#95a5a6;color:#fff}.btn-secondary:hover{background-color:#7f8c8d}.btn-outline{background-color:#303030;color:#fff}.btn-outline:hover{background-color:#2b2b2b;color:#fff}.month-year-wrapper{position:relative;display:flex;align-items:center;width:100%}.month-year-wrapper .form-control{padding-right:45px}.month-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0;border:none;padding:0;margin:0}.month-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.month-picker-btn:hover:not(:disabled){color:#3498db}.month-picker-btn:disabled{cursor:not-allowed;opacity:.5}.month-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}.search-select-wrapper{position:relative;width:100%}.search-select-input{padding-right:10px}.search-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:auto;min-width:100%;max-width:calc(100vw - 16px);background:#fff;border:1px solid #d3d3d3;border-radius:8px;max-height:220px;overflow-y:auto;box-shadow:0 4px 10px #00000014;z-index:5;padding:6px 0;transform:translate(0);transition:transform .1s ease-out}.search-select-option{padding:8px 12px;cursor:pointer;display:flex;gap:8px;align-items:center;border-bottom:1px solid #f2f2f2}.search-select-option:last-child{border-bottom:none}.search-select-option:hover{background:#f5f9ff}.option-code{color:#0052cc;font-weight:700;min-width:90px}.option-name{color:#151d48;font-weight:500}.time-picker-wrapper{position:relative;display:flex;align-items:center;width:100%}.time-input{padding-right:45px;flex:1}.time-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.time-picker-btn:hover:not(:disabled){color:#3498db}.time-picker-btn:disabled{cursor:not-allowed;opacity:.5}.time-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}input[type=time]{cursor:pointer}input[type=time]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:0;position:absolute;right:0;width:100%;height:100%}.date-picker-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-form-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-text-field-wrapper{background-color:#fff}.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__trailing{border-color:#3498db}.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:red!important}.date-picker-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.date-picker-field ::ng-deep .mat-mdc-form-field-input-control input{font-family:Poppins!important;font-size:14px;font-weight:400;color:#1f2b41}\n"] }]
1039
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ElementRef }], propDecorators: { config: [{
1040
+ type: Input
1041
+ }], validationError: [{
1042
+ type: Output
1043
+ }] } });
1044
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVwZGF0ZS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z2LWNvbnRyb2xzL3NyYy9saWIvYWRkLXVwZGF0ZS1mb3JtL2FkZC11cGRhdGUtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEVBLCtCQUErQjtBQUMvQixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELDhCQUE4QjtBQUM5QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUs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QUFNIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRmllbGRUeXBlID1cclxuICB8ICd0ZXh0J1xyXG4gIHwgJ2VtYWlsJ1xyXG4gIHwgJ251bWJlcidcclxuICB8ICdzZWxlY3QnXHJcbiAgfCAnbmFtZS1jb2RlJ1xyXG4gIHwgJ2NoZWNrYm94J1xyXG4gIHwgJ3RleHRhcmVhJ1xyXG4gIHwgJ2RhdGUnXHJcbiAgfCAncGFzc3dvcmQnXHJcbiAgfCAncmFkaW8nXHJcbiAgfCAnZmlsZSdcclxuICB8ICdtb250aC15ZWFyJ1xyXG4gIHwgJ3Bob25lJ1xyXG4gIHwgJ3VhbidcclxuICB8ICdwZidcclxuICB8ICdlc2knXHJcbiAgfCAnaWZzYydcclxuICB8ICdtaWNyJ1xyXG4gIHwgJ2liYW4nO1xyXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uVHlwZSA9XHJcbiAgfCAncmVxdWlyZWQnXHJcbiAgfCAnZW1haWwnXHJcbiAgfCAnbWluTGVuZ3RoJ1xyXG4gIHwgJ21heExlbmd0aCdcclxuICB8ICdwYXR0ZXJuJ1xyXG4gIHwgJ21pbidcclxuICB8ICdtYXgnXHJcbiAgfCAnY3VzdG9tJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRWYWxpZGF0aW9uIHtcclxuICB0eXBlOiBWYWxpZGF0aW9uVHlwZTtcclxuICB2YWx1ZT86IGFueTsgLy8gRm9yIG1pbkxlbmd0aCwgbWF4TGVuZ3RoLCBtaW4sIG1heCwgcGF0dGVyblxyXG4gIG1lc3NhZ2U/OiBzdHJpbmc7IC8vIEN1c3RvbSBlcnJvciBtZXNzYWdlXHJcbiAgdmFsaWRhdG9yPzogKHZhbHVlOiBhbnksIGZvcm1Hcm91cD86IEZvcm1Hcm91cCkgPT4gYm9vbGVhbjsgLy8gRm9yIGN1c3RvbSB2YWxpZGF0aW9uXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbHVtbiB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdHlwZTogRmllbGRUeXBlO1xyXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICBvcHRpb25zPzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogYW55IH1bXTsgLy8gRm9yIHNlbGVjdCBmaWVsZHNcclxuICB2YWxpZGF0aW9ucz86IEZpZWxkVmFsaWRhdGlvbltdO1xyXG4gIHZhbHVlPzogYW55OyAvLyBEZWZhdWx0IHZhbHVlXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIGNsYXNzTmFtZT86IHN0cmluZztcclxuICBoaWRkZW4/OiBib29sZWFuO1xyXG4gIGhpbnQ/OiBzdHJpbmc7XHJcbiAgY29sU3Bhbj86IG51bWJlcjtcclxuICBvbkNoYW5nZT86ICh2YWx1ZTogYW55LCBmb3JtR3JvdXA6IEZvcm1Hcm91cCkgPT4gdm9pZDtcclxuICBhY2NlcHQ/OiBzdHJpbmc7IC8vIEZvciBmaWxlIGlucHV0IChlLmcuLCAnaW1hZ2UvKicpXHJcbiAgZmlsZVByZXZpZXc/OiBib29sZWFuOyAvLyBTaG93IGltYWdlIHByZXZpZXdgXHJcbiAgc2hvd1RpbWVQaWNrZXI/OiBib29sZWFuOyAvLyBTaG93IHRpbWUgcGlja2VyIGZvciB0ZXh0IGZpZWxkc1xyXG4gIGFsbG93QWxwaGFiZXRzT25seT86IGJvb2xlYW47XHJcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TZWN0aW9uIHtcclxuICB0aXRsZT86IHN0cmluZzsgLy8gU2VjdGlvbiBoZWFkaW5nIChlLmcuLCBcIlBFUlNPTkFMIElORk9STUFUSU9OXCIpXHJcbiAgZmllbGRzOiBGb3JtQ29sdW1uW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbmZpZyB7XHJcbiAgc2VjdGlvbnM6IEZvcm1TZWN0aW9uW107XHJcbiAgc3VibWl0TGFiZWw/OiBzdHJpbmc7XHJcbiAgcmVzZXRMYWJlbD86IHN0cmluZztcclxuICBvblN1Ym1pdDogKGRhdGE6IGFueSkgPT4gdm9pZDtcclxuICBvblJlc2V0PzogKCkgPT4gdm9pZDtcclxuICBvbkNhbmNlbDogKCkgPT4gdm9pZDtcclxuICBjYW5jZWxMYWJlbD86IHN0cmluZztcclxuICBmb3JtVGl0bGU/OiBzdHJpbmc7XHJcbiAgbWF4Q29sc1BlclJvdz86IG51bWJlcjtcclxufVxyXG5cclxuLy8gYWRkLXVwZGF0ZS1mb3JtLmNvbXBvbmVudC50c1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBFbGVtZW50UmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG4vLyBJbXBvcnQgeW91ciBsaWJyYXJ5IG1vZHVsZXNcclxuaW1wb3J0IHsgRnZFbnRyeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZW50cnktZmllbGQvZnYtZW50cnktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZOdW1iZXJGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LW51bWJlci1maWVsZC9mdi1udW1iZXItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWRyb3Bkb3duL2Z2LWRyb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2UmFkaW9Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LXJhZGlvLWdyb3VwL2Z2LXJhZGlvLWdyb3VwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9mdi1jaGVja2JveC9mdi1jaGVja2JveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGdkRhdGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWRhdGUtZmllbGQvZnYtZGF0ZS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGdk1vbnRoWWVhckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtbW9udGgteWVhci1maWVsZC9mdi1tb250aC15ZWFyLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2RmlsZVNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZmlsZS1zZWxlY3Rvci9mdi1maWxlLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2SW1hZ2VTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWltYWdlLXNlbGVjdG9yL2Z2LWltYWdlLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2UmljaFRleHRFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi9mdi1yaWNoLXRleHQtZWRpdG9yL2Z2LXJpY2gtdGV4dC1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZOYW1lQ29kZUNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LW5hbWUtY29kZS9mdi1uYW1lLWNvZGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQaG9uZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGhvbmUtZmllbGQvZnYtcGhvbmUtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZVYW5GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LXVhbi1maWVsZC9mdi11YW4tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQZkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGYtZmllbGQvZnYtcGYtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZFc2lGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWVzaS1maWVsZC9mdi1lc2ktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJZnNjRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pZnNjLWZpZWxkL2Z2LWlmc2MtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZNaWNyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1taWNyLWZpZWxkL2Z2LW1pY3ItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJYmFuRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pYmFuLWZpZWxkL2Z2LWliYW4tZmllbGQuY29tcG9uZW50JztcclxuXHJcbi8vIEltcG9ydCBWYWxpZGF0aW9uIFR5cGVzXHJcbmltcG9ydCB7IFZhbGlkYXRpb25TY2hlbWEsIFZhbGlkYXRpb25SdWxlIH0gZnJvbSAnQGZvdmVzdHRhL3ZhbGlkYXRpb24tZW5naW5lJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWRkLXVwZGF0ZS1mb3JtJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBGdkVudHJ5RmllbGRDb21wb25lbnQsXHJcbiAgICBGdk51bWJlckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZEcm9wZG93bkNvbXBvbmVudCxcclxuICAgIEZ2UmFkaW9Hcm91cENvbXBvbmVudCxcclxuICAgIEZ2Q2hlY2tib3hDb21wb25lbnQsXHJcbiAgICBGdkRhdGVGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2TW9udGhZZWFyRmllbGRDb21wb25lbnQsXHJcbiAgICBGdkZpbGVTZWxlY3RvckNvbXBvbmVudCxcclxuICAgIEZ2SW1hZ2VTZWxlY3RvckNvbXBvbmVudCxcclxuICAgIEZ2UmljaFRleHRFZGl0b3JDb21wb25lbnQsXHJcbiAgICBGdlJpY2hUZXh0RWRpdG9yQ29tcG9uZW50LFxyXG4gICAgRnZOYW1lQ29kZUNvbXBvbmVudCxcclxuICAgIEZ2UGhvbmVGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2VWFuRmllbGRDb21wb25lbnQsXHJcbiAgICBGdlBmRmllbGRDb21wb25lbnQsXHJcbiAgICBGdkVzaUZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZJZnNjRmllbGRDb21wb25lbnQsXHJcbiAgICBGdk1pY3JGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2SWJhbkZpZWxkQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oZWFkZXJcIiAqbmdJZj1cImNvbmZpZy5mb3JtVGl0bGVcIj5cclxuICAgICAgICA8aDI+e3sgY29uZmlnLmZvcm1UaXRsZSB9fTwvaDI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cImhhbmRsZVN1Ym1pdCgpXCIgY2xhc3M9XCJkeW5hbWljLWZvcm1cIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGNvbmZpZy5zZWN0aW9uc1wiIGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCIgKm5nSWY9XCJzZWN0aW9uLnRpdGxlXCI+XHJcbiAgICAgICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cclxuICAgICAgICAgIDwvaDM+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcy1yb3dcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHNlY3Rpb24uZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLXdyYXBwZXJcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ2ZpZWxkLScgKyBjb2x1bW4udHlwZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2x1bW4uaGlkZGVuID8geyBkaXNwbGF5OiAnbm9uZScgfSA6IHt9XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCInc3BhbiAnICsgKGNvbHVtbi5jb2xTcGFuIHx8IDEpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyd0ZXh0JywgJ2VtYWlsJywgJ3Bhc3N3b3JkJ10uaW5jbHVkZXMoY29sdW1uLnR5cGUpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5oaWRkZW5cclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWVudHJ5LWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4udHlwZSA9PT0gJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2x1bW4udHlwZSA9PT0gJ2VtYWlsJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdlbWFpbCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiAndGV4dCdcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthbGxvd0FscGhhYmV0c09ubHldPVwiY29sdW1uLmFsbG93QWxwaGFiZXRzT25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCJjb2x1bW4ubWF4TGVuZ3RoIHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1lbnRyeS1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ251bWJlcicgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbnVtYmVyLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1udW1iZXItZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdzZWxlY3QnICYmICFjb2x1bW4uaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IG9wdGlvbidcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zIHx8IFtdXCJcclxuICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZUZpZWxkQ2hhbmdlKGNvbHVtbi5uYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8L2Z2LWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnY2hlY2tib3gnICYmICFjb2x1bW4uaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ3JhZGlvJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcmFkaW8tZ3JvdXBcclxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW4ub3B0aW9ucyB8fCBbXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1yYWRpby1ncm91cD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2RhdGUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1kYXRlLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1kYXRlLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnbW9udGgteWVhcicgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbW9udGgteWVhci1maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlTW9udGhZZWFyQ2hhbmdlKGNvbHVtbi5uYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8L2Z2LW1vbnRoLXllYXItZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICd0ZXh0YXJlYScgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcmljaC10ZXh0LWVkaXRvclxyXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4ucGxhY2Vob2xkZXIgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlRmllbGRDaGFuZ2UoY29sdW1uLm5hbWUsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDwvZnYtcmljaC10ZXh0LWVkaXRvcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0ltYWdlRmllbGQoY29sdW1uKTsgZWxzZSBzdGFuZGFyZEZpbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZnYtaW1hZ2Utc2VsZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGltYWdlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQsIGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZnYtaW1hZ2Utc2VsZWN0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdGFuZGFyZEZpbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZ2LWZpbGUtc2VsZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGZpbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRdPVwiY29sdW1uLmFjY2VwdCB8fCAnKi8qJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQsIGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZnYtZmlsZS1zZWxlY3Rvcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ25hbWUtY29kZScgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbmFtZS1jb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VhcmNoIGJ5IENvZGUgb3IgTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zID8gbWFwU2VhcmNoT3B0aW9ucyhjb2x1bW4ub3B0aW9ucykgOiBbXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDwvZnYtbmFtZS1jb2RlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAncGhvbmUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1waG9uZS1maWVsZCBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvZnYtcGhvbmUtZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICd1YW4nICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi11YW4tZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LXVhbi1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ3BmJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcGYtZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LXBmLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnZXNpJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtZXNpLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIiBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9mdi1lc2ktZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdpZnNjJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtaWZzYy1maWVsZCBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvZnYtaWZzYy1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ21pY3InICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1taWNyLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIiBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9mdi1taWNyLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnaWJhbicgJiYgIWNvbHVtbi5oaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWliYW4tZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LWliYW4tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnNcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCAmJiBzdWJtaXR0ZWRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBjb25maWcuc3VibWl0TGFiZWwgfHwgJ1NhdmUnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpZy5vbkNhbmNlbCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgY29uZmlnLmNhbmNlbExhYmVsIHx8ICdDYW5jZWwnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9mb3JtPlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IGBcclxuXHJcbiAgQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9UG9wcGluczp3Z2h0QDMwMDs0MDA7NTAwOzYwMDs3MDAmZGlzcGxheT1zd2FwJyk7XHJcbiAgQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vaWNvbj9mYW1pbHk9TWF0ZXJpYWwrSWNvbnMnKTtcclxuICAgICp7XHJcbiAgICAgIGZvbnQtZmFtaWx5OiBcIlBvcHBpbnNcIiAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgLmZvcm0tY29udGFpbmVyIHtcclxuICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcclxuICAgICAgcGFkZGluZzogMTBweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICBtYXJnaW46IDAgYXV0bztcclxuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgfVxyXG5cclxuICAgIC5lcnJvci1ib3JkZXIge1xyXG4gICAgIGJvcmRlci1jb2xvcjogcmVkICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmhpZGRlbntcclxuICAgICAgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmZvcm0taGVhZGVyIHtcclxuICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1oZWFkZXIgaDIge1xyXG4gICAgICBtYXJnaW46IDA7XHJcbiAgICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcclxuICAgICAgY29sb3I6ICMzMDMwMzA7XHJcbiAgICB9XHJcblxyXG4gICAgLmR5bmFtaWMtZm9ybSB7XHJcbiAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbiAgICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1zZWN0aW9uIHtcclxuICAgICAgbWFyZ2luLWJvdHRvbToxMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWN0aW9uLXRpdGxlIHtcclxuICAgICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgICBmb250LXdlaWdodDogNzAwO1xyXG4gICAgICBjb2xvcjogIzMwMzAzMDtcclxuICAgICAgbWFyZ2luOiAwIDAgMTZweCAwO1xyXG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xyXG4gICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmZpZWxkcy1yb3cge1xyXG4gICAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg1LDFmcik7XHJcbiAgICAgIGdhcDogMTZweDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5mb3JtLWZpZWxkLXdyYXBwZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIG1pbi13aWR0aDogMDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5wYXNzd29yZC10b2dnbGUtYnRuIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgcmlnaHQ6IDEwcHg7XHJcbiAgdG9wOiAzMnB4O1xyXG4gIGJhY2tncm91bmQ6IG5vbmU7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICBwYWRkaW5nOiA0cHg7XHJcbiAgY29sb3I6ICM2NjY7XHJcbn1cclxuXHJcbi5wYXNzd29yZC10b2dnbGUtYnRuOmhvdmVyIHtcclxuICBjb2xvcjogIzMzMztcclxufVxyXG5cclxuLnBhc3N3b3JkLXRvZ2dsZS1idG4gLm1hdGVyaWFsLWljb25zIHtcclxuICBmb250LXNpemU6IDIwcHg7XHJcbiAgd2lkdGg6IGF1dG87XHJcbiAgaGVpZ2h0OiBhdXRvO1xyXG4gIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSBhbmQgKG1heC13aWR0aDogMTQwMHB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg1LDFmcik7XHJcbiAgICAgIH1cclxuICAgICAgLmZvcm0tY29udHJvbCB7XHJcbiAgICAgICAgd2lkdGg6IDE4MHB4O1xyXG4gICAgICAgIG1heC13aWR0aDogMTgwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLDFmcik7XHJcbiAgICAgIH1cclxuICAgICAgLmZvcm0tY29udHJvbCB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDk5MnB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLDFmcik7XHJcbiAgICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLDFmcik7XHJcbiAgICAgICAgZ2FwOiAxMHB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcclxuICAgICAgICBnYXA6IDEycHg7XHJcbiAgICAgIH1cclxuICAgICAgLmZvcm0tZmllbGQtd3JhcHBlciB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsYWJlbCB7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIG1hcmdpbi1ib3R0b206IDZweDtcclxuICAgICAgY29sb3I6ICMxNTFENDg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIH1cclxuXHJcbiAgICAucmVxdWlyZWQge1xyXG4gICAgICBjb2xvcjogI2U3NGMzYztcclxuICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1jb250cm9sIHtcclxuICAgICAgcGFkZGluZzogNXB4IDEwcHg7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM4Q0JCQTg7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcclxuICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcclxuICAgICAgY29sb3I6ICMxZjJiNDE7XHJcbiAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzLCBib3gtc2hhZG93IDAuMnM7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICB9XHJcblxyXG4gICAgLmZvcm0tY29udHJvbDpmb2N1cyB7XHJcbiAgICAgIG91dGxpbmU6IG5vbmU7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzM0OThkYjtcclxuICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYmEoNTIsIDE1MiwgMjE5LCAwLjEpO1xyXG4gICAgfVxyXG5cclxuICAgIC5mb3JtLWNvbnRyb2w6ZGlzYWJsZWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNmMGYxO1xyXG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHRleHRhcmVhLmZvcm0tY29udHJvbCB7XHJcbiAgICAgIHJlc2l6ZTogdmVydGljYWw7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDEwMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdC5mb3JtLWNvbnRyb2wge1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XHJcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHZpZXdCb3g9JzAgMCAxMiAxMiclM0UlM0NwYXRoIGZpbGw9JyUyMzMzMycgZD0nTTYgOUwxIDRoMTB6Jy8lM0UlM0Mvc3ZnJTNFXCIpO1xyXG4gICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCA4cHggY2VudGVyO1xyXG4gICAgICBwYWRkaW5nLXJpZ2h0OiA0MHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGVja2JveC13cmFwcGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiA4cHg7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcclxuICAgICAgd2lkdGg6IDE4cHg7XHJcbiAgICAgIGhlaWdodDogMThweDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGVja2JveC1sYWJlbCB7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgbWFyZ2luOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5maWxlLXVwbG9hZC1jb250YWluZXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDIwcHg7XHJcbiAgcGFkZGluZzogMjBweDtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICBmbGV4LXdyYXA6IHdyYXA7XHJcbn1cclxuXHJcbi5tYXRlcmlhbC1pY29ucyB7XHJcbiAgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgIWltcG9ydGFudDtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHdpZHRoOiA0MHB4O1xyXG4gIHBhZGRpbmc6IDhweDtcclxuICBoZWlnaHQ6IDQwcHg7XHJcbn1cclxuXHJcbi5maWxlLWZpZWxkLXdyYXBwZXIge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIG1hcmdpbi10b3A6IDE2cHg7XHJcbiAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbn1cclxuXHJcbi5waG90by1wcmV2aWV3LWNpcmNsZSB7XHJcbiAgd2lkdGg6IDEwMHB4O1xyXG4gIGhlaWdodDogMTAwcHg7XHJcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgYm9yZGVyOiAycHggc29saWQgI2RkZDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnM7XHJcbn1cclxuXHJcbi5waG90by1wcmV2aWV3LWNpcmNsZTpob3ZlciB7XHJcbiAgYm9yZGVyLWNvbG9yOiAjMzQ5OGRiO1xyXG59XHJcblxyXG4ucHJldmlldy1pbWFnZSwgLmRlZmF1bHQtcGhvdG8ge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbn1cclxuXHJcbi5wcmV2aWV3LWltYWdlIGltZyB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIG9iamVjdC1maXQ6IGNvdmVyO1xyXG59XHJcblxyXG4uZGVmYXVsdC1waG90byB7XHJcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcclxuICBjb2xvcjogIzk5OTtcclxuICBmb250LXNpemU6IDQwcHg7XHJcbn1cclxuXHJcbi5maWxlLWluZm8ge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBnYXA6IDhweDtcclxufVxyXG4uYnRuLWRlbGV0ZSB7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgZm9udC1zaXplOiAxNHB4O1xyXG4gIHBhZGRpbmc6IDBweDtcclxufVxyXG5cclxuLnVwbG9hZC1idG4tZ3JvdXAge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzO1xyXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICBiYWNrZ3JvdW5kOiAjZmZmO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xyXG59XHJcblxyXG4uYnRuLXVwbG9hZCB7XHJcbiAgYmFja2dyb3VuZDogI2ZmZjtcclxuICBjb2xvcjogIzIyMjtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgcGFkZGluZzogMCAxOHB4O1xyXG4gIGZvbnQtc2l6ZTogMTZweDtcclxuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTBlMGUwO1xyXG4gIGJvcmRlci1yYWRpdXM6IDhweCAwIDAgOHB4O1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgYm94LXNoYWRvdzogbm9uZTtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgaGVpZ2h0OiA0MHB4O1xyXG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycztcclxufVxyXG5cclxuLmJ0bi11cGxvYWQtaWNvbiB7XHJcbiAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYm9yZGVyLXJhZGl1czogMCA4cHggOHB4IDA7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIHdpZHRoOiA0OHB4O1xyXG4gIGhlaWdodDogNDBweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzO1xyXG59XHJcblxyXG4uYnRuLXVwbG9hZC1pY29uIGkubWF0ZXJpYWwtaWNvbnMge1xyXG4gIGZvbnQtc2l6ZTogMjJweDtcclxuICBjb2xvcjogIzIyMjtcclxufVxyXG5cclxuLmJ0bi11cGxvYWQ6aG92ZXIsIC5idG4tdXBsb2FkLWljb246aG92ZXIge1xyXG4gIGJhY2tncm91bmQ6ICNmMGYwZjA7XHJcbn1cclxuXHJcbi5idG4tZGVsZXRlIHtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICBjb2xvcjogcmVkO1xyXG59XHJcblxyXG4uYnRuLWRlbGV0ZTpob3ZlciB7XHJcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcclxufVxyXG5cclxuLmZpbGUtbmFtZSB7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIG1hcmdpbjogOHB4O1xyXG4gIG1hcmdpbi10b3A6IDEwcHg7XHJcbn1cclxuXHJcbi5maWxlLWxhYmVsIHtcclxuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcbiAgICBjb2xvcjogIzE1MWQ0ODtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICBkaXNwbGF5OiBibG9jaztcclxufVxyXG5cclxuICAgIC5yYWRpby1sYWJlbCB7XHJcbiAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xyXG4gIGNvbG9yOiAjMTUxRDQ4O1xyXG4gIGZvbnQtc2l6ZTogMTRweDtcclxuICBkaXNwbGF5OiBibG9jaztcclxufVxyXG5cclxuLnJhZGlvLWdyb3VwIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGdhcDogMjBweDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcblxyXG4ucmFkaW8taXRlbSB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogNnB4O1xyXG59XHJcblxyXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0ge1xyXG4gIHdpZHRoOiAxOHB4O1xyXG4gIGhlaWdodDogMThweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgYWNjZW50LWNvbG9yOiAjMzQ5OGRiO1xyXG59XHJcblxyXG4ucmFkaW8tb3B0aW9uLWxhYmVsIHtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbn1cclxuXHJcbiAgICAuaGludCB7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgY29sb3I6ICM3ZjhjOGQ7XHJcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcclxuICAgIH1cclxuXHJcbiAgICAuZXJyb3ItbWVzc2FnZSB7XHJcbiAgICAgIGNvbG9yOiAjZTc0YzNjO1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1hY3Rpb25zIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZ2FwOiA4cHg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICBwYWRkaW5nLXRvcDogNXB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4ge1xyXG4gICAgICBwYWRkaW5nOiA4cHggMjBweDtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA3cHg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXByaW1hcnkge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2QUZGO1xyXG4gICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1wcmltYXJ5OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzI5ODBiOTtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXByaW1hcnk6ZGlzYWJsZWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmRjM2M3O1xyXG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tc2Vjb25kYXJ5IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNjtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tc2Vjb25kYXJ5OmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzdmOGM4ZDtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLW91dGxpbmUge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzAzMDMwO1xyXG4gICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1vdXRsaW5lOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzJiMmIyYmZmO1xyXG4gICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXllYXItd3JhcHBlciB7XHJcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXllYXItd3JhcHBlciAuZm9ybS1jb250cm9sIHtcclxuICAgICAgcGFkZGluZy1yaWdodDogNDVweDtcclxuICAgIH1cclxuXHJcbiAgICAubW9udGgtcGlja2VyLWhpZGRlbiB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgb3BhY2l0eTogMDtcclxuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbiAgICAgIHdpZHRoOiAwO1xyXG4gICAgICBoZWlnaHQ6IDA7XHJcbiAgICAgIGJvcmRlcjogbm9uZTtcclxuICAgICAgcGFkZGluZzogMDtcclxuICAgICAgbWFyZ2luOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb250aC1waWNrZXItYnRuIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICByaWdodDogNXB4O1xyXG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDVweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIGNvbG9yOiAjNjY2O1xyXG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xyXG4gICAgICB6LWluZGV4OiAxO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb250aC1waWNrZXItYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcclxuICAgICAgY29sb3I6ICMzNDk4ZGI7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXBpY2tlci1idG46ZGlzYWJsZWQge1xyXG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgICBvcGFjaXR5OiAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXBpY2tlci1idG4gLm1hdGVyaWFsLWljb25zIHtcclxuICAgICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgICB3aWR0aDogYXV0bztcclxuICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICBwYWRkaW5nOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWFyY2gtc2VsZWN0LXdyYXBwZXIge1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWFyY2gtc2VsZWN0LWlucHV0IHtcclxuICAgICAgcGFkZGluZy1yaWdodDogMTBweDtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLXNlbGVjdC1kcm9wZG93biB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgdG9wOiBjYWxjKDEwMCUgKyA0cHgpO1xyXG4gICAgICBsZWZ0OiAwO1xyXG4gICAgICByaWdodDogYXV0bztcclxuICAgICAgbWluLXdpZHRoOiAxMDAlO1xyXG4gICAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSAxNnB4KTtcclxuICAgICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkM2QzZDM7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgICAgbWF4LWhlaWdodDogMjIwcHg7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEwcHggcmdiYSgwLDAsMCwwLjA4KTtcclxuICAgICAgei1pbmRleDogNTtcclxuICAgICAgcGFkZGluZzogNnB4IDA7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcclxuICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMXMgZWFzZS1vdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnNlYXJjaC1zZWxlY3Qtb3B0aW9uIHtcclxuICAgICAgcGFkZGluZzogOHB4IDEycHg7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZ2FwOiA4cHg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjJmMmYyO1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWFyY2gtc2VsZWN0LW9wdGlvbjpsYXN0LWNoaWxkIHtcclxuICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLXNlbGVjdC1vcHRpb246aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kOiAjZjVmOWZmO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tY29kZSB7XHJcbiAgICAgIGNvbG9yOiAjMDA1MmNjO1xyXG4gICAgICBmb250LXdlaWdodDogNzAwO1xyXG4gICAgICBtaW4td2lkdGg6IDkwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1uYW1lIHtcclxuICAgICAgY29sb3I6ICMxNTFkNDg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICB9XHJcblxyXG4gICAgLnRpbWUtcGlja2VyLXdyYXBwZXIge1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC50aW1lLWlucHV0IHtcclxuICAgICAgcGFkZGluZy1yaWdodDogNDVweDtcclxuICAgICAgZmxleDogMTtcclxuICAgIH1cclxuXHJcbiAgICAudGltZS1waWNrZXItYnRuIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICByaWdodDogNXB4O1xyXG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDVweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIGNvbG9yOiAjNjY2O1xyXG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xyXG4gICAgICB6LWluZGV4OiAxO1xyXG4gICAgfVxyXG5cclxuICAgIC50aW1lLXBpY2tlci1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkge1xyXG4gICAgICBjb2xvcjogIzM0OThkYjtcclxuICAgIH1cclxuXHJcbiAgICAudGltZS1waWNrZXItYnRuOmRpc2FibGVkIHtcclxuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgICAgb3BhY2l0eTogMC41O1xyXG4gICAgfVxyXG5cclxuICAgIC50aW1lLXBpY2tlci1idG4gLm1hdGVyaWFsLWljb25zIHtcclxuICAgICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgICB3aWR0aDogYXV0bztcclxuICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICBwYWRkaW5nOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0W3R5cGU9XCJ0aW1lXCJdIHtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0W3R5cGU9XCJ0aW1lXCJdOjotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3Ige1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIDo6bmctZGVlcCAubWF0LW1kYy1mb3JtLWZpZWxkIHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIDo6bmctZGVlcCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcclxuICAgICAgYm9yZGVyLWNvbG9yOiAjOENCQkE4O1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcclxuICAgICAgYm9yZGVyLWNvbG9yOiAjOENCQkE4O1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcclxuICAgICAgYm9yZGVyLWNvbG9yOiAjMzQ5OGRiO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZC5lcnJvci1ib3JkZXIgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQuZXJyb3ItYm9yZGVyIDo6bmctZGVlcCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcclxuICAgIC5kYXRlLXBpY2tlci1maWVsZC5lcnJvci1ib3JkZXIgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcclxuICAgICAgYm9yZGVyLWNvbG9yOiByZWQgIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sIGlucHV0IHtcclxuICAgICAgZm9udC1mYW1pbHk6IFwiUG9wcGluc1wiICFpbXBvcnRhbnQ7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICAgICAgY29sb3I6ICMxZjJiNDE7XHJcbiAgICB9XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZFVwZGF0ZUZvcm1Db21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBjb25maWchOiBGb3JtQ29uZmlnO1xyXG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBmb3JtITogRm9ybUdyb3VwO1xyXG4gIHN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZmlsZVByZXZpZXdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgZmlsZU5hbWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgcGFzc3dvcmRWaXNpYmlsaXR5OiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIHNlYXJjaFF1ZXJpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGhvc3RSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAvLyBMaWZlY3ljbGUgaG9vayAtIGNhbiBiZSB1c2VkIGZvciBkYXRlcGlja2VyIGluaXRpYWxpemF0aW9uIGlmIG5lZWRlZFxyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1uV2lkdGgoY29sdW1uOiBGb3JtQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1heENvbHMgPSB0aGlzLmNvbmZpZy5tYXhDb2xzUGVyUm93IHx8IDU7XHJcbiAgICBjb25zdCBjb2xTcGFuID0gTWF0aC5taW4oY29sdW1uLmNvbFNwYW4gfHwgMSwgbWF4Q29scyk7XHJcbiAgICByZXR1cm4gYGNhbGMoJHsoY29sU3BhbiAvIG1heENvbHMpICogMTAwfSUgLSAxNnB4KWA7XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sKG5hbWU6IHN0cmluZyk6IEZvcm1Db250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KG5hbWUpIGFzIEZvcm1Db250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8gMi4gSEVMUEVSOiBDb252ZXJ0IHlvdXIgRmllbGRWYWxpZGF0aW9uW10gdG8gdGhlIGxpYnJhcnkncyBWYWxpZGF0aW9uU2NoZW1hXHJcbiAgZ2V0U2NoZW1hKGNvbHVtbjogRm9ybUNvbHVtbik6IFZhbGlkYXRpb25TY2hlbWEge1xyXG4gICAgY29uc3QgcnVsZXM6IFZhbGlkYXRpb25SdWxlW10gPSBbXTtcclxuICAgIGNvbnN0IGVycm9yUHJpb3JpdHk6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKGNvbHVtbi52YWxpZGF0aW9ucykge1xyXG4gICAgICBjb2x1bW4udmFsaWRhdGlvbnMuZm9yRWFjaCgodikgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAodi50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlICdyZXF1aXJlZCc6XHJcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zOiB7IGVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9SRVFVSVJFRCcsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlcnJvclByaW9yaXR5LnB1c2goJ3JlcXVpcmVkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxyXG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBuYW1lOiAncmVnZXgnLFxyXG4gICAgICAgICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogJ15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcXFwuW2EtekEtWl17Mix9JCcsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9SRUdFWF9NSVNNQVRDSCcsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlcnJvclByaW9yaXR5LnB1c2goJ3JlZ2V4Jyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnbWluTGVuZ3RoJzpcclxuICAgICAgICAgICAgcnVsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ21pbkxlbmd0aCcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlOiB2LnZhbHVlIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3JLZXk6ICdFUlJfTUlOX0xFTkdUSCcsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlcnJvclByaW9yaXR5LnB1c2goJ21pbkxlbmd0aCcpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ21heExlbmd0aCc6XHJcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdtYXhMZW5ndGgnLFxyXG4gICAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZTogdi52YWx1ZSB9LFxyXG4gICAgICAgICAgICAgIGVycm9yS2V5OiAnRVJSX01BWF9MRU5HVEgnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdtYXhMZW5ndGgnKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdwYXR0ZXJuJzpcclxuICAgICAgICAgICAgcnVsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZ2V4JyxcclxuICAgICAgICAgICAgICBwYXJhbXM6IHsgcGF0dGVybjogdi52YWx1ZSB9LFxyXG4gICAgICAgICAgICAgIGVycm9yS2V5OiAnRVJSX1JFR0VYX01JU01BVENIJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVycm9yUHJpb3JpdHkucHVzaCgncmVnZXgnKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdtaW4nOlxyXG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbWluJyxcclxuICAgICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWU6IHYudmFsdWUgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9NSU5fVkFMVUUnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdtaW4nKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdtYXgnOlxyXG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbWF4JyxcclxuICAgICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWU6IHYudmFsdWUgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9NQVhfVkFMVUUnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdtYXgnKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNYXAgJ25hbWUtY29kZScgdG8gJ0Ryb3Bkb3duJyBvciBzaW1pbGFyIGZvciB2YWxpZGF0aW9uIHNjaGVtYSBwdXJwb3NlcyBpZiBuZWVkZWRcclxuICAgIGxldCBjb250cm9sVHlwZSA9IGNvbHVtbi50eXBlO1xyXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSAnbmFtZS1jb2RlJykge1xyXG4gICAgICBjb250cm9sVHlwZSA9ICdzZWxlY3QnOyAvLyBUcmVhdCBhcyBzZWxlY3QgZm9yIHNjaGVtYSBsb29rdXAgaWYgbGlicmFyeSBleHBlY3RzICdzZWxlY3QnIG9yICdEcm9wZG93bidcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjb250cm9sVHlwZTogY29udHJvbFR5cGUsXHJcbiAgICAgIGVycm9yUHJpb3JpdHk6IGVycm9yUHJpb3JpdHksXHJcbiAgICAgIHJ1bGVzOiBydWxlcyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBpc0ltYWdlRmllbGQoY29sdW1uOiBGb3JtQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnICYmXHJcbiAgICAgIChjb2x1bW4uYWNjZXB0Py5zdGFydHNXaXRoKCdpbWFnZScpIHx8IGNvbHVtbi5maWxlUHJldmlldyA9PT0gdHJ1ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XHJcbiAgICBjb25zdCBmb3JtR3JvdXBDb25maWc6IGFueSA9IHt9O1xyXG5cclxuICAgIHRoaXMuY29uZmlnLnNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcclxuICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgbGV0IGluaXRpYWxWYWx1ZSA9IGNvbHVtbi52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAgICAgLy8gRm9ybWF0IG1vbnRoLXllYXIgZmllbGRzIHRvIFlZWVktTU0gZm9ybWF0XHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnbW9udGgteWVhcicgJiYgaW5pdGlhbFZhbHVlKSB7XHJcbiAgICAgICAgICBpbml0aWFsVmFsdWUgPSB0aGlzLmZvcm1hdE1vbnRoWWVhclZhbHVlKGluaXRpYWxWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3JtR3JvdXBDb25maWdbY29sdW1uLm5hbWVdID0gW1xyXG4gICAgICAgICAgeyB2YWx1ZTogaW5pdGlhbFZhbHVlLCBkaXNhYmxlZDogY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlIH0sXHJcbiAgICAgICAgICBudWxsLCAvLyBXZSdsbCBzZXQgdmFsaWRhdG9ycyBhZnRlciBmb3JtIGNyZWF0aW9uXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgLy8gSWYgaXQncyBhIGZpbGUgZmllbGQgd2l0aCBhbiBleGlzdGluZyB2YWx1ZSwgc2V0IHRoZSBwcmV2aWV3XHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnZmlsZScgJiYgY29sdW1uLnZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbGVQcmV2aWV3cy5zZXQoY29sdW1uLm5hbWUsIGNvbHVtbi52YWx1ZSk7XHJcbiAgICAgICAgICAvLyBFeHRyYWN0IGZpbGVuYW1lIGZyb20gVVJMIG9yIGJhc2U2NFxyXG4gICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmV4dHJhY3RGaWxlTmFtZShjb2x1bW4udmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGZpbGVOYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVzLnNldChjb2x1bW4ubmFtZSwgZmlsZU5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzZWFyY2ggZGlzcGxheSBmb3IgbmFtZS1jb2RlIGZpZWxkcyAtIE5vIGxvbmdlciBuZWVkZWQgYXMgRnZOYW1lQ29kZSBoYW5kbGVzIGRpc3BsYXkgaW50ZXJuYWxseVxyXG4gICAgICAgIC8qIGlmIChjb2x1bW4udHlwZSA9PT0gJ25hbWUtY29kZScgJiYgaW5pdGlhbFZhbHVlICYmIGNvbHVtbi5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAvLyBMb2dpYyBtb3ZlZCB0byBjb21wb25lbnRcclxuICAgICAgICB9ICovXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBDb25maWcpO1xyXG5cclxuICAgIHRoaXMuY29uZmlnLnNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcclxuICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuYnVpbGRWYWxpZGF0b3JzKGNvbHVtbi52YWxpZGF0aW9ucywgdGhpcy5mb3JtKTtcclxuICAgICAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uZ2V0KGNvbHVtbi5uYW1lKT8uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5nZXQoY29sdW1uLm5hbWUpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFN1YnNjcmliZSB0byB2YWx1ZSBjaGFuZ2VzIGZvciBhbGwgZmllbGRzIHRvIHRyaWdnZXIgb25DaGFuZ2UgaGFuZGxlcnNcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XHJcbiAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShrZXkpO1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uPy5vbkNoYW5nZSkge1xyXG4gICAgICAgICAgICAgIGNvbHVtbi5vbkNoYW5nZSh2YWx1ZSwgdGhpcy5mb3JtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgLy8gQ2xlYW4gdXAgYWxsIHN1YnNjcmlwdGlvbnMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcclxuICAgIHRoaXMudmFsdWVDaGFuZ2VTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbnMgPSBbXTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUZpZWxkQ2hhbmdlKGZpZWxkTmFtZTogc3RyaW5nLCBldmVudFZhbHVlPzogYW55KSB7XHJcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZE5hbWUpO1xyXG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcblxyXG4gICAgLy8gRm9ybWF0IG1vbnRoLXllYXIgZmllbGRzIChlc3BlY2lhbGx5IGV4cGlyeURhdGUpIHRvIFlZWVktTU1cclxuICAgIGlmIChjb2x1bW4/LnR5cGUgPT09ICdtb250aC15ZWFyJyAmJiBldmVudFZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRNb250aFllYXJWYWx1ZShldmVudFZhbHVlKTtcclxuICAgICAgaWYgKGZvcm1Db250cm9sICYmIGZvcm1hdHRlZFZhbHVlICE9PSBldmVudFZhbHVlKSB7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICBldmVudFZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sdW1uPy5vbkNoYW5nZSkge1xyXG4gICAgICAvLyBVc2UgdGhlIGV2ZW50IHZhbHVlIGRpcmVjdGx5ICh3aGF0IHRoZSB1c2VyIGp1c3Qgc2VsZWN0ZWQvdHlwZWQpXHJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGV2ZW4gaWYgZm9ybSBjb250cm9sIGhhc24ndCB1cGRhdGVkIHlldFxyXG4gICAgICBjb25zdCB2YWx1ZVRvUGFzcyA9XHJcbiAgICAgICAgZXZlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gZXZlbnRWYWx1ZSA6IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKT8udmFsdWU7XHJcbiAgICAgIGNvbnN0IG9uQ2hhbmdlRm4gPSBjb2x1bW4ub25DaGFuZ2U7IC8vIFN0b3JlIHRoZSBmdW5jdGlvbiByZWZlcmVuY2VcclxuXHJcbiAgICAgIC8vIFN0b3JlIHRoZSBzZWxlY3RlZCB2YWx1ZSAtIHRoaXMgaXMgd2hhdCB0aGUgdXNlciBjaG9zZVxyXG4gICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdmFsdWVUb1Bhc3M7XHJcblxyXG4gICAgICAvLyBFbnN1cmUgdGhlIGZvcm0gY29udHJvbCBoYXMgdGhlIHNlbGVjdGVkIHZhbHVlIGJlZm9yZSBjYWxsaW5nIG9uQ2hhbmdlXHJcbiAgICAgIGlmIChmb3JtQ29udHJvbCAmJiBzZWxlY3RlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2wudmFsdWUgIT09IHNlbGVjdGVkVmFsdWUpIHtcclxuICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKHNlbGVjdGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENhbGwgb25DaGFuZ2Ugd2l0aCB0aGUgc2VsZWN0ZWQgdmFsdWVcclxuICAgICAgaWYgKG9uQ2hhbmdlRm4pIHtcclxuICAgICAgICBvbkNoYW5nZUZuKHNlbGVjdGVkVmFsdWUsIHRoaXMuZm9ybSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJlc3RvcmUgdGhlIHZhbHVlIGZvciB0aGUgZmllbGQgdGhhdCB0cmlnZ2VyZWQgdGhlIGNoYW5nZSBpZiBpdCB3YXMgY2xlYXJlZCBieSBvbkNoYW5nZVxyXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBpZiBvbkNoYW5nZSBjbGVhcnMgdGhlIGZpZWxkIHRoYXQgd2FzIGp1c3QgY2hhbmdlZCwgd2UgcmVzdG9yZSBpdFxyXG4gICAgICAvLyBPbmx5IHJlc3RvcmUgaWYgd2UgaGFkIGEgbm9uLWVtcHR5IHZhbHVlIChlbXB0eSBzdHJpbmcsIG51bGwsIHVuZGVmaW5lZCBhcmUgbm90IHJlc3RvcmVkKVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZm9ybUNvbnRyb2wgJiZcclxuICAgICAgICBzZWxlY3RlZFZhbHVlICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICBzZWxlY3RlZFZhbHVlICE9PSBudWxsICYmXHJcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSAhPT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgLy8gVXNlIHNldFRpbWVvdXQgd2l0aCAwIGRlbGF5IHRvIHJ1biBhZnRlciBhbnkgc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbiBvbkNoYW5nZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIHdhcyBjbGVhcmVkIG9yIGNoYW5nZWRcclxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggd2hhdCB3YXMgc2VsZWN0ZWQsIHJlc3RvcmUgaXRcclxuICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBvbkNoYW5nZSBjbGVhcmVkIHRoZSBmaWVsZCB1bmludGVudGlvbmFsbHlcclxuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHNlbGVjdGVkVmFsdWUpIHtcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXRNb250aFllYXJWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcclxuICAgIC8vIE5vcm1hbGl6ZSB0byBZWVlZLU1NXHJcbiAgICBpZiAodmFsdWUubWF0Y2goL15cXGR7Mn0tXFxkezR9JC8pKSB7XHJcbiAgICAgIGNvbnN0IFttb250aCwgeWVhcl0gPSB2YWx1ZS5zcGxpdCgnLScpO1xyXG4gICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH1gO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgYWxyZWFkeSBpbiBZWVlZLU1NIGZvcm1hdCwgcmV0dXJuIGFzIGlzXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwYXJzZU1vbnRoWWVhclZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xyXG4gICAgLy8gRGlzcGxheSBhbmQgcGlja2VyIGJvdGggdXNlIFlZWVktTU07IG5vcm1hbGl6ZSBNTS1ZWVlZIGlmIHByZXNlbnRcclxuICAgIGlmICh2YWx1ZS5tYXRjaCgvXlxcZHsyfS1cXGR7NH0kLykpIHtcclxuICAgICAgY29uc3QgW21vbnRoLCB5ZWFyXSA9IHZhbHVlLnNwbGl0KCctJyk7XHJcbiAgICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVNb250aFllYXJDaGFuZ2UoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIEZvcm1hdCB0aGUgaW5wdXQgdmFsdWUgdG8gWVlZWS1NTSBmb3JtYXRcclxuICAgIGxldCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIC8vIElmIGl0J3MgaW4gTU0tWVlZWSBmb3JtYXQsIGNvbnZlcnQgdG8gWVlZWS1NTVxyXG4gICAgaWYgKGZvcm1hdHRlZFZhbHVlLm1hdGNoKC9eXFxkezJ9LVxcZHs0fSQvKSkge1xyXG4gICAgICBjb25zdCBbbW9udGgsIHllYXJdID0gZm9ybWF0dGVkVmFsdWUuc3BsaXQoJy0nKTtcclxuICAgICAgZm9ybWF0dGVkVmFsdWUgPSBgJHt5ZWFyfS0ke21vbnRofWA7XHJcbiAgICB9XHJcbiAgICAvLyBJZiBpdCdzIGluIFlZWVlNTSBmb3JtYXQgKG5vIGRhc2gpLCBjb252ZXJ0IHRvIFlZWVktTU1cclxuICAgIGVsc2UgaWYgKGZvcm1hdHRlZFZhbHVlLm1hdGNoKC9eXFxkezZ9JC8pKSB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSBmb3JtYXR0ZWRWYWx1ZS5zdWJzdHJpbmcoMCwgNCk7XHJcbiAgICAgIGNvbnN0IG1vbnRoID0gZm9ybWF0dGVkVmFsdWUuc3Vic3RyaW5nKDQsIDYpO1xyXG4gICAgICBmb3JtYXR0ZWRWYWx1ZSA9IGAke3llYXJ9LSR7bW9udGh9YDtcclxuICAgIH1cclxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBpbiBZWVlZLU1NIGZvcm1hdCwgbGVhdmUgYXMgaXNcclxuICAgIGVsc2UgaWYgKGZvcm1hdHRlZFZhbHVlLm1hdGNoKC9eXFxkezR9LVxcZHsyfSQvKSkge1xyXG4gICAgICAvLyBBbHJlYWR5IGluIGNvcnJlY3QgZm9ybWF0XHJcbiAgICB9XHJcbiAgICAvLyBJZiB1c2VyIGlzIHR5cGluZywgYWxsb3cgcGFydGlhbCBpbnB1dFxyXG4gICAgZWxzZSBpZiAoZm9ybWF0dGVkVmFsdWUubWF0Y2goL15cXGR7MSw2fSQvKSkge1xyXG4gICAgICAvLyBBbGxvdyBwYXJ0aWFsIGlucHV0IHdoaWxlIHR5cGluZ1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xyXG4gICAgaWYgKGZvcm1Db250cm9sICYmIGZvcm1hdHRlZFZhbHVlICE9PSB2YWx1ZSkge1xyXG4gICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlRmllbGRDaGFuZ2UoZmllbGROYW1lLCBmb3JtYXR0ZWRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVNb250aFllYXJCbHVyKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcclxuICAgIGlmICghZm9ybUNvbnRyb2wpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGZvcm1Db250cm9sLnZhbHVlIHx8ICcnO1xyXG4gICAgLy8gRW5zdXJlIHRoZSB2YWx1ZSBpcyBpbiBZWVlZLU1NIGZvcm1hdCBvbiBibHVyXHJcbiAgICBpZiAodmFsdWUgJiYgIXZhbHVlLm1hdGNoKC9eXFxkezR9LVxcZHsyfSQvKSkge1xyXG4gICAgICAvLyBUcnkgdG8gcGFyc2UgYW5kIGZvcm1hdFxyXG4gICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdE1vbnRoWWVhclZhbHVlKHZhbHVlKTtcclxuICAgICAgaWYgKGZvcm1hdHRlZCAhPT0gdmFsdWUpIHtcclxuICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShmb3JtYXR0ZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTW9udGhZZWFyUGlja2VyQ2hhbmdlKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAvLyBNb250aCBwaWNrZXIgb3V0cHV0cyBZWVlZLU1NOyBqdXN0IG5vcm1hbGl6ZVxyXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdE1vbnRoWWVhclZhbHVlKHZhbHVlKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xyXG4gICAgaWYgKGZvcm1Db250cm9sKSB7XHJcbiAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIHRoaXMuaGFuZGxlRmllbGRDaGFuZ2UoZmllbGROYW1lLCBmb3JtYXR0ZWRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRNb250aFllYXJQaWNrZXJWYWx1ZShmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcclxuICAgIGlmICghZm9ybUNvbnRyb2wpIHJldHVybiAnJztcclxuICAgIGNvbnN0IHZhbHVlID0gZm9ybUNvbnRyb2wudmFsdWUgfHwgJyc7XHJcbiAgICAvLyBEaXNwbGF5IGFuZCBwaWNrZXIgYm90aCBleHBlY3QgWVlZWS1NTVxyXG4gICAgcmV0dXJuIHRoaXMucGFyc2VNb250aFllYXJWYWx1ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9udGhQaWNrZXIoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG1vbnRoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcclxuICAgICAgZmllbGROYW1lICsgJ19waWNrZXInXHJcbiAgICApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAobW9udGhJbnB1dCAmJiBtb250aElucHV0LnR5cGUgPT09ICdtb250aCcpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSBwaWNrZXIgdmFsdWUgYmVmb3JlIG9wZW5pbmdcclxuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5nZXRNb250aFllYXJQaWNrZXJWYWx1ZShmaWVsZE5hbWUpO1xyXG4gICAgICBpZiAoY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgbW9udGhJbnB1dC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBUcnkgbW9kZXJuIHNob3dQaWNrZXIgQVBJIGZpcnN0LCBmYWxsYmFjayB0byBjbGlja1xyXG4gICAgICBpZiAobW9udGhJbnB1dC5zaG93UGlja2VyKSB7XHJcbiAgICAgICAgbW9udGhJbnB1dC5zaG93UGlja2VyKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbW9udGhJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgIG1vbnRoSW5wdXQuY2xpY2soKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1uQnlOYW1lKG5hbWU6IHN0cmluZyk6IEZvcm1Db2x1bW4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNlY3Rpb25zXHJcbiAgICAgIC5mbGF0TWFwKChzKSA9PiBzLmZpZWxkcylcclxuICAgICAgLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlRmllbGRzKGZpZWxkczogRm9ybUNvbHVtbltdKTogRm9ybUNvbHVtbltdIHtcclxuICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKChmKSA9PiBmLnR5cGUgPT09ICdmaWxlJyk7XHJcbiAgfVxyXG5cclxuICBnZXROb25GaWxlRmllbGRzKGZpZWxkczogRm9ybUNvbHVtbltdKTogRm9ybUNvbHVtbltdIHtcclxuICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKChmKSA9PiBmLnR5cGUgIT09ICdmaWxlJyk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBhc3N3b3JkVmlzaWJpbGl0eS5nZXQoZmllbGROYW1lKSB8fCBmYWxzZTtcclxuICAgIHRoaXMucGFzc3dvcmRWaXNpYmlsaXR5LnNldChmaWVsZE5hbWUsICFjdXJyZW50KTtcclxuICB9XHJcbiAgaGFzUmVxdWlyZWRWYWxpZGF0aW9uKGNvbHVtbjogRm9ybUNvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGNvbHVtbi52YWxpZGF0aW9ucz8uc29tZSgodikgPT4gdi50eXBlID09PSAncmVxdWlyZWQnKSB8fCBmYWxzZTtcclxuICB9XHJcblxyXG4gIGlzUGFzc3dvcmRWaXNpYmxlKGZpZWxkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXNzd29yZFZpc2liaWxpdHkuZ2V0KGZpZWxkTmFtZSkgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICBidWlsZFZhbGlkYXRvcnMoXHJcbiAgICB2YWxpZGF0aW9ucz86IEZpZWxkVmFsaWRhdGlvbltdLFxyXG4gICAgZm9ybUdyb3VwPzogRm9ybUdyb3VwXHJcbiAgKTogYW55W10ge1xyXG4gICAgaWYgKCF2YWxpZGF0aW9ucykgcmV0dXJuIFtdO1xyXG5cclxuICAgIGNvbnN0IHZhbGlkYXRvcnM6IGFueVtdID0gW107XHJcbiAgICB2YWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZGF0aW9uKSA9PiB7XHJcbiAgICAgIHN3aXRjaCAodmFsaWRhdGlvbi50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZW1haWwnOlxyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbWluTGVuZ3RoJzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh2YWxpZGF0aW9uLnZhbHVlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdtYXhMZW5ndGgnOlxyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHZhbGlkYXRpb24udmFsdWUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ21pbic6XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4odmFsaWRhdGlvbi52YWx1ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbWF4JzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heCh2YWxpZGF0aW9uLnZhbHVlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdwYXR0ZXJuJzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4odmFsaWRhdGlvbi52YWx1ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnY3VzdG9tJzpcclxuICAgICAgICAgIGlmICh2YWxpZGF0aW9uLnZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0aW9uLnZhbGlkYXRvciEoY29udHJvbC52YWx1ZSwgZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZCA/IG51bGwgOiB7IGN1c3RvbTogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gIH1cclxuXHJcbiAgdHJpZ2dlckZpbGVVcGxvYWQoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlSW5wdXRfJyArIGZpZWxkTmFtZSk/LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuVGltZVBpY2tlcihmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgdGltZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmllbGROYW1lKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKHRpbWVJbnB1dCAmJiB0aW1lSW5wdXQudHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgIC8vIFRyeSBtb2Rlcm4gc2hvd1BpY2tlciBBUEkgZmlyc3QsIGZhbGxiYWNrIHRvIGNsaWNrXHJcbiAgICAgIGlmICh0aW1lSW5wdXQuc2hvd1BpY2tlcikge1xyXG4gICAgICAgIHRpbWVJbnB1dC5zaG93UGlja2VyKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGltZUlucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgdGltZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRmlsZUNoYW5nZShldmVudDogYW55LCBmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZmlsZTogRmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIHRoaXMuZmlsZU5hbWVzLnNldChmaWVsZE5hbWUsIGZpbGUubmFtZSk7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NFN0cmluZyA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuZmlsZVByZXZpZXdzLnNldChmaWVsZE5hbWUsIGJhc2U2NFN0cmluZyk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpPy5zZXRWYWx1ZShiYXNlNjRTdHJpbmcpO1xyXG5cclxuICAgICAgICAvLyBUcmlnZ2VyIG9uQ2hhbmdlIGhhbmRsZXIgZm9yIGZpbGUgZmllbGRzXHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUoZmllbGROYW1lKTtcclxuICAgICAgICBpZiAoY29sdW1uPy5vbkNoYW5nZSkge1xyXG4gICAgICAgICAgY29sdW1uLm9uQ2hhbmdlKGJhc2U2NFN0cmluZywgdGhpcy5mb3JtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHRyYWN0RmlsZU5hbWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XHJcblxyXG4gICAgLy8gSWYgaXQncyBhIFVSTCwgZXh0cmFjdCBmaWxlbmFtZSBmcm9tIFVSTFxyXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xyXG4gICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCcvJyk7XHJcbiAgICAgIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdCdzIGJhc2U2NCwgcmV0dXJuIGEgZ2VuZXJpYyBuYW1lXHJcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChgZGF0YTppbWFnZWApKSB7XHJcbiAgICAgIHJldHVybiAndXBsb2FkZWQtaW1hZ2UuanBnJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJ2V4aXN0aW5nLXBob3RvLmpwZyc7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlUHJldmlldyhmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsZVByZXZpZXdzLmdldChmaWVsZE5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlTmFtZShmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsZU5hbWVzLmdldChmaWVsZE5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBtYXBTZWFyY2hPcHRpb25zKG9wdGlvbnM6IGFueVtdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdCA9PiAoe1xyXG4gICAgICBjb2RlOiBvcHQuY29kZSB8fCBvcHQudmFsdWUsXHJcbiAgICAgIG5hbWU6IG9wdC5uYW1lIHx8IG9wdC5sYWJlbCB8fCBvcHQudmFsdWUsXHJcbiAgICAgIHZhbHVlOiBvcHQudmFsdWVcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG5cclxuICBkZWxldGVGaWxlKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZpbGVQcmV2aWV3cy5kZWxldGUoZmllbGROYW1lKTtcclxuICAgIHRoaXMuZmlsZU5hbWVzLmRlbGV0ZShmaWVsZE5hbWUpO1xyXG4gICAgdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpPy5zZXRWYWx1ZSgnJyk7XHJcblxyXG4gICAgLy8gVHJpZ2dlciBvbkNoYW5nZSBoYW5kbGVyIHdoZW4gZmlsZSBpcyBkZWxldGVkXHJcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZE5hbWUpO1xyXG4gICAgaWYgKGNvbHVtbj8ub25DaGFuZ2UpIHtcclxuICAgICAgY29sdW1uLm9uQ2hhbmdlKCcnLCB0aGlzLmZvcm0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU3VibWl0KCkge1xyXG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIC8vIE1hcmsgYWxsIGZpZWxkcyBhcyB0b3VjaGVkIHRvIHNob3cgcmVkIGJvcmRlcnNcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KGtleSk/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDb3VudCBvbmx5IHJlcXVpcmVkIGZpZWxkcyB0aGF0IGFyZSBpbnZhbGlkXHJcbiAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLmNvbmZpZy5zZWN0aW9ucy5mbGF0TWFwKChzKSA9PiBzLmZpZWxkcyk7XHJcbiAgICAgIGNvbnN0IGludmFsaWRSZXF1aXJlZENvdW50ID0gT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzKS5maWx0ZXIoXHJcbiAgICAgICAgKGtleSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcclxuICAgICAgICAgIGlmICghY29udHJvbD8uaW52YWxpZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZmllbGQgaGFzIHJlcXVpcmVkIHZhbGlkYXRpb25cclxuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZCgoYykgPT4gYy5uYW1lID09PSBrZXkpO1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgY29sdW1uPy52YWxpZGF0aW9ucz8uc29tZSgodikgPT4gdi50eXBlID09PSAncmVxdWlyZWQnKSB8fCBmYWxzZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICkubGVuZ3RoO1xyXG5cclxuICAgICAgLy8gT25seSBlbWl0IGlmIHRoZXJlIGFyZSByZXF1aXJlZCBmaWVsZHMgbWlzc2luZ1xyXG4gICAgICBpZiAoaW52YWxpZFJlcXVpcmVkQ291bnQgPiAwKSB7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3IuZW1pdChcclxuICAgICAgICAgIGBQbGVhc2UgZmlsbCBhbGwgcmVxdWlyZWQgZmllbGRzIG1hcmtlZCB3aXRoICouICR7aW52YWxpZFJlcXVpcmVkQ291bnR9IGZpZWxkKHMpIG5lZWQgYXR0ZW50aW9uLmBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgdGhpcy5jb25maWcub25TdWJtaXQoZm9ybURhdGEpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUmVzZXQoKSB7XHJcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICBpZiAodGhpcy5jb25maWcub25SZXNldCkge1xyXG4gICAgICB0aGlzLmNvbmZpZy5vblJlc2V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0ZpZWxkSW52YWxpZChmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICByZXR1cm4gISEoZmllbGQgJiYgZmllbGQuaW52YWxpZCAmJiB0aGlzLnN1Ym1pdHRlZCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvck1lc3NhZ2UoZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICBpZiAoIWZpZWxkPy5lcnJvcnMpIHJldHVybiAnJztcclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgY3VzdG9tIG1lc3NhZ2UgZnJvbSB2YWxpZGF0aW9uc1xyXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IHRoaXMuY29uZmlnLnNlY3Rpb25zLmZsYXRNYXAoKHMpID0+IHMuZmllbGRzKTtcclxuICAgIGNvbnN0IGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZCgoYykgPT4gYy5uYW1lID09PSBmaWVsZE5hbWUpO1xyXG4gICAgLy8gQ2hlY2sgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIGVycm9yXHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydjdXN0b20nXSkge1xyXG4gICAgICBjb25zdCBjdXN0b21WYWxpZGF0aW9uID0gY29sdW1uPy52YWxpZGF0aW9ucz8uZmluZChcclxuICAgICAgICAodikgPT4gdi50eXBlID09PSAnY3VzdG9tJ1xyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gY3VzdG9tVmFsaWRhdGlvbj8ubWVzc2FnZSB8fCAnSW52YWxpZCBmaWVsZCc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGN1c3RvbSBtZXNzYWdlIGZyb20gdmFsaWRhdGlvbnNcclxuICAgIGNvbnN0IGVycm9yS2V5cyA9IE9iamVjdC5rZXlzKGZpZWxkLmVycm9ycyk7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBlcnJvcktleXMpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGNvbHVtbj8udmFsaWRhdGlvbnM/LmZpbmQoKHYpID0+IHYudHlwZSA9PT0ga2V5KTtcclxuICAgICAgaWYgKHZhbGlkYXRpb24/Lm1lc3NhZ2UpIHtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGlvbi5tZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzXHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydyZXF1aXJlZCddKSB7XHJcbiAgICAgIHJldHVybiBgJHtjb2x1bW4/LmxhYmVsfSBpcyByZXF1aXJlZGA7XHJcbiAgICB9XHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydlbWFpbCddKSByZXR1cm4gJ0ludmFsaWQgZW1haWwgZm9ybWF0JztcclxuICAgIGlmIChmaWVsZC5lcnJvcnNbJ21pbmxlbmd0aCddKVxyXG4gICAgICByZXR1cm4gYE1pbmltdW0gbGVuZ3RoIGlzICR7ZmllbGQuZXJyb3JzWydtaW5sZW5ndGgnXS5yZXF1aXJlZExlbmd0aH1gO1xyXG4gICAgaWYgKGZpZWxkLmVycm9yc1snbWF4bGVuZ3RoJ10pXHJcbiAgICAgIHJldHVybiBgTWF4aW11bSBsZW5ndGggaXMgJHtmaWVsZC5lcnJvcnNbJ21heGxlbmd0aCddLnJlcXVpcmVkTGVuZ3RofWA7XHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydtaW4nXSlcclxuICAgICAgcmV0dXJuIGBNaW5pbXVtIHZhbHVlIGlzICR7ZmllbGQuZXJyb3JzWydtaW4nXS5taW59YDtcclxuICAgIGlmIChmaWVsZC5lcnJvcnNbJ21heCddKVxyXG4gICAgICByZXR1cm4gYE1heGltdW0gdmFsdWUgaXMgJHtmaWVsZC5lcnJvcnNbJ21heCddLm1heH1gO1xyXG4gICAgaWYgKGZpZWxkLmVycm9yc1sncGF0dGVybiddKSByZXR1cm4gJ0ludmFsaWQgZm9ybWF0JztcclxuICAgIHJldHVybiAnSW52YWxpZCBmaWVsZCc7XHJcbiAgfVxyXG59XHJcbiJdfQ==