@senior-gestao-pessoas/payroll-core 9.5.0-01923a3e-20f4-4cb3-9565-a0584abd00d1 → 9.5.0-32c4c8b1-bb0c-491c-8ec0-0eef83fe1088

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 (26) hide show
  1. package/bundles/senior-gestao-pessoas-payroll-core.umd.js +530 -86
  2. package/bundles/senior-gestao-pessoas-payroll-core.umd.js.map +1 -1
  3. package/bundles/senior-gestao-pessoas-payroll-core.umd.min.js +2 -2
  4. package/bundles/senior-gestao-pessoas-payroll-core.umd.min.js.map +1 -1
  5. package/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.d.ts +1 -0
  6. package/components/historical-pix-account/historical-pix-account.component.d.ts +71 -10
  7. package/components/historical-pix-account-list/historical-pix-account-list.component.d.ts +3 -0
  8. package/components/shared/shared-state.service.d.ts +8 -0
  9. package/esm2015/components/historical-pix-account/historical-pix-account-base.js +9 -2
  10. package/esm2015/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.js +9 -7
  11. package/esm2015/components/historical-pix-account/historical-pix-account.component.js +466 -81
  12. package/esm2015/components/historical-pix-account-list/historical-pix-account-list.component.js +26 -3
  13. package/esm2015/components/shared/shared-state.service.js +17 -1
  14. package/esm2015/components/utils/format-utils/format-utils.service.js +3 -1
  15. package/esm5/components/historical-pix-account/historical-pix-account-base.js +9 -2
  16. package/esm5/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.js +9 -7
  17. package/esm5/components/historical-pix-account/historical-pix-account.component.js +476 -81
  18. package/esm5/components/historical-pix-account-list/historical-pix-account-list.component.js +26 -3
  19. package/esm5/components/shared/shared-state.service.js +17 -1
  20. package/esm5/components/utils/format-utils/format-utils.service.js +3 -1
  21. package/fesm2015/senior-gestao-pessoas-payroll-core.js +520 -86
  22. package/fesm2015/senior-gestao-pessoas-payroll-core.js.map +1 -1
  23. package/fesm5/senior-gestao-pessoas-payroll-core.js +530 -86
  24. package/fesm5/senior-gestao-pessoas-payroll-core.js.map +1 -1
  25. package/package.json +1 -1
  26. package/senior-gestao-pessoas-payroll-core.metadata.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import * as tslib_1 from "tslib";
2
2
  import { Component, OnInit, ViewChild, Input, ChangeDetectorRef, AfterViewInit, OnDestroy, EventEmitter, Output, OnChanges, SimpleChanges, } from "@angular/core";
3
- import { FormGroup, FormBuilder, Validators } from "@angular/forms";
3
+ import { FormGroup, FormBuilder, Validators, AbstractControl } from "@angular/forms";
4
4
  import { TranslateService } from "@ngx-translate/core";
5
5
  import { CustomFieldsComponent } from "@seniorsistemas/angular-components";
6
6
  import { compareValues, isValid, mountCustomToSave } from "../utils/helpers";
@@ -10,6 +10,7 @@ import { FormatUtilsService } from "../utils/format-utils/format-utils.service";
10
10
  import { SharedStateService } from "../shared/shared-state.service";
11
11
  import { HistoricakPixAccountBase } from "./historical-pix-account-base";
12
12
  import { HistoricalPixAccountService } from "./historical-pix-account.service";
