valtech-components 2.0.393 → 2.0.394

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.
@@ -1,5 +1,5 @@
1
1
  import { CommonModule } from '@angular/common';
2
- import { Component, forwardRef, inject, Input, ViewChild, signal, computed, effect } from '@angular/core';
2
+ import { ChangeDetectorRef, Component, forwardRef, inject, Input, ViewChild } from '@angular/core';
3
3
  import { NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
4
  import { IonicModule } from '@ionic/angular';
5
5
  import { LangService } from '../../../services/lang-provider/lang-provider.service';
@@ -15,48 +15,13 @@ export class MultiSelectSimpleComponent {
15
15
  this.valueProperty = 'id';
16
16
  this.placeholder = '';
17
17
  this.langService = inject(LangService);
18
- // Signals for reactive state management
19
- this.isOpen = signal(false);
20
- this.searchTerm = signal('');
21
- this.selectedValues = signal([]);
22
- // Force options to be reactive
23
- this.optionsSignal = signal([]);
24
- // Computed signals
25
- this.displayValue = computed(() => {
26
- const selected = this.selectedValues();
27
- if (selected.length === 0) {
28
- return '';
29
- }
30
- if (selected.length === 1) {
31
- const option = this.getOptionByValue(selected[0]);
32
- return option ? option[this.labelProperty] : '';
33
- }
34
- return `${selected.length} elementos seleccionados`;
35
- });
36
- this.filteredOptions = computed(() => {
37
- // Use signal instead of props directly
38
- const options = this.optionsSignal();
39
- const search = this.searchTerm().toLowerCase();
40
- // Debug
41
- console.log('[MultiSelectSimple] filteredOptions computed:', {
42
- optionsCount: options.length,
43
- searchTerm: search,
44
- options: options.slice(0, 3) // Primeras 3 opciones
45
- });
46
- if (!search) {
47
- return options;
48
- }
49
- return options.filter(option => {
50
- const label = option[this.labelProperty]
51
- ? replaceSpecialChars(String(option[this.labelProperty]).toLowerCase())
52
- : '';
53
- const value = option[this.valueProperty]
54
- ? replaceSpecialChars(String(option[this.valueProperty]).toLowerCase())
55
- : '';
56
- const searchTerm = replaceSpecialChars(search);
57
- return label.includes(searchTerm) || value.includes(searchTerm);
58
- });
59
- });
18
+ this.changeDetector = inject(ChangeDetectorRef);
19
+ // Classic Angular properties
20
+ this.isOpen = false;
21
+ this.searchTerm = '';
22
+ this.selectedValues = [];
23
+ this.displayValue = '';
24
+ this.filteredOptions = [];
60
25
  this.searchPlaceholder = '';
61
26
  // ControlValueAccessor
62
27
  this.onChange = (_value) => { };
@@ -65,52 +30,29 @@ export class MultiSelectSimpleComponent {
65
30
  this.searchPlaceholder = this.langService.getText('_global', 'search', 'Buscar');
66
31
  // Close dropdown when clicking outside
67
32
  document.addEventListener('click', this.handleClickOutside.bind(this));
68
- // Debug effect to track when filteredOptions changes
69
- effect(() => {
70
- const options = this.filteredOptions();
71
- console.log('[MultiSelectSimple] EFFECT - filteredOptions changed:', {
72
- optionsCount: options.length,
73
- options: options,
74
- timestamp: new Date().toLocaleTimeString()
75
- });
76
- });
77
33
  }
78
34
  ngOnInit() {
79
- console.log('[MultiSelectSimple] ngOnInit:', {
80
- props: !!this.props,
81
- options: this.props?.options?.length || 0,
82
- control: !!this.props?.control
83
- });
84
- // Update options signal
85
- if (this.props?.options) {
86
- this.optionsSignal.set(this.props.options);
87
- }
88
35
  this.applyDefaultValue();
36
+ this.initializeOptions();
89
37
  this.syncSelectedValues();
38
+ this.updateDisplayValue();
90
39
  }
91
40
  ngOnDestroy() {
92
41
  document.removeEventListener('click', this.handleClickOutside.bind(this));
93
42
  }
94
43
  ngOnChanges(changes) {
95
- console.log('[MultiSelectSimple] ngOnChanges:', {
96
- hasPropsChange: !!changes['props'],
97
- props: !!this.props,
98
- options: this.props?.options?.length || 0,
99
- propsOptions: this.props?.options
100
- });
101
44
  if (changes['props'] && this.props) {
102
- // Update options signal when props change
103
- if (this.props.options) {
104
- console.log('[MultiSelectSimple] Updating optionsSignal with:', this.props.options);
105
- this.optionsSignal.set(this.props.options);
106
- }
45
+ this.initializeOptions();
107
46
  this.syncSelectedValues();
47
+ this.updateDisplayValue();
48
+ this.changeDetector.detectChanges();
108
49
  }
109
50
  }
110
51
  // ControlValueAccessor implementation
111
52
  writeValue(value) {
112
53
  const valueArray = this.parseValue(value);
113
- this.selectedValues.set(valueArray);
54
+ this.selectedValues = valueArray;
55
+ this.updateDisplayValue();
114
56
  }
115
57
  registerOnChange(fn) {
116
58
  this.onChange = fn;
@@ -124,8 +66,8 @@ export class MultiSelectSimpleComponent {
124
66
  // Component methods
125
67
  toggleDropdown(event) {
126
68
  event.stopPropagation();
127
- this.isOpen.update(value => !value);
128
- if (this.isOpen()) {
69
+ this.isOpen = !this.isOpen;
70
+ if (this.isOpen) {
129
71
  this.onTouched();
130
72
  // Focus search bar when opening
131
73
  setTimeout(() => {
@@ -137,45 +79,48 @@ export class MultiSelectSimpleComponent {
137
79
  }
138
80
  }
139
81
  onSearch(event) {
140
- this.searchTerm.set(event.detail.value || '');
82
+ this.searchTerm = event.detail.value || '';
83
+ this.filterOptions();
141
84
  }
142
85
  toggleOption(option) {
143
- const value = String(option[this.valueProperty]); // Convertir a string
144
- const currentSelected = this.selectedValues();
86
+ const value = String(option[this.valueProperty]);
145
87
  if (this.isSelected(option)) {
146
88
  // Remove from selection
147
- this.selectedValues.set(currentSelected.filter(v => v !== value));
89
+ this.selectedValues = this.selectedValues.filter(v => v !== value);
148
90
  }
149
91
  else {
150
92
  // Add to selection
151
- this.selectedValues.set([...currentSelected, value]);
93
+ this.selectedValues = [...this.selectedValues, value];
152
94
  }
95
+ this.updateDisplayValue();
153
96
  this.emitValue();
154
97
  }
155
98
  selectAll() {
156
- const allValues = this.filteredOptions().map(option => String(option[this.valueProperty]));
157
- const currentSelected = this.selectedValues();
99
+ const allValues = this.filteredOptions.map(option => String(option[this.valueProperty]));
158
100
  // Add only new values to avoid duplicates
159
- const newValues = allValues.filter(value => !currentSelected.includes(value));
160
- this.selectedValues.set([...currentSelected, ...newValues]);
101
+ const newValues = allValues.filter(value => !this.selectedValues.includes(value));
102
+ this.selectedValues = [...this.selectedValues, ...newValues];
103
+ this.updateDisplayValue();
161
104
  this.emitValue();
162
105
  }
163
106
  clearAll() {
164
- this.selectedValues.set([]);
107
+ this.selectedValues = [];
108
+ this.updateDisplayValue();
165
109
  this.emitValue();
166
110
  }
167
111
  isSelected(option) {
168
- return this.selectedValues().includes(String(option[this.valueProperty]));
112
+ return this.selectedValues.includes(String(option[this.valueProperty]));
169
113
  }
170
114
  trackByFn(_index, option) {
171
115
  return option[this.valueProperty];
172
116
  }
173
117
  handleClickOutside(event) {
174
- if (this.isOpen() &&
118
+ if (this.isOpen &&
175
119
  !this.mainInputRef?.nativeElement?.contains(event.target) &&
176
120
  !this.dropdownRef?.nativeElement?.contains(event.target)) {
177
- this.isOpen.set(false);
178
- this.searchTerm.set('');
121
+ this.isOpen = false;
122
+ this.searchTerm = '';
123
+ this.initializeOptions();
179
124
  }
180
125
  }
181
126
  parseValue(value) {
@@ -189,7 +134,7 @@ export class MultiSelectSimpleComponent {
189
134
  return [String(value)];
190
135
  }
191
136
  emitValue() {
192
- const value = this.selectedValues().join(',');
137
+ const value = this.selectedValues.join(',');
193
138
  this.onChange(value);
194
139
  if (this.props?.control) {
195
140
  this.props.control.setValue(value);
@@ -198,27 +143,49 @@ export class MultiSelectSimpleComponent {
198
143
  }
199
144
  }
200
145
  getOptionByValue(value) {
201
- return this.optionsSignal().find(option => String(option[this.valueProperty]) === String(value));
146
+ return this.filteredOptions.find(option => String(option[this.valueProperty]) === String(value));
202
147
  }
203
148
  applyDefaultValue() {
204
149
  if (this.props) {
205
150
  applyDefaultValueToControl(this.props);
206
151
  }
207
152
  }
208
- debugOptions() {
209
- console.log('[MultiSelectSimple] DEBUG CLICK:', {
210
- props: this.props,
211
- filteredOptions: this.filteredOptions(),
212
- searchTerm: this.searchTerm(),
213
- propsOptions: this.props?.options,
214
- optionsSignal: this.optionsSignal(),
215
- computed: this.filteredOptions()
153
+ initializeOptions() {
154
+ this.filteredOptions = this.props?.options || [];
155
+ }
156
+ filterOptions() {
157
+ if (!this.searchTerm) {
158
+ this.initializeOptions();
159
+ return;
160
+ }
161
+ const search = replaceSpecialChars(this.searchTerm.toLowerCase());
162
+ this.filteredOptions = (this.props?.options || []).filter(option => {
163
+ const label = option[this.labelProperty]
164
+ ? replaceSpecialChars(String(option[this.labelProperty]).toLowerCase())
165
+ : '';
166
+ const value = option[this.valueProperty]
167
+ ? replaceSpecialChars(String(option[this.valueProperty]).toLowerCase())
168
+ : '';
169
+ return label.includes(search) || value.includes(search);
216
170
  });
217
171
  }
172
+ updateDisplayValue() {
173
+ if (this.selectedValues.length === 0) {
174
+ this.displayValue = '';
175
+ return;
176
+ }
177
+ if (this.selectedValues.length === 1) {
178
+ const option = this.getOptionByValue(this.selectedValues[0]);
179
+ this.displayValue = option ? option[this.labelProperty] : '';
180
+ }
181
+ else {
182
+ this.displayValue = `${this.selectedValues.length} elementos seleccionados`;
183
+ }
184
+ }
218
185
  syncSelectedValues() {
219
186
  if (this.props?.control?.value) {
220
187
  const valueArray = this.parseValue(this.props.control.value);
221
- this.selectedValues.set(valueArray);
188
+ this.selectedValues = valueArray;
222
189
  }
223
190
  }
224
191
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSimpleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -234,18 +201,18 @@ export class MultiSelectSimpleComponent {
234
201
  <ion-input
235
202
  #mainInput
236
203
  type="text"
237
- [value]="displayValue()"
204
+ [value]="displayValue"
238
205
  [placeholder]="props?.placeholder || placeholder"
239
206
  readonly
240
207
  class="main-input"
241
- [class.is-open]="isOpen()"
208
+ [class.is-open]="isOpen"
242
209
  />
243
210
 
244
211
  <!-- Dropdown icon -->
245
212
  <ion-icon
246
213
  name="chevron-down-outline"
247
214
  class="dropdown-icon"
248
- [class.rotated]="isOpen()"
215
+ [class.rotated]="isOpen"
249
216
  ></ion-icon>
250
217
 
251
218
  <!-- Hidden input for form control -->
@@ -259,7 +226,7 @@ export class MultiSelectSimpleComponent {
259
226
  <!-- Dropdown overlay -->
260
227
  <div
261
228
  class="dropdown-overlay"
262
- [class.visible]="isOpen()"
229
+ [class.visible]="isOpen"
263
230
  #dropdown
264
231
  >
265
232
  <!-- Search bar -->
@@ -268,7 +235,7 @@ export class MultiSelectSimpleComponent {
268
235
  #searchbar
269
236
  [placeholder]="searchPlaceholder"
270
237
  (ionInput)="onSearch($event)"
271
- [value]="searchTerm()"
238
+ [value]="searchTerm"
272
239
  show-clear-button="focus"
273
240
  ></ion-searchbar>
274
241
  </div>
@@ -279,7 +246,7 @@ export class MultiSelectSimpleComponent {
279
246
  fill="clear"
280
247
  size="small"
281
248
  (click)="selectAll()"
282
- [disabled]="filteredOptions().length === 0"
249
+ [disabled]="filteredOptions.length === 0"
283
250
  >
284
251
  Seleccionar todos
285
252
  </ion-button>
@@ -288,22 +255,17 @@ export class MultiSelectSimpleComponent {
288
255
  size="small"
289
256
  color="medium"
290
257
  (click)="clearAll()"
291
- [disabled]="selectedValues().length === 0"
258
+ [disabled]="selectedValues.length === 0"
292
259
  >
293
260
  Limpiar
294
261
  </ion-button>
295
262
  </div>
296
263
 
297
- <!-- Debug button -->
298
- <div class="search-container" style="background: red; color: white; padding: 4px;">
299
- <button (click)="debugOptions()">DEBUG: {{ filteredOptions().length }} opciones</button>
300
- </div>
301
-
302
264
  <!-- Options list -->
303
265
  <div class="options-container">
304
266
  <ion-list class="options-list">
305
267
  <ion-item
306
- *ngFor="let option of filteredOptions(); trackBy: trackByFn"
268
+ *ngFor="let option of filteredOptions; trackBy: trackByFn"
307
269
  button
308
270
  (click)="toggleOption(option)"
309
271
  class="option-item"
@@ -316,9 +278,9 @@ export class MultiSelectSimpleComponent {
316
278
  </ion-item>
317
279
 
318
280
  <!-- No results message -->
319
- <ion-item *ngIf="filteredOptions().length === 0" class="no-results">
281
+ <ion-item *ngIf="filteredOptions.length === 0" class="no-results">
320
282
  <ion-label color="medium">
321
- {{ searchTerm() ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
283
+ {{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
322
284
  </ion-label>
323
285
  </ion-item>
324
286
  </ion-list>
@@ -340,18 +302,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
340
302
  <ion-input
341
303
  #mainInput
342
304
  type="text"
343
- [value]="displayValue()"
305
+ [value]="displayValue"
344
306
  [placeholder]="props?.placeholder || placeholder"
345
307
  readonly
346
308
  class="main-input"
347
- [class.is-open]="isOpen()"
309
+ [class.is-open]="isOpen"
348
310
  />
349
311
 
350
312
  <!-- Dropdown icon -->
351
313
  <ion-icon
352
314
  name="chevron-down-outline"
353
315
  class="dropdown-icon"
354
- [class.rotated]="isOpen()"
316
+ [class.rotated]="isOpen"
355
317
  ></ion-icon>
356
318
 
357
319
  <!-- Hidden input for form control -->
@@ -365,7 +327,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
365
327
  <!-- Dropdown overlay -->
366
328
  <div
367
329
  class="dropdown-overlay"
368
- [class.visible]="isOpen()"
330
+ [class.visible]="isOpen"
369
331
  #dropdown
370
332
  >
371
333
  <!-- Search bar -->
@@ -374,7 +336,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
374
336
  #searchbar
375
337
  [placeholder]="searchPlaceholder"
376
338
  (ionInput)="onSearch($event)"
377
- [value]="searchTerm()"
339
+ [value]="searchTerm"
378
340
  show-clear-button="focus"
379
341
  ></ion-searchbar>
380
342
  </div>
@@ -385,7 +347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
385
347
  fill="clear"
386
348
  size="small"
387
349
  (click)="selectAll()"
388
- [disabled]="filteredOptions().length === 0"
350
+ [disabled]="filteredOptions.length === 0"
389
351
  >
390
352
  Seleccionar todos
391
353
  </ion-button>
@@ -394,22 +356,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
394
356
  size="small"
395
357
  color="medium"
396
358
  (click)="clearAll()"
397
- [disabled]="selectedValues().length === 0"
359
+ [disabled]="selectedValues.length === 0"
398
360
  >
399
361
  Limpiar
400
362
  </ion-button>
401
363
  </div>
402
364
 
403
- <!-- Debug button -->
404
- <div class="search-container" style="background: red; color: white; padding: 4px;">
405
- <button (click)="debugOptions()">DEBUG: {{ filteredOptions().length }} opciones</button>
406
- </div>
407
-
408
365
  <!-- Options list -->
409
366
  <div class="options-container">
410
367
  <ion-list class="options-list">
411
368
  <ion-item
412
- *ngFor="let option of filteredOptions(); trackBy: trackByFn"
369
+ *ngFor="let option of filteredOptions; trackBy: trackByFn"
413
370
  button
414
371
  (click)="toggleOption(option)"
415
372
  class="option-item"
@@ -422,9 +379,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
422
379
  </ion-item>
423
380
 
424
381
  <!-- No results message -->
425
- <ion-item *ngIf="filteredOptions().length === 0" class="no-results">
382
+ <ion-item *ngIf="filteredOptions.length === 0" class="no-results">
426
383
  <ion-label color="medium">
427
- {{ searchTerm() ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
384
+ {{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
428
385
  </ion-label>
429
386
  </ion-item>
430
387
  </ion-list>
@@ -446,4 +403,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
446
403
  }], placeholder: [{
447
404
  type: Input
448
405
  }] } });
449
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LXNpbXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tdWx0aS1zZWxlY3Qtc2ltcGxlL211bHRpLXNlbGVjdC1zaW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUtMLFNBQVMsRUFDVCxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDcEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7O0FBaUhqRSxNQUFNLE9BQU8sMEJBQTBCO0lBa0VyQztRQTdEUyxrQkFBYSxHQUFXLE1BQU0sQ0FBQztRQUMvQixrQkFBYSxHQUFXLElBQUksQ0FBQztRQUM3QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUUxQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUxQyx3Q0FBd0M7UUFDeEMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixlQUFVLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLG1CQUFj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QkFFYixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJb25pY01vZHVsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IExhbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGFuZy1wcm92aWRlci9sYW5nLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgYXBwbHlEZWZhdWx0VmFsdWVUb0NvbnRyb2wgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvZm9ybS1kZWZhdWx0cyc7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL3RleHQnO1xuaW1wb3J0IHsgSW5wdXRNZXRhZGF0YSwgSW5wdXRPcHRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1tdWx0aS1zZWxlY3Qtc2ltcGxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uaWNNb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aVNlbGVjdFNpbXBsZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibXVsdGktc2VsZWN0LWNvbnRhaW5lclwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigkZXZlbnQpXCI+XG4gICAgICA8IS0tIE1haW4gaW5wdXQgZGlzcGxheSAtLT5cbiAgICAgIDxpb24taW5wdXRcbiAgICAgICAgI21haW5JbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFt2YWx1ZV09XCJkaXNwbGF5VmFsdWUoKVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wcz8ucGxhY2Vob2xkZXIgfHwgcGxhY2Vob2xkZXJcIlxuICAgICAgICByZWFkb25seVxuICAgICAgICBjbGFzcz1cIm1haW4taW5wdXRcIlxuICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJpc09wZW4oKVwiXG4gICAgICAvPlxuICAgICAgXG4gICAgICA8IS0tIERyb3Bkb3duIGljb24gLS0+XG4gICAgICA8aW9uLWljb24gXG4gICAgICAgIG5hbWU9XCJjaGV2cm9uLWRvd24tb3V0bGluZVwiIFxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWljb25cIiBcbiAgICAgICAgW2NsYXNzLnJvdGF0ZWRdPVwiaXNPcGVuKClcIlxuICAgICAgPjwvaW9uLWljb24+XG4gICAgICBcbiAgICAgIDwhLS0gSGlkZGVuIGlucHV0IGZvciBmb3JtIGNvbnRyb2wgLS0+XG4gICAgICA8aW9uLWlucHV0IFxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7XCIgXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJwcm9wcz8uY29udHJvbFwiIFxuICAgICAgICB0eXBlPVwiaGlkZGVuXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIERyb3Bkb3duIG92ZXJsYXkgLS0+XG4gICAgPGRpdiBcbiAgICAgIGNsYXNzPVwiZHJvcGRvd24tb3ZlcmxheVwiIFxuICAgICAgW2NsYXNzLnZpc2libGVdPVwiaXNPcGVuKClcIlxuICAgICAgI2Ryb3Bkb3duXG4gICAgPlxuICAgICAgPCEtLSBTZWFyY2ggYmFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1zZWFyY2hiYXJcbiAgICAgICAgICAjc2VhcmNoYmFyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAoaW9uSW5wdXQpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFRlcm0oKVwiXG4gICAgICAgICAgc2hvdy1jbGVhci1idXR0b249XCJmb2N1c1wiXG4gICAgICAgID48L2lvbi1zZWFyY2hiYXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBBY3Rpb24gYnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICA8aW9uLWJ1dHRvbiBcbiAgICAgICAgICBmaWxsPVwiY2xlYXJcIiBcbiAgICAgICAgICBzaXplPVwic21hbGxcIiBcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QWxsKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAgU2VsZWNjaW9uYXIgdG9kb3NcbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBcbiAgICAgICAgICBmaWxsPVwiY2xlYXJcIiBcbiAgICAgICAgICBzaXplPVwic21hbGxcIiBcbiAgICAgICAgICBjb2xvcj1cIm1lZGl1bVwiIFxuICAgICAgICAgIChjbGljayk9XCJjbGVhckFsbCgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRWYWx1ZXMoKS5sZW5ndGggPT09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAgTGltcGlhclxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBEZWJ1ZyBidXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvbnRhaW5lclwiIHN0eWxlPVwiYmFja2dyb3VuZDogcmVkOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVidWdPcHRpb25zKClcIj5ERUJVRzoge3sgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19IG9wY2lvbmVzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBPcHRpb25zIGxpc3QgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwib3B0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwib3B0aW9ucy1saXN0XCI+XG4gICAgICAgICAgPGlvbi1pdGVtIFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2tCeTogdHJhY2tCeUZuXCIgXG4gICAgICAgICAgICBidXR0b24gXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3B0aW9uKG9wdGlvbilcIlxuICAgICAgICAgICAgY2xhc3M9XCJvcHRpb24taXRlbVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1jaGVja2JveFxuICAgICAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgPjwvaW9uLWNoZWNrYm94PlxuICAgICAgICAgICAgPGlvbi1sYWJlbD57eyBvcHRpb25bbGFiZWxQcm9wZXJ0eV0gfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gTm8gcmVzdWx0cyBtZXNzYWdlIC0tPlxuICAgICAgICAgIDxpb24taXRlbSAqbmdJZj1cImZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwibm8tcmVzdWx0c1wiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cIm1lZGl1bVwiPlxuICAgICAgICAgICAgICB7eyBzZWFyY2hUZXJtKCkgPyAnTm8gc2UgZW5jb250cmFyb24gcmVzdWx0YWRvcycgOiAnTm8gaGF5IG9wY2lvbmVzIGRpc3BvbmlibGVzJyB9fVxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1zZWxlY3Qtc2ltcGxlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RTaW1wbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJykgZHJvcGRvd25SZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdtYWluSW5wdXQnKSBtYWluSW5wdXRSZWYhOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIHByb3BzITogSW5wdXRNZXRhZGF0YTtcbiAgQElucHV0KCkgbGFiZWxQcm9wZXJ0eTogc3RyaW5nID0gJ25hbWUnO1xuICBASW5wdXQoKSB2YWx1ZVByb3BlcnR5OiBzdHJpbmcgPSAnaWQnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBsYW5nU2VydmljZSA9IGluamVjdChMYW5nU2VydmljZSk7XG4gIFxuICAvLyBTaWduYWxzIGZvciByZWFjdGl2ZSBzdGF0ZSBtYW5hZ2VtZW50XG4gIGlzT3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gIHNlYXJjaFRlcm0gPSBzaWduYWwoJycpO1xuICBzZWxlY3RlZFZhbHVlcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICBcbiAgLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSByZWFjdGl2ZVxuICBvcHRpb25zU2lnbmFsID0gc2lnbmFsPElucHV0T3B0aW9uW10+KFtdKTtcbiAgXG4gIC8vIENvbXB1dGVkIHNpZ25hbHNcbiAgZGlzcGxheVZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFZhbHVlcygpO1xuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5nZXRPcHRpb25CeVZhbHVlKHNlbGVjdGVkWzBdKTtcbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdGhpcy5sYWJlbFByb3BlcnR5XSA6ICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7c2VsZWN0ZWQubGVuZ3RofSBlbGVtZW50b3Mgc2VsZWNjaW9uYWRvc2A7XG4gIH0pO1xuXG4gIGZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAvLyBVc2Ugc2lnbmFsIGluc3RlYWQgb2YgcHJvcHMgZGlyZWN0bHlcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zU2lnbmFsKCk7XG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hUZXJtKCkudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBEZWJ1Z1xuICAgIGNvbnNvbGUubG9nKCdbTXVsdGlTZWxlY3RTaW1wbGVdIGZpbHRlcmVkT3B0aW9ucyBjb21wdXRlZDonLCB7XG4gICAgICBvcHRpb25zQ291bnQ6IG9wdGlvbnMubGVuZ3RoLFxuICAgICAgc2VhcmNoVGVybTogc2VhcmNoLFxuICAgICAgb3B0aW9uczogb3B0aW9ucy5zbGljZSgwLCAzKSAvLyBQcmltZXJhcyAzIG9wY2lvbmVzXG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gb3B0aW9uW3RoaXMubGFiZWxQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhvcHRpb25bdGhpcy5sYWJlbFByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uW3RoaXMudmFsdWVQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSByZXBsYWNlU3BlY2lhbENoYXJzKHNlYXJjaCk7XG4gICAgICByZXR1cm4gbGFiZWwuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgdmFsdWUuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF92YWx1ZTogYW55KSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgJ3NlbGVjdE9wdGlvbnMnLCAnU2VsZWNjaW9uZSBvcGNpb25lcycpO1xuICAgIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldFRleHQoJ19nbG9iYWwnLCAnc2VhcmNoJywgJ0J1c2NhcicpO1xuICAgIFxuICAgIC8vIENsb3NlIGRyb3Bkb3duIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja091dHNpZGUuYmluZCh0aGlzKSk7XG4gICAgXG4gICAgLy8gRGVidWcgZWZmZWN0IHRvIHRyYWNrIHdoZW4gZmlsdGVyZWRPcHRpb25zIGNoYW5nZXNcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG4gICAgICBjb25zb2xlLmxvZygnW011bHRpU2VsZWN0U2ltcGxlXSBFRkZFQ1QgLSBmaWx0ZXJlZE9wdGlvbnMgY2hhbmdlZDonLCB7XG4gICAgICAgIG9wdGlvbnNDb3VudDogb3B0aW9ucy5sZW5ndGgsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zb2xlLmxvZygnW011bHRpU2VsZWN0U2ltcGxlXSBuZ09uSW5pdDonLCB7XG4gICAgICBwcm9wczogISF0aGlzLnByb3BzLFxuICAgICAgb3B0aW9uczogdGhpcy5wcm9wcz8ub3B0aW9ucz8ubGVuZ3RoIHx8IDAsXG4gICAgICBjb250cm9sOiAhIXRoaXMucHJvcHM/LmNvbnRyb2xcbiAgICB9KTtcbiAgICBcbiAgICAvLyBVcGRhdGUgb3B0aW9ucyBzaWduYWxcbiAgICBpZiAodGhpcy5wcm9wcz8ub3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zU2lnbmFsLnNldCh0aGlzLnByb3BzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmFwcGx5RGVmYXVsdFZhbHVlKCk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja091dHNpZGUuYmluZCh0aGlzKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc29sZS5sb2coJ1tNdWx0aVNlbGVjdFNpbXBsZV0gbmdPbkNoYW5nZXM6Jywge1xuICAgICAgaGFzUHJvcHNDaGFuZ2U6ICEhY2hhbmdlc1sncHJvcHMnXSxcbiAgICAgIHByb3BzOiAhIXRoaXMucHJvcHMsXG4gICAgICBvcHRpb25zOiB0aGlzLnByb3BzPy5vcHRpb25zPy5sZW5ndGggfHwgMCxcbiAgICAgIHByb3BzT3B0aW9uczogdGhpcy5wcm9wcz8ub3B0aW9uc1xuICAgIH0pO1xuICAgIFxuICAgIGlmIChjaGFuZ2VzWydwcm9wcyddICYmIHRoaXMucHJvcHMpIHtcbiAgICAgIC8vIFVwZGF0ZSBvcHRpb25zIHNpZ25hbCB3aGVuIHByb3BzIGNoYW5nZVxuICAgICAgaWYgKHRoaXMucHJvcHMub3B0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZygnW011bHRpU2VsZWN0U2ltcGxlXSBVcGRhdGluZyBvcHRpb25zU2lnbmFsIHdpdGg6JywgdGhpcy5wcm9wcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zU2lnbmFsLnNldCh0aGlzLnByb3BzLm9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5zeW5jU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZUFycmF5ID0gdGhpcy5wYXJzZVZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLnNldCh2YWx1ZUFycmF5KTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShfaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBkaXNhYmxlZCBzdGF0ZSBpZiBuZWVkZWRcbiAgfVxuXG4gIC8vIENvbXBvbmVudCBtZXRob2RzXG4gIHRvZ2dsZURyb3Bkb3duKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNPcGVuLnVwZGF0ZSh2YWx1ZSA9PiAhdmFsdWUpO1xuICAgIFxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgLy8gRm9jdXMgc2VhcmNoIGJhciB3aGVuIG9wZW5pbmdcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hiYXIgPSB0aGlzLmRyb3Bkb3duUmVmPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCdpb24tc2VhcmNoYmFyJyk7XG4gICAgICAgIGlmIChzZWFyY2hiYXIpIHtcbiAgICAgICAgICBzZWFyY2hiYXIuc2V0Rm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldChldmVudC5kZXRhaWwudmFsdWUgfHwgJycpO1xuICB9XG5cbiAgdG9nZ2xlT3B0aW9uKG9wdGlvbjogSW5wdXRPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSk7IC8vIENvbnZlcnRpciBhIHN0cmluZ1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICBcbiAgICBpZiAodGhpcy5pc1NlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgIC8vIFJlbW92ZSBmcm9tIHNlbGVjdGlvblxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zZXQoY3VycmVudFNlbGVjdGVkLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCB0byBzZWxlY3Rpb25cbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuc2V0KFsuLi5jdXJyZW50U2VsZWN0ZWQsIHZhbHVlXSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5tYXAob3B0aW9uID0+IFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkpO1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICBcbiAgICAvLyBBZGQgb25seSBuZXcgdmFsdWVzIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSBhbGxWYWx1ZXMuZmlsdGVyKHZhbHVlID0+ICFjdXJyZW50U2VsZWN0ZWQuaW5jbHVkZXModmFsdWUpKTtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLnNldChbLi4uY3VycmVudFNlbGVjdGVkLCAuLi5uZXdWYWx1ZXNdKTtcbiAgICBcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICB9XG5cbiAgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zZXQoW10pO1xuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKG9wdGlvbjogSW5wdXRPcHRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZhbHVlcygpLmluY2x1ZGVzKFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkpO1xuICB9XG5cbiAgdHJhY2tCeUZuKF9pbmRleDogbnVtYmVyLCBvcHRpb246IElucHV0T3B0aW9uKTogYW55IHtcbiAgICByZXR1cm4gb3B0aW9uW3RoaXMudmFsdWVQcm9wZXJ0eV07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsaWNrT3V0c2lkZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSAmJiBcbiAgICAgICAgIXRoaXMubWFpbklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICF0aGlzLmRyb3Bkb3duUmVmPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IFN0cmluZyh2KSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcCh2ID0+IHYudHJpbSgpKS5maWx0ZXIodiA9PiB2ICE9PSAnJyk7XG4gICAgfVxuICAgIHJldHVybiBbU3RyaW5nKHZhbHVlKV07XG4gIH1cblxuICBwcml2YXRlIGVtaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKS5qb2luKCcsJyk7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgXG4gICAgaWYgKHRoaXMucHJvcHM/LmNvbnRyb2wpIHtcbiAgICAgIHRoaXMucHJvcHMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIHRoaXMucHJvcHMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcHRpb25CeVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBJbnB1dE9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc1NpZ25hbCgpLmZpbmQob3B0aW9uID0+IFxuICAgICAgU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKSA9PT0gU3RyaW5nKHZhbHVlKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RGVmYXVsdFZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzKSB7XG4gICAgICBhcHBseURlZmF1bHRWYWx1ZVRvQ29udHJvbCh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH1cblxuICBkZWJ1Z09wdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tNdWx0aVNlbGVjdFNpbXBsZV0gREVCVUcgQ0xJQ0s6Jywge1xuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBmaWx0ZXJlZE9wdGlvbnM6IHRoaXMuZmlsdGVyZWRPcHRpb25zKCksXG4gICAgICBzZWFyY2hUZXJtOiB0aGlzLnNlYXJjaFRlcm0oKSxcbiAgICAgIHByb3BzT3B0aW9uczogdGhpcy5wcm9wcz8ub3B0aW9ucyxcbiAgICAgIG9wdGlvbnNTaWduYWw6IHRoaXMub3B0aW9uc1NpZ25hbCgpLFxuICAgICAgY29tcHV0ZWQ6IHRoaXMuZmlsdGVyZWRPcHRpb25zKClcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzPy5jb250cm9sPy52YWx1ZSkge1xuICAgICAgY29uc3QgdmFsdWVBcnJheSA9IHRoaXMucGFyc2VWYWx1ZSh0aGlzLnByb3BzLmNvbnRyb2wudmFsdWUpO1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zZXQodmFsdWVBcnJheSk7XG4gICAgfVxuICB9XG59Il19
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LXNpbXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tdWx0aS1zZWxlY3Qtc2ltcGxlL211bHRpLXNlbGVjdC1zaW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFLTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3BGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7OztBQTRHakUsTUFBTSxPQUFPLDBCQUEwQjtJQXdCckM7UUFuQlMsa0JBQWEsR0FBVyxNQUFNLENBQUM7UUFDL0Isa0JBQWEsR0FBVyxJQUFJLENBQUM7UUFDN0IsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFMUIsZ0JBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVuRCw2QkFBNkI7UUFDN0IsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsbUJBQWMsR0FB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LHNJQUFFLG1CQUFtQjs7NEZBc0cxRCwwQkFBMEI7a0JBekd0QyxTQUFTOytCQUNFLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxhQUMzRDt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwyQkFBMkIsQ0FBQzs0QkFDekQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJGVDt3REFJc0IsV0FBVztzQkFBakMsU0FBUzt1QkFBQyxVQUFVO2dCQUNHLFlBQVk7c0JBQW5DLFNBQVM7dUJBQUMsV0FBVztnQkFFYixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBhcHBseURlZmF1bHRWYWx1ZVRvQ29udHJvbCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC91dGlscy9mb3JtLWRlZmF1bHRzJztcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvdGV4dCc7XG5pbXBvcnQgeyBJbnB1dE1ldGFkYXRhLCBJbnB1dE9wdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW11bHRpLXNlbGVjdC1zaW1wbGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25pY01vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpU2VsZWN0U2ltcGxlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3QtY29udGFpbmVyXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudClcIj5cbiAgICAgIDwhLS0gTWFpbiBpbnB1dCBkaXNwbGF5IC0tPlxuICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAjbWFpbklucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW3ZhbHVlXT1cImRpc3BsYXlWYWx1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wcz8ucGxhY2Vob2xkZXIgfHwgcGxhY2Vob2xkZXJcIlxuICAgICAgICByZWFkb25seVxuICAgICAgICBjbGFzcz1cIm1haW4taW5wdXRcIlxuICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJpc09wZW5cIlxuICAgICAgLz5cbiAgICAgIFxuICAgICAgPCEtLSBEcm9wZG93biBpY29uIC0tPlxuICAgICAgPGlvbi1pY29uIFxuICAgICAgICBuYW1lPVwiY2hldnJvbi1kb3duLW91dGxpbmVcIiBcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pY29uXCIgXG4gICAgICAgIFtjbGFzcy5yb3RhdGVkXT1cImlzT3BlblwiXG4gICAgICA+PC9pb24taWNvbj5cbiAgICAgIFxuICAgICAgPCEtLSBIaWRkZW4gaW5wdXQgZm9yIGZvcm0gY29udHJvbCAtLT5cbiAgICAgIDxpb24taW5wdXQgXG4gICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBvcGFjaXR5OiAwOyBwb2ludGVyLWV2ZW50czogbm9uZTtcIiBcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cInByb3BzPy5jb250cm9sXCIgXG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRHJvcGRvd24gb3ZlcmxheSAtLT5cbiAgICA8ZGl2IFxuICAgICAgY2xhc3M9XCJkcm9wZG93bi1vdmVybGF5XCIgXG4gICAgICBbY2xhc3MudmlzaWJsZV09XCJpc09wZW5cIlxuICAgICAgI2Ryb3Bkb3duXG4gICAgPlxuICAgICAgPCEtLSBTZWFyY2ggYmFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1zZWFyY2hiYXJcbiAgICAgICAgICAjc2VhcmNoYmFyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAoaW9uSW5wdXQpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFRlcm1cIlxuICAgICAgICAgIHNob3ctY2xlYXItYnV0dG9uPVwiZm9jdXNcIlxuICAgICAgICA+PC9pb24tc2VhcmNoYmFyPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDwhLS0gQWN0aW9uIGJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1idXR0b24gXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCIgXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCIgXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbCgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICBTZWxlY2Npb25hciB0b2Rvc1xuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIFxuICAgICAgICAgIGZpbGw9XCJjbGVhclwiIFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiIFxuICAgICAgICAgIGNvbG9yPVwibWVkaXVtXCIgXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyQWxsKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAgTGltcGlhclxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBPcHRpb25zIGxpc3QgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwib3B0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwib3B0aW9ucy1saXN0XCI+XG4gICAgICAgICAgPGlvbi1pdGVtIFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFxuICAgICAgICAgICAgYnV0dG9uIFxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgICAgIGNsYXNzPVwib3B0aW9uLWl0ZW1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24tY2hlY2tib3hcbiAgICAgICAgICAgICAgc2xvdD1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgID48L2lvbi1jaGVja2JveD5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+e3sgb3B0aW9uW2xhYmVsUHJvcGVydHldIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIE5vIHJlc3VsdHMgbWVzc2FnZSAtLT5cbiAgICAgICAgICA8aW9uLWl0ZW0gKm5nSWY9XCJmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1yZXN1bHRzXCI+XG4gICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwibWVkaXVtXCI+XG4gICAgICAgICAgICAgIHt7IHNlYXJjaFRlcm0gPyAnTm8gc2UgZW5jb250cmFyb24gcmVzdWx0YWRvcycgOiAnTm8gaGF5IG9wY2lvbmVzIGRpc3BvbmlibGVzJyB9fVxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1zZWxlY3Qtc2ltcGxlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RTaW1wbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJykgZHJvcGRvd25SZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdtYWluSW5wdXQnKSBtYWluSW5wdXRSZWYhOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIHByb3BzITogSW5wdXRNZXRhZGF0YTtcbiAgQElucHV0KCkgbGFiZWxQcm9wZXJ0eTogc3RyaW5nID0gJ25hbWUnO1xuICBASW5wdXQoKSB2YWx1ZVByb3BlcnR5OiBzdHJpbmcgPSAnaWQnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBsYW5nU2VydmljZSA9IGluamVjdChMYW5nU2VydmljZSk7XG4gIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBcbiAgLy8gQ2xhc3NpYyBBbmd1bGFyIHByb3BlcnRpZXNcbiAgaXNPcGVuID0gZmFsc2U7XG4gIHNlYXJjaFRlcm0gPSAnJztcbiAgc2VsZWN0ZWRWYWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGRpc3BsYXlWYWx1ZSA9ICcnO1xuICBmaWx0ZXJlZE9wdGlvbnM6IElucHV0T3B0aW9uW10gPSBbXTtcbiAgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoX3ZhbHVlOiBhbnkpID0+IHt9O1xuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldFRleHQoJ19nbG9iYWwnLCAnc2VsZWN0T3B0aW9ucycsICdTZWxlY2Npb25lIG9wY2lvbmVzJyk7XG4gICAgdGhpcy5zZWFyY2hQbGFjZWhvbGRlciA9IHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dCgnX2dsb2JhbCcsICdzZWFyY2gnLCAnQnVzY2FyJyk7XG4gICAgXG4gICAgLy8gQ2xvc2UgZHJvcGRvd24gd2hlbiBjbGlja2luZyBvdXRzaWRlXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYXBwbHlEZWZhdWx0VmFsdWUoKTtcbiAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zKCk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXSAmJiB0aGlzLnByb3BzKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zKCk7XG4gICAgICB0aGlzLnN5bmNTZWxlY3RlZFZhbHVlcygpO1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLnBhcnNlVmFsdWUodmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPSB2YWx1ZUFycmF5O1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoX2lzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgZGlzYWJsZWQgc3RhdGUgaWYgbmVlZGVkXG4gIH1cblxuICAvLyBDb21wb25lbnQgbWV0aG9kc1xuICB0b2dnbGVEcm9wZG93bihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgICBcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAvLyBGb2N1cyBzZWFyY2ggYmFyIHdoZW4gb3BlbmluZ1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaGJhciA9IHRoaXMuZHJvcGRvd25SZWY/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoJ2lvbi1zZWFyY2hiYXInKTtcbiAgICAgICAgaWYgKHNlYXJjaGJhcikge1xuICAgICAgICAgIHNlYXJjaGJhci5zZXRGb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSBldmVudC5kZXRhaWwudmFsdWUgfHwgJyc7XG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gIH1cblxuICB0b2dnbGVPcHRpb24ob3B0aW9uOiBJbnB1dE9wdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKTtcbiAgICBcbiAgICBpZiAodGhpcy5pc1NlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgIC8vIFJlbW92ZSBmcm9tIHNlbGVjdGlvblxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgdG8gc2VsZWN0aW9uXG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gWy4uLnRoaXMuc2VsZWN0ZWRWYWx1ZXMsIHZhbHVlXTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IGFsbFZhbHVlcyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zLm1hcChvcHRpb24gPT4gU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKSk7XG4gICAgXG4gICAgLy8gQWRkIG9ubHkgbmV3IHZhbHVlcyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgY29uc3QgbmV3VmFsdWVzID0gYWxsVmFsdWVzLmZpbHRlcih2YWx1ZSA9PiAhdGhpcy5zZWxlY3RlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPSBbLi4udGhpcy5zZWxlY3RlZFZhbHVlcywgLi4ubmV3VmFsdWVzXTtcbiAgICBcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBjbGVhckFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gW107XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICB9XG5cbiAgaXNTZWxlY3RlZChvcHRpb246IElucHV0T3B0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMoU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKSk7XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIG9wdGlvbjogSW5wdXRPcHRpb24pOiBhbnkge1xuICAgIHJldHVybiBvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3BlbiAmJiBcbiAgICAgICAgIXRoaXMubWFpbklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICF0aGlzLmRyb3Bkb3duUmVmPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IFN0cmluZyh2KSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcCh2ID0+IHYudHJpbSgpKS5maWx0ZXIodiA9PiB2ICE9PSAnJyk7XG4gICAgfVxuICAgIHJldHVybiBbU3RyaW5nKHZhbHVlKV07XG4gIH1cblxuICBwcml2YXRlIGVtaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuam9pbignLCcpO1xuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIFxuICAgIGlmICh0aGlzLnByb3BzPy5jb250cm9sKSB7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5wcm9wcy5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3B0aW9uQnlWYWx1ZSh2YWx1ZTogc3RyaW5nKTogSW5wdXRPcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maW5kKG9wdGlvbiA9PiBcbiAgICAgIFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkgPT09IFN0cmluZyh2YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcykge1xuICAgICAgYXBwbHlEZWZhdWx0VmFsdWVUb0NvbnRyb2wodGhpcy5wcm9wcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMucHJvcHM/Lm9wdGlvbnMgfHwgW107XG4gIH1cbiAgXG4gIHByaXZhdGUgZmlsdGVyT3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoVGVybSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzZWFyY2ggPSByZXBsYWNlU3BlY2lhbENoYXJzKHRoaXMuc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKTtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9ICh0aGlzLnByb3BzPy5vcHRpb25zIHx8IFtdKS5maWx0ZXIob3B0aW9uID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gb3B0aW9uW3RoaXMubGFiZWxQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhvcHRpb25bdGhpcy5sYWJlbFByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uW3RoaXMudmFsdWVQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIHJldHVybiBsYWJlbC5pbmNsdWRlcyhzZWFyY2gpIHx8IHZhbHVlLmluY2x1ZGVzKHNlYXJjaCk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheVZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZ2V0T3B0aW9uQnlWYWx1ZSh0aGlzLnNlbGVjdGVkVmFsdWVzWzBdKTtcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gb3B0aW9uID8gb3B0aW9uW3RoaXMubGFiZWxQcm9wZXJ0eV0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSBgJHt0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aH0gZWxlbWVudG9zIHNlbGVjY2lvbmFkb3NgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzPy5jb250cm9sPy52YWx1ZSkge1xuICAgICAgY29uc3QgdmFsdWVBcnJheSA9IHRoaXMucGFyc2VWYWx1ZSh0aGlzLnByb3BzLmNvbnRyb2wudmFsdWUpO1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IHZhbHVlQXJyYXk7XG4gICAgfVxuICB9XG59Il19