@messaia/cdk 18.0.0-rc25 → 18.0.0-rc27

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.
@@ -16,19 +16,19 @@ export class GenericFormBaseComponent extends BaseComponent {
16
16
  route;
17
17
  changeDetectorRef;
18
18
  /**
19
- * The action of the form (add | edit)
20
- */
19
+ * The action of the form (add | edit).
20
+ */
21
21
  action = 'add';
22
22
  /**
23
- * Action = edit?
23
+ * Indicates if the form is in edit mode.
24
24
  */
25
25
  isEditMode = false;
26
26
  /**
27
- * Save action
27
+ * Save action enumeration.
28
28
  */
29
29
  SaveAction = SaveAction;
30
30
  /**
31
- * Routes
31
+ * Navigation routes.
32
32
  */
33
33
  editSaveAndCloseRoute = '../../';
34
34
  addSaveAndCloseRoute = '../';
@@ -36,15 +36,15 @@ export class GenericFormBaseComponent extends BaseComponent {
36
36
  addSaveAndNewRoute = '../add';
37
37
  listRoute = this.addSaveAndCloseRoute;
38
38
  /**
39
- * The id of the item to load
39
+ * The ID of the item to load.
40
40
  */
41
41
  _id;
42
42
  /**
43
- * The id of the item to load
43
+ * The ID of the item to load.
44
44
  */
45
45
  get id() { return this._id; }
46
46
  set id(id) {
47
- if (this._id != id) {
47
+ if (this._id !== id) {
48
48
  this._id = id;
49
49
  this.action = 'edit';
50
50
  this.isEditMode = true;
@@ -52,83 +52,82 @@ export class GenericFormBaseComponent extends BaseComponent {
52
52
  }
53
53
  }
54
54
  /**
55
- * The current item to add or edit
55
+ * The current item to add or edit.
56
56
  */
57
57
  _item;
58
58
  /**
59
- * The current item to add or edit
59
+ * The current item to add or edit.
60
60
  */
61
61
  get item() { return this._item; }
62
- ;
63
62
  set item(item) {
64
- if (this._item != item) {
63
+ if (this._item !== item) {
65
64
  this._item = item;
66
65
  this.id ??= item?.id;
67
66
  this.buildFields();
68
67
  }
69
68
  }
70
69
  /**
71
- * Represents the request errors
70
+ * Represents the request errors.
72
71
  */
73
72
  errors = new Array();
74
73
  /**
75
- * Includes
74
+ * Includes fields for query.
76
75
  */
77
76
  includes = [];
78
77
  /**
79
- * Update includes
78
+ * Update includes fields for query.
80
79
  */
81
80
  updateIncludes = [];
82
81
  /**
83
- * Projection
82
+ * Projection fields for query.
84
83
  */
85
84
  projection;
86
85
  /**
87
- * Get params
86
+ * Query parameters.
88
87
  */
89
88
  query = {};
90
89
  /**
91
- * @property
90
+ * Read-only flag.
92
91
  */
93
92
  readonly = false;
94
93
  /**
95
- * @property
94
+ * Disabled flag.
96
95
  */
97
96
  disabled = false;
98
97
  /**
99
- * The current date
98
+ * The current date.
100
99
  */
101
100
  currentDate = new Date();
102
101
  /**
103
- * Date & time mask
102
+ * Date & time input mask.
104
103
  */
105
104
  dateTimeMask = [/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', 2, 0, /[1-2]/, /[0-9]/, ' ', /[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/];
106
105
  /**
107
- * Date mask
106
+ * Date input mask.
108
107
  */
109
108
  dateMask = [/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', 2, 0, /[1-2]/, /[0-9]/];
110
109
  /**
111
- * Time mask
110
+ * Time input mask.
112
111
  */
113
112
  timeMask = [/[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/];
114
113
  /**
115
- * A pattern to validate dates
114
+ * Date validation pattern.
116
115
  */
117
116
  datePattern = `(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[1,3-9]|1[0-2])\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})`;
118
117
  /**
119
- * Phone prefix validation pattern
118
+ * Phone prefix validation pattern.
120
119
  */
121
120
  phonePrefixPattern = '^(0\\d{2,6})$';
122
121
  /**
123
- * Phone number validation pattern
122
+ * Phone number validation pattern.
124
123
  */
125
124
  phoneNumberPattern = '^(\\d{3,30})$';
126
125
  /**
127
- * Password validation pattern
126
+ * Password validation pattern.
128
127
  */
129
- passwordPattern = '^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&#.])[A-Za-z\\d$@$!%*?&#.]{6,}';
128
+ passwordPattern = '^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&#.])[A-Za-z\\d$@$!%*?&#.]{6,}$';
130
129
  /**
131
- * Defaults modules and toolbar
130
+ * Editor options including default modules and toolbar configuration.
132
131
  */
133
132
  editorOptions = {
134
133
  modules: {
@@ -147,52 +146,53 @@ export class GenericFormBaseComponent extends BaseComponent {
147
146
  }
148
147
  };
149
148
  /**
150
- * If true, show the menu 'Delete'
149
+ * If true, shows the 'Delete' menu.
151
150
  */
152
151
  deletable = true;
153
152
  /**
154
- * Toolbar menu items
153
+ * Toolbar menu items.
155
154
  */
156
155
  toolbarMenuItems = [];
157
156
  /**
158
- * Toolbar action buttons
157
+ * Toolbar action buttons.
159
158
  */
160
159
  toolbarActions = [{
161
160
  icon: 'refresh',
162
161
  event: () => this.reloadPage(),
163
162
  }];
164
163
  /**
165
- * MatStepper ref
164
+ * MatStepper reference.
166
165
  */
167
166
  matStepper;
168
167
  /**
169
- * A reference to the input element
168
+ * Reference to the input elements.
170
169
  */
171
170
  input;
172
171
  /**
173
- * _form: FormGroup
172
+ * Form group instance.
174
173
  */
175
174
  _form;
176
175
  /**
177
- * Form group
176
+ * Form group.
178
177
  */
179
178
  get form() { return this._form; }
180
- ;
181
179
  set form(form) {
182
180
  this._form = form;
183
181
  this.onAfterFormBuild();
184
182
  }
185
183
  /**
186
- * formDefinition: FormDefinition
184
+ * Form definition.
187
185
  */
188
186
  formDefinition;
189
187
  /**
190
- * fieldGroups: FormFieldGroup[]
188
+ * Field groups definition.
191
189
  */
192
190
  fieldGroups;
193
191
  /**
194
- * Constructor
195
- * @param service
192
+ * Constructor.
193
+ * @param service The service to manage the entity.
194
+ * @param route The activated route.
195
+ * @param changeDetectorRef The change detector reference.
196
196
  */
197
197
  constructor(entityCtor, service, route, changeDetectorRef) {
198
198
  super(route, changeDetectorRef);
@@ -222,7 +222,7 @@ export class GenericFormBaseComponent extends BaseComponent {
222
222
  this.focus();
223
223
  /*
224
224
  * Force a new change detection cycle since change detections
225
- * have finished when `ngAfterViewInit` is executed
225
+ * have finished when `ngAfterViewInit` is executed.
226
226
  */
227
227
  this.changeDetectorRef.detectChanges();
228
228
  /* Listen for stepper selection changes */
@@ -231,16 +231,17 @@ export class GenericFormBaseComponent extends BaseComponent {
231
231
  /**
232
232
  * Called before any other lifecycle hook. Use it to inject dependencies,
233
233
  * but avoid any serious work here.
234
- * @param changes
234
+ * @param changes The changes object.
235
235
  */
236
236
  ngOnChanges(changes) {
237
- if ((changes?.id?.currentValue && changes.id.currentValue != changes.id.previousValue) ||
238
- (changes?.item?.currentValue && changes.item.currentValue != changes.item.previousValue)) {
237
+ if ((changes?.id?.currentValue && changes.id.currentValue !== changes.id.previousValue) ||
238
+ (changes?.item?.currentValue && changes.item.currentValue !== changes.item.previousValue)) {
239
239
  this.loadItem();
240
240
  }
241
241
  }
242
242
  /**
243
- * Loads an item by ID
243
+ * Loads an item by ID.
244
+ * This method fetches the item if the component is in edit mode and the service endpoint is defined.
244
245
  */
245
246
  loadItem() {
246
247
  if (this.isEditMode && this.service?.endpoint) {
@@ -253,7 +254,8 @@ export class GenericFormBaseComponent extends BaseComponent {
253
254
  }
254
255
  }
255
256
  /**
256
- * Loads an item by ID asyncly
257
+ * Loads an item by ID asynchronously.
258
+ * @returns An Observable of the loaded entity.
257
259
  */
258
260
  loadItemAsync() {
259
261
  if (this.id) {
@@ -269,8 +271,10 @@ export class GenericFormBaseComponent extends BaseComponent {
269
271
  return new Observable();
270
272
  }
271
273
  /**
272
- * Saves data into database.
273
- * @param action
274
+ * Saves data into the database.
275
+ * This method validates the form, checks if it's valid, and sends data to the server to either update or create a new record.
276
+ * @param action The save action to perform.
277
+ * @param form The form to validate and save.
274
278
  */
275
279
  save(action = SaveAction.SaveAndClose, form) {
276
280
  /* Validate the form */
@@ -280,7 +284,7 @@ export class GenericFormBaseComponent extends BaseComponent {
280
284
  if (form && !this.isFormValid(form)) {
281
285
  return;
282
286
  }
283
- /* If we'ra in edit mode, update the record */
287
+ /* If in edit mode, update the record */
284
288
  if (this.isEditMode) {
285
289
  /* The data has not changed? */
286
290
  if (form && form.pristine) {
@@ -332,18 +336,20 @@ export class GenericFormBaseComponent extends BaseComponent {
332
336
  this.changeDetectorRef.detectChanges();
333
337
  }
334
338
  /**
335
- * Saves data and navigates to edit view
339
+ * Saves data and navigates to the edit view.
336
340
  */
337
341
  apply() {
338
342
  this.save(SaveAction.SaveAndEdit);
339
343
  }
340
344
  /**
341
345
  * Deletes the current record.
346
+ * This method shows a confirmation dialog and deletes the record if the user confirms.
347
+ * @param httpHeaders Optional HTTP headers to include in the delete request.
342
348
  */
343
- delete() {
349
+ delete(httpHeaders) {
344
350
  this.showDeleteItemDialog().subscribe((accept) => {
345
351
  if (accept && this.id) {
346
- this.service.delete(this.id, undefined, { headers: this.toHttpHeaders({ 'Show-Message': 'yes' }) })
352
+ this.service.delete(this.id, undefined, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }) })
347
353
  .subscribe(response => {
348
354
  this.back();
349
355
  }, error => {
@@ -353,7 +359,8 @@ export class GenericFormBaseComponent extends BaseComponent {
353
359
  });
354
360
  }
355
361
  /**
356
- * Inits the form
362
+ * Initializes the form.
363
+ * This method sets up the form by extracting query parameters, setting the entity ID, and building the form.
357
364
  */
358
365
  init() {
359
366
  /* Get the entity ID from the query */
@@ -378,11 +385,12 @@ export class GenericFormBaseComponent extends BaseComponent {
378
385
  }
379
386
  /* Set panel ID from query */
380
387
  this.subtitle ||= this.route.snapshot?.data?.subtitle;
381
- /* Add list mneu items */
388
+ /* Add list menu items */
382
389
  this.addToolbarMenuItems();
383
390
  }
384
391
  /**
385
- * Builds the form fields
392
+ * Builds the form fields.
393
+ * This method constructs form fields based on the entity's form definition and includes necessary navigation and menu items.
386
394
  */
387
395
  buildFields() {
388
396
  /* Get form definition */
@@ -395,16 +403,18 @@ export class GenericFormBaseComponent extends BaseComponent {
395
403
  this.toolbarMenuItems = this.toolbarMenuItems.concat(...this.formDefinition?.toolbarMenuItems);
396
404
  this.toolbarMenuItems.forEach((x, i) => x.index ??= i);
397
405
  }
398
- /* Create the from fields using the entity type */
406
+ /* Create the form fields using the entity type */
399
407
  this.fieldGroups = this.formDefinition?.fieldGroups?.filter(x => !x.hidden);
400
408
  }
401
409
  /**
402
- * Builds a new form
410
+ * Builds a new form.
411
+ * This method should be implemented to construct the form for the specific entity.
403
412
  */
404
413
  buildForm() { }
405
414
  /**
406
- * Validates the form
407
- * @param form
415
+ * Validates the form.
416
+ * This method sets the form as submitted, updates its validity, and optionally logs debug information.
417
+ * @param form The form to validate.
408
418
  */
409
419
  validateForm(form) {
410
420
  var form = form || this.form;
@@ -419,21 +429,23 @@ export class GenericFormBaseComponent extends BaseComponent {
419
429
  this.debugForm(form);
420
430
  }
421
431
  /**
422
- * Validates the form
423
- * @param form
432
+ * Checks if the form is valid.
433
+ * This method validates the form, marks invalid controls, and shows error messages if any.
434
+ * @param form The form to check for validity.
435
+ * @returns A boolean indicating whether the form is valid.
424
436
  */
425
437
  isFormValid(form) {
426
438
  /* Print some debug information */
427
439
  this.debugForm(form);
428
- /* If the form ist not valid.. */
440
+ /* If the form is not valid */
429
441
  if (form && !form.valid) {
430
- /* Mark invalid controls as dirtty and touched */
442
+ /* Mark invalid controls as dirty and touched */
431
443
  Object.keys(form.controls)
432
444
  .filter(x => !form.controls[x].valid)
433
445
  .forEach(key => this.invalidateControl(form.controls[key]));
434
446
  /* Show error messages */
435
447
  (async () => {
436
- /* Wait until 'mat-error' displayed */
448
+ /* Wait until 'mat-error' is displayed */
437
449
  await new Promise(y => setTimeout(y, 200));
438
450
  /* Parse the error messages */
439
451
  var errors = Array();
@@ -448,7 +460,7 @@ export class GenericFormBaseComponent extends BaseComponent {
448
460
  });
449
461
  /* Build error message */
450
462
  var message = errors.length ? errors.slice(0, 3).join('\n') : $localize `:@@snackbar.error.required-fields:All fields marked with an asterisk (*) are required.`;
451
- /* show a notice */
463
+ /* Show a notice */
452
464
  this.snackBarService.open(message, 'Ok', { duration: 3000, panelClass: ['error'] });
453
465
  return false;
454
466
  })();
@@ -457,9 +469,9 @@ export class GenericFormBaseComponent extends BaseComponent {
457
469
  return true;
458
470
  }
459
471
  /**
460
- * Resets form controls
461
- * @param form
462
- * @returns
472
+ * Resets form controls.
473
+ * This method marks all controls in the form as pristine, untouched, and updates their validity.
474
+ * @param form The form to reset.
463
475
  */
464
476
  resetForm(form) {
465
477
  if (!form) {
@@ -473,8 +485,9 @@ export class GenericFormBaseComponent extends BaseComponent {
473
485
  });
474
486
  }
475
487
  /**
476
- * Invalidate controls recursively
477
- * @param control
488
+ * Invalidates controls recursively.
489
+ * This method marks all controls in the group as dirty and touched if they are invalid.
490
+ * @param control The control or group of controls to invalidate.
478
491
  */
479
492
  invalidateControl(control) {
480
493
  /* Check the control against null */
@@ -494,8 +507,9 @@ export class GenericFormBaseComponent extends BaseComponent {
494
507
  }
495
508
  }
496
509
  /**
497
- * Shows form errors
498
- * @param form
510
+ * Shows form errors.
511
+ * This method logs form control errors to the console if debugging is enabled.
512
+ * @param form The form to debug.
499
513
  */
500
514
  debugForm(form) {
501
515
  if (form && this.debug) {
@@ -511,7 +525,8 @@ export class GenericFormBaseComponent extends BaseComponent {
511
525
  }
512
526
  }
513
527
  /**
514
- * Add toolbar menu items
528
+ * Adds toolbar menu items.
529
+ * This method adds the 'Delete' menu item to the toolbar if the entity is deletable.
515
530
  */
516
531
  addToolbarMenuItems() {
517
532
  /* Add 'Delete' menu item */
@@ -535,7 +550,8 @@ export class GenericFormBaseComponent extends BaseComponent {
535
550
  }
536
551
  /**
537
552
  * Loads the previous URL in the history list.
538
- * @param action
553
+ * This method navigates back to the previous URL or performs specific actions based on the save action.
554
+ * @param action The save action that determines the navigation behavior.
539
555
  */
540
556
  back(action = SaveAction.SaveAndClose) {
541
557
  if (this.reload.observed) {
@@ -569,41 +585,51 @@ export class GenericFormBaseComponent extends BaseComponent {
569
585
  }
570
586
  }
571
587
  /**
572
- * Sets return url
573
- * @param returnUrl
588
+ * Sets the return URL.
589
+ * This method sets the return URL and updates the list route accordingly.
590
+ * @param returnUrl The URL to return to after the current action is complete.
574
591
  */
575
592
  setReturnUrl(returnUrl) {
576
593
  super.setReturnUrl(returnUrl);
577
594
  this.listRoute = this.returnUrl || this.listRoute;
578
595
  }
579
596
  /**
580
- * Creates a new instance of the TEntity
597
+ * Creates a new instance of TEntity.
598
+ * This method initializes a new entity using the provided constructor.
599
+ * @param init Optional partial initialization object.
600
+ * @returns A new instance of TEntity.
581
601
  */
582
602
  newInstance(init) {
583
603
  return new this.entityCtor(init);
584
604
  }
585
605
  /**
586
- * Creates the entity
587
- * @param httpOptions
588
- * @returns
606
+ * Creates the entity.
607
+ * This method sends a request to create a new entity on the server.
608
+ * @param httpOptions Optional HTTP options for the request.
609
+ * @param httpHeaders Optional HTTP headers for the request.
610
+ * @returns An Observable of the created TEntity.
589
611
  */
590
- create(httpOptions) {
612
+ create(httpOptions, httpHeaders) {
591
613
  this.onBeforeCreate();
592
- return this.service.create(this.formValue, undefined, Object.assign(httpOptions || {}, { headers: this.toHttpHeaders({ 'Show-Message': 'yes' }) }), false);
614
+ return this.service.create(this.formValue, undefined, Object.assign(httpOptions || {}, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }) }), false);
593
615
  }
594
616
  /**
595
- * Updates the entity
596
- * @param httpOptions
597
- * @returns
617
+ * Updates the entity.
618
+ * This method sends a request to update an existing entity on the server.
619
+ * @param httpOptions Optional HTTP options for the request.
620
+ * @param httpHeaders Optional HTTP headers for the request.
621
+ * @returns An Observable of the updated TEntity.
598
622
  */
599
- update(httpOptions) {
623
+ update(httpOptions, httpHeaders) {
600
624
  this.onBeforeUpdate();
601
- return this.service.update(this.id, Object.assign(this.item, this.formValue), undefined, Object.assign(httpOptions || {}, { headers: this.toHttpHeaders({ 'Show-Message': 'yes' }), }), false);
625
+ return this.service.update(this.id, Object.assign(this.item, this.formValue), undefined, Object.assign(httpOptions || {}, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }), }), false);
602
626
  }
603
627
  /**
604
- * Includes some navigations
605
- * @param inc
606
- * @param update
628
+ * Includes specified navigations.
629
+ * This method adds specified navigation properties to the includes array,
630
+ * optionally adding them to the updateIncludes array as well.
631
+ * @param inc The navigation property to include.
632
+ * @param update Whether to include in updateIncludes array.
607
633
  */
608
634
  include(inc, update = false) {
609
635
  this.includes.push(inc);
@@ -612,11 +638,14 @@ export class GenericFormBaseComponent extends BaseComponent {
612
638
  }
613
639
  }
614
640
  /**
615
- * Check if the item is deletable
641
+ * Checks if the item is deletable.
642
+ * This method determines if the current item can be deleted based on its properties.
643
+ * @returns True if the item can be deleted, false otherwise.
616
644
  */
617
645
  canDeleteItem() { return this.canDelete && (!this.item?.hasOwnProperty('deletable') || this.item['deletable']); }
618
646
  /**
619
- * Event emitted when the id is set.
647
+ * Event emitted when the ID is set.
648
+ * This method triggers the loading of the item when the ID is set.
620
649
  */
621
650
  onAfterSetId() {
622
651
  if (this.id) {
@@ -625,20 +654,24 @@ export class GenericFormBaseComponent extends BaseComponent {
625
654
  }
626
655
  /**
627
656
  * Event emitted when the selected step has changed.
628
- * @param $event
657
+ * This method handles actions to be taken when the stepper selection changes.
658
+ * @param $event The stepper selection event.
629
659
  */
630
660
  onAfterStepChange($event) { }
631
661
  /**
632
662
  * Event emitted when the entity has been loaded.
663
+ * This method handles actions to be taken after the entity is loaded.
633
664
  */
634
665
  onAfterItemLoaded() { }
635
666
  /**
636
- * Event emitted before the form has built.
667
+ * Event emitted before the form is built.
668
+ * This method allows performing operations before the form is constructed.
637
669
  */
638
670
  onBeforeFormBuild() { }
639
671
  /**
640
- * Event emitted when the form has built.
641
- * Disables the form controls, if [disable] is true
672
+ * Event emitted when the form has been built.
673
+ * This method handles actions to be taken after the form is constructed,
674
+ * such as disabling form controls if the form is set to be disabled.
642
675
  */
643
676
  onAfterFormBuild() {
644
677
  if (this.form && this.disabled) {
@@ -657,13 +690,16 @@ export class GenericFormBaseComponent extends BaseComponent {
657
690
  */
658
691
  onBeforeUpdate() { }
659
692
  /**
660
- * Called before data submition
693
+ * Called before data submission.
694
+ * This method allows performing operations before submitting data.
661
695
  */
662
696
  beforeSubmit(_ = SaveAction.SaveAndClose) { }
663
697
  /**
664
- * Event emitted after data submition
665
- * @param action
666
- * @param response
698
+ * Event emitted after data submission.
699
+ * This method handles post-submission actions such as resetting the saving state,
700
+ * updating the change detector, and navigating back based on the save action.
701
+ * @param action The save action taken (e.g., SaveAndClose, SaveAndNew).
702
+ * @param response The response received after submission.
667
703
  */
668
704
  onAfterSubmit(action = SaveAction.SaveAndClose, response = null) {
669
705
  this.isSaving = false;
@@ -671,13 +707,15 @@ export class GenericFormBaseComponent extends BaseComponent {
671
707
  this.back(action);
672
708
  }
673
709
  /**
674
- * Called after page reloaded
710
+ * Called after the page is reloaded.
711
+ * This method reinitializes the item with a new instance and applies any query parameters.
675
712
  */
676
713
  afterReload() {
677
714
  this.item = Object.assign(this.newInstance(), this.query);
678
715
  }
679
716
  /**
680
- * Sets focus to first input
717
+ * Sets focus to the first input element.
718
+ * Ensures the first input element in the form is focused for user convenience.
681
719
  */
682
720
  focus() {
683
721
  if (this.input && this.input.first && this.input.first.nativeElement) {
@@ -685,11 +723,13 @@ export class GenericFormBaseComponent extends BaseComponent {
685
723
  }
686
724
  }
687
725
  /**
688
- * Gets element error
689
- * @param nativeElement
726
+ * Retrieves the error message for a given native element.
727
+ * This method navigates through the DOM structure to find error messages associated with form fields.
728
+ * @param nativeElement The DOM element to check for errors.
729
+ * @returns The error message associated with the element, or undefined if no error is found.
690
730
  */
691
731
  getElementError(nativeElement) {
692
- /* Get paranet element 'mat-form-field' */
732
+ /* Get parent element 'mat-form-field' */
693
733
  var matFormField = nativeElement?.closest('.mat-form-field');
694
734
  if (!matFormField) {
695
735
  return undefined;
@@ -711,8 +751,9 @@ export class GenericFormBaseComponent extends BaseComponent {
711
751
  return `'${matLabel.textContent}': ${errorsArray?.join(', ')}`;
712
752
  }
713
753
  /**
714
- * Responds to user-initiated events
715
- * @param event
754
+ * Responds to user-initiated keyboard events.
755
+ * This method listens for specific key combinations and triggers save actions or form cancellation.
756
+ * @param event The keyboard event triggered by the user.
716
757
  */
717
758
  handleKeyboardEvent(event) {
718
759
  if (event.ctrlKey || event.metaKey) {
@@ -731,7 +772,7 @@ export class GenericFormBaseComponent extends BaseComponent {
731
772
  break;
732
773
  }
733
774
  }
734
- /* Cancel the form, if the user press the ESC key */
775
+ /* Cancel the form if the user presses the ESC key */
735
776
  if (event.keyCode == 27) {
736
777
  this.back();
737
778
  }
@@ -771,4 +812,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
771
812
  type: HostListener,
772
813
  args: ['document:keydown', ['$event']]
773
814
  }] } });
774
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1mb3JtLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvYmFzZS9jb21wb25lbnRzL2dlbmVyaWMtZm9ybS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQTRCLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNJLE9BQU8sRUFBbUIsU0FBUyxFQUE0QixNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7QUFFakQsV0FBVztBQUVYLE1BQU0sT0FBZ0Isd0JBQTRGLFNBQVEsYUFBYTtJQXFPOUg7SUFDRztJQUNBO0lBQ0E7SUF2T1g7O09BRUc7SUFDSSxNQUFNLEdBQVcsS0FBSyxDQUFDO0lBRTlCOztPQUVHO0lBQ0ksVUFBVSxHQUFZLEtBQUssQ0FBQztJQUVuQzs7T0FFRztJQUNJLFVBQVUsR0FBc0IsVUFBVSxDQUFDO0lBRWxEOztPQUVHO0lBQ0kscUJBQXFCLEdBQVcsUUFBUSxDQUFDO0lBQ3pDLG9CQUFvQixHQUFXLEtB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Qix3QkFBd0Isa1dBeUxsQyxVQUFVOzsyRkF6TEEsd0JBQXdCO2tCQUQ3QyxTQUFTOzJKQW1DRSxFQUFFO3NCQURaLEtBQUs7Z0JBZUksS0FBSztzQkFEZCxLQUFLO2dCQU9LLElBQUk7c0JBRGQsS0FBSztnQkFtQkMsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLGNBQWM7c0JBRHBCLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxLQUFLO3NCQURYLEtBQUs7Z0JBT0MsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLFFBQVE7c0JBRGQsS0FBSztnQkFxRkksVUFBVTtzQkFEbkIsU0FBUzt1QkFBQyxVQUFVO2dCQU9kLEtBQUs7c0JBRFgsWUFBWTt1QkFBQyxPQUFPO2dCQVlWLElBQUk7c0JBRGQsS0FBSztnQkE2bkJOLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0ZXBwZXJTZWxlY3Rpb25FdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zdGVwcGVyJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUeXBlLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCwgTmdGb3JtLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRTdGVwcGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc3RlcHBlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgQWN0aW9uSXRlbSB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvYWN0aW9uLWl0ZW0nO1xyXG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9lbnRpdHknO1xyXG5pbXBvcnQgeyBTYXZlQWN0aW9uIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9zYXZlLWFjdGlvbic7XHJcbmltcG9ydCB7IGdldEZvcm1EZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZm9ybXMvZnVuY3Rpb25zL2Z1bmN0aW9ucyc7XHJcbmltcG9ydCB7IEZvcm1EZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZm9ybXMvbW9kZWxzL2Zvcm0tZGVmaW5pdGlvbic7XHJcbmltcG9ydCB7IEZvcm1GaWVsZEdyb3VwRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1zL21vZGVscy9mb3JtLWZpZWxkLWdyb3VwLWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBHZW5lcmljU2VydmljZSB9IGZyb20gJy4uLy4uL2h0dHAvc2VydmljZXMvZ2VuZXJpYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSUdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvaWdlbmVyaWMtZm9ybS1iYXNlJztcclxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJy4vYmFzZS5jb21wb25lbnQnO1xyXG5cclxuLy8gQGR5bmFtaWNcclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eSBleHRlbmRzIElFbnRpdHksIFRTZXJ2aWNlIGV4dGVuZHMgR2VuZXJpY1NlcnZpY2U8VEVudGl0eT4+IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4sIE9uQ2hhbmdlcyB7XHJcblx0LyoqXHJcblx0ICogVGhlIGFjdGlvbiBvZiB0aGUgZm9ybSAoYWRkIHwgZWRpdClcclxuXHQgKi9cclxuXHRwdWJsaWMgYWN0aW9uOiBzdHJpbmcgPSAnYWRkJztcclxuXHJcblx0LyoqXHJcblx0ICogQWN0aW9uID0gZWRpdD9cclxuXHQgKi9cclxuXHRwdWJsaWMgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBTYXZlIGFjdGlvblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBTYXZlQWN0aW9uOiB0eXBlb2YgU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb247XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdXRlc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0U2F2ZUFuZENsb3NlUm91dGU6IHN0cmluZyA9ICcuLi8uLi8nO1xyXG5cdHB1YmxpYyBhZGRTYXZlQW5kQ2xvc2VSb3V0ZTogc3RyaW5nID0gJy4uLyc7XHJcblx0cHVibGljIGFkZFNhdmVBbmRFZGl0Um91dGU6IHN0cmluZyA9ICcuLi9lZGl0Lyc7XHJcblx0cHVibGljIGFkZFNhdmVBbmROZXdSb3V0ZTogc3RyaW5nID0gJy4uL2FkZCc7XHJcblx0cHVibGljIGxpc3RSb3V0ZTogc3RyaW5nID0gdGhpcy5hZGRTYXZlQW5kQ2xvc2VSb3V0ZTtcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGlkIG9mIHRoZSBpdGVtIHRvIGxvYWRcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgX2lkPzogbnVtYmVyIHwgc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaWQgb2YgdGhlIGl0ZW0gdG8gbG9hZFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCBpZCgpOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5faWQ7IH1cclxuXHRwdWJsaWMgc2V0IGlkKGlkOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuXHRcdGlmICh0aGlzLl9pZCAhPSBpZCkge1xyXG5cdFx0XHR0aGlzLl9pZCA9IGlkO1xyXG5cdFx0XHR0aGlzLmFjdGlvbiA9ICdlZGl0JztcclxuXHRcdFx0dGhpcy5pc0VkaXRNb2RlID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5saXN0Um91dGUgPSB0aGlzLmVkaXRTYXZlQW5kQ2xvc2VSb3V0ZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjdXJyZW50IGl0ZW0gdG8gYWRkIG9yIGVkaXRcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHByb3RlY3RlZCBfaXRlbT86IFRFbnRpdHk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjdXJyZW50IGl0ZW0gdG8gYWRkIG9yIGVkaXRcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgaXRlbSgpOiBURW50aXR5IHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2l0ZW07IH07XHJcblx0cHVibGljIHNldCBpdGVtKGl0ZW06IFRFbnRpdHkgfCB1bmRlZmluZWQpIHtcclxuXHRcdGlmICh0aGlzLl9pdGVtICE9IGl0ZW0pIHtcclxuXHRcdFx0dGhpcy5faXRlbSA9IGl0ZW07XHJcblx0XHRcdHRoaXMuaWQgPz89IGl0ZW0/LmlkO1xyXG5cdFx0XHR0aGlzLmJ1aWxkRmllbGRzKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXByZXNlbnRzIHRoZSByZXF1ZXN0IGVycm9yc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBlcnJvcnM6IEFycmF5PHN0cmluZz4gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbmNsdWRlc1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGluY2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGUgaW5jbHVkZXNcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyB1cGRhdGVJbmNsdWRlczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogUHJvamVjdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHByb2plY3Rpb24/OiBzdHJpbmdbXTtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0IHBhcmFtc1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHF1ZXJ5OiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgZGF0ZVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjdXJyZW50RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdGUgJiB0aW1lIG1hc2tcclxuXHQgKi9cclxuXHRwdWJsaWMgZGF0ZVRpbWVNYXNrID0gWy9bMC0zXS8sIC9bMC05XS8sICcuJywgL1swLTFdLywgL1swLTldLywgJy4nLCAyLCAwLCAvWzEtMl0vLCAvWzAtOV0vLCAnICcsIC9bMC0yXS8sIC9bMC05XS8sICc6JywgL1swLTVdLywgL1swLTldL107XHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdGUgbWFza1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBkYXRlTWFzayA9IFsvWzAtM10vLCAvWzAtOV0vLCAnLicsIC9bMC0xXS8sIC9bMC05XS8sICcuJywgMiwgMCwgL1sxLTJdLywgL1swLTldL107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRpbWUgbWFza1xyXG5cdCAqL1xyXG5cdHB1YmxpYyB0aW1lTWFzayA9IFsvWzAtMl0vLCAvWzAtOV0vLCAnOicsIC9bMC01XS8sIC9bMC05XS9dO1xyXG5cclxuXHQvKipcclxuXHQgKiBBIHBhdHRlcm4gdG8gdmFsaWRhdGUgZGF0ZXNcclxuXHQgKi9cclxuXHRwdWJsaWMgZGF0ZVBhdHRlcm46IHN0cmluZyA9IGAoPzooPzozMShcXFxcL3wtfFxcXFwuKSg/OjA/WzEzNTc4XXwxWzAyXSkpXFxcXDF8KD86KD86Mjl8MzApKFxcXFwvfC18XFxcXC4pKD86MD9bMSwzLTldfDFbMC0yXSlcXFxcMikpKD86KD86MVs2LTldfFsyLTldXFxcXGQpP1xcXFxkezJ9KSR8Xig/OjI5KFxcXFwvfC18XFxcXC4pMD8yXFxcXDMoPzooPzooPzoxWzYtOV18WzItOV1cXFxcZCk/KD86MFs0OF18WzI0NjhdWzA0OF18WzEzNTc5XVsyNl0pfCg/Oig/OjE2fFsyNDY4XVswNDhdfFszNTc5XVsyNl0pMDApKSkpJHxeKD86MD9bMS05XXwxXFxcXGR8MlswLThdKShcXFxcL3wtfFxcXFwuKSg/Oig/OjA/WzEtOV0pfCg/OjFbMC0yXSkpXFxcXDQoPzooPzoxWzYtOV18WzItOV1cXFxcZCk/XFxcXGR7Mn0pYDtcclxuXHJcblx0LyoqXHJcblx0ICogUGhvbmUgcHJlZml4IHZhbGlkYXRpb24gcGF0dGVyblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwaG9uZVByZWZpeFBhdHRlcm46IHN0cmluZyA9ICdeKDBcXFxcZHsyLDZ9KSQnO1xyXG5cclxuXHQvKipcclxuXHQgKiBQaG9uZSBudW1iZXIgdmFsaWRhdGlvbiBwYXR0ZXJuXHJcblx0ICovXHJcblx0cHVibGljIHBob25lTnVtYmVyUGF0dGVybjogc3RyaW5nID0gJ14oXFxcXGR7MywzMH0pJCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhc3N3b3JkIHZhbGlkYXRpb24gcGF0dGVyblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXNzd29yZFBhdHRlcm46IHN0cmluZyA9ICdeKD89LipbYS16XSkoPz0uKltBLVpdKSg/PS4qXFxcXGQpKD89LipbJEAkISUqPyYjLl0pW0EtWmEtelxcXFxkJEAkISUqPyYjLl17Nix9JztcclxuXHJcblx0LyoqXHJcblx0ICogRGVmYXVsdHMgbW9kdWxlcyBhbmQgdG9vbGJhclxyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0b3JPcHRpb25zID0ge1xyXG5cdFx0bW9kdWxlczoge1xyXG5cdFx0XHR0b29sYmFyOiBbXHJcblx0XHRcdFx0Wydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnXSxcclxuXHRcdFx0XHRbeyAnbGlzdCc6ICdvcmRlcmVkJyB9LCB7ICdsaXN0JzogJ2J1bGxldCcgfV0sXHJcblx0XHRcdFx0W3sgJ2luZGVudCc6ICctMScgfSwgeyAnaW5kZW50JzogJysxJyB9XSxcclxuXHRcdFx0XHRbeyAnc2l6ZSc6IFsnc21hbGwnLCBmYWxzZSwgJ2xhcmdlJywgJ2h1Z2UnXSB9XSxcclxuXHRcdFx0XHRbeyAnaGVhZGVyJzogWzEsIDIsIDMsIDQsIDUsIDYsIGZhbHNlXSB9XSxcclxuXHRcdFx0XHRbeyAnY29sb3InOiBuZXcgQXJyYXk8YW55PigpIH0sIHsgJ2JhY2tncm91bmQnOiBuZXcgQXJyYXk8YW55PigpIH1dLFxyXG5cdFx0XHRcdFsnbGluaycsICdpbWFnZSddXHJcblx0XHRcdF0sXHJcblx0XHRcdGNsaXBib2FyZDoge1xyXG5cdFx0XHRcdG1hdGNoVmlzdWFsOiBmYWxzZVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogSWYgdHJ1ZSwgc2hvdyB0aGUgbWVudSAnRGVsZXRlJ1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBkZWxldGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIG1lbnUgaXRlbXNcclxuXHQgKi9cclxuXHRwdWJsaWMgdG9vbGJhck1lbnVJdGVtczogQWN0aW9uSXRlbVtdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRvb2xiYXIgYWN0aW9uIGJ1dHRvbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgdG9vbGJhckFjdGlvbnM6IEFjdGlvbkl0ZW08VEVudGl0eSwgSUdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5Pj5bXSA9IFt7XHJcblx0XHRpY29uOiAncmVmcmVzaCcsXHJcblx0XHRldmVudDogKCkgPT4gdGhpcy5yZWxvYWRQYWdlKCksXHJcblx0fV07XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1hdFN0ZXBwZXIgcmVmXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTdGVwcGVyKVxyXG5cdHByb3RlY3RlZCBtYXRTdGVwcGVyPzogTWF0U3RlcHBlcjtcclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGlucHV0IGVsZW1lbnRcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdmb2N1cycpXHJcblx0cHVibGljIGlucHV0OiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9mb3JtOiBGb3JtR3JvdXBcclxuXHQgKi9cclxuXHRwdWJsaWMgX2Zvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcm0gZ3JvdXBcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgZm9ybSgpOiBOZ0Zvcm0gfCBGb3JtR3JvdXAgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZm9ybSB9O1xyXG5cdHB1YmxpYyBzZXQgZm9ybShmb3JtOiBOZ0Zvcm0gfCBGb3JtR3JvdXAgfCB1bmRlZmluZWQpIHtcclxuXHRcdHRoaXMuX2Zvcm0gPSBmb3JtO1xyXG5cdFx0dGhpcy5vbkFmdGVyRm9ybUJ1aWxkKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIGZvcm0gdmFsdWVcclxuXHQgKi9cclxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0IGZvcm1WYWx1ZSgpOiBURW50aXR5IHwgYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBmb3JtRGVmaW5pdGlvbjogRm9ybURlZmluaXRpb25cclxuXHQgKi9cclxuXHRwdWJsaWMgZm9ybURlZmluaXRpb24/OiBGb3JtRGVmaW5pdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogZmllbGRHcm91cHM6IEZvcm1GaWVsZEdyb3VwW11cclxuXHQgKi9cclxuXHRwdWJsaWMgZmllbGRHcm91cHM/OiBGb3JtRmllbGRHcm91cERlZmluaXRpb25bXTtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3JcclxuXHQgKiBAcGFyYW0gc2VydmljZSBcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHB1YmxpYyBlbnRpdHlDdG9yOiBUeXBlPFRFbnRpdHk+LFxyXG5cdFx0cHJvdGVjdGVkIHNlcnZpY2U6IFRTZXJ2aWNlLFxyXG5cdFx0cHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuXHRcdHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuXHQpIHtcclxuXHRcdHN1cGVyKHJvdXRlLCBjaGFuZ2VEZXRlY3RvclJlZik7XHJcblx0XHR0aGlzLmxpc3RSb3V0ZSA9IHRoaXMuYWRkU2F2ZUFuZENsb3NlUm91dGU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yLCBpbml0aWFsaXppbmcgaW5wdXQgcHJvcGVydGllcywgXHJcblx0ICogYW5kIHRoZSBmaXJzdCBjYWxsIHRvIG5nT25DaGFuZ2VzLlxyXG5cdCAqL1xyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0c3VwZXIubmdPbkluaXQoKTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgYSBjb21wb25lbnQncyB2aWV3IGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaGFuZGxlRXhwYW5zaW9uUGFuZWxDaGFuZ2VzID0gdGhpcy5pc0VkaXRNb2RlO1xyXG5cdFx0c3VwZXIubmdBZnRlclZpZXdJbml0KCk7XHJcblxyXG5cdFx0LyogU2V0IHBhZ2UgdGl0bGUgKi9cclxuXHRcdHRoaXMudGl0bGUgPSB0aGlzLnRpdGxlU2VydmljZS5nZXRUaXRsZSgpO1xyXG5cclxuXHRcdC8qIFNldCBmb2N1cyAqL1xyXG5cdFx0dGhpcy5mb2N1cygpO1xyXG5cclxuXHRcdC8qIFxyXG5cdFx0ICogRm9yY2UgYSBuZXcgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSBzaW5jZSBjaGFuZ2UgZGV0ZWN0aW9ucyBcclxuXHRcdCAqIGhhdmUgZmluaXNoZWQgd2hlbiBgbmdBZnRlclZpZXdJbml0YCBpcyBleGVjdXRlZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcblx0XHQvKiBMaXN0ZW4gZm9yIHN0ZXBwZXIgc2VsZWN0aW9uIGNoYW5nZXMgKi9cclxuXHRcdHRoaXMubWF0U3RlcHBlcj8uc2VsZWN0aW9uQ2hhbmdlPy5zdWJzY3JpYmUoKGV2ZW50OiBTdGVwcGVyU2VsZWN0aW9uRXZlbnQpID0+IHRoaXMub25BZnRlclN0ZXBDaGFuZ2UoZXZlbnQpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxlZCBiZWZvcmUgYW55IG90aGVyIGxpZmVjeWNsZSBob29rLiBVc2UgaXQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcywgXHJcblx0ICogYnV0IGF2b2lkIGFueSBzZXJpb3VzIHdvcmsgaGVyZS5cclxuXHQgKiBAcGFyYW0gY2hhbmdlcyBcclxuXHQgKi9cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcblx0XHRpZiAoXHJcblx0XHRcdChjaGFuZ2VzPy5pZD8uY3VycmVudFZhbHVlICYmIGNoYW5nZXMuaWQuY3VycmVudFZhbHVlICE9IGNoYW5nZXMuaWQucHJldmlvdXNWYWx1ZSkgfHxcclxuXHRcdFx0KGNoYW5nZXM/Lml0ZW0/LmN1cnJlbnRWYWx1ZSAmJiBjaGFuZ2VzLml0ZW0uY3VycmVudFZhbHVlICE9IGNoYW5nZXMuaXRlbS5wcmV2aW91c1ZhbHVlKVxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMubG9hZEl0ZW0oKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIGFuIGl0ZW0gYnkgSURcclxuXHQgKi9cclxuXHRwdWJsaWMgbG9hZEl0ZW0oKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuc2VydmljZT8uZW5kcG9pbnQpIHtcclxuXHRcdFx0dGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0dGhpcy5sb2FkSXRlbUFzeW5jKCkuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAoXykgPT4gdGhpcy5pc0xvYWRpbmcgPSBmYWxzZSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB0aGlzLnBhcnNlRXJyb3JzKGVycm9yKVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIGFuIGl0ZW0gYnkgSUQgYXN5bmNseVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBsb2FkSXRlbUFzeW5jKCk6IE9ic2VydmFibGU8VEVudGl0eT4ge1xyXG5cdFx0aWYgKHRoaXMuaWQpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuc2VydmljZS5nZXQodGhpcy5pZCwgT2JqZWN0LmFzc2lnbih0aGlzLnF1ZXJ5IHx8IHt9LCB7IGluY2x1ZGVzOiB0aGlzLmluY2x1ZGVzPy5sZW5ndGggPyB0aGlzLmluY2x1ZGVzIDogdGhpcy51cGRhdGVJbmNsdWRlcywgcHJvamVjdGlvbjogdGhpcy5wcm9qZWN0aW9uPy5qb2luKCcsJykgfSksIHsgJ0Rpc2FibGUtQ2FjaGUnOiAnWWVzJyB9KS5waXBlKFxyXG5cdFx0XHRcdG1hcCh4ID0+IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCB4KSksXHJcblx0XHRcdFx0dGFwKHggPT4ge1xyXG5cdFx0XHRcdFx0LyogU2V0IHRoZSBsb2FkZWQgaXRlbSAqL1xyXG5cdFx0XHRcdFx0dGhpcy5pdGVtID0gT2JqZWN0LmFzc2lnbih0aGlzLm5ld0luc3RhbmNlKCksIDxURW50aXR5PngpO1xyXG5cclxuXHRcdFx0XHRcdC8qIEJ1aWxkIHRoZSBmb3JtICovXHJcblx0XHRcdFx0XHR0aGlzLmJ1aWxkRm9ybSgpO1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyaWdnZXIgZXZlbnQgYWZ0ZXJJdGVtTG9hZGVkICovXHJcblx0XHRcdFx0XHR0aGlzLm9uQWZ0ZXJJdGVtTG9hZGVkKCk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbmV3IE9ic2VydmFibGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhdmVzIGRhdGEgaW50byBkYXRhYmFzZS5cclxuXHQgKiBAcGFyYW0gYWN0aW9uXHJcblx0ICovXHJcblx0cHVibGljIHNhdmUoYWN0aW9uOiBTYXZlQWN0aW9uID0gU2F2ZUFjdGlvbi5TYXZlQW5kQ2xvc2UsIGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdC8qIFZhbGlkYXRlIHRoZSBmb3JtICovXHJcblx0XHR0aGlzLnZhbGlkYXRlRm9ybShmb3JtKTtcclxuXHJcblx0XHQvKiBDaGVjayBpZiB0aGUgZm9ybSBpcyB2YWxpZCAqL1xyXG5cdFx0Zm9ybSA9IHRoaXMuZm9ybSB8fCBmb3JtO1xyXG5cdFx0aWYgKGZvcm0gJiYgIXRoaXMuaXNGb3JtVmFsaWQoZm9ybSkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIElmIHdlJ3JhIGluIGVkaXQgbW9kZSwgdXBkYXRlIHRoZSByZWNvcmQgKi9cclxuXHRcdGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuXHRcdFx0LyogVGhlIGRhdGEgaGFzIG5vdCBjaGFuZ2VkPyAqL1xyXG5cdFx0XHRpZiAoZm9ybSAmJiBmb3JtLnByaXN0aW5lKSB7XHJcblx0XHRcdFx0dGhpcy5vbkFmdGVyU3VibWl0KGFjdGlvbik7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBBIGZsYWcgdG8gcHJldmVudCBzZW5kaW5nIHRoZSBmb3JtIHR3aWNlICovXHJcblx0XHRcdHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0LyogU2VuZCB0aGUgZGF0YSB0byB0aGUgc2VydmVyICovXHJcblx0XHRcdHRoaXMudXBkYXRlKHsgcGFyYW1zOiBVdGlscy50b0h0dHBQYXJhbXMoeyBpbmNsdWRlczogdGhpcy51cGRhdGVJbmNsdWRlcyB9KSB9KS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdFx0LyogQXBwbHkgc2F2ZWQgZGF0YSB0byB0aGUgZm9ybSAqL1xyXG5cdFx0XHRcdFx0dGhpcy5vbkFmdGVyU3VibWl0KGFjdGlvbiwgcmVzcG9uc2UpO1xyXG5cclxuXHRcdFx0XHRcdC8qIElmIHRoZSB1c2VyIGNsaWNrcyAnYXBwbHknIHJlbG9hZCB0aGUgcGFnZSAqL1xyXG5cdFx0XHRcdFx0aWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRFZGl0KSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnJlbG9hZC5vYnNlcnZlZCkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVsb2FkLmVtaXQodGhpcy5mb3JtVmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVsb2FkUGFnZSgpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB0aGlzLnBhcnNlRXJyb3JzKGVycm9yKVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBPdGhlcndpc2UsIGNyZWF0ZSBhIG5ldyBvbmUgKi9cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHQvKiBBIGZsYWcgdG8gcHJldmVudCBzZW5kaW5nIHRoZSBmb3JtIHR3aWNlICovXHJcblx0XHRcdHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0LyogU2VuZCB0aGUgZGF0YSB0byB0aGUgc2VydmVyICovXHJcblx0XHRcdHRoaXMuY3JlYXRlPFRFbnRpdHk+KCkuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuaWQgPSByZXNwb25zZT8uaWQ7XHJcblx0XHRcdFx0XHR0aGlzLm9uQWZ0ZXJTdWJtaXQoYWN0aW9uLCByZXNwb25zZSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0T2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBjdHIgPSBmb3JtIS5jb250cm9sc1trZXldO1xyXG5cdFx0XHRcdFx0XHRcdGN0ci5tYXJrQXNQcmlzdGluZSgpO1xyXG5cdFx0XHRcdFx0XHRcdGN0ci5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHRcdFx0XHRcdFx0XHRjdHIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGVycm9yOiAoZXJyb3IpID0+IHRoaXMucGFyc2VFcnJvcnMoZXJyb3IpXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIERldGVjdCBjaGFuZ2VzICovXHJcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhdmVzIGRhdGEgYW5kIG5hdmlnYXRlcyB0byBlZGl0IHZpZXdcclxuXHQgKi9cclxuXHRwdWJsaWMgYXBwbHkoKTogdm9pZCB7XHJcblx0XHR0aGlzLnNhdmUoU2F2ZUFjdGlvbi5TYXZlQW5kRWRpdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIHRoZSBjdXJyZW50IHJlY29yZC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGVsZXRlKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zaG93RGVsZXRlSXRlbURpYWxvZygpLnN1YnNjcmliZSgoYWNjZXB0OiBib29sZWFuKSA9PiB7XHJcblx0XHRcdGlmIChhY2NlcHQgJiYgdGhpcy5pZCkge1xyXG5cdFx0XHRcdHRoaXMuc2VydmljZS5kZWxldGUodGhpcy5pZCEsIHVuZGVmaW5lZCwgeyBoZWFkZXJzOiB0aGlzLnRvSHR0cEhlYWRlcnMoeyAnU2hvdy1NZXNzYWdlJzogJ3llcycgfSkgfSlcclxuXHRcdFx0XHRcdC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmJhY2soKTtcclxuXHRcdFx0XHRcdH0sIGVycm9yID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5kZWJ1ZyhlcnJvcik7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbml0cyB0aGUgZm9ybVxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBpbml0KCk6IHZvaWQge1xyXG5cdFx0LyogR2V0IHRoZSBlbnRpdHkgSUQgZnJvbSB0aGUgcXVlcnkgKi9cclxuXHRcdGlmICghdGhpcy5pZCAmJiAhdGhpcy5pdGVtKSB7XHJcblx0XHRcdC8qIEFzc2lnbiBxdWVyeSBwYXJhbXMgaW50byBxdWVyeSBvYmplY3QgKi9cclxuXHRcdFx0bGV0IGlnbm9yZWRQYXJhbXM6IHN0cmluZ1tdID0gWydpZCcsICdyZXR1cm51cmwnLCAncGFuZWxJZCddO1xyXG5cdFx0XHRPYmplY3QuYXNzaWduKHRoaXMucXVlcnksXHJcblx0XHRcdFx0dGhpcy5zYW5pdGl6ZU9iamVjdCh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcyB8fCB7fSwgLi4uaWdub3JlZFBhcmFtcyksXHJcblx0XHRcdFx0dGhpcy5zYW5pdGl6ZU9iamVjdCh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGE/LnF1ZXJ5IHx8IHt9LCAuLi5pZ25vcmVkUGFyYW1zKSxcclxuXHRcdFx0XHR0aGlzLnNhbml0aXplT2JqZWN0KHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfHwge30sIC4uLmlnbm9yZWRQYXJhbXMpXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHQvKiBHZXQgaWQgZnJvbSB0aGUgdXJsICovXHJcblx0XHRcdGxldCBpZCA9IDxhbnk+dGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJyk7XHJcblx0XHRcdGlmIChpZCA+IDApIHtcclxuXHRcdFx0XHR0aGlzLmlkID0gaWQ7XHJcblx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuaWQgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdD8uZGF0YT8uaWQpIHtcclxuXHRcdFx0XHR0aGlzLmlkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdD8uZGF0YT8uaWQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMub25BZnRlclNldElkKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBURW50aXR5ICovXHJcblx0XHRpZiAoIXRoaXMuaXNFZGl0TW9kZSAmJiAhdGhpcy5mb3JtKSB7XHJcblx0XHRcdHRoaXMuaXRlbSA9IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCB0aGlzLml0ZW0gfHwge30sIHRoaXMucXVlcnkgfHwge30pO1xyXG5cdFx0XHR0aGlzLmJ1aWxkRm9ybSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNldCBwYW5lbCBJRCBmcm9tIHF1ZXJ5ICovXHJcblx0XHR0aGlzLnN1YnRpdGxlIHx8PSB0aGlzLnJvdXRlLnNuYXBzaG90Py5kYXRhPy5zdWJ0aXRsZTtcclxuXHJcblx0XHQvKiBBZGQgbGlzdCBtbmV1IGl0ZW1zICovXHJcblx0XHR0aGlzLmFkZFRvb2xiYXJNZW51SXRlbXMoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ1aWxkcyB0aGUgZm9ybSBmaWVsZHNcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgYnVpbGRGaWVsZHMoKTogdm9pZCB7XHJcblx0XHQvKiBHZXQgZm9ybSBkZWZpbml0aW9uICovXHJcblx0XHR0aGlzLmZvcm1EZWZpbml0aW9uID0gZ2V0Rm9ybURlZmluaXRpb24odGhpcy5uZXdJbnN0YW5jZSgpKTtcclxuXHJcblx0XHQvKiBTZXQgaW5jbHVkZXMgZnJvbSBmb3JtIGRlZmluaXRpb24sIGlmIGFueSAqL1xyXG5cdFx0dGhpcy5mb3JtRGVmaW5pdGlvbj8uaW5jbHVkZXM/LmZvckVhY2goeCA9PiB0aGlzLmluY2x1ZGUoeC5lbnRpdHksIHgudXBkYXRlKSk7XHJcblxyXG5cdFx0LyogQWRkIHRvb2xiYXIgbWVudSBpdGVtcywgaWYgYW55ICovXHJcblx0XHRpZiAodGhpcy5mb3JtRGVmaW5pdGlvbj8udG9vbGJhck1lbnVJdGVtcz8ubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcyA/Pz0gW107XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcyA9IHRoaXMudG9vbGJhck1lbnVJdGVtcy5jb25jYXQoLi4udGhpcy5mb3JtRGVmaW5pdGlvbj8udG9vbGJhck1lbnVJdGVtcyk7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcy5mb3JFYWNoKCh4LCBpKSA9PiB4LmluZGV4ID8/PSBpKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBDcmVhdGUgdGhlIGZyb20gZmllbGRzIHVzaW5nIHRoZSBlbnRpdHkgdHlwZSAqL1xyXG5cdFx0dGhpcy5maWVsZEdyb3VwcyA9IHRoaXMuZm9ybURlZmluaXRpb24/LmZpZWxkR3JvdXBzPy5maWx0ZXIoeCA9PiAheC5oaWRkZW4pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQnVpbGRzIGEgbmV3IGZvcm1cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgYnVpbGRGb3JtKCk6IHZvaWQgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFZhbGlkYXRlcyB0aGUgZm9ybVxyXG5cdCAqIEBwYXJhbSBmb3JtIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB2YWxpZGF0ZUZvcm0oZm9ybT86IE5nRm9ybSB8IEZvcm1Hcm91cCk6IHZvaWQge1xyXG5cdFx0dmFyIGZvcm0gPSBmb3JtIHx8IHRoaXMuZm9ybTtcclxuXHJcblx0XHQvKiBTZXQgdGhlIGZvcm0gYXMgc3VibWl0dGVkICovXHJcblx0XHRpZiAoZm9ybSAmJiBmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcblx0XHRcdC8qIFNldCBmb3JtIGFzIHN1Ym1pdHRlZCAqL1xyXG5cdFx0XHQoZm9ybSBhcyBhbnkpWydzdWJtaXR0ZWQnXSA9IHRydWU7XHJcblxyXG5cdFx0XHQvKiBVcGRhdGUgdmFsdWUgYW5kIHZhbGlkaXR5ICovXHJcblx0XHRcdGZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFByaW50IHNvbWUgZGVidWcgaW5mb3JtYXRpb24gKi9cclxuXHRcdHRoaXMuZGVidWdGb3JtKGZvcm0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVmFsaWRhdGVzIHRoZSBmb3JtXHJcblx0ICogQHBhcmFtIGZvcm0gXHJcblx0ICovXHJcblx0cHVibGljIGlzRm9ybVZhbGlkKGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiBib29sZWFuIHtcclxuXHRcdC8qIFByaW50IHNvbWUgZGVidWcgaW5mb3JtYXRpb24gKi9cclxuXHRcdHRoaXMuZGVidWdGb3JtKGZvcm0pO1xyXG5cclxuXHRcdC8qIElmIHRoZSBmb3JtIGlzdCBub3QgdmFsaWQuLiAqL1xyXG5cdFx0aWYgKGZvcm0gJiYgIWZvcm0udmFsaWQpIHtcclxuXHRcdFx0LyogTWFyayBpbnZhbGlkIGNvbnRyb2xzIGFzIGRpcnR0eSBhbmQgdG91Y2hlZCAqL1xyXG5cdFx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKVxyXG5cdFx0XHRcdC5maWx0ZXIoeCA9PiAhZm9ybS5jb250cm9sc1t4XS52YWxpZClcclxuXHRcdFx0XHQuZm9yRWFjaChrZXkgPT4gdGhpcy5pbnZhbGlkYXRlQ29udHJvbChmb3JtLmNvbnRyb2xzW2tleV0pKTtcclxuXHJcblx0XHRcdC8qIFNob3cgZXJyb3IgbWVzc2FnZXMgKi9cclxuXHRcdFx0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHQvKiBXYWl0IHVudGlsICdtYXQtZXJyb3InIGRpc3BsYXllZCAqL1xyXG5cdFx0XHRcdGF3YWl0IG5ldyBQcm9taXNlKHkgPT4gc2V0VGltZW91dCh5LCAyMDApKTtcclxuXHJcblx0XHRcdFx0LyogUGFyc2UgdGhlIGVycm9yIG1lc3NhZ2VzICovXHJcblx0XHRcdFx0dmFyIGVycm9ycyA9IEFycmF5PHN0cmluZz4oKTtcclxuXHRcdFx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKVxyXG5cdFx0XHRcdFx0LmZpbHRlcih4ID0+ICFmb3JtLmNvbnRyb2xzW3hdLnZhbGlkKVxyXG5cdFx0XHRcdFx0LmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0XHRcdFx0LyogR2V0IGVycm9yIHRleHQgKi9cclxuXHRcdFx0XHRcdFx0dmFyIGVycm9yID0gdGhpcy5nZXRFbGVtZW50RXJyb3IoKGZvcm0uY29udHJvbHNba2V5XSBhcyBhbnkpPy5uYXRpdmVFbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0aWYgKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3JzLnB1c2goZXJyb3IpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0LyogQnVpbGQgZXJyb3IgbWVzc2FnZSAqL1xyXG5cdFx0XHRcdHZhciBtZXNzYWdlID0gZXJyb3JzLmxlbmd0aCA/IGVycm9ycy5zbGljZSgwLCAzKS5qb2luKCdcXG4nKSA6ICRsb2NhbGl6ZWA6QEBzbmFja2Jhci5lcnJvci5yZXF1aXJlZC1maWVsZHM6QWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIHJlcXVpcmVkLmA7XHJcblxyXG5cdFx0XHRcdC8qIHNob3cgYSBub3RpY2UgKi9cclxuXHRcdFx0XHR0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKG1lc3NhZ2UsICdPaycsIHsgZHVyYXRpb246IDMwMDAsIHBhbmVsQ2xhc3M6IFsnZXJyb3InXSB9KTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH0pKCk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgZm9ybSBjb250cm9sc1xyXG5cdCAqIEBwYXJhbSBmb3JtIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyByZXNldEZvcm0oZm9ybTogTmdGb3JtKTogdm9pZCB7XHJcblx0XHRpZiAoIWZvcm0pIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0bGV0IGN0ciA9IGZvcm0uY29udHJvbHNba2V5XTtcclxuXHRcdFx0Y3RyLm1hcmtBc1ByaXN0aW5lKCk7XHJcblx0XHRcdGN0ci5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHRcdFx0Y3RyLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW52YWxpZGF0ZSBjb250cm9scyByZWN1cnNpdmVseVxyXG5cdCAqIEBwYXJhbSBjb250cm9sIFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBpbnZhbGlkYXRlQ29udHJvbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcclxuXHRcdC8qIENoZWNrIHRoZSBjb250cm9sIGFnYWluc3QgbnVsbCAqL1xyXG5cdFx0aWYgKCFjb250cm9sKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBDaGVjayBpZiB0aGUgY29udHJvbCBpcyBhIGdyb3VwICovXHJcblx0XHRsZXQgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XHJcblx0XHRpZiAoZm9ybUdyb3VwPy5jb250cm9scykge1xyXG5cdFx0XHRPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpXHJcblx0XHRcdFx0LmZpbHRlcih4ID0+ICFmb3JtR3JvdXAuY29udHJvbHNbeF0udmFsaWQpXHJcblx0XHRcdFx0LmZvckVhY2goeCA9PiB0aGlzLmludmFsaWRhdGVDb250cm9sKGZvcm1Hcm91cC5jb250cm9sc1t4XSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG5cdFx0XHRjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3dzIGZvcm0gZXJyb3JzXHJcblx0ICogQHBhcmFtIGZvcm0gXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGRlYnVnRm9ybShmb3JtPzogTmdGb3JtIHwgRm9ybUdyb3VwKTogdm9pZCB7XHJcblx0XHRpZiAoZm9ybSAmJiB0aGlzLmRlYnVnKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdGb3JtOicsIGZvcm0pO1xyXG5cdFx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY29udHJvbEVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPSBmb3JtLmNvbnRyb2xzW2tleV0uZXJyb3JzO1xyXG5cdFx0XHRcdGlmIChjb250cm9sRXJyb3JzICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdE9iamVjdC5rZXlzKGNvbnRyb2xFcnJvcnMpLmZvckVhY2goa2V5RXJyb3IgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZygnS2V5IGNvbnRyb2w6ICcgKyBrZXkgKyAnLCBrZXlFcnJvcjogJyArIGtleUVycm9yICsgJywgZXJyIHZhbHVlOiAnLCBjb250cm9sRXJyb3JzW2tleUVycm9yXSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkIHRvb2xiYXIgbWVudSBpdGVtc1xyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBhZGRUb29sYmFyTWVudUl0ZW1zKCk6IHZvaWQge1xyXG5cdFx0LyogQWRkICdEZWxldGUnIG1lbnUgaXRlbSAqL1xyXG5cdFx0aWYgKHRoaXMuZGVsZXRhYmxlKSB7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcy5wdXNoKHtcclxuXHRcdFx0XHR0aXRsZTogJGxvY2FsaXplYDpAQGRlbGV0ZTpEZWxldGVgLFxyXG5cdFx0XHRcdGljb246ICdkZWxldGVfZm9yZXZlcicsXHJcblx0XHRcdFx0aWNvbkNsYXNzOiAndGMtb3JhbmdlLTgwMCcsXHJcblx0XHRcdFx0ZXZlbnQ6ICgpID0+IHRoaXMuZGVsZXRlKCksXHJcblx0XHRcdFx0ZGlzYWJsZTogKCkgPT4gIXRoaXMuaWQsXHJcblx0XHRcdFx0aGlkZTogKCkgPT4gIXRoaXMuY2FuRGVsZXRlSXRlbSgpLFxyXG5cdFx0XHRcdGluZGV4OiAxMDAwXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnRvb2xiYXJNZW51SXRlbXMubGVuZ3RoKSB7XHJcblx0XHRcdC8qIFNvcnQgdGhlIG1lbnUgaXRlbXMgYnkgaW5kZXggKi9cclxuXHRcdFx0VXRpbHMuc29ydEFycmF5KHRoaXMudG9vbGJhck1lbnVJdGVtcywgJ2luZGV4Jyk7XHJcblxyXG5cdFx0XHQvKiBBZGQgdGhlIHRvb2xiYXIgbWVudSBpdGVtcyB0byB0aGUgdGhlIHRvb2xiYXIgYWN0aW9ucyAqL1xyXG5cdFx0XHR0aGlzLnRvb2xiYXJBY3Rpb25zLnB1c2goeyBpY29uOiAnbW9yZV92ZXJ0JywgaXRlbXM6IHRoaXMudG9vbGJhck1lbnVJdGVtcyB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIHRoZSBwcmV2aW91cyBVUkwgaW4gdGhlIGhpc3RvcnkgbGlzdC5cclxuXHQgKiBAcGFyYW0gYWN0aW9uXHJcblx0ICovXHJcblx0cHVibGljIGJhY2soYWN0aW9uOiBTYXZlQWN0aW9uID0gU2F2ZUFjdGlvbi5TYXZlQW5kQ2xvc2UpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnJlbG9hZC5vYnNlcnZlZCkge1xyXG5cdFx0XHR0aGlzLnJlbG9hZC5lbWl0KHRoaXMuZm9ybVZhbHVlKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmIChhY3Rpb24gPT0gU2F2ZUFjdGlvbi5TYXZlQW5kQ2xvc2UgJiYgdGhpcy5yZXR1cm5VcmwpIHtcclxuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9SZXR1cm5VcmwoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcblx0XHRcdFx0XHRpZiAoYWN0aW9uID09IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMubG9jYXRpb24uYmFjaygpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24gPT0gU2F2ZUFjdGlvbi5TYXZlQW5kRWRpdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlbG9hZFBhZ2UoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmxvY2F0aW9uLmJhY2soKTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uID09IFNhdmVBY3Rpb24uU2F2ZUFuZEVkaXQgJiYgPG51bWJlcj50aGlzLmlkID4gMCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dGhpcy5hZGRTYXZlQW5kRWRpdFJvdXRlfSR7dGhpcy5pZH1gXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24gPT0gU2F2ZUFjdGlvbi5TYXZlQW5kTmV3KSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuYWZ0ZXJSZWxvYWQoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgcmV0dXJuIHVybFxyXG5cdCAqIEBwYXJhbSByZXR1cm5VcmwgXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNldFJldHVyblVybChyZXR1cm5Vcmw6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0c3VwZXIuc2V0UmV0dXJuVXJsKHJldHVyblVybCk7XHJcblx0XHR0aGlzLmxpc3RSb3V0ZSA9IHRoaXMucmV0dXJuVXJsIHx8IHRoaXMubGlzdFJvdXRlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVEVudGl0eVxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBuZXdJbnN0YW5jZShpbml0PzogUGFydGlhbDxURW50aXR5Pik6IFRFbnRpdHkge1xyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmVudGl0eUN0b3IoaW5pdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIHRoZSBlbnRpdHlcclxuXHQgKiBAcGFyYW0gaHR0cE9wdGlvbnMgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGNyZWF0ZTxURW50aXR5PihodHRwT3B0aW9ucz86IE9iamVjdCk6IE9ic2VydmFibGU8VEVudGl0eT4ge1xyXG5cdFx0dGhpcy5vbkJlZm9yZUNyZWF0ZSgpO1xyXG5cdFx0cmV0dXJuIHRoaXMuc2VydmljZS5jcmVhdGU8VEVudGl0eT4oXHJcblx0XHRcdHRoaXMuZm9ybVZhbHVlLFxyXG5cdFx0XHR1bmRlZmluZWQsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24oaHR0cE9wdGlvbnMgfHwge30sIHsgaGVhZGVyczogdGhpcy50b0h0dHBIZWFkZXJzKHsgJ1Nob3ctTWVzc2FnZSc6ICd5ZXMnIH0pIH0pLFxyXG5cdFx0XHRmYWxzZVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGVudGl0eVxyXG5cdCAqIEBwYXJhbSBodHRwT3B0aW9ucyBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgdXBkYXRlKGh0dHBPcHRpb25zPzogT2JqZWN0KTogT2JzZXJ2YWJsZTxURW50aXR5PiB7XHJcblx0XHR0aGlzLm9uQmVmb3JlVXBkYXRlKCk7XHJcblx0XHRyZXR1cm4gdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0aGlzLmlkISxcclxuXHRcdFx0T2JqZWN0LmFzc2lnbih0aGlzLml0ZW0hLCB0aGlzLmZvcm1WYWx1ZSksXHJcblx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0T2JqZWN0LmFzc2lnbihodHRwT3B0aW9ucyB8fCB7fSwgeyBoZWFkZXJzOiB0aGlzLnRvSHR0cEhlYWRlcnMoeyAnU2hvdy1NZXNzYWdlJzogJ3llcycgfSksIH0pLFxyXG5cdFx0XHRmYWxzZVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluY2x1ZGVzIHNvbWUgbmF2aWdhdGlvbnNcclxuXHQgKiBAcGFyYW0gaW5jIFxyXG5cdCAqIEBwYXJhbSB1cGRhdGUgXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGluY2x1ZGUoaW5jOiBzdHJpbmcsIHVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblx0XHR0aGlzLmluY2x1ZGVzLnB1c2goaW5jKTtcclxuXHRcdGlmICh1cGRhdGUpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVJbmNsdWRlcy5wdXNoKGluYyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVjayBpZiB0aGUgaXRlbSBpcyBkZWxldGFibGVcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgY2FuRGVsZXRlSXRlbSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY2FuRGVsZXRlICYmICghdGhpcy5pdGVtPy5oYXNPd25Qcm9wZXJ0eSgnZGVsZXRhYmxlJykgfHwgKHRoaXMuaXRlbSBhcyBhbnkpWydkZWxldGFibGUnXSk7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBpZCBpcyBzZXQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG9uQWZ0ZXJTZXRJZCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmlkKSB7XHJcblx0XHRcdHRoaXMubG9hZEl0ZW0oKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgc3RlcCBoYXMgY2hhbmdlZC5cclxuXHQgKiBAcGFyYW0gJGV2ZW50IFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyU3RlcENoYW5nZSgkZXZlbnQ6IFN0ZXBwZXJTZWxlY3Rpb25FdmVudCk6IHZvaWQgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZW50aXR5IGhhcyBiZWVuIGxvYWRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25BZnRlckl0ZW1Mb2FkZWQoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCBiZWZvcmUgdGhlIGZvcm0gaGFzIGJ1aWx0LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkJlZm9yZUZvcm1CdWlsZCgpOiB2b2lkIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGZvcm0gaGFzIGJ1aWx0LlxyXG5cdCAqIERpc2FibGVzIHRoZSBmb3JtIGNvbnRyb2xzLCBpZiBbZGlzYWJsZV0gaXMgdHJ1ZVxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyRm9ybUJ1aWxkKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZm9ybSAmJiB0aGlzLmRpc2FibGVkKSB7XHJcblx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdGxldCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSB0aGlzLmZvcm0hLmNvbnRyb2xzW2tleV07XHJcblx0XHRcdFx0Y29udHJvbD8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGUoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlbnRpdHkgaGFzIGJlZW4gdXBkYXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25CZWZvcmVVcGRhdGUoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGVkIGJlZm9yZSBkYXRhIHN1Ym1pdGlvblxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBiZWZvcmVTdWJtaXQoXzogU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCBhZnRlciBkYXRhIHN1Ym1pdGlvblxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gXHJcblx0ICogQHBhcmFtIHJlc3BvbnNlIFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyU3VibWl0KGFjdGlvbjogU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlLCByZXNwb25zZTogYW55ID0gbnVsbCk6IHZvaWQge1xyXG5cdFx0dGhpcy5pc1NhdmluZyA9IGZhbHNlO1xyXG5cdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0XHR0aGlzLmJhY2soYWN0aW9uKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxlZCBhZnRlciBwYWdlIHJlbG9hZGVkXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGFmdGVyUmVsb2FkKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5pdGVtID0gT2JqZWN0LmFzc2lnbih0aGlzLm5ld0luc3RhbmNlKCksIHRoaXMucXVlcnkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBmb2N1cyB0byBmaXJzdCBpbnB1dFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBmb2N1cygpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmlucHV0ICYmIHRoaXMuaW5wdXQuZmlyc3QgJiYgdGhpcy5pbnB1dC5maXJzdC5uYXRpdmVFbGVtZW50KSB7XHJcblx0XHRcdHRoaXMuaW5wdXQuZmlyc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBlbGVtZW50IGVycm9yXHJcblx0ICogQHBhcmFtIG5hdGl2ZUVsZW1lbnQgXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldEVsZW1lbnRFcnJvcihuYXRpdmVFbGVtZW50OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG5cdFx0LyogR2V0IHBhcmFuZXQgZWxlbWVudCAnbWF0LWZvcm0tZmllbGQnICovXHJcblx0XHR2YXIgbWF0Rm9ybUZpZWxkID0gbmF0aXZlRWxlbWVudD8uY2xvc2VzdCgnLm1hdC1mb3JtLWZpZWxkJyk7XHJcblx0XHRpZiAoIW1hdEZvcm1GaWVsZCkge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEdldCBjaGlsZCBlbGVtZW50ICdtYXQtZXJyb3InICovXHJcblx0XHR2YXIgbWF0RXJyb3JzID0gbWF0Rm9ybUZpZWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtZXJyb3InKTtcclxuXHRcdGlmICghbWF0RXJyb3JzKSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogR2V0IGNoaWxkIGVsZW1lbnQgJ21hdC1sYWJlbCcgKi9cclxuXHRcdHZhciBtYXRMYWJlbCA9IG1hdEZvcm1GaWVsZC5xdWVyeVNlbGVjdG9yKCdtYXQtbGFiZWwnKTtcclxuXHRcdGlmICghbWF0TGFiZWwpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBHZXQgZXJyb3IgdGV4dHMgKi9cclxuXHRcdHZhciBlcnJvcnNBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG1hdEVycm9ycylcclxuXHRcdFx0Py5maWx0ZXIoKHg6IGFueSkgPT4geC50ZXh0Q29udGVudClcclxuXHRcdFx0Py5tYXAoKHg6IGFueSkgPT4geC50ZXh0Q29udGVudCk7XHJcblxyXG5cdFx0cmV0dXJuIGAnJHttYXRMYWJlbC50ZXh0Q29udGVudH0nOiAke2Vycm9yc0FycmF5Py5qb2luKCcsICcpfWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNwb25kcyB0byB1c2VyLWluaXRpYXRlZCBldmVudHNcclxuXHQgKiBAcGFyYW0gZXZlbnQgXHJcblx0ICovXHJcblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcblx0aGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG5cdFx0aWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xyXG5cdFx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRcdGNhc2UgJ3MnOlxyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdHRoaXMuc2F2ZShTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnZCc6XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0dGhpcy5zYXZlKFNhdmVBY3Rpb24uU2F2ZUFuZE5ldyk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnZSc6XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0dGhpcy5zYXZlKFNhdmVBY3Rpb24uU2F2ZUFuZEVkaXQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKiBDYW5jZWwgdGhlIGZvcm0sIGlmIHRoZSB1c2VyIHByZXNzIHRoZSBFU0Mga2V5ICovXHJcblx0XHRpZiAoZXZlbnQua2V5Q29kZSA9PSAyNykge1xyXG5cdFx0XHR0aGlzLmJhY2soKTtcclxuXHRcdH1cclxuXHR9XHJcbn0iXX0=
815
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1mb3JtLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvYmFzZS9jb21wb25lbnRzL2dlbmVyaWMtZm9ybS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQTRCLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNJLE9BQU8sRUFBbUIsU0FBUyxFQUE0QixNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7QUFFakQsV0FBVztBQUVYLE1BQU0sT0FBZ0Isd0JBQTRGLFNBQVEsYUFBYTtJQXVPOUg7SUFDRztJQUNBO0lBQ0E7SUF6T1g7O0dBRUU7SUFDSyxNQUFNLEdBQVcsS0FBSyxDQUFDO0lBRTlCOztPQUVHO0lBQ0ksVUFBVSxHQUFZLEtBQUssQ0FBQztJQUVuQzs7T0FFRztJQUNJLFVBQVUsR0FBc0IsVUFBVSxDQUFDO0lBRWxEOztPQUVHO0lBQ0kscUJBQXFCLEdBQVcsUUFBUSxDQUFDO0lBQ3pDLG9CQUFvQixHQUFXLEtB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RUFBRSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQztJQUNGLENBQUM7MEhBejRCb0Isd0JBQXdCOzhHQUF4Qix3QkFBd0Isa1dBeUxsQyxVQUFVOzsyRkF6TEEsd0JBQXdCO2tCQUQ3QyxTQUFTOzJKQW1DRSxFQUFFO3NCQURaLEtBQUs7Z0JBZUksS0FBSztzQkFEZCxLQUFLO2dCQU9LLElBQUk7c0JBRGQsS0FBSztnQkFtQkMsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLGNBQWM7c0JBRHBCLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxLQUFLO3NCQURYLEtBQUs7Z0JBT0MsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLFFBQVE7c0JBRGQsS0FBSztnQkFxRkksVUFBVTtzQkFEbkIsU0FBUzt1QkFBQyxVQUFVO2dCQU9kLEtBQUs7c0JBRFgsWUFBWTt1QkFBQyxPQUFPO2dCQVlWLElBQUk7c0JBRGQsS0FBSztnQkF1cUJOLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0ZXBwZXJTZWxlY3Rpb25FdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zdGVwcGVyJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVHlwZSwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIE5nRm9ybSwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0U3RlcHBlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3N0ZXBwZXInO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlscyc7XHJcbmltcG9ydCB7IEFjdGlvbkl0ZW0gfSBmcm9tICcuLi8uLi9jb21tb24vbW9kZWxzL2FjdGlvbi1pdGVtJztcclxuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvZW50aXR5JztcclxuaW1wb3J0IHsgU2F2ZUFjdGlvbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvc2F2ZS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBnZXRGb3JtRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1zL2Z1bmN0aW9ucy9mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBGb3JtRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1zL21vZGVscy9mb3JtLWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBGb3JtRmllbGRHcm91cERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9mb3Jtcy9tb2RlbHMvZm9ybS1maWVsZC1ncm91cC1kZWZpbml0aW9uJztcclxuaW1wb3J0IHsgR2VuZXJpY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9odHRwL3NlcnZpY2VzL2dlbmVyaWMuc2VydmljZSc7XHJcbmltcG9ydCB7IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2lnZW5lcmljLWZvcm0tYmFzZSc7XHJcbmltcG9ydCB7IEJhc2VDb21wb25lbnQgfSBmcm9tICcuL2Jhc2UuY29tcG9uZW50JztcclxuXHJcbi8vIEBkeW5hbWljXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHkgZXh0ZW5kcyBJRW50aXR5LCBUU2VydmljZSBleHRlbmRzIEdlbmVyaWNTZXJ2aWNlPFRFbnRpdHk+PiBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+LCBPbkNoYW5nZXMge1xyXG5cdC8qKlxyXG4gKiBUaGUgYWN0aW9uIG9mIHRoZSBmb3JtIChhZGQgfCBlZGl0KS5cclxuICovXHJcblx0cHVibGljIGFjdGlvbjogc3RyaW5nID0gJ2FkZCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyBpZiB0aGUgZm9ybSBpcyBpbiBlZGl0IG1vZGUuXHJcblx0ICovXHJcblx0cHVibGljIGlzRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogU2F2ZSBhY3Rpb24gZW51bWVyYXRpb24uXHJcblx0ICovXHJcblx0cHVibGljIFNhdmVBY3Rpb246IHR5cGVvZiBTYXZlQWN0aW9uID0gU2F2ZUFjdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogTmF2aWdhdGlvbiByb3V0ZXMuXHJcblx0ICovXHJcblx0cHVibGljIGVkaXRTYXZlQW5kQ2xvc2VSb3V0ZTogc3RyaW5nID0gJy4uLy4uLyc7XHJcblx0cHVibGljIGFkZFNhdmVBbmRDbG9zZVJvdXRlOiBzdHJpbmcgPSAnLi4vJztcclxuXHRwdWJsaWMgYWRkU2F2ZUFuZEVkaXRSb3V0ZTogc3RyaW5nID0gJy4uL2VkaXQvJztcclxuXHRwdWJsaWMgYWRkU2F2ZUFuZE5ld1JvdXRlOiBzdHJpbmcgPSAnLi4vYWRkJztcclxuXHRwdWJsaWMgbGlzdFJvdXRlOiBzdHJpbmcgPSB0aGlzLmFkZFNhdmVBbmRDbG9zZVJvdXRlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gbG9hZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgX2lkPzogbnVtYmVyIHwgc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gbG9hZC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2lkOyB9XHJcblx0cHVibGljIHNldCBpZChpZDogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcblx0XHRpZiAodGhpcy5faWQgIT09IGlkKSB7XHJcblx0XHRcdHRoaXMuX2lkID0gaWQ7XHJcblx0XHRcdHRoaXMuYWN0aW9uID0gJ2VkaXQnO1xyXG5cdFx0XHR0aGlzLmlzRWRpdE1vZGUgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmxpc3RSb3V0ZSA9IHRoaXMuZWRpdFNhdmVBbmRDbG9zZVJvdXRlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgaXRlbSB0byBhZGQgb3IgZWRpdC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHByb3RlY3RlZCBfaXRlbT86IFRFbnRpdHk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjdXJyZW50IGl0ZW0gdG8gYWRkIG9yIGVkaXQuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGl0ZW0oKTogVEVudGl0eSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9pdGVtOyB9XHJcblx0cHVibGljIHNldCBpdGVtKGl0ZW06IFRFbnRpdHkgfCB1bmRlZmluZWQpIHtcclxuXHRcdGlmICh0aGlzLl9pdGVtICE9PSBpdGVtKSB7XHJcblx0XHRcdHRoaXMuX2l0ZW0gPSBpdGVtO1xyXG5cdFx0XHR0aGlzLmlkID8/PSBpdGVtPy5pZDtcclxuXHRcdFx0dGhpcy5idWlsZEZpZWxkcygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgcmVxdWVzdCBlcnJvcnMuXHJcblx0ICovXHJcblx0cHVibGljIGVycm9yczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluY2x1ZGVzIGZpZWxkcyBmb3IgcXVlcnkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgaW5jbHVkZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSBpbmNsdWRlcyBmaWVsZHMgZm9yIHF1ZXJ5LlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHVwZGF0ZUluY2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0aW9uIGZpZWxkcyBmb3IgcXVlcnkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcHJvamVjdGlvbj86IHN0cmluZ1tdO1xyXG5cclxuXHQvKipcclxuXHQgKiBRdWVyeSBwYXJhbWV0ZXJzLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHF1ZXJ5OiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVhZC1vbmx5IGZsYWcuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGlzYWJsZWQgZmxhZy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY3VycmVudCBkYXRlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjdXJyZW50RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdGUgJiB0aW1lIGlucHV0IG1hc2suXHJcblx0ICovXHJcblx0cHVibGljIGRhdGVUaW1lTWFzayA9IFsvWzAtM10vLCAvWzAtOV0vLCAnLicsIC9bMC0xXS8sIC9bMC05XS8sICcuJywgMiwgMCwgL1sxLTJdLywgL1swLTldLywgJyAnLCAvWzAtMl0vLCAvWzAtOV0vLCAnOicsIC9bMC01XS8sIC9bMC05XS9dO1xyXG5cclxuXHQvKipcclxuXHQgKiBEYXRlIGlucHV0IG1hc2suXHJcblx0ICovXHJcblx0cHVibGljIGRhdGVNYXNrID0gWy9bMC0zXS8sIC9bMC05XS8sICcuJywgL1swLTFdLywgL1swLTldLywgJy4nLCAyLCAwLCAvWzEtMl0vLCAvWzAtOV0vXTtcclxuXHJcblx0LyoqXHJcblx0ICogVGltZSBpbnB1dCBtYXNrLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0aW1lTWFzayA9IFsvWzAtMl0vLCAvWzAtOV0vLCAnOicsIC9bMC01XS8sIC9bMC05XS9dO1xyXG5cclxuXHQvKipcclxuXHQgKiBEYXRlIHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGF0ZVBhdHRlcm46IHN0cmluZyA9IGAoPzooPzozMShcXFxcL3wtfFxcXFwuKSg/OjA/WzEzNTc4XXwxWzAyXSkpXFxcXDF8KD86KD86Mjl8MzApKFxcXFwvfC18XFxcXC4pKD86MD9bMSwzLTldfDFbMC0yXSlcXFxcMikpKD86KD86MVs2LTldfFsyLTldXFxcXGQpP1xcXFxkezJ9KSR8Xig/OjI5KFxcXFwvfC18XFxcXC4pMD8yXFxcXDMoPzooPzooPzoxWzYtOV18WzItOV1cXFxcZCk/KD86MFs0OF18WzI0NjhdWzA0OF18WzEzNTc5XVsyNl0pfCg/Oig/OjE2fFsyNDY4XVswNDhdfFszNTc5XVsyNl0pMDApKSkpJHxeKD86MD9bMS05XXwxXFxcXGR8MlswLThdKShcXFxcL3wtfFxcXFwuKSg/Oig/OjA/WzEtOV0pfCg/OjFbMC0yXSkpXFxcXDQoPzooPzoxWzYtOV18WzItOV1cXFxcZCk/XFxcXGR7Mn0pYDtcclxuXHJcblx0LyoqXHJcblx0ICogUGhvbmUgcHJlZml4IHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGhvbmVQcmVmaXhQYXR0ZXJuOiBzdHJpbmcgPSAnXigwXFxcXGR7Miw2fSkkJztcclxuXHJcblx0LyoqXHJcblx0ICogUGhvbmUgbnVtYmVyIHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGhvbmVOdW1iZXJQYXR0ZXJuOiBzdHJpbmcgPSAnXihcXFxcZHszLDMwfSkkJztcclxuXHJcblx0LyoqXHJcblx0ICogUGFzc3dvcmQgdmFsaWRhdGlvbiBwYXR0ZXJuLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXNzd29yZFBhdHRlcm46IHN0cmluZyA9ICdeKD89LipbYS16XSkoPz0uKltBLVpdKSg/PS4qXFxcXGQpKD89LipbJEAkISUqPyYjLl0pW0EtWmEtelxcXFxkJEAkISUqPyYjLl17Nix9JCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVkaXRvciBvcHRpb25zIGluY2x1ZGluZyBkZWZhdWx0IG1vZHVsZXMgYW5kIHRvb2xiYXIgY29uZmlndXJhdGlvbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZWRpdG9yT3B0aW9ucyA9IHtcclxuXHRcdG1vZHVsZXM6IHtcclxuXHRcdFx0dG9vbGJhcjogW1xyXG5cdFx0XHRcdFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJ10sXHJcblx0XHRcdFx0W3sgJ2xpc3QnOiAnb3JkZXJlZCcgfSwgeyAnbGlzdCc6ICdidWxsZXQnIH1dLFxyXG5cdFx0XHRcdFt7ICdpbmRlbnQnOiAnLTEnIH0sIHsgJ2luZGVudCc6ICcrMScgfV0sXHJcblx0XHRcdFx0W3sgJ3NpemUnOiBbJ3NtYWxsJywgZmFsc2UsICdsYXJnZScsICdodWdlJ10gfV0sXHJcblx0XHRcdFx0W3sgJ2hlYWRlcic6IFsxLCAyLCAzLCA0LCA1LCA2LCBmYWxzZV0gfV0sXHJcblx0XHRcdFx0W3sgJ2NvbG9yJzogbmV3IEFycmF5PGFueT4oKSB9LCB7ICdiYWNrZ3JvdW5kJzogbmV3IEFycmF5PGFueT4oKSB9XSxcclxuXHRcdFx0XHRbJ2xpbmsnLCAnaW1hZ2UnXVxyXG5cdFx0XHRdLFxyXG5cdFx0XHRjbGlwYm9hcmQ6IHtcclxuXHRcdFx0XHRtYXRjaFZpc3VhbDogZmFsc2VcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRydWUsIHNob3dzIHRoZSAnRGVsZXRlJyBtZW51LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBkZWxldGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIG1lbnUgaXRlbXMuXHJcblx0ICovXHJcblx0cHVibGljIHRvb2xiYXJNZW51SXRlbXM6IEFjdGlvbkl0ZW1bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIGFjdGlvbiBidXR0b25zLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b29sYmFyQWN0aW9uczogQWN0aW9uSXRlbTxURW50aXR5LCBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+PltdID0gW3tcclxuXHRcdGljb246ICdyZWZyZXNoJyxcclxuXHRcdGV2ZW50OiAoKSA9PiB0aGlzLnJlbG9hZFBhZ2UoKSxcclxuXHR9XTtcclxuXHJcblx0LyoqXHJcblx0ICogTWF0U3RlcHBlciByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTdGVwcGVyKVxyXG5cdHByb3RlY3RlZCBtYXRTdGVwcGVyPzogTWF0U3RlcHBlcjtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBlbGVtZW50cy5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdmb2N1cycpXHJcblx0cHVibGljIGlucHV0OiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcm0gZ3JvdXAgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cHVibGljIF9mb3JtPzogTmdGb3JtIHwgRm9ybUdyb3VwO1xyXG5cclxuXHQvKipcclxuXHQgKiBGb3JtIGdyb3VwLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCBmb3JtKCk6IE5nRm9ybSB8IEZvcm1Hcm91cCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb3JtOyB9XHJcblx0cHVibGljIHNldCBmb3JtKGZvcm06IE5nRm9ybSB8IEZvcm1Hcm91cCB8IHVuZGVmaW5lZCkge1xyXG5cdFx0dGhpcy5fZm9ybSA9IGZvcm07XHJcblx0XHR0aGlzLm9uQWZ0ZXJGb3JtQnVpbGQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIGZvcm0gdmFsdWUuXHJcblx0ICovXHJcblx0cHVibGljIGFic3RyYWN0IGdldCBmb3JtVmFsdWUoKTogVEVudGl0eSB8IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogRm9ybSBkZWZpbml0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBmb3JtRGVmaW5pdGlvbj86IEZvcm1EZWZpbml0aW9uO1xyXG5cclxuXHQvKipcclxuXHQgKiBGaWVsZCBncm91cHMgZGVmaW5pdGlvbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZmllbGRHcm91cHM/OiBGb3JtRmllbGRHcm91cERlZmluaXRpb25bXTtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3IuXHJcblx0ICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gbWFuYWdlIHRoZSBlbnRpdHkuXHJcblx0ICogQHBhcmFtIHJvdXRlIFRoZSBhY3RpdmF0ZWQgcm91dGUuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIFRoZSBjaGFuZ2UgZGV0ZWN0b3IgcmVmZXJlbmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIGVudGl0eUN0b3I6IFR5cGU8VEVudGl0eT4sXHJcblx0XHRwcm90ZWN0ZWQgc2VydmljZTogVFNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG5cdCkge1xyXG5cdFx0c3VwZXIocm91dGUsIGNoYW5nZURldGVjdG9yUmVmKTtcclxuXHRcdHRoaXMubGlzdFJvdXRlID0gdGhpcy5hZGRTYXZlQW5kQ2xvc2VSb3V0ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxlZCBhZnRlciB0aGUgY29uc3RydWN0b3IsIGluaXRpYWxpemluZyBpbnB1dCBwcm9wZXJ0aWVzLCBcclxuXHQgKiBhbmQgdGhlIGZpcnN0IGNhbGwgdG8gbmdPbkNoYW5nZXMuXHJcblx0ICovXHJcblx0bmdPbkluaXQoKTogdm9pZCB7XHJcblx0XHRzdXBlci5uZ09uSW5pdCgpO1xyXG5cdFx0dGhpcy5pbml0KCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBhIGNvbXBvbmVudCdzIHZpZXcgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0bmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5oYW5kbGVFeHBhbnNpb25QYW5lbENoYW5nZXMgPSB0aGlzLmlzRWRpdE1vZGU7XHJcblx0XHRzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcclxuXHJcblx0XHQvKiBTZXQgcGFnZSB0aXRsZSAqL1xyXG5cdFx0dGhpcy50aXRsZSA9IHRoaXMudGl0bGVTZXJ2aWNlLmdldFRpdGxlKCk7XHJcblxyXG5cdFx0LyogU2V0IGZvY3VzICovXHJcblx0XHR0aGlzLmZvY3VzKCk7XHJcblxyXG5cdFx0LyogXHJcblx0XHQgKiBGb3JjZSBhIG5ldyBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIHNpbmNlIGNoYW5nZSBkZXRlY3Rpb25zIFxyXG5cdFx0ICogaGF2ZSBmaW5pc2hlZCB3aGVuIGBuZ0FmdGVyVmlld0luaXRgIGlzIGV4ZWN1dGVkLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcblx0XHQvKiBMaXN0ZW4gZm9yIHN0ZXBwZXIgc2VsZWN0aW9uIGNoYW5nZXMgKi9cclxuXHRcdHRoaXMubWF0U3RlcHBlcj8uc2VsZWN0aW9uQ2hhbmdlPy5zdWJzY3JpYmUoKGV2ZW50OiBTdGVwcGVyU2VsZWN0aW9uRXZlbnQpID0+IHRoaXMub25BZnRlclN0ZXBDaGFuZ2UoZXZlbnQpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxlZCBiZWZvcmUgYW55IG90aGVyIGxpZmVjeWNsZSBob29rLiBVc2UgaXQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcywgXHJcblx0ICogYnV0IGF2b2lkIGFueSBzZXJpb3VzIHdvcmsgaGVyZS5cclxuXHQgKiBAcGFyYW0gY2hhbmdlcyBUaGUgY2hhbmdlcyBvYmplY3QuXHJcblx0ICovXHJcblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG5cdFx0aWYgKFxyXG5cdFx0XHQoY2hhbmdlcz8uaWQ/LmN1cnJlbnRWYWx1ZSAmJiBjaGFuZ2VzLmlkLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5pZC5wcmV2aW91c1ZhbHVlKSB8fFxyXG5cdFx0XHQoY2hhbmdlcz8uaXRlbT8uY3VycmVudFZhbHVlICYmIGNoYW5nZXMuaXRlbS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuaXRlbS5wcmV2aW91c1ZhbHVlKVxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMubG9hZEl0ZW0oKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIGFuIGl0ZW0gYnkgSUQuXHJcblx0ICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUgaXRlbSBpZiB0aGUgY29tcG9uZW50IGlzIGluIGVkaXQgbW9kZSBhbmQgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaXMgZGVmaW5lZC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbG9hZEl0ZW0oKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuc2VydmljZT8uZW5kcG9pbnQpIHtcclxuXHRcdFx0dGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0dGhpcy5sb2FkSXRlbUFzeW5jKCkuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAoXykgPT4gdGhpcy5pc0xvYWRpbmcgPSBmYWxzZSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB0aGlzLnBhcnNlRXJyb3JzKGVycm9yKVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIGFuIGl0ZW0gYnkgSUQgYXN5bmNocm9ub3VzbHkuXHJcblx0ICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBvZiB0aGUgbG9hZGVkIGVudGl0eS5cclxuXHQgKi9cclxuXHRwdWJsaWMgbG9hZEl0ZW1Bc3luYygpOiBPYnNlcnZhYmxlPFRFbnRpdHk+IHtcclxuXHRcdGlmICh0aGlzLmlkKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0KHRoaXMuaWQsIE9iamVjdC5hc3NpZ24odGhpcy5xdWVyeSB8fCB7fSwgeyBpbmNsdWRlczogdGhpcy5pbmNsdWRlcz8ubGVuZ3RoID8gdGhpcy5pbmNsdWRlcyA6IHRoaXMudXBkYXRlSW5jbHVkZXMsIHByb2plY3Rpb246IHRoaXMucHJvamVjdGlvbj8uam9pbignLCcpIH0pLCB7ICdEaXNhYmxlLUNhY2hlJzogJ1llcycgfSkucGlwZShcclxuXHRcdFx0XHRtYXAoeCA9PiBPYmplY3QuYXNzaWduKHRoaXMubmV3SW5zdGFuY2UoKSwgeCkpLFxyXG5cdFx0XHRcdHRhcCh4ID0+IHtcclxuXHRcdFx0XHRcdC8qIFNldCB0aGUgbG9hZGVkIGl0ZW0gKi9cclxuXHRcdFx0XHRcdHRoaXMuaXRlbSA9IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCA8VEVudGl0eT54KTtcclxuXHJcblx0XHRcdFx0XHQvKiBCdWlsZCB0aGUgZm9ybSAqL1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZEZvcm0oKTtcclxuXHJcblx0XHRcdFx0XHQvKiBUcmlnZ2VyIGV2ZW50IGFmdGVySXRlbUxvYWRlZCAqL1xyXG5cdFx0XHRcdFx0dGhpcy5vbkFmdGVySXRlbUxvYWRlZCgpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBPYnNlcnZhYmxlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTYXZlcyBkYXRhIGludG8gdGhlIGRhdGFiYXNlLlxyXG5cdCAqIFRoaXMgbWV0aG9kIHZhbGlkYXRlcyB0aGUgZm9ybSwgY2hlY2tzIGlmIGl0J3MgdmFsaWQsIGFuZCBzZW5kcyBkYXRhIHRvIHRoZSBzZXJ2ZXIgdG8gZWl0aGVyIHVwZGF0ZSBvciBjcmVhdGUgYSBuZXcgcmVjb3JkLlxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gVGhlIHNhdmUgYWN0aW9uIHRvIHBlcmZvcm0uXHJcblx0ICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gdG8gdmFsaWRhdGUgYW5kIHNhdmUuXHJcblx0ICovXHJcblx0cHVibGljIHNhdmUoYWN0aW9uOiBTYXZlQWN0aW9uID0gU2F2ZUFjdGlvbi5TYXZlQW5kQ2xvc2UsIGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdC8qIFZhbGlkYXRlIHRoZSBmb3JtICovXHJcblx0XHR0aGlzLnZhbGlkYXRlRm9ybShmb3JtKTtcclxuXHJcblx0XHQvKiBDaGVjayBpZiB0aGUgZm9ybSBpcyB2YWxpZCAqL1xyXG5cdFx0Zm9ybSA9IHRoaXMuZm9ybSB8fCBmb3JtO1xyXG5cdFx0aWYgKGZvcm0gJiYgIXRoaXMuaXNGb3JtVmFsaWQoZm9ybSkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIElmIGluIGVkaXQgbW9kZSwgdXBkYXRlIHRoZSByZWNvcmQgKi9cclxuXHRcdGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuXHRcdFx0LyogVGhlIGRhdGEgaGFzIG5vdCBjaGFuZ2VkPyAqL1xyXG5cdFx0XHRpZiAoZm9ybSAmJiBmb3JtLnByaXN0aW5lKSB7XHJcblx0XHRcdFx0dGhpcy5vbkFmdGVyU3VibWl0KGFjdGlvbik7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBBIGZsYWcgdG8gcHJldmVudCBzZW5kaW5nIHRoZSBmb3JtIHR3aWNlICovXHJcblx0XHRcdHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0LyogU2VuZCB0aGUgZGF0YSB0byB0aGUgc2VydmVyICovXHJcblx0XHRcdHRoaXMudXBkYXRlKHsgcGFyYW1zOiBVdGlscy50b0h0dHBQYXJhbXMoeyBpbmNsdWRlczogdGhpcy51cGRhdGVJbmNsdWRlcyB9KSB9KS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdFx0LyogQXBwbHkgc2F2ZWQgZGF0YSB0byB0aGUgZm9ybSAqL1xyXG5cdFx0XHRcdFx0dGhpcy5vbkFmdGVyU3VibWl0KGFjdGlvbiwgcmVzcG9uc2UpO1xyXG5cclxuXHRcdFx0XHRcdC8qIElmIHRoZSB1c2VyIGNsaWNrcyAnYXBwbHknIHJlbG9hZCB0aGUgcGFnZSAqL1xyXG5cdFx0XHRcdFx0aWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRFZGl0KSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnJlbG9hZC5vYnNlcnZlZCkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVsb2FkLmVtaXQodGhpcy5mb3JtVmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVsb2FkUGFnZSgpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB0aGlzLnBhcnNlRXJyb3JzKGVycm9yKVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdC8qIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IG9uZSAqL1xyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdC8qIEEgZmxhZyB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIGZvcm0gdHdpY2UgKi9cclxuXHRcdFx0dGhpcy5pc1NhdmluZyA9IHRydWU7XHJcblxyXG5cdFx0XHQvKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBzZXJ2ZXIgKi9cclxuXHRcdFx0dGhpcy5jcmVhdGU8VEVudGl0eT4oKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5pZCA9IHJlc3BvbnNlPy5pZDtcclxuXHRcdFx0XHRcdHRoaXMub25BZnRlclN1Ym1pdChhY3Rpb24sIHJlc3BvbnNlKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoZm9ybSkge1xyXG5cdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGN0ciA9IGZvcm0hLmNvbnRyb2xzW2tleV07XHJcblx0XHRcdFx0XHRcdFx0Y3RyLm1hcmtBc1ByaXN0aW5lKCk7XHJcblx0XHRcdFx0XHRcdFx0Y3RyLm1hcmtBc1VudG91Y2hlZCgpO1xyXG5cdFx0XHRcdFx0XHRcdGN0ci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0ZXJyb3I6IChlcnJvcikgPT4gdGhpcy5wYXJzZUVycm9ycyhlcnJvcilcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogRGV0ZWN0IGNoYW5nZXMgKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2F2ZXMgZGF0YSBhbmQgbmF2aWdhdGVzIHRvIHRoZSBlZGl0IHZpZXcuXHJcblx0ICovXHJcblx0cHVibGljIGFwcGx5KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zYXZlKFNhdmVBY3Rpb24uU2F2ZUFuZEVkaXQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVsZXRlcyB0aGUgY3VycmVudCByZWNvcmQuXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvd3MgYSBjb25maXJtYXRpb24gZGlhbG9nIGFuZCBkZWxldGVzIHRoZSByZWNvcmQgaWYgdGhlIHVzZXIgY29uZmlybXMuXHJcblx0ICogQHBhcmFtIGh0dHBIZWFkZXJzIE9wdGlvbmFsIEhUVFAgaGVhZGVycyB0byBpbmNsdWRlIGluIHRoZSBkZWxldGUgcmVxdWVzdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGVsZXRlKGh0dHBIZWFkZXJzPzogSHR0cEhlYWRlcnMpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2hvd0RlbGV0ZUl0ZW1EaWFsb2coKS5zdWJzY3JpYmUoKGFjY2VwdDogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRpZiAoYWNjZXB0ICYmIHRoaXMuaWQpIHtcclxuXHRcdFx0XHR0aGlzLnNlcnZpY2UuZGVsZXRlKHRoaXMuaWQhLCB1bmRlZmluZWQsIHsgaGVhZGVyczogaHR0cEhlYWRlcnMgPz8gdGhpcy50b0h0dHBIZWFkZXJzKHsgJ1Nob3ctTWVzc2FnZSc6ICd5ZXMnIH0pIH0pXHJcblx0XHRcdFx0XHQuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5iYWNrKCk7XHJcblx0XHRcdFx0XHR9LCBlcnJvciA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZGVidWcoZXJyb3IpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGZvcm0uXHJcblx0ICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgZm9ybSBieSBleHRyYWN0aW5nIHF1ZXJ5IHBhcmFtZXRlcnMsIHNldHRpbmcgdGhlIGVudGl0eSBJRCwgYW5kIGJ1aWxkaW5nIHRoZSBmb3JtLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBpbml0KCk6IHZvaWQge1xyXG5cdFx0LyogR2V0IHRoZSBlbnRpdHkgSUQgZnJvbSB0aGUgcXVlcnkgKi9cclxuXHRcdGlmICghdGhpcy5pZCAmJiAhdGhpcy5pdGVtKSB7XHJcblx0XHRcdC8qIEFzc2lnbiBxdWVyeSBwYXJhbXMgaW50byBxdWVyeSBvYmplY3QgKi9cclxuXHRcdFx0bGV0IGlnbm9yZWRQYXJhbXM6IHN0cmluZ1tdID0gWydpZCcsICdyZXR1cm51cmwnLCAncGFuZWxJZCddO1xyXG5cdFx0XHRPYmplY3QuYXNzaWduKHRoaXMucXVlcnksXHJcblx0XHRcdFx0dGhpcy5zYW5pdGl6ZU9iamVjdCh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcyB8fCB7fSwgLi4uaWdub3JlZFBhcmFtcyksXHJcblx0XHRcdFx0dGhpcy5zYW5pdGl6ZU9iamVjdCh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGE/LnF1ZXJ5IHx8IHt9LCAuLi5pZ25vcmVkUGFyYW1zKSxcclxuXHRcdFx0XHR0aGlzLnNhbml0aXplT2JqZWN0KHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfHwge30sIC4uLmlnbm9yZWRQYXJhbXMpXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHQvKiBHZXQgaWQgZnJvbSB0aGUgdXJsICovXHJcblx0XHRcdGxldCBpZCA9IDxhbnk+dGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJyk7XHJcblx0XHRcdGlmIChpZCA+IDApIHtcclxuXHRcdFx0XHR0aGlzLmlkID0gaWQ7XHJcblx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuaWQgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdD8uZGF0YT8uaWQpIHtcclxuXHRcdFx0XHR0aGlzLmlkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdD8uZGF0YT8uaWQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMub25BZnRlclNldElkKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBURW50aXR5ICovXHJcblx0XHRpZiAoIXRoaXMuaXNFZGl0TW9kZSAmJiAhdGhpcy5mb3JtKSB7XHJcblx0XHRcdHRoaXMuaXRlbSA9IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCB0aGlzLml0ZW0gfHwge30sIHRoaXMucXVlcnkgfHwge30pO1xyXG5cdFx0XHR0aGlzLmJ1aWxkRm9ybSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNldCBwYW5lbCBJRCBmcm9tIHF1ZXJ5ICovXHJcblx0XHR0aGlzLnN1YnRpdGxlIHx8PSB0aGlzLnJvdXRlLnNuYXBzaG90Py5kYXRhPy5zdWJ0aXRsZTtcclxuXHJcblx0XHQvKiBBZGQgbGlzdCBtZW51IGl0ZW1zICovXHJcblx0XHR0aGlzLmFkZFRvb2xiYXJNZW51SXRlbXMoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ1aWxkcyB0aGUgZm9ybSBmaWVsZHMuXHJcblx0ICogVGhpcyBtZXRob2QgY29uc3RydWN0cyBmb3JtIGZpZWxkcyBiYXNlZCBvbiB0aGUgZW50aXR5J3MgZm9ybSBkZWZpbml0aW9uIGFuZCBpbmNsdWRlcyBuZWNlc3NhcnkgbmF2aWdhdGlvbiBhbmQgbWVudSBpdGVtcy5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgYnVpbGRGaWVsZHMoKTogdm9pZCB7XHJcblx0XHQvKiBHZXQgZm9ybSBkZWZpbml0aW9uICovXHJcblx0XHR0aGlzLmZvcm1EZWZpbml0aW9uID0gZ2V0Rm9ybURlZmluaXRpb24odGhpcy5uZXdJbnN0YW5jZSgpKTtcclxuXHJcblx0XHQvKiBTZXQgaW5jbHVkZXMgZnJvbSBmb3JtIGRlZmluaXRpb24sIGlmIGFueSAqL1xyXG5cdFx0dGhpcy5mb3JtRGVmaW5pdGlvbj8uaW5jbHVkZXM/LmZvckVhY2goeCA9PiB0aGlzLmluY2x1ZGUoeC5lbnRpdHksIHgudXBkYXRlKSk7XHJcblxyXG5cdFx0LyogQWRkIHRvb2xiYXIgbWVudSBpdGVtcywgaWYgYW55ICovXHJcblx0XHRpZiAodGhpcy5mb3JtRGVmaW5pdGlvbj8udG9vbGJhck1lbnVJdGVtcz8ubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcyA/Pz0gW107XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcyA9IHRoaXMudG9vbGJhck1lbnVJdGVtcy5jb25jYXQoLi4udGhpcy5mb3JtRGVmaW5pdGlvbj8udG9vbGJhck1lbnVJdGVtcyk7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcy5mb3JFYWNoKCh4LCBpKSA9PiB4LmluZGV4ID8/PSBpKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBDcmVhdGUgdGhlIGZvcm0gZmllbGRzIHVzaW5nIHRoZSBlbnRpdHkgdHlwZSAqL1xyXG5cdFx0dGhpcy5maWVsZEdyb3VwcyA9IHRoaXMuZm9ybURlZmluaXRpb24/LmZpZWxkR3JvdXBzPy5maWx0ZXIoeCA9PiAheC5oaWRkZW4pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQnVpbGRzIGEgbmV3IGZvcm0uXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIGNvbnN0cnVjdCB0aGUgZm9ybSBmb3IgdGhlIHNwZWNpZmljIGVudGl0eS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgYnVpbGRGb3JtKCk6IHZvaWQgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFZhbGlkYXRlcyB0aGUgZm9ybS5cclxuXHQgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIGFzIHN1Ym1pdHRlZCwgdXBkYXRlcyBpdHMgdmFsaWRpdHksIGFuZCBvcHRpb25hbGx5IGxvZ3MgZGVidWcgaW5mb3JtYXRpb24uXHJcblx0ICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gdG8gdmFsaWRhdGUuXHJcblx0ICovXHJcblx0cHVibGljIHZhbGlkYXRlRm9ybShmb3JtPzogTmdGb3JtIHwgRm9ybUdyb3VwKTogdm9pZCB7XHJcblx0XHR2YXIgZm9ybSA9IGZvcm0gfHwgdGhpcy5mb3JtO1xyXG5cclxuXHRcdC8qIFNldCB0aGUgZm9ybSBhcyBzdWJtaXR0ZWQgKi9cclxuXHRcdGlmIChmb3JtICYmIGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuXHRcdFx0LyogU2V0IGZvcm0gYXMgc3VibWl0dGVkICovXHJcblx0XHRcdChmb3JtIGFzIGFueSlbJ3N1Ym1pdHRlZCddID0gdHJ1ZTtcclxuXHJcblx0XHRcdC8qIFVwZGF0ZSB2YWx1ZSBhbmQgdmFsaWRpdHkgKi9cclxuXHRcdFx0Zm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogUHJpbnQgc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbiAqL1xyXG5cdFx0dGhpcy5kZWJ1Z0Zvcm0oZm9ybSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgaWYgdGhlIGZvcm0gaXMgdmFsaWQuXHJcblx0ICogVGhpcyBtZXRob2QgdmFsaWRhdGVzIHRoZSBmb3JtLCBtYXJrcyBpbnZhbGlkIGNvbnRyb2xzLCBhbmQgc2hvd3MgZXJyb3IgbWVzc2FnZXMgaWYgYW55LlxyXG5cdCAqIEBwYXJhbSBmb3JtIFRoZSBmb3JtIHRvIGNoZWNrIGZvciB2YWxpZGl0eS5cclxuXHQgKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0Zvcm1WYWxpZChmb3JtPzogTmdGb3JtIHwgRm9ybUdyb3VwKTogYm9vbGVhbiB7XHJcblx0XHQvKiBQcmludCBzb21lIGRlYnVnIGluZm9ybWF0aW9uICovXHJcblx0XHR0aGlzLmRlYnVnRm9ybShmb3JtKTtcclxuXHJcblx0XHQvKiBJZiB0aGUgZm9ybSBpcyBub3QgdmFsaWQgKi9cclxuXHRcdGlmIChmb3JtICYmICFmb3JtLnZhbGlkKSB7XHJcblx0XHRcdC8qIE1hcmsgaW52YWxpZCBjb250cm9scyBhcyBkaXJ0eSBhbmQgdG91Y2hlZCAqL1xyXG5cdFx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKVxyXG5cdFx0XHRcdC5maWx0ZXIoeCA9PiAhZm9ybS5jb250cm9sc1t4XS52YWxpZClcclxuXHRcdFx0XHQuZm9yRWFjaChrZXkgPT4gdGhpcy5pbnZhbGlkYXRlQ29udHJvbChmb3JtLmNvbnRyb2xzW2tleV0pKTtcclxuXHJcblx0XHRcdC8qIFNob3cgZXJyb3IgbWVzc2FnZXMgKi9cclxuXHRcdFx0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHQvKiBXYWl0IHVudGlsICdtYXQtZXJyb3InIGlzIGRpc3BsYXllZCAqL1xyXG5cdFx0XHRcdGF3YWl0IG5ldyBQcm9taXNlKHkgPT4gc2V0VGltZW91dCh5LCAyMDApKTtcclxuXHJcblx0XHRcdFx0LyogUGFyc2UgdGhlIGVycm9yIG1lc3NhZ2VzICovXHJcblx0XHRcdFx0dmFyIGVycm9ycyA9IEFycmF5PHN0cmluZz4oKTtcclxuXHRcdFx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKVxyXG5cdFx0XHRcdFx0LmZpbHRlcih4ID0+ICFmb3JtLmNvbnRyb2xzW3hdLnZhbGlkKVxyXG5cdFx0XHRcdFx0LmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0XHRcdFx0LyogR2V0IGVycm9yIHRleHQgKi9cclxuXHRcdFx0XHRcdFx0dmFyIGVycm9yID0gdGhpcy5nZXRFbGVtZW50RXJyb3IoKGZvcm0uY29udHJvbHNba2V5XSBhcyBhbnkpPy5uYXRpdmVFbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0aWYgKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3JzLnB1c2goZXJyb3IpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0LyogQnVpbGQgZXJyb3IgbWVzc2FnZSAqL1xyXG5cdFx0XHRcdHZhciBtZXNzYWdlID0gZXJyb3JzLmxlbmd0aCA/IGVycm9ycy5zbGljZSgwLCAzKS5qb2luKCdcXG4nKSA6ICRsb2NhbGl6ZWA6QEBzbmFja2Jhci5lcnJvci5yZXF1aXJlZC1maWVsZHM6QWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIHJlcXVpcmVkLmA7XHJcblxyXG5cdFx0XHRcdC8qIFNob3cgYSBub3RpY2UgKi9cclxuXHRcdFx0XHR0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKG1lc3NhZ2UsICdPaycsIHsgZHVyYXRpb246IDMwMDAsIHBhbmVsQ2xhc3M6IFsnZXJyb3InXSB9KTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH0pKCk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgZm9ybSBjb250cm9scy5cclxuXHQgKiBUaGlzIG1ldGhvZCBtYXJrcyBhbGwgY29udHJvbHMgaW4gdGhlIGZvcm0gYXMgcHJpc3RpbmUsIHVudG91Y2hlZCwgYW5kIHVwZGF0ZXMgdGhlaXIgdmFsaWRpdHkuXHJcblx0ICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gdG8gcmVzZXQuXHJcblx0ICovXHJcblx0cHVibGljIHJlc2V0Rm9ybShmb3JtOiBOZ0Zvcm0pOiB2b2lkIHtcclxuXHRcdGlmICghZm9ybSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0T2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRsZXQgY3RyID0gZm9ybS5jb250cm9sc1trZXldO1xyXG5cdFx0XHRjdHIubWFya0FzUHJpc3RpbmUoKTtcclxuXHRcdFx0Y3RyLm1hcmtBc1VudG91Y2hlZCgpO1xyXG5cdFx0XHRjdHIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnZhbGlkYXRlcyBjb250cm9scyByZWN1cnNpdmVseS5cclxuXHQgKiBUaGlzIG1ldGhvZCBtYXJrcyBhbGwgY29udHJvbHMgaW4gdGhlIGdyb3VwIGFzIGRpcnR5IGFuZCB0b3VjaGVkIGlmIHRoZXkgYXJlIGludmFsaWQuXHJcblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgb3IgZ3JvdXAgb2YgY29udHJvbHMgdG8gaW52YWxpZGF0ZS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgaW52YWxpZGF0ZUNvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XHJcblx0XHQvKiBDaGVjayB0aGUgY29udHJvbCBhZ2FpbnN0IG51bGwgKi9cclxuXHRcdGlmICghY29udHJvbCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQ2hlY2sgaWYgdGhlIGNvbnRyb2wgaXMgYSBncm91cCAqL1xyXG5cdFx0bGV0IGZvcm1Hcm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG5cdFx0aWYgKGZvcm1Hcm91cD8uY29udHJvbHMpIHtcclxuXHRcdFx0T2JqZWN0LmtleXMoZm9ybUdyb3VwLmNvbnRyb2xzKVxyXG5cdFx0XHRcdC5maWx0ZXIoeCA9PiAhZm9ybUdyb3VwLmNvbnRyb2xzW3hdLnZhbGlkKVxyXG5cdFx0XHRcdC5mb3JFYWNoKHggPT4gdGhpcy5pbnZhbGlkYXRlQ29udHJvbChmb3JtR3JvdXAuY29udHJvbHNbeF0pKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuXHRcdFx0Y29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93cyBmb3JtIGVycm9ycy5cclxuXHQgKiBUaGlzIG1ldGhvZCBsb2dzIGZvcm0gY29udHJvbCBlcnJvcnMgdG8gdGhlIGNvbnNvbGUgaWYgZGVidWdnaW5nIGlzIGVuYWJsZWQuXHJcblx0ICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gdG8gZGVidWcuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGRlYnVnRm9ybShmb3JtPzogTmdGb3JtIHwgRm9ybUdyb3VwKTogdm9pZCB7XHJcblx0XHRpZiAoZm9ybSAmJiB0aGlzLmRlYnVnKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdGb3JtOicsIGZvcm0pO1xyXG5cdFx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY29udHJvbEVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPSBmb3JtLmNvbnRyb2xzW2tleV0uZXJyb3JzO1xyXG5cdFx0XHRcdGlmIChjb250cm9sRXJyb3JzICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdE9iamVjdC5rZXlzKGNvbnRyb2xFcnJvcnMpLmZvckVhY2goa2V5RXJyb3IgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZygnS2V5IGNvbnRyb2w6ICcgKyBrZXkgKyAnLCBrZXlFcnJvcjogJyArIGtleUVycm9yICsgJywgZXJyIHZhbHVlOiAnLCBjb250cm9sRXJyb3JzW2tleUVycm9yXSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0b29sYmFyIG1lbnUgaXRlbXMuXHJcblx0ICogVGhpcyBtZXRob2QgYWRkcyB0aGUgJ0RlbGV0ZScgbWVudSBpdGVtIHRvIHRoZSB0b29sYmFyIGlmIHRoZSBlbnRpdHkgaXMgZGVsZXRhYmxlLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBhZGRUb29sYmFyTWVudUl0ZW1zKCk6IHZvaWQge1xyXG5cdFx0LyogQWRkICdEZWxldGUnIG1lbnUgaXRlbSAqL1xyXG5cdFx0aWYgKHRoaXMuZGVsZXRhYmxlKSB7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcy5wdXNoKHtcclxuXHRcdFx0XHR0aXRsZTogJGxvY2FsaXplYDpAQGRlbGV0ZTpEZWxldGVgLFxyXG5cdFx0XHRcdGljb246ICdkZWxldGVfZm9yZXZlcicsXHJcblx0XHRcdFx0aWNvbkNsYXNzOiAndGMtb3JhbmdlLTgwMCcsXHJcblx0XHRcdFx0ZXZlbnQ6ICgpID0+IHRoaXMuZGVsZXRlKCksXHJcblx0XHRcdFx0ZGlzYWJsZTogKCkgPT4gIXRoaXMuaWQsXHJcblx0XHRcdFx0aGlkZTogKCkgPT4gIXRoaXMuY2FuRGVsZXRlSXRlbSgpLFxyXG5cdFx0XHRcdGluZGV4OiAxMDAwXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnRvb2xiYXJNZW51SXRlbXMubGVuZ3RoKSB7XHJcblx0XHRcdC8qIFNvcnQgdGhlIG1lbnUgaXRlbXMgYnkgaW5kZXggKi9cclxuXHRcdFx0VXRpbHMuc29ydEFycmF5KHRoaXMudG9vbGJhck1lbnVJdGVtcywgJ2luZGV4Jyk7XHJcblxyXG5cdFx0XHQvKiBBZGQgdGhlIHRvb2xiYXIgbWVudSBpdGVtcyB0byB0aGUgdGhlIHRvb2xiYXIgYWN0aW9ucyAqL1xyXG5cdFx0XHR0aGlzLnRvb2xiYXJBY3Rpb25zLnB1c2goeyBpY29uOiAnbW9yZV92ZXJ0JywgaXRlbXM6IHRoaXMudG9vbGJhck1lbnVJdGVtcyB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIHRoZSBwcmV2aW91cyBVUkwgaW4gdGhlIGhpc3RvcnkgbGlzdC5cclxuXHQgKiBUaGlzIG1ldGhvZCBuYXZpZ2F0ZXMgYmFjayB0byB0aGUgcHJldmlvdXMgVVJMIG9yIHBlcmZvcm1zIHNwZWNpZmljIGFjdGlvbnMgYmFzZWQgb24gdGhlIHNhdmUgYWN0aW9uLlxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gVGhlIHNhdmUgYWN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgbmF2aWdhdGlvbiBiZWhhdmlvci5cclxuXHQgKi9cclxuXHRwdWJsaWMgYmFjayhhY3Rpb246IFNhdmVBY3Rpb24gPSBTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMucmVsb2FkLm9ic2VydmVkKSB7XHJcblx0XHRcdHRoaXMucmVsb2FkLmVtaXQodGhpcy5mb3JtVmFsdWUpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSAmJiB0aGlzLnJldHVyblVybCkge1xyXG5cdFx0XHRcdHRoaXMubmF2aWdhdGVUb1JldHVyblVybCgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuXHRcdFx0XHRcdGlmIChhY3Rpb24gPT0gU2F2ZUFjdGlvbi5TYXZlQW5kQ2xvc2UpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5sb2NhdGlvbi5iYWNrKCk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRFZGl0KSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVsb2FkUGFnZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRpZiAoYWN0aW9uID09IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMubG9jYXRpb24uYmFjaygpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24gPT0gU2F2ZUFjdGlvbi5TYXZlQW5kRWRpdCAmJiA8bnVtYmVyPnRoaXMuaWQgPiAwKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmFkZFNhdmVBbmRFZGl0Um91dGV9JHt0aGlzLmlkfWBdLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmROZXcpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hZnRlclJlbG9hZCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmV0dXJuIFVSTC5cclxuXHQgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSByZXR1cm4gVVJMIGFuZCB1cGRhdGVzIHRoZSBsaXN0IHJvdXRlIGFjY29yZGluZ2x5LlxyXG5cdCAqIEBwYXJhbSByZXR1cm5VcmwgVGhlIFVSTCB0byByZXR1cm4gdG8gYWZ0ZXIgdGhlIGN1cnJlbnQgYWN0aW9uIGlzIGNvbXBsZXRlLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBzZXRSZXR1cm5VcmwocmV0dXJuVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdHN1cGVyLnNldFJldHVyblVybChyZXR1cm5VcmwpO1xyXG5cdFx0dGhpcy5saXN0Um91dGUgPSB0aGlzLnJldHVyblVybCB8fCB0aGlzLmxpc3RSb3V0ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVEVudGl0eS5cclxuXHQgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBhIG5ldyBlbnRpdHkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbnN0cnVjdG9yLlxyXG5cdCAqIEBwYXJhbSBpbml0IE9wdGlvbmFsIHBhcnRpYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0LlxyXG5cdCAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIFRFbnRpdHkuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG5ld0luc3RhbmNlKGluaXQ/OiBQYXJ0aWFsPFRFbnRpdHk+KTogVEVudGl0eSB7XHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuZW50aXR5Q3Rvcihpbml0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIGVudGl0eS5cclxuXHQgKiBUaGlzIG1ldGhvZCBzZW5kcyBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgbmV3IGVudGl0eSBvbiB0aGUgc2VydmVyLlxyXG5cdCAqIEBwYXJhbSBodHRwT3B0aW9ucyBPcHRpb25hbCBIVFRQIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0LlxyXG5cdCAqIEBwYXJhbSBodHRwSGVhZGVycyBPcHRpb25hbCBIVFRQIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0LlxyXG5cdCAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgb2YgdGhlIGNyZWF0ZWQgVEVudGl0eS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgY3JlYXRlPFRFbnRpdHk+KGh0dHBPcHRpb25zPzogT2JqZWN0LCBodHRwSGVhZGVycz86IEh0dHBIZWFkZXJzKTogT2JzZXJ2YWJsZTxURW50aXR5PiB7XHJcblx0XHR0aGlzLm9uQmVmb3JlQ3JlYXRlKCk7XHJcblx0XHRyZXR1cm4gdGhpcy5zZXJ2aWNlLmNyZWF0ZTxURW50aXR5PihcclxuXHRcdFx0dGhpcy5mb3JtVmFsdWUsXHJcblx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0T2JqZWN0LmFzc2lnbihodHRwT3B0aW9ucyB8fCB7fSwgeyBoZWFkZXJzOiBodHRwSGVhZGVycyA/PyB0aGlzLnRvSHR0cEhlYWRlcnMoeyAnU2hvdy1NZXNzYWdlJzogJ3llcycgfSkgfSksXHJcblx0XHRcdGZhbHNlXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZW50aXR5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgcmVxdWVzdCB0byB1cGRhdGUgYW4gZXhpc3RpbmcgZW50aXR5IG9uIHRoZSBzZXJ2ZXIuXHJcblx0ICogQHBhcmFtIGh0dHBPcHRpb25zIE9wdGlvbmFsIEhUVFAgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3QuXHJcblx0ICogQHBhcmFtIGh0dHBIZWFkZXJzIE9wdGlvbmFsIEhUVFAgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3QuXHJcblx0ICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBvZiB0aGUgdXBkYXRlZCBURW50aXR5LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCB1cGRhdGUoaHR0cE9wdGlvbnM/OiBPYmplY3QsIGh0dHBIZWFkZXJzPzogSHR0cEhlYWRlcnMpOiBPYnNlcnZhYmxlPFRFbnRpdHk+IHtcclxuXHRcdHRoaXMub25CZWZvcmVVcGRhdGUoKTtcclxuXHRcdHJldHVybiB0aGlzLnNlcnZpY2UudXBkYXRlKHRoaXMuaWQhLFxyXG5cdFx0XHRPYmplY3QuYXNzaWduKHRoaXMuaXRlbSEsIHRoaXMuZm9ybVZhbHVlKSxcclxuXHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRPYmplY3QuYXNzaWduKGh0dHBPcHRpb25zIHx8IHt9LCB7IGhlYWRlcnM6IGh0dHBIZWFkZXJzID8/IHRoaXMudG9IdHRwSGVhZGVycyh7ICdTaG93LU1lc3NhZ2UnOiAneWVzJyB9KSwgfSksXHJcblx0XHRcdGZhbHNlXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5jbHVkZXMgc3BlY2lmaWVkIG5hdmlnYXRpb25zLlxyXG5cdCAqIFRoaXMgbWV0aG9kIGFkZHMgc3BlY2lmaWVkIG5hdmlnYXRpb24gcHJvcGVydGllcyB0byB0aGUgaW5jbHVkZXMgYXJyYXksXHJcblx0ICogb3B0aW9uYWxseSBhZGRpbmcgdGhlbSB0byB0aGUgdXBkYXRlSW5jbHVkZXMgYXJyYXkgYXMgd2VsbC5cclxuXHQgKiBAcGFyYW0gaW5jIFRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIGluY2x1ZGUuXHJcblx0ICogQHBhcmFtIHVwZGF0ZSBXaGV0aGVyIHRvIGluY2x1ZGUgaW4gdXBkYXRlSW5jbHVkZXMgYXJyYXkuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGluY2x1ZGUoaW5jOiBzdHJpbmcsIHVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblx0XHR0aGlzLmluY2x1ZGVzLnB1c2goaW5jKTtcclxuXHRcdGlmICh1cGRhdGUpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVJbmNsdWRlcy5wdXNoKGluYyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgaWYgdGhlIGl0ZW0gaXMgZGVsZXRhYmxlLlxyXG5cdCAqIFRoaXMgbWV0aG9kIGRldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgaXRlbSBjYW4gYmUgZGVsZXRlZCBiYXNlZCBvbiBpdHMgcHJvcGVydGllcy5cclxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBpdGVtIGNhbiBiZSBkZWxldGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGNhbkRlbGV0ZUl0ZW0oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNhbkRlbGV0ZSAmJiAoIXRoaXMuaXRlbT8uaGFzT3duUHJvcGVydHkoJ2RlbGV0YWJsZScpIHx8ICh0aGlzLml0ZW0gYXMgYW55KVsnZGVsZXRhYmxlJ10pOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgSUQgaXMgc2V0LlxyXG5cdCAqIFRoaXMgbWV0aG9kIHRyaWdnZXJzIHRoZSBsb2FkaW5nIG9mIHRoZSBpdGVtIHdoZW4gdGhlIElEIGlzIHNldC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25BZnRlclNldElkKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuaWQpIHtcclxuXHRcdFx0dGhpcy5sb2FkSXRlbSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3RlZCBzdGVwIGhhcyBjaGFuZ2VkLlxyXG5cdCAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgYWN0aW9ucyB0byBiZSB0YWtlbiB3aGVuIHRoZSBzdGVwcGVyIHNlbGVjdGlvbiBjaGFuZ2VzLlxyXG5cdCAqIEBwYXJhbSAkZXZlbnQgVGhlIHN0ZXBwZXIgc2VsZWN0aW9uIGV2ZW50LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyU3RlcENoYW5nZSgkZXZlbnQ6IFN0ZXBwZXJTZWxlY3Rpb25FdmVudCk6IHZvaWQgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZW50aXR5IGhhcyBiZWVuIGxvYWRlZC5cclxuXHQgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGFjdGlvbnMgdG8gYmUgdGFrZW4gYWZ0ZXIgdGhlIGVudGl0eSBpcyBsb2FkZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG9uQWZ0ZXJJdGVtTG9hZGVkKCk6IHZvaWQgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgYmVmb3JlIHRoZSBmb3JtIGlzIGJ1aWx0LlxyXG5cdCAqIFRoaXMgbWV0aG9kIGFsbG93cyBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgYmVmb3JlIHRoZSBmb3JtIGlzIGNvbnN0cnVjdGVkLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkJlZm9yZUZvcm1CdWlsZCgpOiB2b2lkIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGZvcm0gaGFzIGJlZW4gYnVpbHQuXHJcblx0ICogVGhpcyBtZXRob2QgaGFuZGxlcyBhY3Rpb25zIHRvIGJlIHRha2VuIGFmdGVyIHRoZSBmb3JtIGlzIGNvbnN0cnVjdGVkLFxyXG5cdCAqIHN1Y2ggYXMgZGlzYWJsaW5nIGZvcm0gY29udHJvbHMgaWYgdGhlIGZvcm0gaXMgc2V0IHRvIGJlIGRpc2FibGVkLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyRm9ybUJ1aWxkKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZm9ybSAmJiB0aGlzLmRpc2FibGVkKSB7XHJcblx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdGxldCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSB0aGlzLmZvcm0hLmNvbnRyb2xzW2tleV07XHJcblx0XHRcdFx0Y29udHJvbD8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGUoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlbnRpdHkgaGFzIGJlZW4gdXBkYXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25CZWZvcmVVcGRhdGUoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGVkIGJlZm9yZSBkYXRhIHN1Ym1pc3Npb24uXHJcblx0ICogVGhpcyBtZXRob2QgYWxsb3dzIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyBiZWZvcmUgc3VibWl0dGluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBiZWZvcmVTdWJtaXQoXzogU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCBhZnRlciBkYXRhIHN1Ym1pc3Npb24uXHJcblx0ICogVGhpcyBtZXRob2QgaGFuZGxlcyBwb3N0LXN1Ym1pc3Npb24gYWN0aW9ucyBzdWNoIGFzIHJlc2V0dGluZyB0aGUgc2F2aW5nIHN0YXRlLFxyXG5cdCAqIHVwZGF0aW5nIHRoZSBjaGFuZ2UgZGV0ZWN0b3IsIGFuZCBuYXZpZ2F0aW5nIGJhY2sgYmFzZWQgb24gdGhlIHNhdmUgYWN0aW9uLlxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gVGhlIHNhdmUgYWN0aW9uIHRha2VuIChlLmcuLCBTYXZlQW5kQ2xvc2UsIFNhdmVBbmROZXcpLlxyXG5cdCAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgYWZ0ZXIgc3VibWlzc2lvbi5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25BZnRlclN1Ym1pdChhY3Rpb246IFNhdmVBY3Rpb24gPSBTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSwgcmVzcG9uc2U6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuXHRcdHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdFx0dGhpcy5iYWNrKGFjdGlvbik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxsZWQgYWZ0ZXIgdGhlIHBhZ2UgaXMgcmVsb2FkZWQuXHJcblx0ICogVGhpcyBtZXRob2QgcmVpbml0aWFsaXplcyB0aGUgaXRlbSB3aXRoIGEgbmV3IGluc3RhbmNlIGFuZCBhcHBsaWVzIGFueSBxdWVyeSBwYXJhbWV0ZXJzLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBhZnRlclJlbG9hZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaXRlbSA9IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCB0aGlzLnF1ZXJ5KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgZm9jdXMgdG8gdGhlIGZpcnN0IGlucHV0IGVsZW1lbnQuXHJcblx0ICogRW5zdXJlcyB0aGUgZmlyc3QgaW5wdXQgZWxlbWVudCBpbiB0aGUgZm9ybSBpcyBmb2N1c2VkIGZvciB1c2VyIGNvbnZlbmllbmNlLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBmb2N1cygpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmlucHV0ICYmIHRoaXMuaW5wdXQuZmlyc3QgJiYgdGhpcy5pbnB1dC5maXJzdC5uYXRpdmVFbGVtZW50KSB7XHJcblx0XHRcdHRoaXMuaW5wdXQuZmlyc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0cmlldmVzIHRoZSBlcnJvciBtZXNzYWdlIGZvciBhIGdpdmVuIG5hdGl2ZSBlbGVtZW50LlxyXG5cdCAqIFRoaXMgbWV0aG9kIG5hdmlnYXRlcyB0aHJvdWdoIHRoZSBET00gc3RydWN0dXJlIHRvIGZpbmQgZXJyb3IgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIGZvcm0gZmllbGRzLlxyXG5cdCAqIEBwYXJhbSBuYXRpdmVFbGVtZW50IFRoZSBET00gZWxlbWVudCB0byBjaGVjayBmb3IgZXJyb3JzLlxyXG5cdCAqIEByZXR1cm5zIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCwgb3IgdW5kZWZpbmVkIGlmIG5vIGVycm9yIGlzIGZvdW5kLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBnZXRFbGVtZW50RXJyb3IobmF0aXZlRWxlbWVudDogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuXHRcdC8qIEdldCBwYXJlbnQgZWxlbWVudCAnbWF0LWZvcm0tZmllbGQnICovXHJcblx0XHR2YXIgbWF0Rm9ybUZpZWxkID0gbmF0aXZlRWxlbWVudD8uY2xvc2VzdCgnLm1hdC1mb3JtLWZpZWxkJyk7XHJcblx0XHRpZiAoIW1hdEZvcm1GaWVsZCkge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEdldCBjaGlsZCBlbGVtZW50ICdtYXQtZXJyb3InICovXHJcblx0XHR2YXIgbWF0RXJyb3JzID0gbWF0Rm9ybUZpZWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtZXJyb3InKTtcclxuXHRcdGlmICghbWF0RXJyb3JzKSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogR2V0IGNoaWxkIGVsZW1lbnQgJ21hdC1sYWJlbCcgKi9cclxuXHRcdHZhciBtYXRMYWJlbCA9IG1hdEZvcm1GaWVsZC5xdWVyeVNlbGVjdG9yKCdtYXQtbGFiZWwnKTtcclxuXHRcdGlmICghbWF0TGFiZWwpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBHZXQgZXJyb3IgdGV4dHMgKi9cclxuXHRcdHZhciBlcnJvcnNBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG1hdEVycm9ycylcclxuXHRcdFx0Py5maWx0ZXIoKHg6IGFueSkgPT4geC50ZXh0Q29udGVudClcclxuXHRcdFx0Py5tYXAoKHg6IGFueSkgPT4geC50ZXh0Q29udGVudCk7XHJcblxyXG5cdFx0cmV0dXJuIGAnJHttYXRMYWJlbC50ZXh0Q29udGVudH0nOiAke2Vycm9yc0FycmF5Py5qb2luKCcsICcpfWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNwb25kcyB0byB1c2VyLWluaXRpYXRlZCBrZXlib2FyZCBldmVudHMuXHJcblx0ICogVGhpcyBtZXRob2QgbGlzdGVucyBmb3Igc3BlY2lmaWMga2V5IGNvbWJpbmF0aW9ucyBhbmQgdHJpZ2dlcnMgc2F2ZSBhY3Rpb25zIG9yIGZvcm0gY2FuY2VsbGF0aW9uLlxyXG5cdCAqIEBwYXJhbSBldmVudCBUaGUga2V5Ym9hcmQgZXZlbnQgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyLlxyXG5cdCAqL1xyXG5cdEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG5cdGhhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuXHRcdGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcclxuXHRcdFx0c3dpdGNoIChldmVudC5rZXkpIHtcclxuXHRcdFx0XHRjYXNlICdzJzpcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR0aGlzLnNhdmUoU2F2ZUFjdGlvbi5TYXZlQW5kQ2xvc2UpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ2QnOlxyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdHRoaXMuc2F2ZShTYXZlQWN0aW9uLlNhdmVBbmROZXcpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ2UnOlxyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdHRoaXMuc2F2ZShTYXZlQWN0aW9uLlNhdmVBbmRFZGl0KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQ2FuY2VsIHRoZSBmb3JtIGlmIHRoZSB1c2VyIHByZXNzZXMgdGhlIEVTQyBrZXkgKi9cclxuXHRcdGlmIChldmVudC5rZXlDb2RlID09IDI3KSB7XHJcblx0XHRcdHRoaXMuYmFjaygpO1xyXG5cdFx0fVxyXG5cdH1cclxufSJdfQ==