13
+ import { GenericValidator } from "../utils/generic-validators";
13
14
  var HistoricalPixAccountComponent = /** @class */ (function (_super) {
14
15
  tslib_1.__extends(HistoricalPixAccountComponent, _super);
15
16
  function HistoricalPixAccountComponent(translateService, cd, formBuilder, sharedStateService, service) {
@@ -27,6 +28,9 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
27
28
  _this.addExistentHistoricData = [];
28
29
  _this.getListPixAccount = [];
29
30
  _this.isEditModeForSave = false;
31
+ _this.showField = false;
32
+ _this.hideBtnAddForViewMode = false;
33
+ _this.showButtonView = true;
30
34
  _this.isViewModeActive = new EventEmitter();
31
35
  _this.isEditModeActive = new EventEmitter();
32
36
  _this.isDeleteModeActive = new EventEmitter();
@@ -44,12 +48,12 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
44
48
  _this.loading = true;
45
49
  _this.listData = [];
46
50
  _this.listDataNoPage = [];
47
- _this.showButtonView = true;
48
51
  _this.showEditMode = false;
49
52
  _this.hasRecordsPix = true;
50
53
  _this.hideFields = _this.sharedStateService.hideField$;
51
54
  _this.suggestions = [];
52
55
  _this.formGroupByRow = {};
56
+ _this.isSyncingPercentage = false;
53
57
  _this.cols = [
54
58
  {
55
59
  label: _this.translateService.instant("hcm.payroll.employees_addition_pix_key_type"),
@@ -128,14 +132,17 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
128
132
  }
129
133
  HistoricalPixAccountComponent.prototype.ngOnInit = function () {
130
134
  var _this = this;
135
+ this.showFields = this.showField;
131
136
  this.formGroup.setControl(this.fieldFormGroup, this.historicalPixAccountList);
132
- this.sharedStateService.showButton$.subscribe(function (value) {
133
- _this.showButtonView = value;
134
- });
135
137
  this.sharedStateService.showEditMode$.subscribe(function (value) {
136
138
  _this.showEditMode = value;
137
139
  _this.isEditModeForSave = value;
138
140
  });
141
+ this.sharedStateService.activeHideOptionsOnView$.subscribe(function (value) {
142
+ if (value) {
143
+ _this.showButtonView = false;
144
+ }
145
+ });
139
146
  this.sharedStateService.activeValidatorsOnEditModalOpen$
140
147
  .subscribe(function () {
141
148
  Object.values(_this.formGroupByRow).forEach(function (fg) {
@@ -146,6 +153,7 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
146
153
  });
147
154
  _this.emitFormValidity();
148
155
  });
156
+ this.resetFormState();
149
157
  };
150
158
  HistoricalPixAccountComponent.prototype.ngOnChanges = function (changes) {
151
159
  if (changes['listDataReciever'] && changes['listDataReciever'].currentValue) {
@@ -158,6 +166,10 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
158
166
  var newData = changes['addExistentHistoricData'].currentValue;
159
167
  this.rebuildFormGroupMap(newData);
160
168
  }
169
+ if (changes['isEditMode']) {
170
+ this.isEditMode = changes['isEditMode'].currentValue;
171
+ this.cd.detectChanges();
172
+ }
161
173
  };
162
174
  HistoricalPixAccountComponent.prototype.createFormGroup = function () {
163
175
  this.historicalPixAccountList = this.formBuilder.group({
@@ -172,9 +184,31 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
172
184
  this.cd.detectChanges();
173
185
  };
174
186
  HistoricalPixAccountComponent.prototype.emitFormValidity = function () {
175
- var allValid = Object.values(this.formGroupByRow).every(function (fg) {
187
+ if (!this.formGroupByRow || Object.keys(this.formGroupByRow).length === 0) {
188
+ this.isValidChangeForm.emit(false);
189
+ return;
190
+ }
191
+ var allValid = true;
192
+ Object.values(this.formGroupByRow).forEach(function (fg) {
193
+ // Verifica cada controle individualmente
194
+ Object.keys(fg.controls).forEach(function (key) {
195
+ var control = fg.get(key);
196
+ // Verifica se o controle é obrigatório e está vazio
197
+ if (control.validator && control.validator({})) {
198
+ var validatorFn = control.validator({});
199
+ if (validatorFn && validatorFn.required && !control.value) {
200
+ allValid = false;
201
+ }
202
+ }
203
+ // Verifica se o controle tem erros
204
+ if (control.errors) {
205
+ allValid = false;
206
+ }
207
+ });
176
208
  fg.updateValueAndValidity();
177
- return fg.valid;
209
+ if (!fg.valid) {
210
+ allValid = false;
211
+ }
178
212
  });
179
213
  this.isValidChangeForm.emit(allValid);
180
214
  };
@@ -195,65 +229,27 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
195
229
  };
196
230
  HistoricalPixAccountComponent.prototype.createPixRowFormGroup = function () {
197
231
  return this.formBuilder.group({
232
+ id: [null],
198
233
  pixKeyType: [null, Validators.required],
199
234
  pixKey: [null],
200
235
  percentage: [0, Validators.compose(tslib_1.__spread(this.initialValidatorOfPercentage, [
201
236
  Validators.max(this.maxValuePercentage),
202
- ]))]
237
+ ]))],
238
+ externalId: [null],
203
239
  });
204
240
  };
205
- HistoricalPixAccountComponent.prototype.onPixKeyInput = function (event, index) {
206
- var inputValue = event.target.value;
207
- var inputRawValue = inputValue.replace(/\D/g, '');
208
- var form = this.formGroupByRow[index];
209
- var pixKeyControl = form.get('pixKey');
210
- if (pixKeyControl) {
211
- pixKeyControl.setValue(inputRawValue, { emitEvent: false });
212
- pixKeyControl.markAsDirty();
213
- pixKeyControl.updateValueAndValidity();
214
- }
215
- this.setPixKeyValidators(true, form);
216
- this.emitFormValidity();
217
- };
218
- HistoricalPixAccountComponent.prototype.onBlurPixCpfAndCnpj = function (index) {
219
- var form = this.formGroupByRow[index];
220
- var pixKeyControl = form.get('pixKey');
221
- var pixKeyTypeControl = form.get('pixKeyType');
222
- if (!pixKeyControl || !pixKeyTypeControl)
223
- return;
224
- var currentValue = pixKeyControl.value;
225
- var pixKeyType = pixKeyTypeControl.value.key;
226
- var rawValue = (currentValue || '').replace(/\D/g, '');
227
- pixKeyControl.setValue(rawValue, { emitEvent: false });
228
- if (pixKeyControl.valid) {
229
- form.patchValue({
230
- pixKeyFormatted: FormatUtilsService.getFormattedSubscriptionNumber(rawValue, pixKeyType)
241
+ /**
242
+ * Sincroniza todos os dados do NgModel para os FormGroups antes de enviar ao componente pai
243
+ */
244
+ HistoricalPixAccountComponent.prototype.syncPixDataToParentForm = function () {
245
+ this.syncAllModelToForm();
246
+ var historicalPix = tslib_1.__spread(this.addExistentHistoricData);
247
+ this.historicalPixAccountList.get("historicalPixAccountList").setValue(historicalPix);
248
+ if (this.formGroup) {
249
+ this.formGroup.get(this.fieldFormGroup).patchValue({
250
+ historicalPixAccountList: historicalPix
231
251
  });
232
252
  }
233
- this.emitFormValidity();
234
- };
235
- HistoricalPixAccountComponent.prototype.getFormattedPixKey = function (type, value) {
236
- return FormatUtilsService.getFormattedSubscriptionNumber(value, type);
237
- };
238
- HistoricalPixAccountComponent.prototype.syncPixDataToParentForm = function () {
239
- if (!this.isEditModeForSave)
240
- return;
241
- var values = Object.values(this.formGroupByRow).map(function (fg) {
242
- var value = fg.getRawValue();
243
- var pixKeyType = value.pixKeyType.key;
244
- if (pixKeyType === 'CPF' || pixKeyType === 'CNPJ') {
245
- value.pixKey = (value.pixKey || '').replace(/[.\-\/]/g, '');
246
- }
247
- else if (pixKeyType === 'TELEPHONE') {
248
- value.pixKey = (value.pixKey || '').replace(/[()\s\-]/g, '');
249
- }
250
- return value;
251
- });
252
- this.formGroup
253
- .get(this.fieldFormGroup)
254
- .get('historicalPixAccountList')
255
- .setValue(values);
256
- this.emitFormValidity();
257
253
  };
258
254
  HistoricalPixAccountComponent.prototype.syncResetPixFormToParent = function () {
259
255
  this.formGroupByRow = {};
@@ -263,6 +259,46 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
263
259
  this.rebuildFormGroupMap(this.addExistentHistoricData);
264
260
  }
265
261
  };
262
+ /**
263
+ * Valida todos os formulários
264
+ */
265
+ HistoricalPixAccountComponent.prototype.validateAllForms = function () {
266
+ var _this = this;
267
+ this.forceCloseAllCellEditors();
268
+ this.syncAllModelToForm();
269
+ if (!this.formGroupByRow || Object.keys(this.formGroupByRow).length === 0) {
270
+ return true;
271
+ }
272
+ var isAllValid = true;
273
+ Object.keys(this.formGroupByRow).forEach(function (indexKey) {
274
+ var index = Number(indexKey);
275
+ var form = _this.formGroupByRow[index];
276
+ if (form) {
277
+ Object.keys(form.controls).forEach(function (controlName) {
278
+ var control = form.get(controlName);
279
+ control.markAsTouched();
280
+ if (controlName === 'pixKey') {
281
+ var pixKeyTypeControl = form.get('pixKeyType');
282
+ if (pixKeyTypeControl.value) {
283
+ _this.validateDocumentField(index, pixKeyTypeControl.value.key);
284
+ }
285
+ }
286
+ });
287
+ form.updateValueAndValidity();
288
+ if (form.invalid) {
289
+ isAllValid = false;
290
+ }
291
+ }
292
+ });
293
+ if (isAllValid && this.addExistentHistoricData && this.addExistentHistoricData.length > 0) {
294
+ var totalPercentage = this.addExistentHistoricData.reduce(function (sum, item) { return sum + (parseFloat(item.percentage) || 0); }, 0);
295
+ if (Math.abs(totalPercentage - 100) > 0.01) {
296
+ isAllValid = false;
297
+ }
298
+ }
299
+ this.isValidChangeForm.emit(isAllValid);
300
+ return isAllValid;
301
+ };
266
302
  HistoricalPixAccountComponent.prototype.onLazyLoad = function (event) {
267
303
  var _this = this;
268
304
  var first = event && event.first ? event.first : 0;
@@ -310,9 +346,11 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
310
346
  };
311
347
  HistoricalPixAccountComponent.prototype.addPix = function () {
312
348
  var newItem = {
349
+ id: null,
313
350
  pixKeyType: {},
314
351
  pixKey: '',
315
- percentage: 0
352
+ percentage: '',
353
+ externalId: '',
316
354
  };
317
355
  var index = this.addExistentHistoricData.length;
318
356
  this.addExistentHistoricData = tslib_1.__spread(this.addExistentHistoricData, [
@@ -323,11 +361,27 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
323
361
  this.emitFormValidity();
324
362
  };
325
363
  HistoricalPixAccountComponent.prototype.deletePix = function (index) {
364
+ var _this = this;
326
365
  if (this.dataListPix.editingCell) {
327
366
  this.dataListPix.editingCell = null;
328
367
  }
329
368
  this.addExistentHistoricData = this.addExistentHistoricData.filter(function (_, i) { return i !== index; });
369
+ var currentList = this.historicalPixAccountList.get("historicalPixAccountList").value || [];
370
+ var updatedList = currentList.filter(function (_, i) { return i !== index; });
371
+ this.historicalPixAccountList.get("historicalPixAccountList").setValue(updatedList);
372
+ if (this.formGroup) {
373
+ this.formGroup.get(this.fieldFormGroup).patchValue({
374
+ historicalPixAccountList: updatedList
375
+ });
376
+ }
330
377
  this.rebuildFormGroupMap(this.addExistentHistoricData);
378
+ this.addExistentHistoricData.forEach(function (_, i) {
379
+ if (_this.formGroupByRow[i]) {
380
+ var allValues = _this.addExistentHistoricData
381
+ .map(function (item, idx) { return idx === i ? 0 : (parseFloat(item.percentage) || 0); });
382
+ _this.validatePercentageValid(allValues, _this.formGroupByRow[i]);
383
+ }
384
+ });
331
385
  this.emitFormValidity();
332
386
  };
333
387
  HistoricalPixAccountComponent.prototype.rebuildFormGroupMap = function (data) {
@@ -402,6 +456,7 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
402
456
  }
403
457
  $event["dateChange"] = this.dateChange;
404
458
  newDataList.push($event);
459
+ this.addExistentHistoricData.push(tslib_1.__assign({}, $event));
405
460
  }
406
461
  this.historicalPixAccountList.get("historicalPixAccountList").setValue(newDataList);
407
462
  this.verifyTotalPercentage();
@@ -431,7 +486,14 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
431
486
  this.msgTotalLimitByPercentage = null;
432
487
  }
433
488
  };
489
+ HistoricalPixAccountComponent.prototype.formatPercentage = function (value) {
490
+ if (value == null || value === '' || isNaN(Number(value))) {
491
+ return '0.00';
492
+ }
493
+ return Number(value).toFixed(2);
494
+ };
434
495
  HistoricalPixAccountComponent.prototype.onSyncValue = function (field, index) {
496
+ var _this = this;
435
497
  if (this.formGroupByRow &&
436
498
  this.formGroupByRow[index] &&
437
499
  this.formGroupByRow[index].get(field)) {
@@ -440,14 +502,352 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
440
502
  this.addExistentHistoricData[index][field] = value;
441
503
  control.markAsDirty();
442
504
  control.markAsTouched();
505
+ if (field === 'percentage') {
506
+ var currentList = this.addExistentHistoricData
507
+ .map(function (item, i) { return i === index ? 0 : (parseFloat(item.percentage) || 0); });
508
+ this.validatePercentageValid(currentList, this.formGroupByRow[index]);
509
+ if (!this.isSyncingPercentage) {
510
+ this.isSyncingPercentage = true;
511
+ setTimeout(function () {
512
+ _this.syncPixDataToParentForm();
513
+ _this.isSyncingPercentage = false;
514
+ }, 0);
515
+ }
516
+ }
443
517
  control.updateValueAndValidity();
444
- var currentList = this.addExistentHistoricData.map(function (item, i) {
445
- return i === index ? 0 : item.percentage;
518
+ this.formGroupByRow[index].updateValueAndValidity();
519
+ this.emitFormValidity();
520
+ }
521
+ };
522
+ HistoricalPixAccountComponent.prototype.close = function () {
523
+ this.visible = false;
524
+ };
525
+ HistoricalPixAccountComponent.prototype.getFormattedTelephoneNumber = function (telephoneNumber) {
526
+ return FormatUtilsService.getFormattedTelephoneNumber(telephoneNumber);
527
+ };
528
+ HistoricalPixAccountComponent.prototype.getFormattedCpf = function (cpf) {
529
+ return FormatUtilsService.getFormattedCpf(cpf);
530
+ };
531
+ HistoricalPixAccountComponent.prototype.getFormattedCnpj = function (cnpj) {
532
+ return FormatUtilsService.getFormattedCnpj(cnpj);
533
+ };
534
+ HistoricalPixAccountComponent.prototype.getFormattedPercentage = function (value) {
535
+ return FormatUtilsService.getFormattedPercentage(value);
536
+ };
537
+ /**
538
+ * Reseta completamente o estado do formulário e controles
539
+ */
540
+ HistoricalPixAccountComponent.prototype.resetFormState = function () {
541
+ if (this.formGroupByRow) {
542
+ Object.values(this.formGroupByRow).forEach(function (form) {
543
+ if (form) {
544
+ Object.keys(form.controls).forEach(function (controlName) {
545
+ var control = form.get(controlName);
546
+ if (control) {
547
+ control.setErrors(null);
548
+ control.markAsUntouched();
549
+ control.markAsPristine();
550
+ }
551
+ });
552
+ form.updateValueAndValidity();
553
+ }
446
554
  });
447
- this.validatePercentageValid(currentList, this.formGroupByRow[index]);
555
+ }
556
+ if (this.dataListPix) {
557
+ if (typeof this.dataListPix.closeAllCellEditors === 'function') {
558
+ try {
559
+ this.dataListPix.closeAllCellEditors();
560
+ }
561
+ catch (e) {
562
+ console.error('Erro ao tentar fechar cell editors:', e);
563
+ }
564
+ }
565
+ else if (this.dataListPix.editingCell) {
566
+ this.dataListPix.editingCell = null;
567
+ }
568
+ if (this.dataListPix.editing !== undefined) {
569
+ this.dataListPix.editing = false;
570
+ }
571
+ }
572
+ this.cd.detectChanges();
573
+ };
574
+ /**
575
+ * Formata a chave PIX para exibição baseada no tipo
576
+ */
577
+ HistoricalPixAccountComponent.prototype.getFormattedPixKey = function (pixKeyType, pixKey) {
578
+ if (!pixKey)
579
+ return '';
580
+ switch (pixKeyType) {
581
+ case 'CPF':
582
+ return FormatUtilsService.getFormattedCpf(pixKey);
583
+ case 'CNPJ':
584
+ return FormatUtilsService.getFormattedCnpj(pixKey);
585
+ case 'TELEPHONE':
586
+ return FormatUtilsService.getFormattedTelephoneNumber(pixKey);
587
+ case 'EMAIL':
588
+ case 'RANDOM_KEY':
589
+ default:
590
+ return pixKey;
591
+ }
592
+ };
593
+ /**
594
+ * Obtém o tipo de chave PIX do item atual
595
+ */
596
+ HistoricalPixAccountComponent.prototype.getPixKeyType = function (item) {
597
+ return item && item.pixKeyType && item.pixKeyType.key || '';
598
+ };
599
+ /**
600
+ * Verifica se um controle está inválido para os campos editáveis
601
+ */
602
+ HistoricalPixAccountComponent.prototype.isInvalid = function (index, controlName) {
603
+ var form = this.formGroupByRow[index];
604
+ if (!form)
605
+ return false;
606
+ var control = form.get(controlName);
607
+ if (!control)
608
+ return false;
609
+ return control.invalid && (control.touched || control.dirty);
610
+ };
611
+ /**
612
+ * Método chamado quando uma célula entra no modo de edição
613
+ */
614
+ HistoricalPixAccountComponent.prototype.onCellEditInit = function (event) {
615
+ var rowIndex = this.addExistentHistoricData.findIndex(function (item) { return item === event.data; });
616
+ if (rowIndex < 0)
617
+ return;
618
+ var form = this.formGroupByRow[rowIndex];
619
+ if (form && form.get('pixKey')) {
620
+ var pixKeyControl = form.get('pixKey');
621
+ var currentValue = this.addExistentHistoricData[rowIndex].pixKey;
622
+ pixKeyControl.setValue(currentValue);
623
+ }
624
+ };
625
+ /**
626
+ * Recupera o FormControl específico para um campo em determinado índice
627
+ */
628
+ HistoricalPixAccountComponent.prototype.getFormControl = function (index, controlName) {
629
+ var form = this.formGroupByRow[index];
630
+ if (!form)
631
+ return null;
632
+ return form.get(controlName);
633
+ };
634
+ /**
635
+ * Valida campos de documento (CPF, CNPJ) quando o usuário termina de digitar no form de edição
636
+ */
637
+ HistoricalPixAccountComponent.prototype.validateDocumentField = function (index, fieldType) {
638
+ var _a;
639
+ var form = this.formGroupByRow[index];
640
+ var item = this.addExistentHistoricData[index];
641
+ if (!form || !item)
642
+ return;
643
+ var pixKeyControl = form.get('pixKey');
644
+ if (!pixKeyControl)
645
+ return;
646
+ var value = item.pixKey;
647
+ pixKeyControl.setValue(value);
648
+ if (fieldType === 'CPF' || fieldType === 'CNPJ' || fieldType === 'TELEPHONE') {
649
+ value = value ? value.toString().replace(/\D/g, '') : '';
650
+ item.pixKey = value;
651
+ pixKeyControl.setValue(value);
652
+ }
653
+ if (!value || value.toString().trim() === '') {
654
+ pixKeyControl.setErrors({ required: true });
655
+ pixKeyControl.markAsTouched();
656
+ form.updateValueAndValidity();
448
657
  this.emitFormValidity();
658
+ return;
659
+ }
660
+ var cleanValue = value;
661
+ if (fieldType === 'CPF' || fieldType === 'CNPJ') {
662
+ cleanValue = value.toString().replace(/\D/g, '');
663
+ item.pixKey = cleanValue;
664
+ pixKeyControl.setValue(cleanValue);
665
+ }
666
+ var isValid = false;
667
+ switch (fieldType) {
668
+ case 'CPF':
669
+ isValid = cleanValue.length === 11 && GenericValidator.isValidCpf({ value: cleanValue }) === null;
670
+ break;
671
+ case 'CNPJ':
672
+ isValid = cleanValue.length === 14 && GenericValidator.isValidCnpj({ value: cleanValue }) === null;
673
+ break;
674
+ case 'TELEPHONE':
675
+ cleanValue = value.toString().replace(/\D/g, '');
676
+ isValid = GenericValidator.isValidPhoneNumber({ value: cleanValue }) === null;
677
+ break;
678
+ case 'EMAIL':
679
+ isValid = GenericValidator.isValidEmail({ value: value }) === null;
680
+ break;
681
+ case 'RANDOM_KEY':
682
+ isValid = true;
683
+ break;
684
+ default:
685
+ isValid = true;
686
+ }
687
+ pixKeyControl.markAsTouched();
688
+ if (isValid) {
689
+ pixKeyControl.setErrors(null);
690
+ }
691
+ else {
692
+ var errorType = this.getErrorTypeForField(fieldType);
693
+ pixKeyControl.setErrors((_a = {}, _a[errorType] = true, _a));
694
+ }
695
+ form.updateValueAndValidity();
696
+ this.emitFormValidity();
697
+ this.cd.detectChanges();
698
+ };
699
+ /**
700
+ * Obtém o tipo de erro para cada tipo de campo editável
701
+ */
702
+ HistoricalPixAccountComponent.prototype.getErrorTypeForField = function (fieldType) {
703
+ switch (fieldType) {
704
+ case 'CPF': return 'invalidCpf';
705
+ case 'CNPJ': return 'invalidCnpj';
706
+ case 'TELEPHONE': return 'invalidPhoneNumber';
707
+ case 'EMAIL': return 'invalidEmail';
708
+ default: return 'required';
449
709
  }
450
710
  };
711
+ /**
712
+ * Retorna a mensagem de erro apropriada para um campo
713
+ */
714
+ HistoricalPixAccountComponent.prototype.getErrorMessage = function (index, controlName) {
715
+ var form = this.formGroupByRow[index];
716
+ if (!form)
717
+ return '';
718
+ var control = form.get(controlName);
719
+ if (!control || !control.errors)
720
+ return '';
721
+ var fieldValue = control.value || '';
722
+ if (control.hasError('required')) {
723
+ return this.translateService.instant('hcm.payroll.required');
724
+ }
725
+ if (control.hasError('invalidCpf')) {
726
+ return this.translateService.instant('hcm.payroll.employees_addition_cpf_error');
727
+ }
728
+ else if (control.hasError('invalidCnpj')) {
729
+ return this.translateService.instant('hcm.payroll.employees_addition_cnpj_error');
730
+ }
731
+ else if (control.hasError('invalidEmail')) {
732
+ return this.translateService.instant('hcm.payroll.employees_addition_email_invalid');
733
+ }
734
+ else if (control.hasError('invalidPhoneNumber')) {
735
+ return this.translateService.instant('hcm.payroll.employees_addition_invalid_phone_number', { value: fieldValue });
736
+ }
737
+ return '';
738
+ };
739
+ /**
740
+ * Tratamento ao perder o foco em campos de documento
741
+ */
742
+ HistoricalPixAccountComponent.prototype.onDocumentBlur = function (index) {
743
+ var form = this.formGroupByRow[index];
744
+ var item = this.addExistentHistoricData[index];
745
+ if (!form || !item)
746
+ return;
747
+ var pixKeyControl = form.get('pixKey');
748
+ var pixKeyTypeControl = form.get('pixKeyType');
749
+ if (!pixKeyControl || !pixKeyTypeControl.value)
750
+ return;
751
+ var pixKeyType = pixKeyTypeControl.value.key;
752
+ var value = item.pixKey;
753
+ if (pixKeyType === 'CPF' || pixKeyType === 'CNPJ' || pixKeyType === 'TELEPHONE') {
754
+ value = value ? value.toString().replace(/\D/g, '') : '';
755
+ item.pixKey = value;
756
+ }
757
+ pixKeyControl.setValue(value);
758
+ this.validateDocumentField(index, pixKeyType);
759
+ if (value) {
760
+ if (pixKeyType === 'CPF') {
761
+ item.pixKeyFormatted = FormatUtilsService.getFormattedCpf(value);
762
+ }
763
+ else if (pixKeyType === 'CNPJ') {
764
+ item.pixKeyFormatted = FormatUtilsService.getFormattedCnpj(value);
765
+ }
766
+ else if (pixKeyType === 'TELEPHONE') {
767
+ item.pixKeyFormatted = FormatUtilsService.getFormattedTelephoneNumber(value);
768
+ }
769
+ else {
770
+ item.pixKeyFormatted = value;
771
+ }
772
+ }
773
+ this.finishEditing();
774
+ };
775
+ HistoricalPixAccountComponent.prototype.finishEditing = function () {
776
+ this.syncAllModelToForm();
777
+ this.cd.detectChanges();
778
+ };
779
+ HistoricalPixAccountComponent.prototype.clearErrorsTemporarily = function (rowIndex) {
780
+ var form = this.formGroupByRow[rowIndex];
781
+ if (form && form.get('pixKey')) {
782
+ var currentValue = form.get('pixKey').value;
783
+ form.get('pixKey').setErrors(null);
784
+ form.get('pixKey').setValue(currentValue);
785
+ }
786
+ };
787
+ HistoricalPixAccountComponent.prototype.closeEditModeManually = function () {
788
+ var _this = this;
789
+ setTimeout(function () {
790
+ if (_this.dataListPix) {
791
+ if (typeof _this.dataListPix.closeAllCellEditors === 'function') {
792
+ _this.dataListPix.closeAllCellEditors();
793
+ }
794
+ else if (_this.dataListPix.editingCell) {
795
+ _this.dataListPix.editingCell = null;
796
+ }
797
+ _this.cd.detectChanges();
798
+ }
799
+ }, 100);
800
+ };
801
+ HistoricalPixAccountComponent.prototype.syncAllModelToForm = function () {
802
+ var _this = this;
803
+ if (!this.addExistentHistoricData || !this.formGroupByRow)
804
+ return;
805
+ this.addExistentHistoricData.forEach(function (item, index) {
806
+ var form = _this.formGroupByRow[index];
807
+ if (form) {
808
+ Object.keys(form.controls).forEach(function (controlName) {
809
+ var control = form.get(controlName);
810
+ if (control && item[controlName] !== undefined) {
811
+ control.setValue(item[controlName]);
812
+ }
813
+ });
814
+ var pixKeyTypeControl = form.get('pixKeyType');
815
+ if (pixKeyTypeControl.value) {
816
+ _this.validateDocumentField(index, pixKeyTypeControl.value.key);
817
+ }
818
+ }
819
+ });
820
+ };
821
+ /**
822
+ * Método para forçar o fechamento de todas as células em edição
823
+ */
824
+ HistoricalPixAccountComponent.prototype.forceCloseAllCellEditors = function () {
825
+ this.finishEditing();
826
+ this.syncAllModelToForm();
827
+ };
828
+ HistoricalPixAccountComponent.prototype.isPixKeyType = function (item, type) {
829
+ return item && item.pixKeyType && item.pixKeyType.key === type;
830
+ };
831
+ HistoricalPixAccountComponent.prototype.getPixKey = function (rowData) {
832
+ return rowData ? rowData.pixKey : null;
833
+ };
834
+ HistoricalPixAccountComponent.prototype.setPixKey = function (rowData, value) {
835
+ if (rowData) {
836
+ rowData.pixKey = value;
837
+ }
838
+ };
839
+ Object.defineProperty(HistoricalPixAccountComponent.prototype, "isTotalPercentage100", {
840
+ get: function () {
841
+ if (!this.addExistentHistoricData || this.addExistentHistoricData.length === 0) {
842
+ return false;
843
+ }
844
+ var totalPercentage = this.addExistentHistoricData
845
+ .reduce(function (sum, item) { return sum + (parseFloat(item.percentage) || 0); }, 0);
846
+ return totalPercentage >= 100;
847
+ },
848
+ enumerable: true,
849
+ configurable: true
850
+ });
451
851
  Object.defineProperty(HistoricalPixAccountComponent.prototype, "scopedActions", {
452
852
  get: function () {
453
853
  return this.actions.bind(this);
@@ -457,7 +857,8 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
457
857
  });
458
858
  Object.defineProperty(HistoricalPixAccountComponent.prototype, "recordsMessage", {
459
859
  get: function () {
460
- return (this.totalRecords || 0) + " " + (this.totalRecords === 1 ? this.translateService.instant("hcm.payroll.admission_register") : this.translateService.instant("hcm.payroll.admission_registers"));
860
+ return (this.totalRecords || 0) + " " + (this.totalRecords === 1 ?
861
+ this.translateService.instant("hcm.payroll.admission_register") : this.translateService.instant("hcm.payroll.admission_registers"));
461
862
  },
462
863
  enumerable: true,
463
864
  configurable: true
@@ -532,21 +933,6 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
532
933
  enumerable: true,
533
934
  configurable: true
534
935
  });
535
- HistoricalPixAccountComponent.prototype.close = function () {
536
- this.visible = false;
537
- };
538
- HistoricalPixAccountComponent.prototype.getFormattedTelephoneNumber = function (telephoneNumber) {
539
- return FormatUtilsService.getFormattedTelephoneNumber(telephoneNumber);
540
- };
541
- HistoricalPixAccountComponent.prototype.getFormattedCpf = function (cpf) {
542
- return FormatUtilsService.getFormattedCpf(cpf);
543
- };
544
- HistoricalPixAccountComponent.prototype.getFormattedCnpj = function (cnpj) {
545
- return FormatUtilsService.getFormattedCnpj(cnpj);
546
- };
547
- HistoricalPixAccountComponent.prototype.getFormattedPercentage = function (value) {
548
- return FormatUtilsService.getFormattedPercentage(value);
549
- };
550
936
  Object.defineProperty(HistoricalPixAccountComponent.prototype, "isAllowToAddHistorical", {
551
937
  get: function () {
552
938
  return (this.permission["incluir"]);
@@ -642,6 +1028,15 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
642
1028
  tslib_1.__decorate([
643
1029
  Input()
644
1030
  ], HistoricalPixAccountComponent.prototype, "isEditModeForSave", void 0);
1031
+ tslib_1.__decorate([
1032
+ Input()
1033
+ ], HistoricalPixAccountComponent.prototype, "showField", void 0);
1034
+ tslib_1.__decorate([
1035
+ Input()
1036
+ ], HistoricalPixAccountComponent.prototype, "hideBtnAddForViewMode", void 0);
1037
+ tslib_1.__decorate([
1038
+ Input()
1039
+ ], HistoricalPixAccountComponent.prototype, "showButtonView", void 0);
645
1040
  tslib_1.__decorate([
646
1041
  Output()
647
1042
  ], HistoricalPixAccountComponent.prototype, "isViewModeActive", void 0);
@@ -676,11 +1071,11 @@ var HistoricalPixAccountComponent = /** @class */ (function (_super) {
676
1071
  Component({
677
1072
  // tslint:disable-next-line:component-selector
678
1073
  selector: "c-historical-pix-account",
679
- template: "<s-sidebar *ngIf=\"withSideBar\" [visible]=\"visible\" (visibleChange)=\"close()\"\n header=\"{{'hcm.payroll.historical_pix_account_title_form'|translate}}\">\n<pix-account [(visible)]=\"visible\"\n [isEditAndViewValue]=\"pixAccountItemInput\"\n [currency]=\"currency\"\n [customEntity]=\"customEntity\"\n [customService]=\"customService\"\n [getListPixAccount]=\"listDataNoPage\"\n [paramsForm]=\"paramsForm\"\n (pixAccountItemToList)=\"addItemInList($event)\"\n [defaultCpfNumber]=\"defaultCpfNumber\"></pix-account>\n</s-sidebar>\n\n<div *ngIf=\"!withSideBar\">\n <pix-account [(visible)]=\"visible\"\n [isEditAndViewValue]=\"pixAccountItemInput\"\n [currency]=\"currency\"\n [customEntity]=\"customEntity\"\n [customService]=\"customService\"\n [getListPixAccount]=\"listDataNoPage\"\n [withSideBar]=\"false\"\n [isViewMode]=\"isViewMode\"\n [paramsForm]=\"paramsForm\"\n (pixAccountItemToList)=\"addItemInList($event)\"\n [defaultCpfNumber]=\"defaultCpfNumber\"></pix-account>\n</div>\n\n<div class=\"ui-g-1\" *ngIf=\"withSideBar && !isEditMode\">\n <div class=\"form-group \">\n <s-button id=\"ta-addPayAnnuity\"\n [disabled]=\"getTooltipAndDisableButtonAdd || msgTotalLimitByPercentage\"\n (onClick)=\"add()\"\n [pTooltip]=\"getTooltipAndDisableButtonAdd || msgTotalLimitByPercentage\"\n tooltipPosition=\"top\"\n label=\"{{'hcm.payroll.historical_pix_account_add'|translate}}\"></s-button>\n </div>\n</div>\n<div *ngIf=\"!showEditMode || !(hideFields | async)\" class=\"ui-g-12\">\n <p-table\n id=\"table-annuity\"\n [value]=\"listData\"\n [columns]=\"cols\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [lazy]=\"true\"\n [scrollable]=\"true\"\n [paginator]=\"true\"\n [totalRecords]=\"totalRecords\"\n [sortMode]=\"'multiple'\"\n *sLoadingState=\"loading\"\n [rows]=\"recordByRow\"\n dataKey=\"id\">\n <ng-template pTemplate=\"colgroup\" let-coumns>\n <colgroup>\n <col [ngClass]=\"'col-default-m'\">\n <col [ngClass]=\"'col-default-m'\">\n <col [ngClass]=\"'col-default-s'\">\n <col *ngIf=\"showButtonView\" [ngClass]=\"'col-action'\">\n </colgroup>\n </ng-template>\n <ng-template pTemplate=\"header\" let-columns>\n <!-- Cabe\u00E7alhos quando da table \u00E9 permitido ordenar as colunas -->\n <tr>\n <!-- Cabe\u00E7alhos das colunas da tabela -->\n <th\n [pSortableColumn]=\"'pixKeyType'\"\n [pTooltip]=\"'hcm.payroll.employees_addition_pix_key_type' | translate\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n >\n <div class=\"senior-header\" id=\"table-0\">\n <span\n id=\"table-annuity-s-0\">{{ 'hcm.payroll.employees_addition_pix_key_type' | translate }}</span>\n <p-sortIcon class=\"p-sorticon-status\"\n [field]=\"'hcm.payroll.employees_addition_pix_key_type' | translate\"></p-sortIcon>\n </div>\n </th>\n\n <th\n [pSortableColumn]=\"'pixKey'\"\n [pTooltip]=\"'hcm.payroll.employees_addition_pix_key' | translate\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n >\n <div class=\"senior-header\">\n <span>{{ 'hcm.payroll.employees_addition_pix_key' | translate }}</span>\n <p-sortIcon class=\"p-sorticon-status\"\n [field]=\"'hcm.payroll.employees_addition_pix_key' | translate\"></p-sortIcon>\n </div>\n </th>\n\n <th\n [pSortableColumn]=\"'percentage'\"\n [pTooltip]=\"'hcm.payroll.historical_pix_account_label_percentage' | translate\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n >\n <div class=\"senior-header\">\n <span>{{ 'hcm.payroll.historical_pix_account_label_percentage' | translate }}</span>\n <p-sortIcon class=\"p-sorticon-status\"\n [field]=\"'hcm.payroll.historical_pix_account_label_percentage' | translate\"></p-sortIcon>\n </div>\n </th>\n <!-- Cabe\u00E7alho da coluna de a\u00E7\u00F5es -->\n <th *ngIf=\"showButtonView\" id=\"col-actions\"></th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-key=\"rowIndex\">\n\n <tr [ngClass]=\"'row'+key\" [pSelectableRow]=\"rowData\">\n <td [pTooltip]=\"rowData?.pixKeyType.value\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ rowData?.pixKeyType.value }}</span>\n </td>\n\n <ng-container [ngSwitch]=\"rowData?.pixKeyType.key\">\n <td *ngSwitchCase=\"'TELEPHONE'\"\n [pTooltip]=\"getFormattedTelephoneNumber(rowData?.pixKey)\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ getFormattedTelephoneNumber(rowData?.pixKey) }}</span>\n </td>\n <td *ngSwitchCase=\"'CPF'\"\n [pTooltip]=\"getFormattedCpf(rowData?.pixKey)\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ getFormattedCpf(rowData?.pixKey) }}</span>\n </td>\n <td *ngSwitchCase=\"'CNPJ'\"\n [pTooltip]=\"getFormattedCnpj(rowData?.pixKey)\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ getFormattedCnpj(rowData?.pixKey) }}</span>\n </td>\n <td *ngSwitchDefault\n [pTooltip]=\"rowData?.pixKey\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ rowData?.pixKey }}</span>\n </td>\n </ng-container>\n <td [pTooltip]=\"getFormattedPercentage(rowData?.percentage)\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ getFormattedPercentage(rowData?.percentage) }}</span>\n </td>\n <td id=\"col-actions-{{key}}\" class=\"col-actions \"\n *ngIf=\"actions && actions(rowData, key)?.length && showButtonView\">\n <s-button id=\"table-admission-btn-actions-{{key}}\"\n *ngIf=\"!isViewMode && actions(rowData, key).length > 1\" [label]=\"actionLabel\"\n priority=\"default\" [model]=\"scopedActions(rowData, key)\"\n [disabled]=\"false\" [auxiliary]=\"true\"></s-button>\n\n <s-button id=\"table-admission-btn-action-{{key}}\"\n *ngIf=\"!isViewMode && actions(rowData, key).length <= 1\"\n [label]=\"scopedActions(rowData, key)[0].label\"\n priority=\"default\"\n (click)=\"scopedActions(rowData, key)[0].command()\"\n [disabled]=\"false\" [auxiliary]=\"true\"></s-button>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\" let-columns>\n <tr>\n <td [attr.colspan]=\"columns.length +2\">\n {{'hcm.payroll.admission_empty_message'|translate}}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <span *ngIf=\"totalRecords\">{{recordsMessage}}</span>\n </ng-template>\n </p-table>\n</div>\n\n<!-- Template exlusivo para edi\u00E7\u00E3o de pix via modal-->\n<div *ngIf=\"showEditMode && (hideFields | async)\" class=\"ui-g-12\">\n <!-- Bot\u00E3o Adicionar -->\n <div class=\"ui-g\">\n <div class=\"ui-g-12\">\n <s-button\n id=\"btn-save\"\n label=\"{{ 'hcm.payroll.historical_pix_account_add' | translate}}\"\n priority=\"primary\"\n (onClick)=\"addPix()\">\n </s-button>\n </div>\n </div>\n\n <!-- Tabela -->\n <p-table #dataListPix sortField=\"percentage\"\n [columns]=\"cols\"\n [value]=\"addExistentHistoricData\"\n [pageLinks]=\"3\"\n [paginator]=\"true\"\n [responsive]=\"true\"\n [rows]=\"10\"\n [resetPageOnSort]=\"false\"\n [tableStyle]=\"{'margin-top': '2rem'}\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of cols\">\n {{ col.label }}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-rowIndex=\"rowIndex\">\n <ng-container *ngIf=\"formGroupByRow[rowIndex]\" [formGroup]=\"formGroupByRow[rowIndex]\">\n <tr>\n <!-- Tipo de Chave -->\n <td class=\"ui-md-6 ui-sm-12 required\"\n [pEditableColumn]=\"item.pixKeyType\" pEditableColumnField=\"pixKeyType\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div style=\"width: 100%; position: relative;\">\n <p-autoComplete\n [suggestions]=\"suggestions\"\n (completeMethod)=\"filterPixKeyType($event)\"\n formControlName=\"pixKeyType\"\n [dropdown]=\"true\"\n (onSelect)=\"onPixKeyTypeChange($event, rowIndex)\"\n (onClear)=\"onPixKeyTypeClear(rowIndex)\"\n (ngModelChange)=\"onSyncValue('pixKeyType', rowIndex)\"\n field=\"value\"\n placeholder=\"{{'hcm.payroll.select' | translate}}\"\n appendTo=\"body\"\n [panelStyle]=\"{ maxWidth: '300px', width: '100%' }\"\n [inputStyle]=\"{ width: '100%' }\"\n ></p-autoComplete>\n\n <s-control-errors [control]=\"formGroupByRow[rowIndex]?.get('pixKeyType')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n pixKeyTypeBankAccountDuplicate: 'hcm.payroll.historical_pix_key_type_bank_account_duplicate' | translate\n }\">\n </s-control-errors>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ item.pixKeyType?.value }}\n </ng-template>\n </p-cellEditor>\n </td>\n\n <!-- Chave Pix -->\n <td class=\"ui-md-6 ui-sm-12 required\"\n [pEditableColumn]=\"item.pixKey\" pEditableColumnField=\"pixKey\"\n [ngClass]=\"{'required': item.pixKeyType.key !== 'BANK_ACCOUNT',\n 'disabled': item.pixKeyType && item.pixKeyType.key === 'BANK_ACCOUNT'\n }\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <ng-container [ngSwitch]=\"item.pixKeyType.key\">\n <input *ngSwitchCase=\"'TELEPHONE'\"\n only-number\n pInputText\n type=\"text\"\n formControlName=\"pixKey\"\n (keyup)=\"phoneMask($event)\"\n (ngModelChange)=\"onSyncValue('pixKey', rowIndex)\"\n maxlength=\"15\"\n placeholder=\"(__) ____-____\" />\n\n <input *ngSwitchCase=\"'CPF'\"\n type=\"text\"\n pInputText\n formControlName=\"pixKey\"\n maxlength=\"14\"\n placeholder=\"___.___.___-__\"\n (input)=\"onPixKeyInput($event, rowIndex)\"\n (blur)=\"onBlurPixCpfAndCnpj(rowIndex)\"\n (keyup)=\"cpfMask($event)\"\n (ngModelChange)=\"onSyncValue('pixKey', rowIndex)\" />\n\n <input *ngSwitchCase=\"'CNPJ'\"\n type=\"text\"\n pInputText\n formControlName=\"pixKey\"\n maxlength=\"18\"\n placeholder=\"___.___.___/____-__\"\n (input)=\"onPixKeyInput($event, rowIndex)\"\n (blur)=\"onBlurPixCpfAndCnpj(rowIndex)\"\n (keyup)=\"cnpjMask($event)\"\n (ngModelChange)=\"onSyncValue('pixKey', rowIndex)\" />\n\n <input *ngSwitchCase=\"'EMAIL'\"\n pInputText\n type=\"email\"\n formControlName=\"pixKey\"\n (ngModelChange)=\"onSyncValue('pixKey', rowIndex)\"\n placeholder=\"{{ 'hcm.payroll.employees_addition_email' | translate }}\" />\n\n <input *ngSwitchCase=\"'BANK_ACCOUNT'\"\n pInputText\n formControlName=\"pixKey\"\n (ngModelChange)=\"onSyncValue('pixKey', rowIndex)\"\n [disabled]=\"true\" />\n\n <input *ngSwitchDefault\n pInputText\n type=\"text\"\n formControlName=\"pixKey\"\n (ngModelChange)=\"onSyncValue('pixKey', rowIndex)\"\n maxlength=\"100\" />\n </ng-container>\n\n <s-control-errors *ngIf=\"isShowPixKeyFieldValidatorMessage\"\n [control]=\"formGroupByRow[rowIndex]?.get('pixKey')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n invalidPhoneNumber: 'hcm.payroll.employees_addition_invalid_phone_number' | translate: { value: formGroupByRow[rowIndex]?.get('pixKey').value },\n invalidEmail: 'hcm.payroll.employees_addition_email_invalid' | translate,\n cpfNotValid: 'hcm.payroll.employees_addition_cpf_error' | translate,\n cnpjNotValid: 'hcm.payroll.employees_addition_cnpj_error' | translate\n }\">\n </s-control-errors>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ getFormattedPixKey(item.pixKeyType?.key, item.pixKey) }}\n </ng-template>\n </p-cellEditor>\n </td>\n\n <!-- Percentual -->\n <td class=\"ui-md-6 ui-sm-12 required\"\n [pEditableColumn]=\"item.percentage\" pEditableColumnField=\"percentage\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText type=\"number\"\n formControlName=\"percentage\"\n (ngModelChange)=\"onSyncValue('percentage', rowIndex)\"\n >\n <s-control-errors\n [control]=\"formGroupByRow[rowIndex]?.get('percentage')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n maxlength: 'hcm.payroll.error_max_length' | translate: { value: '6' },\n max: 'hcm.payroll.error_max_value_number' | translate: { value: maxValuePercentage },\n min: 'hcm.payroll.error_min_value_number' | translate: { value: '0,01' }\n }\">\n </s-control-errors>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ item.percentage?.toFixed(2).replace('.', ',') }}%\n </ng-template>\n </p-cellEditor>\n </td>\n\n <!-- Bot\u00E3o de excluir -->\n <td>\n <s-button\n id=\"btn-delete\"\n label=\"{{ 'hcm.payroll.delete' | translate }}\"\n priority=\"default\"\n (onClick)=\"deletePix(rowIndex)\">\n </s-button>\n </td>\n </tr>\n </ng-container>\n </ng-template>\n </p-table>\n</div>\n",
680
- styles: [".refresh{width:100%!important}#table-annuity .col-default-s{width:10%}#table-annuity .col-default-m{width:12%}#table-annuity .col-default-l{width:16%}#table-annuity .col-action{width:10%}#table-annuity .icon-warning{text-align:center!important;color:#ff6d00c7!important}@media screen and (max-width:612px){#table-annuity .col-default-1,#table-annuity .col-default-2{width:16%}#table-annuity .col-default-3{width:26%}#table-annuity .col-icon{width:10%}#table-annuity .col-action{width:27%}}#main{display:-webkit-box;display:flex;height:100%;width:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}#main form{height:100%}#main .footer{border-top:1px solid #ccc;padding-top:15px;margin-top:15px;flex-shrink:0;margin-bottom:-18px}#main .footer-s-border{padding-left:7px;flex-shrink:0;margin-bottom:-18px}"]
1074
+ template: "<s-sidebar *ngIf=\"withSideBar\" [visible]=\"visible\" (visibleChange)=\"close()\"\n header=\"{{'hcm.payroll.historical_pix_account_title_form'|translate}}\">\n<pix-account [(visible)]=\"visible\"\n [isEditAndViewValue]=\"pixAccountItemInput\"\n [currency]=\"currency\"\n [customEntity]=\"customEntity\"\n [customService]=\"customService\"\n [getListPixAccount]=\"listDataNoPage\"\n [paramsForm]=\"paramsForm\"\n [showField]=\"showFields\"\n (pixAccountItemToList)=\"addItemInList($event)\"\n [defaultCpfNumber]=\"defaultCpfNumber\"></pix-account>\n</s-sidebar>\n\n<div *ngIf=\"!withSideBar\">\n <pix-account [(visible)]=\"visible\"\n [isEditAndViewValue]=\"pixAccountItemInput\"\n [currency]=\"currency\"\n [customEntity]=\"customEntity\"\n [customService]=\"customService\"\n [getListPixAccount]=\"listDataNoPage\"\n [withSideBar]=\"false\"\n [isViewMode]=\"isViewMode\"\n [paramsForm]=\"paramsForm\"\n (pixAccountItemToList)=\"addItemInList($event)\"\n [defaultCpfNumber]=\"defaultCpfNumber\"></pix-account>\n</div>\n<div class=\"ui-g-1\" *ngIf=\"withSideBar && !isEditMode && !hideBtnAddForViewMode\">\n <div class=\"form-group \">\n <s-button id=\"ta-addPayAnnuity\"\n [disabled]=\"getTooltipAndDisableButtonAdd || msgTotalLimitByPercentage\"\n (onClick)=\"add()\"\n [pTooltip]=\"getTooltipAndDisableButtonAdd || msgTotalLimitByPercentage\"\n tooltipPosition=\"top\"\n label=\"{{'hcm.payroll.historical_pix_account_add'|translate}}\"></s-button>\n </div>\n</div>\n<div *ngIf=\"showFields || !showEditMode || !(hideFields | async)\" class=\"ui-g-12\">\n <p-table\n id=\"table-annuity\"\n [value]=\"listData\"\n [columns]=\"cols\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [lazy]=\"true\"\n [scrollable]=\"true\"\n [paginator]=\"true\"\n [totalRecords]=\"totalRecords\"\n [sortMode]=\"'multiple'\"\n *sLoadingState=\"loading\"\n [rows]=\"recordByRow\"\n dataKey=\"id\">\n <ng-template pTemplate=\"colgroup\" let-coumns>\n <colgroup>\n <col [ngClass]=\"'col-default-m'\">\n <col [ngClass]=\"'col-default-m'\">\n <col [ngClass]=\"'col-default-s'\">\n <col *ngIf=\"showButtonView\" [ngClass]=\"'col-action'\">\n </colgroup>\n </ng-template>\n <ng-template pTemplate=\"header\" let-columns>\n <!-- Cabe\u00E7alhos quando da table \u00E9 permitido ordenar as colunas -->\n <tr>\n <!-- Cabe\u00E7alhos das colunas da tabela -->\n <th\n [pSortableColumn]=\"'pixKeyType'\"\n [pTooltip]=\"'hcm.payroll.employees_addition_pix_key_type' | translate\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n >\n <div class=\"senior-header\" id=\"table-0\">\n <span\n id=\"table-annuity-s-0\">{{ 'hcm.payroll.employees_addition_pix_key_type' | translate }}</span>\n <p-sortIcon class=\"p-sorticon-status\"\n [field]=\"'hcm.payroll.employees_addition_pix_key_type' | translate\"></p-sortIcon>\n </div>\n </th>\n\n <th\n [pSortableColumn]=\"'pixKey'\"\n [pTooltip]=\"'hcm.payroll.employees_addition_pix_key' | translate\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n >\n <div class=\"senior-header\">\n <span>{{ 'hcm.payroll.employees_addition_pix_key' | translate }}</span>\n <p-sortIcon class=\"p-sorticon-status\"\n [field]=\"'hcm.payroll.employees_addition_pix_key' | translate\"></p-sortIcon>\n </div>\n </th>\n\n <th\n [pSortableColumn]=\"'percentage'\"\n [pTooltip]=\"'hcm.payroll.historical_pix_account_label_percentage' | translate\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n >\n <div class=\"senior-header\">\n <span>{{ 'hcm.payroll.historical_pix_account_label_percentage' | translate }}</span>\n <p-sortIcon class=\"p-sorticon-status\"\n [field]=\"'hcm.payroll.historical_pix_account_label_percentage' | translate\"></p-sortIcon>\n </div>\n </th>\n <!-- Cabe\u00E7alho da coluna de a\u00E7\u00F5es -->\n <th *ngIf=\"showButtonView\" id=\"col-actions\"></th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-key=\"rowIndex\">\n\n <tr [ngClass]=\"'row'+key\" [pSelectableRow]=\"rowData\">\n <td [pTooltip]=\"rowData?.pixKeyType.value\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ rowData?.pixKeyType.value }}</span>\n </td>\n\n <ng-container [ngSwitch]=\"rowData?.pixKeyType.key\">\n <td *ngSwitchCase=\"'TELEPHONE'\"\n [pTooltip]=\"getFormattedTelephoneNumber(rowData?.pixKey)\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ getFormattedTelephoneNumber(rowData?.pixKey) }}</span>\n </td>\n <td *ngSwitchCase=\"'CPF'\"\n [pTooltip]=\"getFormattedCpf(rowData?.pixKey)\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ getFormattedCpf(rowData?.pixKey) }}</span>\n </td>\n <td *ngSwitchCase=\"'CNPJ'\"\n [pTooltip]=\"getFormattedCnpj(rowData?.pixKey)\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ getFormattedCnpj(rowData?.pixKey) }}</span>\n </td>\n <td *ngSwitchDefault\n [pTooltip]=\"rowData?.pixKey\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ rowData?.pixKey }}</span>\n </td>\n </ng-container>\n <td [pTooltip]=\"getFormattedPercentage(rowData?.percentage)\" tooltipPosition=\"top\"\n showDelay=\"500\">\n <span>{{ getFormattedPercentage(rowData?.percentage) }}</span>\n </td>\n <td id=\"col-actions-{{key}}\" class=\"col-actions \"\n *ngIf=\"actions && actions(rowData, key)?.length && showButtonView\">\n <s-button id=\"table-admission-btn-actions-{{key}}\"\n *ngIf=\"!isViewMode && actions(rowData, key).length > 1\" [label]=\"actionLabel\"\n priority=\"default\" [model]=\"scopedActions(rowData, key)\"\n [disabled]=\"false\" [auxiliary]=\"true\"></s-button>\n\n <s-button id=\"table-admission-btn-action-{{key}}\"\n *ngIf=\"!isViewMode && actions(rowData, key).length <= 1\"\n [label]=\"scopedActions(rowData, key)[0].label\"\n priority=\"default\"\n (click)=\"scopedActions(rowData, key)[0].command()\"\n [disabled]=\"false\" [auxiliary]=\"true\"></s-button>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\" let-columns>\n <tr>\n <td [attr.colspan]=\"columns.length +2\">\n {{'hcm.payroll.admission_empty_message'|translate}}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <span *ngIf=\"totalRecords\">{{recordsMessage}}</span>\n </ng-template>\n </p-table>\n</div>\n\n<!-- Template exlusivo para edi\u00E7\u00E3o de pix via modal-->\n<div *ngIf=\"!withSideBar && showEditMode && (hideFields | async)\" class=\"ui-g-12\">\n <!-- Bot\u00E3o Adicionar -->\n <div class=\"ui-g\">\n <div class=\"ui-g-12\">\n <s-button\n id=\"btn-save\"\n label=\"{{ 'hcm.payroll.historical_pix_account_add' | translate}}\"\n priority=\"primary\"\n [disabled]=\"isTotalPercentage100\"\n [pTooltip]=\"isTotalPercentage100 ? ('hcm.payroll.historical_pix_account_msg_limit_total_by_percentage' | translate) : ''\"\n tooltipPosition=\"top\"\n (onClick)=\"addPix()\">\n </s-button>\n </div>\n </div>\n\n <!-- Tabela -->\n <p-table #dataListPix sortField=\"percentage\"\n [columns]=\"cols\"\n [value]=\"addExistentHistoricData\"\n [pageLinks]=\"3\"\n [paginator]=\"true\"\n [responsive]=\"true\"\n [rows]=\"10\"\n [resetPageOnSort]=\"false\"\n [tableStyle]=\"{'margin-top': '2rem'}\"\n [customSort]=\"true\"\n (onEditInit)=\"onCellEditInit($event)\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of cols\">\n {{ col.label }}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-rowIndex=\"rowIndex\">\n <ng-container *ngIf=\"formGroupByRow[rowIndex]\" [formGroup]=\"formGroupByRow[rowIndex]\">\n <tr>\n <!-- Tipo de Chave -->\n <td class=\"ui-md-6 ui-sm-12 required\"\n [pEditableColumn]=\"item.pixKeyType\" pEditableColumnField=\"pixKeyType\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div style=\"width: 100%; position: relative;\">\n <p-autoComplete\n [suggestions]=\"suggestions\"\n (completeMethod)=\"filterPixKeyType($event)\"\n formControlName=\"pixKeyType\"\n [dropdown]=\"true\"\n (onSelect)=\"onPixKeyTypeChange($event, rowIndex)\"\n (onClear)=\"onPixKeyTypeClear(rowIndex)\"\n (ngModelChange)=\"onSyncValue('pixKeyType', rowIndex)\"\n field=\"value\"\n placeholder=\"{{'hcm.payroll.select' | translate}}\"\n appendTo=\"body\"\n [panelStyle]=\"{ maxWidth: '300px', width: '100%' }\"\n [inputStyle]=\"{ width: '100%' }\"\n ></p-autoComplete>\n\n <s-control-errors [control]=\"formGroupByRow[rowIndex]?.get('pixKeyType')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n pixKeyTypeBankAccountDuplicate: 'hcm.payroll.historical_pix_key_type_bank_account_duplicate' | translate\n }\">\n </s-control-errors>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ item.pixKeyType?.value }}\n </ng-template>\n </p-cellEditor>\n </td>\n\n <!-- Chave Pix -->\n <td class=\"ui-md-6 ui-sm-12 required\"\n [pEditableColumn]=\"item.pixKey\" pEditableColumnField=\"pixKey\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div class=\"ui-fluid\">\n <!-- \u00C1rea de inputs din\u00E2micos -->\n <div [ngSwitch]=\"getPixKeyType(item)\" class=\"ui-fluid\">\n <!-- CPF -->\n <p-inputMask *ngSwitchCase=\"'CPF'\"\n mask=\"999.999.999-99\"\n unmask=\"true\"\n [(ngModel)]=\"item.pixKey\"\n [ngModelOptions]=\"{standalone: true}\"\n styleClass=\"full-width-input\"\n [ngClass]=\"{'ng-invalid': isInvalid(rowIndex, 'pixKey')}\"\n (onComplete)=\"validateDocumentField(rowIndex, 'CPF')\"\n (onBlur)=\"onDocumentBlur(rowIndex)\"\n (keydown.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.enter)=\"onDocumentBlur(rowIndex)\"\n (keydown.esc)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.esc)=\"onDocumentBlur(rowIndex)\">\n </p-inputMask>\n\n <!-- CNPJ -->\n <p-inputMask *ngSwitchCase=\"'CNPJ'\"\n mask=\"99.999.999/9999-99\"\n unmask=\"true\"\n [(ngModel)]=\"item.pixKey\"\n [ngModelOptions]=\"{standalone: true}\"\n styleClass=\"full-width-input\"\n [ngClass]=\"{'ng-invalid': isInvalid(rowIndex, 'pixKey')}\"\n (onComplete)=\"validateDocumentField(rowIndex, 'CNPJ')\"\n (onBlur)=\"onDocumentBlur(rowIndex)\"\n (keydown.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.enter)=\"onDocumentBlur(rowIndex)\"\n (keydown.esc)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.esc)=\"onDocumentBlur(rowIndex)\">\n </p-inputMask>\n\n <!-- TELEPHONE -->\n <p-inputMask *ngSwitchCase=\"'TELEPHONE'\"\n mask=\"(99) 99999-9999\"\n unmask=\"true\"\n [(ngModel)]=\"item.pixKey\"\n [ngModelOptions]=\"{standalone: true}\"\n styleClass=\"full-width-input\"\n [ngClass]=\"{'ng-invalid': isInvalid(rowIndex, 'pixKey')}\"\n (onComplete)=\"validateDocumentField(rowIndex, 'TELEPHONE')\"\n (onBlur)=\"onDocumentBlur(rowIndex)\"\n (keydown.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.enter)=\"onDocumentBlur(rowIndex)\"\n (keydown.esc)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.esc)=\"onDocumentBlur(rowIndex)\">\n </p-inputMask>\n\n <!-- EMAIL -->\n <input *ngSwitchCase=\"'EMAIL'\"\n type=\"email\"\n pInputText\n class=\"p-inputtext p-component full-width-input\"\n [(ngModel)]=\"item.pixKey\"\n [ngModelOptions]=\"{standalone: true}\"\n [ngClass]=\"{'ng-invalid': isInvalid(rowIndex, 'pixKey')}\"\n (blur)=\"validateDocumentField(rowIndex, 'EMAIL'); onDocumentBlur(rowIndex)\"\n (keydown.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.enter)=\"onDocumentBlur(rowIndex)\"\n (keydown.esc)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.esc)=\"onDocumentBlur(rowIndex)\">\n\n <!-- RANDOM_KEY -->\n <input *ngSwitchCase=\"'RANDOM_KEY'\"\n type=\"text\"\n pInputText\n class=\"p-inputtext p-component full-width-input\"\n [(ngModel)]=\"item.pixKey\"\n [ngModelOptions]=\"{standalone: true}\"\n [ngClass]=\"{'ng-invalid': isInvalid(rowIndex, 'pixKey')}\"\n (blur)=\"validateDocumentField(rowIndex, 'RANDOM_KEY'); onDocumentBlur(rowIndex)\"\n (keydown.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.tab)=\"onDocumentBlur(rowIndex)\"\n (keydown.enter)=\"onDocumentBlur(rowIndex)\"\n (keydown.esc)=\"onDocumentBlur(rowIndex)\"\n (keydown.shift.esc)=\"onDocumentBlur(rowIndex)\">\n\n <!-- BANK_ACCOUNT -->\n <input *ngSwitchCase=\"'BANK_ACCOUNT'\"\n type=\"text\"\n pInputText\n class=\"p-inputtext p-component full-width-input\"\n [disabled]=\"true\">\n </div>\n\n <!-- \u00DAnico s-control-errors para todos os tipos -->\n <small *ngIf=\"isInvalid(rowIndex, 'pixKey')\" class=\"p-error error-text\">\n {{getErrorMessage(rowIndex, 'pixKey')}}\n </small>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{getFormattedPixKey(getPixKeyType(item), item.pixKey)}}\n </ng-template>\n </p-cellEditor>\n </td>\n\n <!-- Percentual -->\n <td class=\"ui-md-6 ui-sm-12 required\"\n [pEditableColumn]=\"item.percentage\" pEditableColumnField=\"percentage\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText type=\"number\"\n formControlName=\"percentage\"\n (ngModelChange)=\"onSyncValue('percentage', rowIndex)\"\n >\n <s-control-errors\n [control]=\"formGroupByRow[rowIndex]?.get('percentage')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n maxlength: 'hcm.payroll.error_max_length' | translate: { value: '6' },\n max: 'hcm.payroll.error_max_value_number' | translate: { value: maxValuePercentage },\n min: 'hcm.payroll.error_min_value_number' | translate: { value: '0,01' }\n }\">\n </s-control-errors>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ formatPercentage(item.percentage) }}%\n </ng-template>\n </p-cellEditor>\n </td>\n\n <!-- Bot\u00E3o de excluir -->\n <td>\n <s-button\n id=\"btn-delete\"\n label=\"{{ 'hcm.payroll.delete' | translate }}\"\n priority=\"default\"\n (onClick)=\"deletePix(rowIndex)\">\n </s-button>\n </td>\n </tr>\n </ng-container>\n </ng-template>\n </p-table>\n</div>\n",
1075
+ styles: [".refresh{width:100%!important}#table-annuity .col-default-s{width:10%}#table-annuity .col-default-m{width:12%}#table-annuity .col-default-l{width:16%}#table-annuity .col-action{width:10%}#table-annuity .icon-warning{text-align:center!important;color:#ff6d00c7!important}@media screen and (max-width:612px){#table-annuity .col-default-1,#table-annuity .col-default-2{width:16%}#table-annuity .col-default-3{width:26%}#table-annuity .col-icon{width:10%}#table-annuity .col-action{width:27%}}#main{display:-webkit-box;display:flex;height:100%;width:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}#main form{height:100%}#main .footer{border-top:1px solid #ccc;padding-top:15px;margin-top:15px;flex-shrink:0;margin-bottom:-18px}#main .footer-s-border{padding-left:7px;flex-shrink:0;margin-bottom:-18px}:host ::ng-deep .p-cell-editing{padding:0!important}:host ::ng-deep .full-width-input{width:100%!important;min-height:34px!important;padding:6px 12px!important}:host ::ng-deep .p-inputtext{width:100%;min-height:34px;padding:6px 12px}:host ::ng-deep .p-inputmask{width:100%;display:block}:host ::ng-deep .p-inputmask .p-inputmask-input{width:100%!important;min-height:34px!important;padding:6px 12px!important}:host ::ng-deep p-celleditor{width:100%}:host ::ng-deep p-celleditor .ui-fluid{width:100%;display:block;padding:0}:host ::ng-deep .p-error{margin-top:4px;font-size:12px}:host ::ng-deep .error-text{color:#f44336;display:block;margin-top:4px;font-size:.875em}"]
681
1076
  })
682
1077
  ], HistoricalPixAccountComponent);
683
1078
  return HistoricalPixAccountComponent;
684
1079
  }(HistoricakPixAccountBase));
685
1080
  export { HistoricalPixAccountComponent };
686
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yaWNhbC1waXgtYWNjb3VudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1wZXNzb2FzL3BheXJvbGwtY29yZS8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvaGlzdG9yaWNhbC1waXgtYWNjb3VudC9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxNQUFNLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxpQkFBaUIsRUFDakIsYUFBYSxFQUNiLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLFNBQVMsRUFDVCxhQUFhLEdBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFRL0U7SUFBbUQseURBQXdCO0lBa0p2RSx1Q0FDWSxnQkFBa0MsRUFDbEMsRUFBcUIsRUFDN0IsV0FBd0IsRUFDaEIsa0JBQXNDLEVBQ3RDLE9BQW9DO1FBTGhELFlBT0ksa0JBQU0sV0FBVyxDQUFDLFNBRXJCO1FBUlcsc0JBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxRQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUVyQix3QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGFBQU8sR0FBUCxPQUFPLENBQTZCO1FBMUl6QyxpQkFBVyxHQUFXLENBQUMsQ0FBQztRQUV4QixvQkFBYyxHQUFZLEtBQUssQ0FBQztRQUloQyxnQkFBVSxHQUFZLEtBQUssQ0FBQztRQUU1QixnQkFBVSxHQUFZLEtBQUssQ0FBQztRQVE1QixpQkFBVyxHQUFZLElBQUksQ0FBQztRQUk1QixzQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFFN0IsNkJBQXVCLEdBQVUsRUFBRSxDQUFDO1FBRXBDLHVCQUFpQixHQUFhLEVBQUUsQ0FBQztRQUVqQyx1QkFBaUIsR0FBWSxLQUFLLENBQUM7UUFHbkMsc0JBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFXLENBQUM7UUFFbEUsc0JBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFXLENBQUM7UUFFbEUsd0JBQWtCLEdBQXNCLElBQUksWUFBWSxFQUFXLENBQUM7UUFFcEUsdUJBQWlCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFHdEUsaUJBQVcsR0FBVSxFQUFFLENBQUM7UUFDeEIsbUJBQWEsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNuRSxtQkFBYSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFOUIsYUFBTyxHQUF1RDtZQUNsRSxLQUFLLEVBQUUsWUFBWTtZQUNuQixTQUFTLEVBQUUsb0JBQW9CLENBQUMsSUFBSTtTQUN2QyxDQUFDO1FBR0sseUJBQW1CLEdBQVcsRUFBRSxDQUFDO1FBQ2pDLGtCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLGlCQUFXLEdBQVcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ3JHLGFBQU8sR0FBRyxJQUFJLENBQUM7UUFHZixjQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLG9CQUFjLEdBQWEsRUFBRSxDQUFDO1FBQzlCLG9CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLGtCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLG1CQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLGdCQUFVLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztRQUNoRCxpQkFBVyxHQUFVLEVBQUUsQ0FBQztRQUN4QixvQkFBYyxHQUFtQyxFQUFFLENBQUM7UUFFcEQsVUFBSSxHQUFHO1lBQ1Y7Z0JBQ0ksS0FBSyxFQUFFLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsNkNBQTZDLENBQUM7Z0JBQ25GLEtBQUssRUFBRSxZQUFZO2FBQ3RCO1lBQ0Q7Z0JBQ0ksS0FBSyxFQUFFLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUM7Z0JBQzlFLEtBQUssRUFBRSxRQUFRO2FBQ2xCO1lBQ0Q7Z0JBQ0ksS0FBSyxFQUFFLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMscURBQXFELENBQUM7Z0JBQzNGLEtBQUssRUFBRSxZQUFZO2FBQ3RCO1lBQ0Q7Z0JBQ0ksS0FBSyxFQUFFLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsMENBQTBDLENBQUM7Z0JBQ2hGLEtBQUssRUFBRSxTQUFTO2FBQ25CO1NBQ0osQ0FBQztRQUNGLGFBQU8sR0FBRyxVQUFDLE9BQWlCLEVBQUUsR0FBUTtZQUEzQix3QkFBQSxFQUFBLFlBQWlCO1lBQ3hCLE9BQU87Z0JBQ0g7b0JBQ0ksT0FBTyxFQUFFLEtBQUksQ0FBQyxVQUFVO29CQUN4QixLQUFLLEVBQUUsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQztvQkFDaEYsT0FBTyxFQUFFO3dCQUNMLElBQUksS0FBSSxDQUFDLHVCQUF1QixFQUFFOzRCQUM5QixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDOzRCQUN2QixLQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFJLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQzs0QkFDdEcsS0FBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7eUJBQ3ZCOzZCQUFNOzRCQUNILEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3BDO29CQUNMLENBQUM7aUJBQ0o7Z0JBQ0Q7b0JBQ0ksT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLFVBQVUsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDO29CQUNqRCxLQUFLLEVBQUUsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztvQkFDeEQsT0FBTyxFQUFFO3dCQUNMLElBQUksS0FBSSxDQUFDLHVCQUF1QixFQUFFOzRCQUM5QixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDOzRCQUN2QixLQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFJLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs0QkFDckcsS0FBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7eUJBQ3ZCOzZCQUFNOzRCQUNILEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ2pDLElBQUksS0FBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dDQUM5QixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dDQUN2QixLQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFJLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQ0FDckcsS0FBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7NkJBQ3ZCO3lCQUNKO29CQUNMLENBQUM7aUJBQ0o7Z0JBQ0Q7b0JBQ0ksT0FBTyxFQUFFLENBQUMsS0FBSSxDQUFDLFVBQVUsSUFBSSxLQUFJLENBQUMsWUFBWTtvQkFDOUMsS0FBSyxFQUFFLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7b0JBQzFELE9BQU8sRUFBRTt3QkFDTCxJQUFJLEtBQUksQ0FBQyx5QkFBeUIsRUFBRTs0QkFDaEMsS0FBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7NEJBQ3BCLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDL0I7NkJBQU07NEJBQ0gsS0FBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDbkMsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0NBQzlCLEtBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dDQUNwQixLQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7NkJBQy9CO3lCQUNKO29CQUNMLENBQUM7aUJBQ0o7YUFDSixDQUFDO1FBQ04sQ0FBQyxDQUFBO1FBVUcsS0FBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOztJQUMzQixDQUFDO0lBRUQsZ0RBQVEsR0FBUjtRQUFBLGlCQXNCQztRQXJCRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQUMsS0FBSztZQUNoRCxLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQUMsS0FBSztZQUNsRCxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixLQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdDQUFnQzthQUNuRCxTQUFTLENBQUM7WUFDUCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxFQUFFO2dCQUN6QyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPO29CQUN0QyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3hCLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFWCxDQUFDO0lBRUQsbURBQVcsR0FBWCxVQUFZLE9BQXNCO1FBQzlCLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsWUFBWSxFQUFFO1lBQ3pFLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsWUFBWSxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxPQUFPLENBQUMseUJBQXlCLENBQUMsSUFBSSxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxZQUFZLEVBQUU7WUFDdkYsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7U0FDdEM7UUFFRCxJQUFJLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLFlBQVksRUFBRTtZQUN2RixJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDaEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVPLHVEQUFlLEdBQXZCO1FBQ0ksSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ25ELHdCQUF3QixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztTQUMzRCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsbURBQVcsR0FBWDtRQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsdURBQWUsR0FBZjtRQUNJLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVPLHdEQUFnQixHQUF4QjtRQUNJLElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFBLEVBQUU7WUFDeEQsRUFBRSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDNUIsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsd0RBQWdCLEdBQWhCLFVBQWlCLEtBQVU7UUFBM0IsaUJBWUM7UUFYRyxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQUMsUUFBUTtZQUMxQyxJQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFDLE1BQVcsSUFBSyxPQUFBLE1BQU0sQ0FBQyxRQUFRLEtBQUssWUFBWSxFQUFoQyxDQUFnQyxDQUFDLENBQUM7WUFDaEcsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLEtBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQyxJQUFTO29CQUN2RCxPQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFBdEQsQ0FBc0QsQ0FDdkQsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLEtBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsNkRBQXFCLEdBQXJCO1FBQ0ksT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QixVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUN2QyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDZCxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sa0JBQzdCLElBQUksQ0FBQyw0QkFBNEI7b0JBQ3BDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO21CQUN2QyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHFEQUFhLEdBQWIsVUFBYyxLQUFVLEVBQUUsS0FBYTtRQUNuQyxJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN0QyxJQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwRCxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekMsSUFBRyxhQUFhLEVBQUU7WUFDZCxhQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzVELGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixhQUFhLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELDJEQUFtQixHQUFuQixVQUFvQixLQUFhO1FBQzdCLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxJQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLGlCQUFpQjtZQUFFLE9BQU87UUFFakQsSUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUN6QyxJQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQy9DLElBQU0sUUFBUSxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUV2RCxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDZCxlQUFlLEVBQUUsa0JBQWtCLENBQUMsOEJBQThCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQzthQUN6RixDQUFDLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSwwREFBa0IsR0FBekIsVUFBMEIsSUFBWSxFQUFFLEtBQWE7UUFDakQsT0FBTyxrQkFBa0IsQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVNLCtEQUF1QixHQUE5QjtRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCO1lBQUUsT0FBTztRQUVwQyxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxFQUFFO1lBQ3RELElBQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUV4QyxJQUFJLFVBQVUsS0FBSyxLQUFLLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtnQkFDakQsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUM3RDtpQkFBTSxJQUFJLFVBQVUsS0FBSyxXQUFXLEVBQUU7Z0JBQ3JDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDOUQ7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVM7YUFDWCxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQzthQUN4QixHQUFHLENBQUMsMEJBQTBCLENBQUM7YUFDL0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxnRUFBd0IsR0FBL0I7UUFDSSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUzRSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUU7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQ3hEO0lBQ0wsQ0FBQztJQUVNLGtEQUFVLEdBQWpCLFVBQWtCLEtBQVc7UUFBN0IsaUJBK0JDO1FBOUJHLElBQU0sS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDakUsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFekIsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtZQUM1RCxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFDLEtBQVU7Z0JBQy9CLEtBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLEtBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztZQUN0RyxDQUFDLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsb0JBQU8sT0FBTyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQzlEO2FBQU07WUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztTQUM1QjtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDM0I7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRTVCLENBQUM7SUFFRDs7T0FFRztJQUNLLHdEQUFnQixHQUF4QjtRQUNJLElBQUksMEJBQTBCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0QsVUFBVSxDQUFFO2dCQUNSLElBQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUNyQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDVDtJQUNMLENBQUM7SUFFTSwyQ0FBRyxHQUFWO1FBQ0ksSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsOENBQU0sR0FBTjtRQUNJLElBQU0sT0FBTyxHQUFHO1lBQ2QsVUFBVSxFQUFFLEVBQUU7WUFDZCxNQUFNLEVBQUUsRUFBRTtZQUNWLFVBQVUsRUFBRSxDQUFDO1NBQ2QsQ0FBQztRQUVGLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7UUFFbEQsSUFBSSxDQUFDLHVCQUF1QixvQkFDdkIsSUFBSSxDQUFDLHVCQUF1QjtZQUMvQixPQUFPO1VBQ1IsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFMUQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFM0UsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUdELGlEQUFTLEdBQVQsVUFBVSxLQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3ZDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxLQUFLLEtBQUssRUFBWCxDQUFXLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUdLLDJEQUFtQixHQUEzQixVQUE0QixJQUFXO1FBQXZDLGlCQStCQztRQTlCRyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBSSxFQUFFLEtBQUs7WUFDckIsSUFBTSxJQUFJLEdBQUcsS0FBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDMUMsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFDdkMsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUU5QixJQUFJLFVBQVUsS0FBSyxLQUFLLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtnQkFDL0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDMUY7WUFDRCxJQUFJLFVBQVUsS0FBSyxXQUFXLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDM0U7WUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLEtBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBRWxDLEtBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQzdCLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFckMsS0FBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTlELElBQU0sVUFBVSxHQUFHLElBQUk7aUJBQ2xCLE1BQU0sQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBQSxDQUFDLEtBQUssS0FBSyxFQUFYLENBQVcsQ0FBQztpQkFDN0IsR0FBRyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUEvQyxDQUErQyxDQUFDLENBQUM7WUFFakUsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCwwREFBa0IsR0FBbEIsVUFBbUIsSUFBUyxFQUFFLEtBQWE7UUFBM0MsaUJBYUM7UUFaRyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFcEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFaEQsVUFBVSxDQUFDO1lBQ1AsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDaEMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2FBQ3JDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCx5REFBaUIsR0FBakIsVUFBa0IsS0FBYTtRQUMzQixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8seURBQWlCLEdBQXpCLFVBQTBCLEtBQWE7UUFDbkMsSUFBSSxPQUFPLG9CQUFPLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxFQUFILENBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxtRUFBMkIsR0FBbEM7UUFDSSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUM7WUFDN0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUs7WUFDbkUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQzFFLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxLQUFLLENBQUM7O1lBRTVJLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxxREFBYSxHQUFwQixVQUFxQixNQUFXO1FBQzVCLElBQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hFLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWpHLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUNmLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDNUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3ZCO2FBQU07WUFDSCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFDL0UsSUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sQ0FBQyxjQUFjLENBQUMsb0JBQU8sV0FBVyxDQUFDLENBQUM7YUFDN0M7WUFDRCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN2QyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTyw0REFBb0IsR0FBNUIsVUFBNkIsS0FBYSxFQUFFLElBQWM7UUFDdEQsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFCLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUMzRTtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyw2REFBcUIsR0FBN0I7UUFDSSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixJQUFNLGVBQWUsR0FBUSxFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBRS9ELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQyxJQUFTLElBQUssT0FBQSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBaEQsQ0FBZ0QsQ0FBQyxDQUFDO1FBRTdFLElBQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBQyxLQUFhLEVBQUUsVUFBa0I7WUFDM0UsT0FBTyxLQUFLLEdBQUcsVUFBVSxDQUFDO1FBQzlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUksYUFBYSxLQUFLLEdBQUcsRUFBRTtZQUN2QixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1NBQ3RJO2FBQU07WUFDSCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1NBQ3pDO0lBRUwsQ0FBQztJQUVNLG1EQUFXLEdBQWxCLFVBQW1CLEtBQWEsRUFBRSxLQUFhO1FBQzNDLElBQ0UsSUFBSSxDQUFDLGNBQWM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQ3JDO1lBQ0EsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUU1QixJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBRW5ELE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFFakMsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxVQUFDLElBQUksRUFBRSxDQUFDO2dCQUMzRCxPQUFPLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXRFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO0lBQ0wsQ0FBQztJQUVELHNCQUFXLHdEQUFhO2FBQXhCO1lBQ0ksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDOzs7T0FBQTtJQUVELHNCQUFXLHlEQUFjO2FBQXpCO1lBQ0ksT0FBTyxDQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxXQUFNLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsaUNBQWlDLENBQUMsQ0FBRyxDQUFDO1FBQzNNLENBQUM7OztPQUFBO0lBRUQsc0JBQVcsd0VBQTZCO2FBQXhDO1lBQ0ksT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdkQsQ0FBQzs7O09BQUE7SUFHRCxzQkFBVyxxREFBVTthQUFyQjtZQUNJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM1QixDQUFDO2FBRUQsVUFBc0IsS0FBYTtZQUFuQyxpQkFLQztZQUpHLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQyxHQUFRLElBQUssT0FBQSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSSxDQUFDLFdBQVcsRUFBcEMsQ0FBb0MsQ0FBQyxDQUFDO2FBQzVFO1FBQ0wsQ0FBQzs7O09BUEE7SUFVRCxzQkFBVyw0REFBaUI7YUFBNUI7WUFDSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNuQyxDQUFDO2FBRUQsVUFBNkIsS0FBYTtZQUExQyxpQkFLQztZQUpHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBUSxJQUFLLE9BQUEsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixFQUFsRCxDQUFrRCxDQUFDLENBQUM7YUFDMUY7UUFDTCxDQUFDOzs7T0FQQTtJQVVELHNCQUFXLHNEQUFXO2FBQXRCLFVBQXVCLElBQWM7WUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQzs7O09BQUE7SUFHRCxzQkFBVyxrREFBTzthQUFsQjtZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6QixDQUFDO2FBWUQsVUFBbUIsS0FBYztZQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsQ0FBQzs7O09BZkE7SUFHRCxzQkFBVyxxREFBVTthQUFyQixVQUFzQixLQUFnQjtZQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDOzs7T0FBQTtJQUdELHNCQUFXLDJEQUFnQjthQUEzQixVQUE0QixLQUFhO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDbkMsQ0FBQzs7O09BQUE7SUFNTSw2Q0FBSyxHQUFaO1FBQ0ksSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVNLG1FQUEyQixHQUFsQyxVQUFtQyxlQUF1QjtRQUN0RCxPQUFPLGtCQUFrQixDQUFDLDJCQUEyQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTSx1REFBZSxHQUF0QixVQUF1QixHQUFXO1FBQzlCLE9BQU8sa0JBQWtCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSx3REFBZ0IsR0FBdkIsVUFBd0IsSUFBWTtRQUNoQyxPQUFPLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSw4REFBc0IsR0FBN0IsVUFBOEIsS0FBYTtRQUN2QyxPQUFPLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxzQkFBWSxpRUFBc0I7YUFBbEM7WUFDSSxPQUFPLENBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FDN0IsQ0FBQztRQUNOLENBQUM7OztPQUFBO0lBRUQsc0JBQVksb0VBQXlCO2FBQXJDO1lBQ0ksT0FBTyxDQUNILElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQzdCLENBQUM7UUFDTixDQUFDOzs7T0FBQTtJQUVELHNCQUFZLGtFQUF1QjthQUFuQztZQUNJLE9BQU8sQ0FDSCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUM1QixDQUFDO1FBQ04sQ0FBQzs7O09BQUE7SUFFRCxzQkFBWSxrRUFBdUI7YUFBbkM7WUFDSSxPQUFPLENBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FDaEMsQ0FBQztRQUNOLENBQUM7OztPQUFBOztnQkExZjZCLGdCQUFnQjtnQkFDOUIsaUJBQWlCO2dCQUNoQixXQUFXO2dCQUNJLGtCQUFrQjtnQkFDN0IsMkJBQTJCOztJQXJKaEQ7UUFEQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7dUVBQ1Q7SUFDRTtRQUE1QyxTQUFTLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO3NFQUFrQjtJQUU5RDtRQURDLEtBQUssRUFBRTtvRUFDb0I7SUFFNUI7UUFEQyxLQUFLLEVBQUU7eUVBQ3NCO0lBRTlCO1FBREMsS0FBSyxFQUFFO3NFQUNtQjtJQUUzQjtRQURDLEtBQUssRUFBRTs2RUFDMEI7SUFFbEM7UUFEQyxLQUFLLEVBQUU7c0VBQ3VCO0lBRS9CO1FBREMsS0FBSyxFQUFFO3lFQUMrQjtJQUV2QztRQURDLEtBQUssRUFBRTt3RUFDcUI7SUFFN0I7UUFEQyxLQUFLLEVBQUU7cUVBQzJCO0lBRW5DO1FBREMsS0FBSyxFQUFFO3FFQUMyQjtJQUVuQztRQURDLEtBQUssRUFBRTttRUFDNkI7SUFFckM7UUFEQyxLQUFLLEVBQUU7dUVBQ29CO0lBRTVCO1FBREMsS0FBSyxFQUFFO3dFQUNxQjtJQUU3QjtRQURDLEtBQUssRUFBRTtzRUFDMkI7SUFFbkM7UUFEQyxLQUFLLEVBQUU7cUVBQ2tCO0lBRTFCO1FBREMsS0FBSyxFQUFFOzJFQUM0QjtJQUVwQztRQURDLEtBQUssRUFBRTtrRkFDbUM7SUFFM0M7UUFEQyxLQUFLLEVBQUU7NEVBQ2dDO0lBRXhDO1FBREMsS0FBSyxFQUFFOzRFQUNrQztJQUcxQztRQURDLE1BQU0sRUFBRTsyRUFDZ0U7SUFFekU7UUFEQyxNQUFNLEVBQUU7MkVBQ2dFO0lBRXpFO1FBREMsTUFBTSxFQUFFOzZFQUNrRTtJQUUzRTtRQURDLE1BQU0sRUFBRTs0RUFDcUU7SUFpZ0I5RTtRQURDLEtBQUssRUFBRTttRUFHUDtJQVVEO1FBREMsS0FBSyxFQUFFOzBFQUdQO0lBVUQ7UUFEQyxLQUFLLEVBQUU7b0VBTVA7SUFHRDtRQURDLEtBQUssRUFBRTtnRUFHUDtJQUdEO1FBREMsS0FBSyxFQUFFO21FQUdQO0lBR0Q7UUFEQyxLQUFLLEVBQUU7eUVBR1A7SUE3bEJRLDZCQUE2QjtRQU56QyxTQUFTLENBQUM7WUFDUCw4Q0FBOEM7WUFDOUMsUUFBUSxFQUFFLDBCQUEwQjtZQUNwQyx5a2pCQUFzRDs7U0FFekQsQ0FBQztPQUNXLDZCQUE2QixDQThvQnpDO0lBQUQsb0NBQUM7Q0FBQSxBQTlvQkQsQ0FBbUQsd0JBQXdCLEdBOG9CMUU7U0E5b0JZLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgSW5wdXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIE91dHB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgQ3VzdG9tRmllbGRzQ29tcG9uZW50LCBOdW1iZXJMb2NhbGVPcHRpb25zIH0gZnJvbSBcIkBzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IGNvbXBhcmVWYWx1ZXMsIGlzVmFsaWQsIG1vdW50Q3VzdG9tVG9TYXZlIH0gZnJvbSBcIi4uL3V0aWxzL2hlbHBlcnNcIjtcbmltcG9ydCB7IERpcmVjdGlvbkVudW1lcmF0aW9uIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW51bXNcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgRm9ybWF0VXRpbHNTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm1hdC11dGlscy9mb3JtYXQtdXRpbHMuc2VydmljZVwiO1xuaW1wb3J0IHsgU2hhcmVkU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3NoYXJlZC9zaGFyZWQtc3RhdGUuc2VydmljZVwiO1xuaW1wb3J0IHsgSGlzdG9yaWNha1BpeEFjY291bnRCYXNlIH0gZnJvbSBcIi4vaGlzdG9yaWNhbC1waXgtYWNjb3VudC1iYXNlXCI7XG5pbXBvcnQgeyBIaXN0b3JpY2FsUGl4QWNjb3VudFNlcnZpY2UgfSBmcm9tIFwiLi9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiBcImMtaGlzdG9yaWNhbC1waXgtYWNjb3VudFwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vaGlzdG9yaWNhbC1waXgtYWNjb3VudC5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LmNvbXBvbmVudC5zY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBIaXN0b3JpY2FsUGl4QWNjb3VudENvbXBvbmVudCBleHRlbmRzIEhpc3RvcmljYWtQaXhBY2NvdW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICAgIEBWaWV3Q2hpbGQoQ3VzdG9tRmllbGRzQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgY3VzdG9tRmllbGRzOiBDdXN0b21GaWVsZHNDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnZGF0YUxpc3RQaXgnLCB7IHN0YXRpYzogZmFsc2UgfSkgZGF0YUxpc3RQaXg6IGFueTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBmb3JtR3JvdXA6IEZvcm1Hcm91cDtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBmaWVsZEZvcm1Hcm91cDogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIF9kYXRlQ2hhbmdlOiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgX2Rpc3BsYXlEYXRlQ2hhbmdlOiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmVjb3JkQnlSb3c6IG51bWJlciA9IDE7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2hvd0RhdGVDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtc2dUb29sdGlwQWRkOiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlzVmlld01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjdXJyZW5jeTogTnVtYmVyTG9jYWxlT3B0aW9ucztcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjdXN0b21FbnRpdHk6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjdXN0b21TZXJ2aWNlOiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2l0aFNpZGVCYXI6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHBlcm1pc3Npb246IG9iamVjdDtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsaXN0RGF0YVJlY2lldmVyOiBhbnlbXSA9IFtdO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhOiBhbnlbXSA9IFtdO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldExpc3RQaXhBY2NvdW50OiBvYmplY3RbXSA9IFtdO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlzRWRpdE1vZGVGb3JTYXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgaXNWaWV3TW9kZUFjdGl2ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGlzRWRpdE1vZGVBY3RpdmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBpc0RlbGV0ZU1vZGVBY3RpdmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBpc1ZhbGlkQ2hhbmdlRm9ybTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG5cbiAgICBwcml2YXRlIGxpc3RGcm9tQXBwOiBhbnlbXSA9IFtdO1xuICAgIHByaXZhdGUgdmlzaWJsZUNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHJpdmF0ZSBoaXN0b3JpY2FsUGl4QWNjb3VudExpc3Q6IEZvcm1Hcm91cDtcbiAgICBwcml2YXRlIG9yZGVyQnk6IHsgZmllbGQ6IHN0cmluZzsgZGlyZWN0aW9uOiBEaXJlY3Rpb25FbnVtZXJhdGlvbiB9ID0ge1xuICAgICAgICBmaWVsZDogXCJkYXRlQ2hhbmdlXCIsXG4gICAgICAgIGRpcmVjdGlvbjogRGlyZWN0aW9uRW51bWVyYXRpb24uREVTQyxcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfdmlzaWJsZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcGl4QWNjb3VudEl0ZW1JbnB1dDogb2JqZWN0ID0ge307XG4gICAgcHVibGljIHRvdGFsUmVjb3JkczogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgYWN0aW9uTGFiZWw6IHN0cmluZyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuZW50cmllc19xdWVyeV9hY3Rpb25zX3RvdGFsX3RpdGxlXCIpO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcbiAgICBwdWJsaWMgcGFyYW1ldGVyczogYW55O1xuICAgIHB1YmxpYyBtc2dUb3RhbExpbWl0QnlQZXJjZW50YWdlOiBzdHJpbmc7XG4gICAgcHVibGljIGxpc3REYXRhOiBvYmplY3RbXSA9IFtdO1xuICAgIHB1YmxpYyBsaXN0RGF0YU5vUGFnZTogb2JqZWN0W10gPSBbXTtcbiAgICBwdWJsaWMgc2hvd0J1dHRvblZpZXcgPSB0cnVlO1xuICAgIHB1YmxpYyBzaG93RWRpdE1vZGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgaGFzUmVjb3Jkc1BpeCA9IHRydWU7XG4gICAgcHVibGljIGhpZGVGaWVsZHMgPSB0aGlzLnNoYXJlZFN0YXRlU2VydmljZS5oaWRlRmllbGQkO1xuICAgIHB1YmxpYyBzdWdnZXN0aW9uczogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgZm9ybUdyb3VwQnlSb3c6IHsgW2luZGV4OiBudW1iZXJdOiBGb3JtR3JvdXAgfSA9IHt9O1xuXG4gICAgcHVibGljIGNvbHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcImhjbS5wYXlyb2xsLmVtcGxveWVlc19hZGRpdGlvbl9waXhfa2V5X3R5cGVcIiksXG4gICAgICAgICAgICBmaWVsZDogXCJwaXhLZXlUeXBlXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcImhjbS5wYXlyb2xsLmVtcGxveWVlc19hZGRpdGlvbl9waXhfa2V5XCIpLFxuICAgICAgICAgICAgZmllbGQ6IFwicGl4S2V5XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcImhjbS5wYXlyb2xsLmhpc3RvcmljYWxfcGl4X2FjY291bnRfbGFiZWxfcGVyY2VudGFnZVwiKSxcbiAgICAgICAgICAgIGZpZWxkOiBcInBlcmNlbnRhZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwubW92aW1lbnRhdGlvbl9nZW5lcmljX2FjdGlvblwiKSxcbiAgICAgICAgICAgIGZpZWxkOiBcImFjdGlvbnNcIixcbiAgICAgICAgfVxuICAgIF07XG4gICAgYWN0aW9ucyA9IChyb3dEYXRhOiBhbnkgPSB7fSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB0aGlzLmlzRWRpdE1vZGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuZW1wbG95ZWVzX2ltYWdlX2Nyb3BwZXJfdmlld1wiKSxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWxsb3dUb1ZpZXdIaXN0b3JpY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhW1wiaW5kZXhcIl0gPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpeEFjY291bnRJdGVtSW5wdXQgPSB7IGN1cnJlbnRJdGVtOiByb3dEYXRhLCBsaXN0RGF0YTogdGhpcy5saXN0RGF0YU5vUGFnZSwgaXNFZGl0TW9kZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVmlld01vZGVBY3RpdmUuZW1pdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZpc2libGU6ICEhKCF0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy53aXRoU2lkZUJhciksXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuZWRpdFwiKSxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWxsb3dUb0VkaXRIaXN0b3JpY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhW1wiaW5kZXhcIl0gPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpeEFjY291bnRJdGVtSW5wdXQgPSB7IGN1cnJlbnRJdGVtOiByb3dEYXRhLCBsaXN0RGF0YTogdGhpcy5saXN0RGF0YU5vUGFnZSwgaXNFZGl0TW9kZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNFZGl0TW9kZUFjdGl2ZS5lbWl0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdEZyb21BcHAubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhW1wiaW5kZXhcIl0gPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhBY2NvdW50SXRlbUlucHV0ID0geyBjdXJyZW50SXRlbTogcm93RGF0YSwgbGlzdERhdGE6IHRoaXMubGlzdERhdGFOb1BhZ2UsIGlzRWRpdE1vZGU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogIXRoaXMuaXNFZGl0TW9kZSB8fCB0aGlzLnNob3dFZGl0TW9kZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXCJoY20ucGF5cm9sbC5kZWxldGVcIiksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FsbG93VG9EZWxldGVIaXN0b3JpY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVBbm51aXR5SXRlbShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0RlbGV0ZU1vZGVBY3RpdmUuZW1pdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RGcm9tQXBwLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUFubnVpdHlJdGVtKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHNoYXJlZFN0YXRlU2VydmljZTogU2hhcmVkU3RhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNlcnZpY2U6IEhpc3RvcmljYWxQaXhBY2NvdW50U2VydmljZSxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZm9ybUJ1aWxkZXIpO1xuICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Hcm91cCgpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5zZXRDb250cm9sKHRoaXMuZmllbGRGb3JtR3JvdXAsIHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KTtcbiAgICAgICAgdGhpcy5zaGFyZWRTdGF0ZVNlcnZpY2Uuc2hvd0J1dHRvbiQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93QnV0dG9uVmlldyA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNoYXJlZFN0YXRlU2VydmljZS5zaG93RWRpdE1vZGUkLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0VkaXRNb2RlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmlzRWRpdE1vZGVGb3JTYXZlID0gdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2hhcmVkU3RhdGVTZXJ2aWNlLmFjdGl2ZVZhbGlkYXRvcnNPbkVkaXRNb2RhbE9wZW4kXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuZm9ybUdyb3VwQnlSb3cpLmZvckVhY2goZmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGZnLmNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Rm9ybVZhbGlkaXR5KCk7XG4gICAgICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2xpc3REYXRhUmVjaWV2ZXInXSAmJiBjaGFuZ2VzWydsaXN0RGF0YVJlY2lldmVyJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RGcm9tQXBwID0gY2hhbmdlc1snbGlzdERhdGFSZWNpZXZlciddLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEnXSAmJiBjaGFuZ2VzWydhZGRFeGlzdGVudEhpc3RvcmljRGF0YSddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5nZXRIaXN0b3JpY2FsUGl4QWNjb3VudExpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWydhZGRFeGlzdGVudEhpc3RvcmljRGF0YSddICYmIGNoYW5nZXNbJ2FkZEV4aXN0ZW50SGlzdG9yaWNEYXRhJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRhID0gY2hhbmdlc1snYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEnXS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRGb3JtR3JvdXBNYXAobmV3RGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUZvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGhpc3RvcmljYWxQaXhBY2NvdW50TGlzdDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVtaXRGb3JtVmFsaWRpdHkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFsbFZhbGlkID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZvcm1Hcm91cEJ5Um93KS5ldmVyeShmZyA9PiB7XG4gICAgICAgICAgICBmZy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICByZXR1cm4gZmcudmFsaWQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzVmFsaWRDaGFuZ2VGb3JtLmVtaXQoYWxsVmFsaWQpO1xuICAgIH1cblxuICAgIGZpbHRlclBpeEtleVR5cGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGV2ZW50LnF1ZXJ5O1xuICAgICAgICB0aGlzLnNlcnZpY2UuZW51bVF1ZXJ5KCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBpeEtleVR5cGVFbnVtID0gcmVzcG9uc2UucmVzdWx0cy5maW5kKChyZXN1bHQ6IGFueSkgPT4gcmVzdWx0LmVudW1OYW1lID09PSAnUGl4S2V5VHlwZScpO1xuICAgICAgICAgIGlmIChwaXhLZXlUeXBlRW51bSkge1xuICAgICAgICAgICAgdGhpcy5zdWdnZXN0aW9ucyA9IHBpeEtleVR5cGVFbnVtLml0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICBpdGVtLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZVBpeFJvd0Zvcm1Hcm91cCgpOiBGb3JtR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgcGl4S2V5VHlwZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgIHBpeEtleTogW251bGxdLFxuICAgICAgICAgIHBlcmNlbnRhZ2U6IFswLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgLi4udGhpcy5pbml0aWFsVmFsaWRhdG9yT2ZQZXJjZW50YWdlLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXgodGhpcy5tYXhWYWx1ZVBlcmNlbnRhZ2UpLFxuICAgICAgICAgIF0pXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblBpeEtleUlucHV0KGV2ZW50OiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgY29uc3QgaW5wdXRSYXdWYWx1ZSA9IGlucHV0VmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcblxuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtR3JvdXBCeVJvd1tpbmRleF07XG4gICAgICAgIGNvbnN0IHBpeEtleUNvbnRyb2wgPSBmb3JtLmdldCgncGl4S2V5Jyk7XG5cbiAgICAgICAgaWYocGl4S2V5Q29udHJvbCkge1xuICAgICAgICAgICAgcGl4S2V5Q29udHJvbC5zZXRWYWx1ZShpbnB1dFJhd1ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICBwaXhLZXlDb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICBwaXhLZXlDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFBpeEtleVZhbGlkYXRvcnModHJ1ZSwgZm9ybSk7XG4gICAgICAgIHRoaXMuZW1pdEZvcm1WYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIG9uQmx1clBpeENwZkFuZENucGooaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtR3JvdXBCeVJvd1tpbmRleF07XG4gICAgICAgIGNvbnN0IHBpeEtleUNvbnRyb2wgPSBmb3JtLmdldCgncGl4S2V5Jyk7XG4gICAgICAgIGNvbnN0IHBpeEtleVR5cGVDb250cm9sID0gZm9ybS5nZXQoJ3BpeEtleVR5cGUnKTtcblxuICAgICAgICBpZiAoIXBpeEtleUNvbnRyb2wgfHwgIXBpeEtleVR5cGVDb250cm9sKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gcGl4S2V5Q29udHJvbC52YWx1ZTtcbiAgICAgICAgY29uc3QgcGl4S2V5VHlwZSA9IHBpeEtleVR5cGVDb250cm9sLnZhbHVlLmtleTtcbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSAoY3VycmVudFZhbHVlIHx8ICcnKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuXG4gICAgICAgIHBpeEtleUNvbnRyb2wuc2V0VmFsdWUocmF3VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgICAgICBpZiAocGl4S2V5Q29udHJvbC52YWxpZCkge1xuICAgICAgICAgIGZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBwaXhLZXlGb3JtYXR0ZWQ6IEZvcm1hdFV0aWxzU2VydmljZS5nZXRGb3JtYXR0ZWRTdWJzY3JpcHRpb25OdW1iZXIocmF3VmFsdWUsIHBpeEtleVR5cGUpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0Rm9ybVZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZFBpeEtleSh0eXBlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gRm9ybWF0VXRpbHNTZXJ2aWNlLmdldEZvcm1hdHRlZFN1YnNjcmlwdGlvbk51bWJlcih2YWx1ZSwgdHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN5bmNQaXhEYXRhVG9QYXJlbnRGb3JtKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZUZvclNhdmUpIHJldHVybjtcblxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMuZm9ybUdyb3VwQnlSb3cpLm1hcChmZyA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmZy5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICAgIGNvbnN0IHBpeEtleVR5cGUgPSB2YWx1ZS5waXhLZXlUeXBlLmtleTtcblxuICAgICAgICAgIGlmIChwaXhLZXlUeXBlID09PSAnQ1BGJyB8fCBwaXhLZXlUeXBlID09PSAnQ05QSicpIHtcbiAgICAgICAgICAgIHZhbHVlLnBpeEtleSA9ICh2YWx1ZS5waXhLZXkgfHwgJycpLnJlcGxhY2UoL1suXFwtXFwvXS9nLCAnJyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwaXhLZXlUeXBlID09PSAnVEVMRVBIT05FJykge1xuICAgICAgICAgICAgdmFsdWUucGl4S2V5ID0gKHZhbHVlLnBpeEtleSB8fCAnJykucmVwbGFjZSgvWygpXFxzXFwtXS9nLCAnJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cFxuICAgICAgICAgIC5nZXQodGhpcy5maWVsZEZvcm1Hcm91cClcbiAgICAgICAgICAuZ2V0KCdoaXN0b3JpY2FsUGl4QWNjb3VudExpc3QnKVxuICAgICAgICAgIC5zZXRWYWx1ZSh2YWx1ZXMpO1xuXG4gICAgICAgICAgdGhpcy5lbWl0Rm9ybVZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN5bmNSZXNldFBpeEZvcm1Ub1BhcmVudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBCeVJvdyA9IHt9O1xuICAgICAgICB0aGlzLmhpc3RvcmljYWxQaXhBY2NvdW50TGlzdC5yZXNldCgpO1xuICAgICAgICB0aGlzLmhpc3RvcmljYWxQaXhBY2NvdW50TGlzdC5nZXQoJ2hpc3RvcmljYWxQaXhBY2NvdW50TGlzdCcpLnNldFZhbHVlKFtdKTtcblxuICAgICAgICBpZiAodGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnJlYnVpbGRGb3JtR3JvdXBNYXAodGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25MYXp5TG9hZChldmVudD86IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaXJzdCA9IGV2ZW50ICYmIGV2ZW50LmZpcnN0ID8gZXZlbnQuZmlyc3QgOiAwO1xuICAgICAgICBjb25zdCByb3dzID0gZXZlbnQgJiYgZXZlbnQucm93cyA/IGV2ZW50LnJvd3MgOiB0aGlzLnJlY29yZEJ5Um93O1xuICAgICAgICBjb25zdCBhcnJMaXN0ID0gdGhpcy5nZXRIaXN0b3JpY2FsUGl4QWNjb3VudExpc3QoKTtcbiAgICAgICAgdGhpcy5saXN0RGF0YSA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50Lm11bHRpU29ydE1ldGEgJiYgZXZlbnQubXVsdGlTb3J0TWV0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV2ZW50Lm11bHRpU29ydE1ldGEubWFwKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmRlckJ5LmZpZWxkID0gdmFsdWUuZmllbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmRlckJ5LmRpcmVjdGlvbiA9IHZhbHVlLm9yZGVyID09PSAxID8gRGlyZWN0aW9uRW51bWVyYXRpb24uQVNDIDogRGlyZWN0aW9uRW51bWVyYXRpb24uREVTQztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyckxpc3QgJiYgYXJyTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gYXJyTGlzdC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmxpc3REYXRhID0gYXJyTGlzdDtcbiAgICAgICAgICAgIHRoaXMubGlzdERhdGFOb1BhZ2UgPSBbLi4uYXJyTGlzdF07XG4gICAgICAgICAgICB0aGlzLmxpc3REYXRhLnNvcnQoY29tcGFyZVZhbHVlcyh0aGlzLm9yZGVyQnkuZmllbGQsIHRoaXMub3JkZXJCeS5kaXJlY3Rpb24pKTtcbiAgICAgICAgICAgIHRoaXMubGlzdERhdGEgPSB0aGlzLmxpc3REYXRhLnNsaWNlKGZpcnN0LCAoZmlyc3QgKyByb3dzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpc3REYXRhTm9QYWdlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0VkaXRNb2RlIHx8IGFyckxpc3QgJiYgYXJyTGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENzc0luSUUxMSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW0gQnVnIGRlIENTUyBxdWUgYWNvbnRlY2UgbmFzIGxpbmhhcyBkYSB0YWJlbGEsIHF1ZSByZXNvbHZlIHPDsyBhdHVhbGl6YW5kbyBxdWFscXVlciBwYXJ0ZSBkbyBDU1MgZGEgcGFnaW5hLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVmcmVzaENzc0luSUUxMSgpIHtcbiAgICAgICAgaWYgKC9tc2llXFxzfHRyaWRlbnRcXC98ZWRnZVxcLy9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInJvdzBcIik7XG4gICAgICAgICAgICAgICAgaWYgKHJvdyAmJiByb3dbMF0pXG4gICAgICAgICAgICAgICAgICAgIHJvd1swXS5jbGFzc05hbWUgPSAncmVmcmVzaCc7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGl4QWNjb3VudEl0ZW1JbnB1dCA9IHt9O1xuICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGFkZFBpeCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmV3SXRlbSA9IHtcbiAgICAgICAgICBwaXhLZXlUeXBlOiB7fSxcbiAgICAgICAgICBwaXhLZXk6ICcnLFxuICAgICAgICAgIHBlcmNlbnRhZ2U6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEgPSBbXG4gICAgICAgICAgLi4udGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSxcbiAgICAgICAgICBuZXdJdGVtXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXBCeVJvd1tpbmRleF0gPSB0aGlzLmNyZWF0ZVBpeFJvd0Zvcm1Hcm91cCgpO1xuXG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdG9yc0FjY29yZGluZ0xpc3QodGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuZW1pdEZvcm1WYWxpZGl0eSgpO1xuICAgIH1cblxuXG4gICAgZGVsZXRlUGl4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YUxpc3RQaXguZWRpdGluZ0NlbGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RQaXguZWRpdGluZ0NlbGwgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEgPSB0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICB0aGlzLnJlYnVpbGRGb3JtR3JvdXBNYXAodGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSk7XG4gICAgICAgIHRoaXMuZW1pdEZvcm1WYWxpZGl0eSgpO1xuICAgICAgfVxuXG5cbiAgICBwcml2YXRlIHJlYnVpbGRGb3JtR3JvdXBNYXAoZGF0YTogYW55W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBCeVJvdyA9IHt9O1xuXG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNyZWF0ZVBpeFJvd0Zvcm1Hcm91cCgpO1xuICAgICAgICAgICAgY29uc3QgcGl4S2V5VHlwZSA9IGl0ZW0ucGl4S2V5VHlwZS5rZXk7XG4gICAgICAgICAgICBjb25zdCBwaXhLZXlSYXcgPSBpdGVtLnBpeEtleTtcblxuICAgICAgICAgICAgaWYgKHBpeEtleVR5cGUgPT09ICdDUEYnIHx8IHBpeEtleVR5cGUgPT09ICdDTlBKJykge1xuICAgICAgICAgICAgICAgIGl0ZW0ucGl4S2V5ID0gRm9ybWF0VXRpbHNTZXJ2aWNlLmdldEZvcm1hdHRlZFN1YnNjcmlwdGlvbk51bWJlcihwaXhLZXlSYXcsIHBpeEtleVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBpeEtleVR5cGUgPT09ICdURUxFUEhPTkUnKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5waXhLZXkgPSBGb3JtYXRVdGlsc1NlcnZpY2UuZ2V0Rm9ybWF0dGVkVGVsZXBob25lTnVtYmVyKHBpeEtleVJhdyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm0ucGF0Y2hWYWx1ZShpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdID0gZm9ybTtcblxuICAgICAgICAgICAgdGhpcy5waXhLZXlUeXBlID0gcGl4S2V5VHlwZTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGl4S2V5VmFsaWRhdG9ycyh0cnVlLCBmb3JtKTtcblxuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0b3JzQWNjb3JkaW5nTGlzdChkYXRhLCBpbmRleCwgdGhpcy5pc0VkaXRNb2RlKTtcblxuICAgICAgICAgICAgY29uc3QgbGlzdFZhbHVlcyA9IGRhdGFcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICAubWFwKHJvdyA9PiByb3cucGVyY2VudGFnZSA/IHBhcnNlRmxvYXQocm93LnBlcmNlbnRhZ2UpIDogMCk7XG5cbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQZXJjZW50YWdlVmFsaWQobGlzdFZhbHVlcywgZm9ybSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZW1pdEZvcm1WYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIG9uUGl4S2V5VHlwZUNoYW5nZShpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlUGl4S2V5VHlwZShpdGVtLCBmb3JtKTtcblxuICAgICAgICB0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhW2luZGV4XS5waXhLZXkgPSAnJztcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFMaXN0UGl4LmVkaXRpbmdDZWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RQaXguZWRpdGluZ0NlbGwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvblBpeEtleVR5cGVDbGVhcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1Hcm91cEJ5Um93W2luZGV4XTtcbiAgICAgICAgdGhpcy5vbkNsZWFyUGl4S2V5VHlwZShmb3JtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlbGV0ZUFubnVpdHlJdGVtKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IG5ld2xpc3QgPSBbLi4udGhpcy5nZXRIaXN0b3JpY2FsUGl4QWNjb3VudExpc3QoKV07XG4gICAgICAgIG5ld2xpc3Quc29ydChjb21wYXJlVmFsdWVzKHRoaXMub3JkZXJCeS5maWVsZCwgdGhpcy5vcmRlckJ5LmRpcmVjdGlvbikpO1xuICAgICAgICBkZWxldGUgbmV3bGlzdFtpbmRleF07XG4gICAgICAgIG5ld2xpc3QgPSBuZXdsaXN0LmZpbHRlcih2YWwgPT4gdmFsKTtcbiAgICAgICAgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QuZ2V0KFwiaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0XCIpLnNldFZhbHVlKG5ld2xpc3QpO1xuICAgICAgICB0aGlzLnZlcmlmeVRvdGFsUGVyY2VudGFnZSgpO1xuICAgICAgICB0aGlzLm9uTGF6eUxvYWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KCk6IG9iamVjdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0LmdldChcImhpc3RvcmljYWxQaXhBY2NvdW50TGlzdFwiKSAmJlxuICAgICAgICAgICAgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QuZ2V0KFwiaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0XCIpLnZhbHVlICYmXG4gICAgICAgICAgICB0aGlzLmhpc3RvcmljYWxQaXhBY2NvdW50TGlzdC5nZXQoXCJoaXN0b3JpY2FsUGl4QWNjb3VudExpc3RcIikudmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0LmdldChcImhpc3RvcmljYWxQaXhBY2NvdW50TGlzdFwiKSAmJiB0aGlzLmhpc3RvcmljYWxQaXhBY2NvdW50TGlzdC5nZXQoXCJoaXN0b3JpY2FsUGl4QWNjb3VudExpc3RcIikudmFsdWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSXRlbUluTGlzdCgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9ICRldmVudCAmJiAkZXZlbnQuaW5kZXggPj0gMCA/ICRldmVudC5pbmRleCA6IG51bGw7XG4gICAgICAgIGNvbnN0IG5ld0RhdGFMaXN0ID0gdGhpcy5nZXRIaXN0b3JpY2FsUGl4QWNjb3VudExpc3QoKSA/IHRoaXMuZ2V0SGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KCkgOiBbXTtcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3RGF0YUxpc3RbaW5kZXhdID0gJGV2ZW50O1xuICAgICAgICAgICAgZGVsZXRlICRldmVudC5pbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKCRldmVudFtcImN1c3RvbUZpZWxkc1wiXSkgJiYgT2JqZWN0LmtleXMoJGV2ZW50W1wiY3VzdG9tRmllbGRzXCJdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21WYWx1ZSA9IG1vdW50Q3VzdG9tVG9TYXZlKCRldmVudFtcImN1c3RvbUZpZWxkc1wiXSk7XG4gICAgICAgICAgICAgICAgJGV2ZW50W1wiY3VzdG9tRmllbGRzXCJdID0gWy4uLmN1c3RvbVZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRldmVudFtcImRhdGVDaGFuZ2VcIl0gPSB0aGlzLmRhdGVDaGFuZ2U7XG4gICAgICAgICAgICBuZXdEYXRhTGlzdC5wdXNoKCRldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpc3RvcmljYWxQaXhBY2NvdW50TGlzdC5nZXQoXCJoaXN0b3JpY2FsUGl4QWNjb3VudExpc3RcIikuc2V0VmFsdWUobmV3RGF0YUxpc3QpO1xuICAgICAgICB0aGlzLnZlcmlmeVRvdGFsUGVyY2VudGFnZSgpO1xuICAgICAgICB0aGlzLm9uTGF6eUxvYWQoeyBmaXJzdDogdGhpcy5nZXROdW1iZXJQYWdlQnlJbmRleChpbmRleCwgbmV3RGF0YUxpc3QpIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TnVtYmVyUGFnZUJ5SW5kZXgoaW5kZXg6IG51bWJlciwgbGlzdDogb2JqZWN0W10pOiBudW1iZXIge1xuICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gbGlzdC5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBzdWIgPSB0aGlzLnJlY29yZEJ5Um93IC0gMTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwodG90YWwgLyB0aGlzLnJlY29yZEJ5Um93KSAqIHRoaXMucmVjb3JkQnlSb3cgLSBzdWIgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmVyaWZ5VG90YWxQZXJjZW50YWdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5nZXRIaXN0b3JpY2FsUGl4QWNjb3VudExpc3QoKSA/IHRoaXMuZ2V0SGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KCkgOiBbXTtcbiAgICAgICAgY29uc3QgYXJyYXlQZXJjZW50YWdlOiBhbnkgPSBbXTtcblxuICAgICAgICBpZiAoIWxpc3QubGVuZ3RoKSByZXR1cm4gdGhpcy5tc2dUb3RhbExpbWl0QnlQZXJjZW50YWdlID0gbnVsbDtcblxuICAgICAgICBsaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBhcnJheVBlcmNlbnRhZ2UucHVzaChpdGVtICYmIGl0ZW1bXCJwZXJjZW50YWdlXCJdKSk7XG5cbiAgICAgICAgY29uc3Qgc3VtUGVyY2VudGFnZSA9IGFycmF5UGVyY2VudGFnZS5yZWR1Y2UoKHRvdGFsOiBudW1iZXIsIHBlcmNlbnRhZ2U6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRvdGFsICsgcGVyY2VudGFnZTtcbiAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgaWYgKHN1bVBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5tc2dUb3RhbExpbWl0QnlQZXJjZW50YWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXCJoY20ucGF5cm9sbC5oaXN0b3JpY2FsX3BpeF9hY2NvdW50X21zZ19saW1pdF90b3RhbF9ieV9wZXJjZW50YWdlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tc2dUb3RhbExpbWl0QnlQZXJjZW50YWdlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHVibGljIG9uU3luY1ZhbHVlKGZpZWxkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQnlSb3cgJiZcbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJ5Um93W2luZGV4XSAmJlxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdLmdldChmaWVsZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdLmdldChmaWVsZCk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgICAgICAgdGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YVtpbmRleF1bZmllbGRdID0gdmFsdWU7XG5cbiAgICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50TGlzdCA9IHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaSA9PT0gaW5kZXggPyAwIDogaXRlbS5wZXJjZW50YWdlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVBlcmNlbnRhZ2VWYWxpZChjdXJyZW50TGlzdCwgdGhpcy5mb3JtR3JvdXBCeVJvd1tpbmRleF0pO1xuXG4gICAgICAgICAgdGhpcy5lbWl0Rm9ybVZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNjb3BlZEFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlY29yZHNNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gYCR7IHRoaXMudG90YWxSZWNvcmRzIHx8IDAgfSAkeyB0aGlzLnRvdGFsUmVjb3JkcyA9PT0gMSA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuYWRtaXNzaW9uX3JlZ2lzdGVyXCIpIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXCJoY20ucGF5cm9sbC5hZG1pc3Npb25fcmVnaXN0ZXJzXCIpIH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2V0VG9vbHRpcEFuZERpc2FibGVCdXR0b25BZGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVDaGFuZ2UgPyBudWxsIDogdGhpcy5tc2dUb29sdGlwQWRkO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBkYXRlQ2hhbmdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlQ2hhbmdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZGF0ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGVDaGFuZ2UgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdERhdGEuZmlsdGVyKChyb3c6IGFueSkgPT4gcm93W1wiZGF0ZUNoYW5nZVwiXSA9IHRoaXMuX2RhdGVDaGFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRpc3BsYXlEYXRlQ2hhbmdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwbGF5RGF0ZUNoYW5nZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGRpc3BsYXlEYXRlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGlzcGxheURhdGVDaGFuZ2UgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlEYXRlQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3REYXRhLmZpbHRlcigocm93OiBhbnkpID0+IHJvd1tcImRpc3BsYXlEYXRlQ2hhbmdlXCJdID0gdGhpcy5fZGlzcGxheURhdGVDaGFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGFkZExpc3REYXRhKGxpc3Q6IG9iamVjdFtdKSB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0LmdldChcImhpc3RvcmljYWxQaXhBY2NvdW50TGlzdFwiKS5wYXRjaFZhbHVlKGxpc3QpO1xuICAgICAgICB0aGlzLnZlcmlmeVRvdGFsUGVyY2VudGFnZSgpO1xuICAgICAgICB0aGlzLm9uTGF6eUxvYWQoKTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHBhcmFtc0Zvcm0odmFsdWU6IEZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5fcGFyYW1zRm9ybSA9IHZhbHVlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q3BmTnVtYmVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdENwZk51bWJlciA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl92aXNpYmxlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZFRlbGVwaG9uZU51bWJlcih0ZWxlcGhvbmVOdW1iZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBGb3JtYXRVdGlsc1NlcnZpY2UuZ2V0Rm9ybWF0dGVkVGVsZXBob25lTnVtYmVyKHRlbGVwaG9uZU51bWJlcik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZENwZihjcGY6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBGb3JtYXRVdGlsc1NlcnZpY2UuZ2V0Rm9ybWF0dGVkQ3BmKGNwZik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZENucGooY25wajogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEZvcm1hdFV0aWxzU2VydmljZS5nZXRGb3JtYXR0ZWRDbnBqKGNucGopO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWRQZXJjZW50YWdlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gRm9ybWF0VXRpbHNTZXJ2aWNlLmdldEZvcm1hdHRlZFBlcmNlbnRhZ2UodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzQWxsb3dUb0FkZEhpc3RvcmljYWwoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25bXCJpbmNsdWlyXCJdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNBbGxvd1RvRGVsZXRlSGlzdG9yaWNhbCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbltcImV4Y2x1aXJcIl1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpc0FsbG93VG9FZGl0SGlzdG9yaWNhbCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbltcImVkaXRhclwiXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzQWxsb3dUb1ZpZXdIaXN0b3JpY2FsKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uW1widmlzdWFsaXphclwiXVxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
1081
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yaWNhbC1waXgtYWNjb3VudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1wZXNzb2FzL3BheXJvbGwtY29yZS8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvaGlzdG9yaWNhbC1waXgtYWNjb3VudC9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxNQUFNLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxpQkFBaUIsRUFDakIsYUFBYSxFQUNiLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLFNBQVMsRUFDVCxhQUFhLEdBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0sb0NBQW9DLENBQUM7QUFDaEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2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XG4gICAgVmlld0NoaWxkLFxuICAgIElucHV0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgT25EZXN0cm95LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPdXRwdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgQ3VzdG9tRmllbGRzQ29tcG9uZW50LCBOdW1iZXJMb2NhbGVPcHRpb25zIH0gZnJvbSBcIkBzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IGNvbXBhcmVWYWx1ZXMsIGlzVmFsaWQsIG1vdW50Q3VzdG9tVG9TYXZlIH0gZnJvbSBcIi4uL3V0aWxzL2hlbHBlcnNcIjtcbmltcG9ydCB7IERpcmVjdGlvbkVudW1lcmF0aW9uIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW51bXNcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgRm9ybWF0VXRpbHNTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm1hdC11dGlscy9mb3JtYXQtdXRpbHMuc2VydmljZVwiO1xuaW1wb3J0IHsgU2hhcmVkU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3NoYXJlZC9zaGFyZWQtc3RhdGUuc2VydmljZVwiO1xuaW1wb3J0IHsgSGlzdG9yaWNha1BpeEFjY291bnRCYXNlIH0gZnJvbSBcIi4vaGlzdG9yaWNhbC1waXgtYWNjb3VudC1iYXNlXCI7XG5pbXBvcnQgeyBIaXN0b3JpY2FsUGl4QWNjb3VudFNlcnZpY2UgfSBmcm9tIFwiLi9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IEdlbmVyaWNWYWxpZGF0b3IgfSBmcm9tIFwiLi4vdXRpbHMvZ2VuZXJpYy12YWxpZGF0b3JzXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogXCJjLWhpc3RvcmljYWwtcGl4LWFjY291bnRcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2hpc3RvcmljYWwtcGl4LWFjY291bnQuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vaGlzdG9yaWNhbC1waXgtYWNjb3VudC5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgSGlzdG9yaWNhbFBpeEFjY291bnRDb21wb25lbnQgZXh0ZW5kcyBIaXN0b3JpY2FrUGl4QWNjb3VudEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgICBAVmlld0NoaWxkKEN1c3RvbUZpZWxkc0NvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIGN1c3RvbUZpZWxkczogQ3VzdG9tRmllbGRzQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ2RhdGFMaXN0UGl4JywgeyBzdGF0aWM6IGZhbHNlIH0pIGRhdGFMaXN0UGl4OiBhbnk7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZmllbGRGb3JtR3JvdXA6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBfZGF0ZUNoYW5nZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIF9kaXNwbGF5RGF0ZUNoYW5nZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlY29yZEJ5Um93OiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dEYXRlQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbXNnVG9vbHRpcEFkZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlzRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpc1ZpZXdNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VycmVuY3k6IE51bWJlckxvY2FsZU9wdGlvbnM7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VzdG9tRW50aXR5OiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VzdG9tU2VydmljZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHdpdGhTaWRlQmFyOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwZXJtaXNzaW9uOiBvYmplY3Q7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGlzdERhdGFSZWNpZXZlcjogYW55W10gPSBbXTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhZGRFeGlzdGVudEhpc3RvcmljRGF0YTogYW55W10gPSBbXTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXRMaXN0UGl4QWNjb3VudDogb2JqZWN0W10gPSBbXTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpc0VkaXRNb2RlRm9yU2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhpZGVCdG5BZGRGb3JWaWV3TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dCdXR0b25WaWV3ID0gdHJ1ZTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBpc1ZpZXdNb2RlQWN0aXZlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgaXNFZGl0TW9kZUFjdGl2ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGlzRGVsZXRlTW9kZUFjdGl2ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGlzVmFsaWRDaGFuZ2VGb3JtOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBwcml2YXRlIGxpc3RGcm9tQXBwOiBhbnlbXSA9IFtdO1xuICAgIHByaXZhdGUgdmlzaWJsZUNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHJpdmF0ZSBoaXN0b3JpY2FsUGl4QWNjb3VudExpc3Q6IEZvcm1Hcm91cDtcbiAgICBwcml2YXRlIG9yZGVyQnk6IHsgZmllbGQ6IHN0cmluZzsgZGlyZWN0aW9uOiBEaXJlY3Rpb25FbnVtZXJhdGlvbiB9ID0ge1xuICAgICAgICBmaWVsZDogXCJkYXRlQ2hhbmdlXCIsXG4gICAgICAgIGRpcmVjdGlvbjogRGlyZWN0aW9uRW51bWVyYXRpb24uREVTQyxcbiAgICB9O1xuICAgIHByaXZhdGUgX3Zpc2libGU6IGJvb2xlYW47XG4gICAgcHVibGljIHBpeEFjY291bnRJdGVtSW5wdXQ6IG9iamVjdCA9IHt9O1xuICAgIHB1YmxpYyB0b3RhbFJlY29yZHM6IG51bWJlciA9IDA7XG4gICAgcHVibGljIGFjdGlvbkxhYmVsOiBzdHJpbmcgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcImhjbS5wYXlyb2xsLmVudHJpZXNfcXVlcnlfYWN0aW9uc190b3RhbF90aXRsZVwiKTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IHRydWU7XG4gICAgcHVibGljIHBhcmFtZXRlcnM6IGFueTtcbiAgICBwdWJsaWMgbXNnVG90YWxMaW1pdEJ5UGVyY2VudGFnZTogc3RyaW5nO1xuICAgIHB1YmxpYyBsaXN0RGF0YTogb2JqZWN0W10gPSBbXTtcbiAgICBwdWJsaWMgbGlzdERhdGFOb1BhZ2U6IG9iamVjdFtdID0gW107XG4gICAgcHVibGljIHNob3dFZGl0TW9kZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBoYXNSZWNvcmRzUGl4ID0gdHJ1ZTtcbiAgICBwdWJsaWMgaGlkZUZpZWxkcyA9IHRoaXMuc2hhcmVkU3RhdGVTZXJ2aWNlLmhpZGVGaWVsZCQ7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyBmb3JtR3JvdXBCeVJvdzogeyBbaW5kZXg6IG51bWJlcl06IEZvcm1Hcm91cCB9ID0ge307XG4gICAgcHVibGljIHNob3dGaWVsZHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBpc1N5bmNpbmdQZXJjZW50YWdlID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29scyA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuZW1wbG95ZWVzX2FkZGl0aW9uX3BpeF9rZXlfdHlwZVwiKSxcbiAgICAgICAgICAgIGZpZWxkOiBcInBpeEtleVR5cGVcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuZW1wbG95ZWVzX2FkZGl0aW9uX3BpeF9rZXlcIiksXG4gICAgICAgICAgICBmaWVsZDogXCJwaXhLZXlcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuaGlzdG9yaWNhbF9waXhfYWNjb3VudF9sYWJlbF9wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgZmllbGQ6IFwicGVyY2VudGFnZVwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXCJoY20ucGF5cm9sbC5tb3ZpbWVudGF0aW9uX2dlbmVyaWNfYWN0aW9uXCIpLFxuICAgICAgICAgICAgZmllbGQ6IFwiYWN0aW9uc1wiLFxuICAgICAgICB9XG4gICAgXTtcblxuICAgIGFjdGlvbnMgPSAocm93RGF0YTogYW55ID0ge30sIGtleTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogdGhpcy5pc0VkaXRNb2RlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcImhjbS5wYXlyb2xsLmVtcGxveWVlc19pbWFnZV9jcm9wcGVyX3ZpZXdcIiksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FsbG93VG9WaWV3SGlzdG9yaWNhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtcImluZGV4XCJdID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhBY2NvdW50SXRlbUlucHV0ID0geyBjdXJyZW50SXRlbTogcm93RGF0YSwgbGlzdERhdGE6IHRoaXMubGlzdERhdGFOb1BhZ2UsIGlzRWRpdE1vZGU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1ZpZXdNb2RlQWN0aXZlLmVtaXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAhISghdGhpcy5pc0VkaXRNb2RlICYmIHRoaXMud2l0aFNpZGVCYXIpLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcImhjbS5wYXlyb2xsLmVkaXRcIiksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FsbG93VG9FZGl0SGlzdG9yaWNhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtcImluZGV4XCJdID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhBY2NvdW50SXRlbUlucHV0ID0geyBjdXJyZW50SXRlbTogcm93RGF0YSwgbGlzdERhdGE6IHRoaXMubGlzdERhdGFOb1BhZ2UsIGlzRWRpdE1vZGU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRWRpdE1vZGVBY3RpdmUuZW1pdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RGcm9tQXBwLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtcImluZGV4XCJdID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEl0ZW1JbnB1dCA9IHsgY3VycmVudEl0ZW06IHJvd0RhdGEsIGxpc3REYXRhOiB0aGlzLmxpc3REYXRhTm9QYWdlLCBpc0VkaXRNb2RlOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZpc2libGU6ICF0aGlzLmlzRWRpdE1vZGUgfHwgdGhpcy5zaG93RWRpdE1vZGUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuZGVsZXRlXCIpLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBbGxvd1RvRGVsZXRlSGlzdG9yaWNhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlQW5udWl0eUl0ZW0oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEZWxldGVNb2RlQWN0aXZlLmVtaXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0RnJvbUFwcC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVBbm51aXR5SXRlbShrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHJpdmF0ZSBzaGFyZWRTdGF0ZVNlcnZpY2U6IFNoYXJlZFN0YXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzZXJ2aWNlOiBIaXN0b3JpY2FsUGl4QWNjb3VudFNlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGZvcm1CdWlsZGVyKTtcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtR3JvdXAoKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zaG93RmllbGRzID0gdGhpcy5zaG93RmllbGQ7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2wodGhpcy5maWVsZEZvcm1Hcm91cCwgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QpO1xuICAgICAgICB0aGlzLnNoYXJlZFN0YXRlU2VydmljZS5zaG93RWRpdE1vZGUkLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0VkaXRNb2RlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmlzRWRpdE1vZGVGb3JTYXZlID0gdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2hhcmVkU3RhdGVTZXJ2aWNlLmFjdGl2ZUhpZGVPcHRpb25zT25WaWV3JC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dCdXR0b25WaWV3ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2hhcmVkU3RhdGVTZXJ2aWNlLmFjdGl2ZVZhbGlkYXRvcnNPbkVkaXRNb2RhbE9wZW4kXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuZm9ybUdyb3VwQnlSb3cpLmZvckVhY2goZmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGZnLmNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Rm9ybVZhbGlkaXR5KCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0Rm9ybVN0YXRlKCk7XG5cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydsaXN0RGF0YVJlY2lldmVyJ10gJiYgY2hhbmdlc1snbGlzdERhdGFSZWNpZXZlciddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5saXN0RnJvbUFwcCA9IGNoYW5nZXNbJ2xpc3REYXRhUmVjaWV2ZXInXS5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2FkZEV4aXN0ZW50SGlzdG9yaWNEYXRhJ10gJiYgY2hhbmdlc1snYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0SGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1snYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEnXSAmJiBjaGFuZ2VzWydhZGRFeGlzdGVudEhpc3RvcmljRGF0YSddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0YSA9IGNoYW5nZXNbJ2FkZEV4aXN0ZW50SGlzdG9yaWNEYXRhJ10uY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkRm9ybUdyb3VwTWFwKG5ld0RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzRWRpdE1vZGUnXSkge1xuICAgICAgICAgICAgdGhpcy5pc0VkaXRNb2RlID0gY2hhbmdlc1snaXNFZGl0TW9kZSddLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVGb3JtR3JvdXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0ID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBoaXN0b3JpY2FsUGl4QWNjb3VudExpc3Q6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbWl0Rm9ybVZhbGlkaXR5KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUdyb3VwQnlSb3cgfHwgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXBCeVJvdykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWRDaGFuZ2VGb3JtLmVtaXQoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFsbFZhbGlkID0gdHJ1ZTtcblxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuZm9ybUdyb3VwQnlSb3cpLmZvckVhY2goZmcgPT4ge1xuICAgICAgICAgICAgLy8gVmVyaWZpY2EgY2FkYSBjb250cm9sZSBpbmRpdmlkdWFsbWVudGVcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZnLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGZnLmdldChrZXkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVmVyaWZpY2Egc2UgbyBjb250cm9sZSDDqSBvYnJpZ2F0w7NyaW8gZSBlc3TDoSB2YXppb1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLnZhbGlkYXRvciAmJiBjb250cm9sLnZhbGlkYXRvcih7fSBhcyBBYnN0cmFjdENvbnRyb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvckZuID0gY29udHJvbC52YWxpZGF0b3Ioe30gYXMgQWJzdHJhY3RDb250cm9sKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvckZuICYmIHZhbGlkYXRvckZuLnJlcXVpcmVkICYmICFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmVyaWZpY2Egc2UgbyBjb250cm9sZSB0ZW0gZXJyb3NcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZmcudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgaWYgKCFmZy52YWxpZCkge1xuICAgICAgICAgICAgICAgIGFsbFZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaXNWYWxpZENoYW5nZUZvcm0uZW1pdChhbGxWYWxpZCk7XG4gICAgfVxuXG4gICAgZmlsdGVyUGl4S2V5VHlwZShldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZXZlbnQucXVlcnk7XG4gICAgICAgIHRoaXMuc2VydmljZS5lbnVtUXVlcnkoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGl4S2V5VHlwZUVudW0gPSByZXNwb25zZS5yZXN1bHRzLmZpbmQoKHJlc3VsdDogYW55KSA9PiByZXN1bHQuZW51bU5hbWUgPT09ICdQaXhLZXlUeXBlJyk7XG4gICAgICAgICAgaWYgKHBpeEtleVR5cGVFbnVtKSB7XG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25zID0gcGl4S2V5VHlwZUVudW0uaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+XG4gICAgICAgICAgICAgIGl0ZW0udmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY3JlYXRlUGl4Um93Rm9ybUdyb3VwKCk6IEZvcm1Hcm91cCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICBpZDogW251bGxdLFxuICAgICAgICAgIHBpeEtleVR5cGU6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICBwaXhLZXk6IFtudWxsXSxcbiAgICAgICAgICBwZXJjZW50YWdlOiBbMCwgVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICAgIC4uLnRoaXMuaW5pdGlhbFZhbGlkYXRvck9mUGVyY2VudGFnZSxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4KHRoaXMubWF4VmFsdWVQZXJjZW50YWdlKSxcbiAgICAgICAgICBdKV0sXG4gICAgICAgICAgZXh0ZXJuYWxJZDogW251bGxdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaW5jcm9uaXphIHRvZG9zIG9zIGRhZG9zIGRvIE5nTW9kZWwgcGFyYSBvcyBGb3JtR3JvdXBzIGFudGVzIGRlIGVudmlhciBhbyBjb21wb25lbnRlIHBhaVxuICAgICAqL1xuICAgIHB1YmxpYyBzeW5jUGl4RGF0YVRvUGFyZW50Rm9ybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zeW5jQWxsTW9kZWxUb0Zvcm0oKTtcbiAgICAgICAgY29uc3QgaGlzdG9yaWNhbFBpeCA9IFsuLi50aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhXTtcbiAgICAgICAgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QuZ2V0KFwiaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0XCIpLnNldFZhbHVlKGhpc3RvcmljYWxQaXgpO1xuXG4gICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMuZmllbGRGb3JtR3JvdXApLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgIGhpc3RvcmljYWxQaXhBY2NvdW50TGlzdDogaGlzdG9yaWNhbFBpeFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3luY1Jlc2V0UGl4Rm9ybVRvUGFyZW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cEJ5Um93ID0ge307XG4gICAgICAgIHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0LnJlc2V0KCk7XG4gICAgICAgIHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0LmdldCgnaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0Jykuc2V0VmFsdWUoW10pO1xuXG4gICAgICAgIGlmICh0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMucmVidWlsZEZvcm1Hcm91cE1hcCh0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYSB0b2RvcyBvcyBmb3JtdWzDoXJpb3NcbiAgICAgKi9cbiAgICBwdWJsaWMgdmFsaWRhdGVBbGxGb3JtcygpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5mb3JjZUNsb3NlQWxsQ2VsbEVkaXRvcnMoKTtcbiAgICAgICAgdGhpcy5zeW5jQWxsTW9kZWxUb0Zvcm0oKTtcblxuICAgICAgICBpZiAoIXRoaXMuZm9ybUdyb3VwQnlSb3cgfHwgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXBCeVJvdykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc0FsbFZhbGlkID0gdHJ1ZTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cEJ5Um93KS5mb3JFYWNoKGluZGV4S2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKGluZGV4S2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1Hcm91cEJ5Um93W2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2xOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm0uZ2V0KGNvbnRyb2xOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xOYW1lID09PSAncGl4S2V5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4S2V5VHlwZUNvbnRyb2wgPSBmb3JtLmdldCgncGl4S2V5VHlwZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeEtleVR5cGVDb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlRG9jdW1lbnRGaWVsZChpbmRleCwgcGl4S2V5VHlwZUNvbnRyb2wudmFsdWUua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBpc0FsbFZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNBbGxWYWxpZCAmJiB0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhICYmIHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdG90YWxQZXJjZW50YWdlID0gdGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKHN1bSwgaXRlbSkgPT4gc3VtICsgKHBhcnNlRmxvYXQoaXRlbS5wZXJjZW50YWdlKSB8fCAwKSxcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModG90YWxQZXJjZW50YWdlIC0gMTAwKSA+IDAuMDEpIHtcbiAgICAgICAgICAgICAgICBpc0FsbFZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzVmFsaWRDaGFuZ2VGb3JtLmVtaXQoaXNBbGxWYWxpZCk7XG5cbiAgICAgICAgcmV0dXJuIGlzQWxsVmFsaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTGF6eUxvYWQoZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmlyc3QgPSBldmVudCAmJiBldmVudC5maXJzdCA/IGV2ZW50LmZpcnN0IDogMDtcbiAgICAgICAgY29uc3Qgcm93cyA9IGV2ZW50ICYmIGV2ZW50LnJvd3MgPyBldmVudC5yb3dzIDogdGhpcy5yZWNvcmRCeVJvdztcbiAgICAgICAgY29uc3QgYXJyTGlzdCA9IHRoaXMuZ2V0SGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KCk7XG4gICAgICAgIHRoaXMubGlzdERhdGEgPSBbXTtcbiAgICAgICAgdGhpcy50b3RhbFJlY29yZHMgPSBudWxsO1xuXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5tdWx0aVNvcnRNZXRhICYmIGV2ZW50Lm11bHRpU29ydE1ldGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBldmVudC5tdWx0aVNvcnRNZXRhLm1hcCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJCeS5maWVsZCA9IHZhbHVlLmZpZWxkO1xuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJCeS5kaXJlY3Rpb24gPSB2YWx1ZS5vcmRlciA9PT0gMSA/IERpcmVjdGlvbkVudW1lcmF0aW9uLkFTQyA6IERpcmVjdGlvbkVudW1lcmF0aW9uLkRFU0M7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJMaXN0ICYmIGFyckxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IGFyckxpc3QubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5saXN0RGF0YSA9IGFyckxpc3Q7XG4gICAgICAgICAgICB0aGlzLmxpc3REYXRhTm9QYWdlID0gWy4uLmFyckxpc3RdO1xuICAgICAgICAgICAgdGhpcy5saXN0RGF0YS5zb3J0KGNvbXBhcmVWYWx1ZXModGhpcy5vcmRlckJ5LmZpZWxkLCB0aGlzLm9yZGVyQnkuZGlyZWN0aW9uKSk7XG4gICAgICAgICAgICB0aGlzLmxpc3REYXRhID0gdGhpcy5saXN0RGF0YS5zbGljZShmaXJzdCwgKGZpcnN0ICsgcm93cykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5saXN0RGF0YU5vUGFnZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0TW9kZSB8fCBhcnJMaXN0ICYmIGFyckxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDc3NJbklFMTEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVtIEJ1ZyBkZSBDU1MgcXVlIGFjb250ZWNlIG5hcyBsaW5oYXMgZGEgdGFiZWxhLCBxdWUgcmVzb2x2ZSBzw7MgYXR1YWxpemFuZG8gcXVhbHF1ZXIgcGFydGUgZG8gQ1NTIGRhIHBhZ2luYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZnJlc2hDc3NJbklFMTEoKSB7XG4gICAgICAgIGlmICgvbXNpZVxcc3x0cmlkZW50XFwvfGVkZ2VcXC8vaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJyb3cwXCIpO1xuICAgICAgICAgICAgICAgIGlmIChyb3cgJiYgcm93WzBdKVxuICAgICAgICAgICAgICAgICAgICByb3dbMF0uY2xhc3NOYW1lID0gJ3JlZnJlc2gnO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpeEFjY291bnRJdGVtSW5wdXQgPSB7fTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBhZGRQaXgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7XG4gICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgcGl4S2V5VHlwZToge30sXG4gICAgICAgICAgcGl4S2V5OiAnJyxcbiAgICAgICAgICBwZXJjZW50YWdlOiAnJyxcbiAgICAgICAgICBleHRlcm5hbElkOiAnJyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEgPSBbXG4gICAgICAgICAgLi4udGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSxcbiAgICAgICAgICBuZXdJdGVtXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXBCeVJvd1tpbmRleF0gPSB0aGlzLmNyZWF0ZVBpeFJvd0Zvcm1Hcm91cCgpO1xuXG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdG9yc0FjY29yZGluZ0xpc3QodGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuZW1pdEZvcm1WYWxpZGl0eSgpO1xuICAgIH1cblxuXG4gICAgZGVsZXRlUGl4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YUxpc3RQaXguZWRpdGluZ0NlbGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RQaXguZWRpdGluZ0NlbGwgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSA9IHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudExpc3QgPSB0aGlzLmhpc3RvcmljYWxQaXhBY2NvdW50TGlzdC5nZXQoXCJoaXN0b3JpY2FsUGl4QWNjb3VudExpc3RcIikudmFsdWUgfHwgW107XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRMaXN0ID0gY3VycmVudExpc3QuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0LmdldChcImhpc3RvcmljYWxQaXhBY2NvdW50TGlzdFwiKS5zZXRWYWx1ZSh1cGRhdGVkTGlzdCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQodGhpcy5maWVsZEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0OiB1cGRhdGVkTGlzdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYnVpbGRGb3JtR3JvdXBNYXAodGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSk7XG4gICAgICAgIHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEuZm9yRWFjaCgoXywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwQnlSb3dbaV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxWYWx1ZXMgPSB0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGlkeCkgPT4gaWR4ID09PSBpID8gMCA6IChwYXJzZUZsb2F0KGl0ZW0ucGVyY2VudGFnZSkgfHwgMCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQZXJjZW50YWdlVmFsaWQoYWxsVmFsdWVzLCB0aGlzLmZvcm1Hcm91cEJ5Um93W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0Rm9ybVZhbGlkaXR5KCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHJlYnVpbGRGb3JtR3JvdXBNYXAoZGF0YTogYW55W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBCeVJvdyA9IHt9O1xuXG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNyZWF0ZVBpeFJvd0Zvcm1Hcm91cCgpO1xuICAgICAgICAgICAgY29uc3QgcGl4S2V5VHlwZSA9IGl0ZW0ucGl4S2V5VHlwZS5rZXk7XG4gICAgICAgICAgICBjb25zdCBwaXhLZXlSYXcgPSBpdGVtLnBpeEtleTtcblxuICAgICAgICAgICAgaWYgKHBpeEtleVR5cGUgPT09ICdDUEYnIHx8IHBpeEtleVR5cGUgPT09ICdDTlBKJykge1xuICAgICAgICAgICAgICAgIGl0ZW0ucGl4S2V5ID0gRm9ybWF0VXRpbHNTZXJ2aWNlLmdldEZvcm1hdHRlZFN1YnNjcmlwdGlvbk51bWJlcihwaXhLZXlSYXcsIHBpeEtleVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBpeEtleVR5cGUgPT09ICdURUxFUEhPTkUnKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5waXhLZXkgPSBGb3JtYXRVdGlsc1NlcnZpY2UuZ2V0Rm9ybWF0dGVkVGVsZXBob25lTnVtYmVyKHBpeEtleVJhdyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm0ucGF0Y2hWYWx1ZShpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdID0gZm9ybTtcblxuICAgICAgICAgICAgdGhpcy5waXhLZXlUeXBlID0gcGl4S2V5VHlwZTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGl4S2V5VmFsaWRhdG9ycyh0cnVlLCBmb3JtKTtcblxuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0b3JzQWNjb3JkaW5nTGlzdChkYXRhLCBpbmRleCwgdGhpcy5pc0VkaXRNb2RlKTtcblxuICAgICAgICAgICAgY29uc3QgbGlzdFZhbHVlcyA9IGRhdGFcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICAubWFwKHJvdyA9PiByb3cucGVyY2VudGFnZSA/IHBhcnNlRmxvYXQocm93LnBlcmNlbnRhZ2UpIDogMCk7XG5cbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQZXJjZW50YWdlVmFsaWQobGlzdFZhbHVlcywgZm9ybSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZW1pdEZvcm1WYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIG9uUGl4S2V5VHlwZUNoYW5nZShpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlUGl4S2V5VHlwZShpdGVtLCBmb3JtKTtcblxuICAgICAgICB0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhW2luZGV4XS5waXhLZXkgPSAnJztcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFMaXN0UGl4LmVkaXRpbmdDZWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RQaXguZWRpdGluZ0NlbGwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvblBpeEtleVR5cGVDbGVhcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1Hcm91cEJ5Um93W2luZGV4XTtcbiAgICAgICAgdGhpcy5vbkNsZWFyUGl4S2V5VHlwZShmb3JtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlbGV0ZUFubnVpdHlJdGVtKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IG5ld2xpc3QgPSBbLi4udGhpcy5nZXRIaXN0b3JpY2FsUGl4QWNjb3VudExpc3QoKV07XG4gICAgICAgIG5ld2xpc3Quc29ydChjb21wYXJlVmFsdWVzKHRoaXMub3JkZXJCeS5maWVsZCwgdGhpcy5vcmRlckJ5LmRpcmVjdGlvbikpO1xuICAgICAgICBkZWxldGUgbmV3bGlzdFtpbmRleF07XG4gICAgICAgIG5ld2xpc3QgPSBuZXdsaXN0LmZpbHRlcih2YWwgPT4gdmFsKTtcbiAgICAgICAgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QuZ2V0KFwiaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0XCIpLnNldFZhbHVlKG5ld2xpc3QpO1xuICAgICAgICB0aGlzLnZlcmlmeVRvdGFsUGVyY2VudGFnZSgpO1xuICAgICAgICB0aGlzLm9uTGF6eUxvYWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KCk6IG9iamVjdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0LmdldChcImhpc3RvcmljYWxQaXhBY2NvdW50TGlzdFwiKSAmJlxuICAgICAgICAgICAgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QuZ2V0KFwiaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0XCIpLnZhbHVlICYmXG4gICAgICAgICAgICB0aGlzLmhpc3RvcmljYWxQaXhBY2NvdW50TGlzdC5nZXQoXCJoaXN0b3JpY2FsUGl4QWNjb3VudExpc3RcIikudmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0LmdldChcImhpc3RvcmljYWxQaXhBY2NvdW50TGlzdFwiKSAmJiB0aGlzLmhpc3RvcmljYWxQaXhBY2NvdW50TGlzdC5nZXQoXCJoaXN0b3JpY2FsUGl4QWNjb3VudExpc3RcIikudmFsdWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSXRlbUluTGlzdCgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9ICRldmVudCAmJiAkZXZlbnQuaW5kZXggPj0gMCA/ICRldmVudC5pbmRleCA6IG51bGw7XG4gICAgICAgIGNvbnN0IG5ld0RhdGFMaXN0ID0gdGhpcy5nZXRIaXN0b3JpY2FsUGl4QWNjb3VudExpc3QoKSA/IHRoaXMuZ2V0SGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KCkgOiBbXTtcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3RGF0YUxpc3RbaW5kZXhdID0gJGV2ZW50O1xuICAgICAgICAgICAgZGVsZXRlICRldmVudC5pbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKCRldmVudFtcImN1c3RvbUZpZWxkc1wiXSkgJiYgT2JqZWN0LmtleXMoJGV2ZW50W1wiY3VzdG9tRmllbGRzXCJdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21WYWx1ZSA9IG1vdW50Q3VzdG9tVG9TYXZlKCRldmVudFtcImN1c3RvbUZpZWxkc1wiXSk7XG4gICAgICAgICAgICAgICAgJGV2ZW50W1wiY3VzdG9tRmllbGRzXCJdID0gWy4uLmN1c3RvbVZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRldmVudFtcImRhdGVDaGFuZ2VcIl0gPSB0aGlzLmRhdGVDaGFuZ2U7XG4gICAgICAgICAgICBuZXdEYXRhTGlzdC5wdXNoKCRldmVudCk7XG4gICAgICAgICAgICB0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhLnB1c2goey4uLiRldmVudH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QuZ2V0KFwiaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0XCIpLnNldFZhbHVlKG5ld0RhdGFMaXN0KTtcbiAgICAgICAgdGhpcy52ZXJpZnlUb3RhbFBlcmNlbnRhZ2UoKTtcbiAgICAgICAgdGhpcy5vbkxhenlMb2FkKHsgZmlyc3Q6IHRoaXMuZ2V0TnVtYmVyUGFnZUJ5SW5kZXgoaW5kZXgsIG5ld0RhdGFMaXN0KSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE51bWJlclBhZ2VCeUluZGV4KGluZGV4OiBudW1iZXIsIGxpc3Q6IG9iamVjdFtdKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCB0b3RhbCA9IGxpc3QubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3Qgc3ViID0gdGhpcy5yZWNvcmRCeVJvdyAtIDE7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRvdGFsIC8gdGhpcy5yZWNvcmRCeVJvdykgKiB0aGlzLnJlY29yZEJ5Um93IC0gc3ViIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZlcmlmeVRvdGFsUGVyY2VudGFnZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMuZ2V0SGlzdG9yaWNhbFBpeEFjY291bnRMaXN0KCkgPyB0aGlzLmdldEhpc3RvcmljYWxQaXhBY2NvdW50TGlzdCgpIDogW107XG4gICAgICAgIGNvbnN0IGFycmF5UGVyY2VudGFnZTogYW55ID0gW107XG5cbiAgICAgICAgaWYgKCFsaXN0Lmxlbmd0aCkgcmV0dXJuIHRoaXMubXNnVG90YWxMaW1pdEJ5UGVyY2VudGFnZSA9IG51bGw7XG5cbiAgICAgICAgbGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gYXJyYXlQZXJjZW50YWdlLnB1c2goaXRlbSAmJiBpdGVtW1wicGVyY2VudGFnZVwiXSkpO1xuXG4gICAgICAgIGNvbnN0IHN1bVBlcmNlbnRhZ2UgPSBhcnJheVBlcmNlbnRhZ2UucmVkdWNlKCh0b3RhbDogbnVtYmVyLCBwZXJjZW50YWdlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0b3RhbCArIHBlcmNlbnRhZ2U7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGlmIChzdW1QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgICAgIHRoaXMubXNnVG90YWxMaW1pdEJ5UGVyY2VudGFnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFwiaGNtLnBheXJvbGwuaGlzdG9yaWNhbF9waXhfYWNjb3VudF9tc2dfbGltaXRfdG90YWxfYnlfcGVyY2VudGFnZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubXNnVG90YWxMaW1pdEJ5UGVyY2VudGFnZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGZvcm1hdFBlcmNlbnRhZ2UodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJyB8fCBpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gJzAuMDAnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpLnRvRml4ZWQoMik7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU3luY1ZhbHVlKGZpZWxkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQnlSb3cgJiZcbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJ5Um93W2luZGV4XSAmJlxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdLmdldChmaWVsZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdLmdldChmaWVsZCk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgICAgICAgdGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YVtpbmRleF1bZmllbGRdID0gdmFsdWU7XG5cbiAgICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICAgICAgICBpZiAoZmllbGQgPT09ICdwZXJjZW50YWdlJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudExpc3QgPSB0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhXG4gICAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGkpID0+IGkgPT09IGluZGV4ID8gMCA6IChwYXJzZUZsb2F0KGl0ZW0ucGVyY2VudGFnZSkgfHwgMCkpO1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBlcmNlbnRhZ2VWYWxpZChjdXJyZW50TGlzdCwgdGhpcy5mb3JtR3JvdXBCeVJvd1tpbmRleF0pO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTeW5jaW5nUGVyY2VudGFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTeW5jaW5nUGVyY2VudGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3luY1BpeERhdGFUb1BhcmVudEZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N5bmNpbmdQZXJjZW50YWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICB0aGlzLmVtaXRGb3JtVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZFRlbGVwaG9uZU51bWJlcih0ZWxlcGhvbmVOdW1iZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBGb3JtYXRVdGlsc1NlcnZpY2UuZ2V0Rm9ybWF0dGVkVGVsZXBob25lTnVtYmVyKHRlbGVwaG9uZU51bWJlcik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZENwZihjcGY6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBGb3JtYXRVdGlsc1NlcnZpY2UuZ2V0Rm9ybWF0dGVkQ3BmKGNwZik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZENucGooY25wajogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEZvcm1hdFV0aWxzU2VydmljZS5nZXRGb3JtYXR0ZWRDbnBqKGNucGopO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWRQZXJjZW50YWdlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gRm9ybWF0VXRpbHNTZXJ2aWNlLmdldEZvcm1hdHRlZFBlcmNlbnRhZ2UodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0YSBjb21wbGV0YW1lbnRlIG8gZXN0YWRvIGRvIGZvcm11bMOhcmlvIGUgY29udHJvbGVzXG4gICAgICovXG4gICAgcmVzZXRGb3JtU3RhdGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJ5Um93KSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5mb3JtR3JvdXBCeVJvdykuZm9yRWFjaChmb3JtID0+IHtcbiAgICAgICAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2xOYW1lID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoY29udHJvbE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhTGlzdFBpeCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRhdGFMaXN0UGl4LmNsb3NlQWxsQ2VsbEVkaXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMaXN0UGl4LmNsb3NlQWxsQ2VsbEVkaXRvcnMoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm8gYW8gdGVudGFyIGZlY2hhciBjZWxsIGVkaXRvcnM6JywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGFMaXN0UGl4LmVkaXRpbmdDZWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFBpeC5lZGl0aW5nQ2VsbCA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFMaXN0UGl4LmVkaXRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxpc3RQaXguZWRpdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0YSBhIGNoYXZlIFBJWCBwYXJhIGV4aWJpw6fDo28gYmFzZWFkYSBubyB0aXBvXG4gICAgICovXG4gICAgZ2V0Rm9ybWF0dGVkUGl4S2V5KHBpeEtleVR5cGU6IHN0cmluZywgcGl4S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXBpeEtleSkgcmV0dXJuICcnO1xuXG4gICAgICAgIHN3aXRjaCAocGl4S2V5VHlwZSkge1xuICAgICAgICBjYXNlICdDUEYnOlxuICAgICAgICAgICAgcmV0dXJuIEZvcm1hdFV0aWxzU2VydmljZS5nZXRGb3JtYXR0ZWRDcGYocGl4S2V5KTtcbiAgICAgICAgY2FzZSAnQ05QSic6XG4gICAgICAgICAgICByZXR1cm4gRm9ybWF0VXRpbHNTZXJ2aWNlLmdldEZvcm1hdHRlZENucGoocGl4S2V5KTtcbiAgICAgICAgY2FzZSAnVEVMRVBIT05FJzpcbiAgICAgICAgICAgIHJldHVybiBGb3JtYXRVdGlsc1NlcnZpY2UuZ2V0Rm9ybWF0dGVkVGVsZXBob25lTnVtYmVyKHBpeEtleSk7XG4gICAgICAgIGNhc2UgJ0VNQUlMJzpcbiAgICAgICAgY2FzZSAnUkFORE9NX0tFWSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gcGl4S2V5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2J0w6ltIG8gdGlwbyBkZSBjaGF2ZSBQSVggZG8gaXRlbSBhdHVhbFxuICAgICAqL1xuICAgIGdldFBpeEtleVR5cGUoaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gJiYgaXRlbS5waXhLZXlUeXBlICYmIGl0ZW0ucGl4S2V5VHlwZS5rZXkgfHwgJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBWZXJpZmljYSBzZSB1bSBjb250cm9sZSBlc3TDoSBpbnbDoWxpZG8gcGFyYSBvcyBjYW1wb3MgZWRpdMOhdmVpc1xuICAgICovXG4gICAgaXNJbnZhbGlkKGluZGV4OiBudW1iZXIsIGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdO1xuICAgICAgICBpZiAoIWZvcm0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoY29udHJvbE5hbWUpO1xuICAgICAgICBpZiAoIWNvbnRyb2wpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gY29udHJvbC5pbnZhbGlkICYmIChjb250cm9sLnRvdWNoZWQgfHwgY29udHJvbC5kaXJ0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTcOpdG9kbyBjaGFtYWRvIHF1YW5kbyB1bWEgY8OpbHVsYSBlbnRyYSBubyBtb2RvIGRlIGVkacOnw6NvXG4gICAgICovXG4gICAgb25DZWxsRWRpdEluaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gZXZlbnQuZGF0YSk7XG4gICAgICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtR3JvdXBCeVJvd1tyb3dJbmRleF07XG4gICAgICAgIGlmIChmb3JtICYmIGZvcm0uZ2V0KCdwaXhLZXknKSkge1xuICAgICAgICAgICAgY29uc3QgcGl4S2V5Q29udHJvbCA9IGZvcm0uZ2V0KCdwaXhLZXknKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGFbcm93SW5kZXhdLnBpeEtleTtcbiAgICAgICAgICAgIHBpeEtleUNvbnRyb2wuc2V0VmFsdWUoY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3VwZXJhIG8gRm9ybUNvbnRyb2wgZXNwZWPDrWZpY28gcGFyYSB1bSBjYW1wbyBlbSBkZXRlcm1pbmFkbyDDrW5kaWNlXG4gICAgICovXG4gICAgZ2V0Rm9ybUNvbnRyb2woaW5kZXg6IG51bWJlciwgY29udHJvbE5hbWU6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1Hcm91cEJ5Um93W2luZGV4XTtcbiAgICAgICAgaWYgKCFmb3JtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGZvcm0uZ2V0KGNvbnRyb2xOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGEgY2FtcG9zIGRlIGRvY3VtZW50byAoQ1BGLCBDTlBKKSBxdWFuZG8gbyB1c3XDoXJpbyB0ZXJtaW5hIGRlIGRpZ2l0YXIgbm8gZm9ybSBkZSBlZGnDp8Ojb1xuICAgICAqL1xuICAgIHZhbGlkYXRlRG9jdW1lbnRGaWVsZChpbmRleDogbnVtYmVyLCBmaWVsZFR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtR3JvdXBCeVJvd1tpbmRleF07XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmFkZEV4aXN0ZW50SGlzdG9yaWNEYXRhW2luZGV4XTtcblxuICAgICAgICBpZiAoIWZvcm0gfHwgIWl0ZW0pIHJldHVybjtcblxuICAgICAgICBjb25zdCBwaXhLZXlDb250cm9sID0gZm9ybS5nZXQoJ3BpeEtleScpO1xuICAgICAgICBpZiAoIXBpeEtleUNvbnRyb2wpIHJldHVybjtcblxuICAgICAgICBsZXQgdmFsdWUgPSBpdGVtLnBpeEtleTtcblxuICAgICAgICBwaXhLZXlDb250cm9sLnNldFZhbHVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoZmllbGRUeXBlID09PSAnQ1BGJyB8fCBmaWVsZFR5cGUgPT09ICdDTlBKJyB8fCBmaWVsZFR5cGUgPT09ICdURUxFUEhPTkUnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID8gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEQvZywgJycpIDogJyc7XG4gICAgICAgICAgICBpdGVtLnBpeEtleSA9IHZhbHVlO1xuICAgICAgICAgICAgcGl4S2V5Q29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgcGl4S2V5Q29udHJvbC5zZXRFcnJvcnMoeyByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHBpeEtleUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRGb3JtVmFsaWRpdHkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjbGVhblZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmIChmaWVsZFR5cGUgPT09ICdDUEYnIHx8IGZpZWxkVHlwZSA9PT0gJ0NOUEonKSB7XG4gICAgICAgICAgICBjbGVhblZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuXG4gICAgICAgICAgICBpdGVtLnBpeEtleSA9IGNsZWFuVmFsdWU7XG4gICAgICAgICAgICBwaXhLZXlDb250cm9sLnNldFZhbHVlKGNsZWFuVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0NQRic6XG4gICAgICAgICAgICAgICAgaXNWYWxpZCA9IGNsZWFuVmFsdWUubGVuZ3RoID09PSAxMSAmJiBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRDcGYoe3ZhbHVlOiBjbGVhblZhbHVlfSBhcyBBYnN0cmFjdENvbnRyb2wpID09PSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQ05QSic6XG4gICAgICAgICAgICAgICAgaXNWYWxpZCA9IGNsZWFuVmFsdWUubGVuZ3RoID09PSAxNCAmJiBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRDbnBqKHt2YWx1ZTogY2xlYW5WYWx1ZX0gYXMgQWJzdHJhY3RDb250cm9sKSA9PT0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RFTEVQSE9ORSc6XG4gICAgICAgICAgICAgICAgY2xlYW5WYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gR2VuZXJpY1ZhbGlkYXRvci5pc1ZhbGlkUGhvbmVOdW1iZXIoe3ZhbHVlOiBjbGVhblZhbHVlfSBhcyBBYnN0cmFjdENvbnRyb2wpID09PSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRU1BSUwnOlxuICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRFbWFpbCh7dmFsdWV9IGFzIEFic3RyYWN0Q29udHJvbCkgPT09IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdSQU5ET01fS0VZJzpcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBwaXhLZXlDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcblxuICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgcGl4S2V5Q29udHJvbC5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvclR5cGUgPSB0aGlzLmdldEVycm9yVHlwZUZvckZpZWxkKGZpZWxkVHlwZSk7XG4gICAgICAgICAgICBwaXhLZXlDb250cm9sLnNldEVycm9ycyh7IFtlcnJvclR5cGVdOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuZW1pdEZvcm1WYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnTDqW0gbyB0aXBvIGRlIGVycm8gcGFyYSBjYWRhIHRpcG8gZGUgY2FtcG8gZWRpdMOhdmVsXG4gICAgICovXG4gICAgZ2V0RXJyb3JUeXBlRm9yRmllbGQoZmllbGRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0NQRic6IHJldHVybiAnaW52YWxpZENwZic7XG4gICAgICAgICAgY2FzZSAnQ05QSic6IHJldHVybiAnaW52YWxpZENucGonO1xuICAgICAgICAgIGNhc2UgJ1RFTEVQSE9ORSc6IHJldHVybiAnaW52YWxpZFBob25lTnVtYmVyJztcbiAgICAgICAgICBjYXNlICdFTUFJTCc6IHJldHVybiAnaW52YWxpZEVtYWlsJztcbiAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gJ3JlcXVpcmVkJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgYSBtZW5zYWdlbSBkZSBlcnJvIGFwcm9wcmlhZGEgcGFyYSB1bSBjYW1wb1xuICAgICAqL1xuICAgIGdldEVycm9yTWVzc2FnZShpbmRleDogbnVtYmVyLCBjb250cm9sTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdO1xuICAgICAgICBpZiAoIWZvcm0pIHJldHVybiAnJztcblxuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoY29udHJvbE5hbWUpO1xuICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wuZXJyb3JzKSByZXR1cm4gJyc7XG5cbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IGNvbnRyb2wudmFsdWUgfHwgJyc7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnaGNtLnBheXJvbGwucmVxdWlyZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250cm9sLmhhc0Vycm9yKCdpbnZhbGlkQ3BmJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnaGNtLnBheXJvbGwuZW1wbG95ZWVzX2FkZGl0aW9uX2NwZl9lcnJvcicpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wuaGFzRXJyb3IoJ2ludmFsaWRDbnBqJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnaGNtLnBheXJvbGwuZW1wbG95ZWVzX2FkZGl0aW9uX2NucGpfZXJyb3InKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250cm9sLmhhc0Vycm9yKCdpbnZhbGlkRW1haWwnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdoY20ucGF5cm9sbC5lbXBsb3llZXNfYWRkaXRpb25fZW1haWxfaW52YWxpZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wuaGFzRXJyb3IoJ2ludmFsaWRQaG9uZU51bWJlcicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2hjbS5wYXlyb2xsLmVtcGxveWVlc19hZGRpdGlvbl9pbnZhbGlkX3Bob25lX251bWJlcicsIHsgdmFsdWU6IGZpZWxkVmFsdWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhdGFtZW50byBhbyBwZXJkZXIgbyBmb2NvIGVtIGNhbXBvcyBkZSBkb2N1bWVudG9cbiAgICAgKi9cbiAgICBvbkRvY3VtZW50Qmx1cihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1Hcm91cEJ5Um93W2luZGV4XTtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGFbaW5kZXhdO1xuXG4gICAgICAgIGlmICghZm9ybSB8fCAhaXRlbSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBpeEtleUNvbnRyb2wgPSBmb3JtLmdldCgncGl4S2V5Jyk7XG4gICAgICAgIGNvbnN0IHBpeEtleVR5cGVDb250cm9sID0gZm9ybS5nZXQoJ3BpeEtleVR5cGUnKTtcblxuICAgICAgICBpZiAoIXBpeEtleUNvbnRyb2wgfHwgIXBpeEtleVR5cGVDb250cm9sLnZhbHVlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGl4S2V5VHlwZSA9IHBpeEtleVR5cGVDb250cm9sLnZhbHVlLmtleTtcbiAgICAgICAgbGV0IHZhbHVlID0gaXRlbS5waXhLZXk7XG5cbiAgICAgICAgaWYgKHBpeEtleVR5cGUgPT09ICdDUEYnIHx8IHBpeEtleVR5cGUgPT09ICdDTlBKJyB8fCBwaXhLZXlUeXBlID09PSAnVEVMRVBIT05FJykge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA/IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxEL2csICcnKSA6ICcnO1xuICAgICAgICAgICAgaXRlbS5waXhLZXkgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBpeEtleUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbGlkYXRlRG9jdW1lbnRGaWVsZChpbmRleCwgcGl4S2V5VHlwZSk7XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAocGl4S2V5VHlwZSA9PT0gJ0NQRicpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnBpeEtleUZvcm1hdHRlZCA9IEZvcm1hdFV0aWxzU2VydmljZS5nZXRGb3JtYXR0ZWRDcGYodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwaXhLZXlUeXBlID09PSAnQ05QSicpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnBpeEtleUZvcm1hdHRlZCA9IEZvcm1hdFV0aWxzU2VydmljZS5nZXRGb3JtYXR0ZWRDbnBqKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGl4S2V5VHlwZSA9PT0gJ1RFTEVQSE9ORScpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnBpeEtleUZvcm1hdHRlZCA9IEZvcm1hdFV0aWxzU2VydmljZS5nZXRGb3JtYXR0ZWRUZWxlcGhvbmVOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtLnBpeEtleUZvcm1hdHRlZCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maW5pc2hFZGl0aW5nKCk7XG4gICAgfVxuXG4gICAgZmluaXNoRWRpdGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zeW5jQWxsTW9kZWxUb0Zvcm0oKTtcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgY2xlYXJFcnJvcnNUZW1wb3JhcmlseShyb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1Hcm91cEJ5Um93W3Jvd0luZGV4XTtcbiAgICAgICAgaWYgKGZvcm0gJiYgZm9ybS5nZXQoJ3BpeEtleScpKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZm9ybS5nZXQoJ3BpeEtleScpLnZhbHVlO1xuICAgICAgICAgIGZvcm0uZ2V0KCdwaXhLZXknKS5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgZm9ybS5nZXQoJ3BpeEtleScpLnNldFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VFZGl0TW9kZU1hbnVhbGx5KCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhTGlzdFBpeCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRhdGFMaXN0UGl4LmNsb3NlQWxsQ2VsbEVkaXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFBpeC5jbG9zZUFsbENlbGxFZGl0b3JzKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YUxpc3RQaXguZWRpdGluZ0NlbGwpIHtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhTGlzdFBpeC5lZGl0aW5nQ2VsbCA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICBzeW5jQWxsTW9kZWxUb0Zvcm0oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YSB8fCAhdGhpcy5mb3JtR3JvdXBCeVJvdykgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUdyb3VwQnlSb3dbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2xOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm0uZ2V0KGNvbnRyb2xOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgJiYgaXRlbVtjb250cm9sTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShpdGVtW2NvbnRyb2xOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBpeEtleVR5cGVDb250cm9sID0gZm9ybS5nZXQoJ3BpeEtleVR5cGUnKTtcbiAgICAgICAgICAgICAgICBpZiAocGl4S2V5VHlwZUNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZURvY3VtZW50RmllbGQoaW5kZXgsIHBpeEtleVR5cGVDb250cm9sLnZhbHVlLmtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIE3DqXRvZG8gcGFyYSBmb3LDp2FyIG8gZmVjaGFtZW50byBkZSB0b2RhcyBhcyBjw6lsdWxhcyBlbSBlZGnDp8Ojb1xuICAgICovXG4gICAgcHVibGljIGZvcmNlQ2xvc2VBbGxDZWxsRWRpdG9ycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maW5pc2hFZGl0aW5nKCk7XG4gICAgICAgIHRoaXMuc3luY0FsbE1vZGVsVG9Gb3JtKCk7XG4gICAgfVxuXG4gICAgaXNQaXhLZXlUeXBlKGl0ZW06IGFueSwgdHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpdGVtICYmIGl0ZW0ucGl4S2V5VHlwZSAmJiBpdGVtLnBpeEtleVR5cGUua2V5ID09PSB0eXBlO1xuICAgIH1cblxuICAgIGdldFBpeEtleShyb3dEYXRhOiBhbnkpOiBhbnkge1xuICAgICAgICByZXR1cm4gcm93RGF0YSA/IHJvd0RhdGEucGl4S2V5IDogbnVsbDtcbiAgICB9XG5cbiAgICBzZXRQaXhLZXkocm93RGF0YTogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmIChyb3dEYXRhKSB7XG4gICAgICAgICAgICByb3dEYXRhLnBpeEtleSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGlzVG90YWxQZXJjZW50YWdlMTAwKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGEgfHwgdGhpcy5hZGRFeGlzdGVudEhpc3RvcmljRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsUGVyY2VudGFnZSA9IHRoaXMuYWRkRXhpc3RlbnRIaXN0b3JpY0RhdGFcbiAgICAgICAgICAgIC5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgKHBhcnNlRmxvYXQoaXRlbS5wZXJjZW50YWdlKSB8fCAwKSwgMCk7XG5cbiAgICAgICAgcmV0dXJuIHRvdGFsUGVyY2VudGFnZSA+PSAxMDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzY29wZWRBY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZWNvcmRzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGAkeyB0aGlzLnRvdGFsUmVjb3JkcyB8fCAwIH0gJHsgdGhpcy50b3RhbFJlY29yZHMgPT09IDEgP1xuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXCJoY20ucGF5cm9sbC5hZG1pc3Npb25fcmVnaXN0ZXJcIikgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcImhjbS5wYXlyb2xsLmFkbWlzc2lvbl9yZWdpc3RlcnNcIikgfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBnZXRUb29sdGlwQW5kRGlzYWJsZUJ1dHRvbkFkZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUNoYW5nZSA/IG51bGwgOiB0aGlzLm1zZ1Rvb2x0aXBBZGQ7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRhdGVDaGFuZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVDaGFuZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkYXRlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGF0ZUNoYW5nZSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fZGF0ZUNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5saXN0RGF0YS5maWx0ZXIoKHJvdzogYW55KSA9PiByb3dbXCJkYXRlQ2hhbmdlXCJdID0gdGhpcy5fZGF0ZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZGlzcGxheURhdGVDaGFuZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlEYXRlQ2hhbmdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZGlzcGxheURhdGVDaGFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kaXNwbGF5RGF0ZUNoYW5nZSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fZGlzcGxheURhdGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdERhdGEuZmlsdGVyKChyb3c6IGFueSkgPT4gcm93W1wiZGlzcGxheURhdGVDaGFuZ2VcIl0gPSB0aGlzLl9kaXNwbGF5RGF0ZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgYWRkTGlzdERhdGEobGlzdDogb2JqZWN0W10pIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oaXN0b3JpY2FsUGl4QWNjb3VudExpc3QuZ2V0KFwiaGlzdG9yaWNhbFBpeEFjY291bnRMaXN0XCIpLnBhdGNoVmFsdWUobGlzdCk7XG4gICAgICAgIHRoaXMudmVyaWZ5VG90YWxQZXJjZW50YWdlKCk7XG4gICAgICAgIHRoaXMub25MYXp5TG9hZCgpO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcGFyYW1zRm9ybSh2YWx1ZTogRm9ybUdyb3VwKSB7XG4gICAgICB0aGlzLl9wYXJhbXNGb3JtID0gdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRDcGZOdW1iZXIodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kZWZhdWx0Q3BmTnVtYmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodGhpcy52aXNpYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpc0FsbG93VG9BZGRIaXN0b3JpY2FsKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uW1wiaW5jbHVpclwiXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzQWxsb3dUb0RlbGV0ZUhpc3RvcmljYWwoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25bXCJleGNsdWlyXCJdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNBbGxvd1RvRWRpdEhpc3RvcmljYWwoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25bXCJlZGl0YXJcIl1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpc0FsbG93VG9WaWV3SGlzdG9yaWNhbCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbltcInZpc3VhbGl6YXJcIl1cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=