@esfaenza/forms-and-validations 14.2.0 → 14.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/esm2020/lib/forms/base-form-control.mjs +42 -17
  2. package/esm2020/lib/forms/form-adaptive/form-adaptive.component.loc.mjs +4 -4
  3. package/esm2020/lib/forms/form-adaptive/form-adaptive.component.mjs +37 -9
  4. package/esm2020/lib/forms/form-autocomplete/form-autocomplete.component.loc.mjs +4 -4
  5. package/esm2020/lib/forms/form-autocomplete/form-autocomplete.component.mjs +12 -11
  6. package/esm2020/lib/forms/form-checkbox/form-checkbox.component.mjs +5 -4
  7. package/esm2020/lib/forms/form-date/form-date.component.mjs +7 -7
  8. package/esm2020/lib/forms/form-datetime/form-datetime.component.mjs +7 -7
  9. package/esm2020/lib/forms/form-empty/form-empty.component.mjs +4 -4
  10. package/esm2020/lib/forms/form-error/form-error.component.mjs +4 -4
  11. package/esm2020/lib/forms/form-file/form-file.component.loc.mjs +4 -4
  12. package/esm2020/lib/forms/form-file/form-file.component.mjs +23 -9
  13. package/esm2020/lib/forms/form-info/form-info.component.mjs +4 -4
  14. package/esm2020/lib/forms/form-input/form-input.component.mjs +5 -5
  15. package/esm2020/lib/forms/form-multiselect/form-multiselect.component.loc.mjs +4 -4
  16. package/esm2020/lib/forms/form-multiselect/form-multiselect.component.mjs +4 -4
  17. package/esm2020/lib/forms/form-select/form-select.component.loc.mjs +4 -4
  18. package/esm2020/lib/forms/form-select/form-select.component.mjs +12 -9
  19. package/esm2020/lib/forms/form-template/form-template.component.mjs +5 -5
  20. package/esm2020/lib/forms/form-textarea/form-textarea.component.mjs +5 -5
  21. package/esm2020/lib/forms/form-time/form-time.component.mjs +4 -4
  22. package/esm2020/lib/forms-and-validations.module.mjs +5 -5
  23. package/esm2020/lib/models/dayjs-adapter/dayjs-date-adapter.mjs +4 -4
  24. package/esm2020/lib/validations/base-validation.loc.mjs +4 -4
  25. package/esm2020/lib/validations/base-validation.mjs +40 -10
  26. package/esm2020/lib/validations/customValidators/CustomRequiredDirective.mjs +4 -4
  27. package/esm2020/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs +13 -12
  28. package/esm2020/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.mjs +13 -12
  29. package/esm2020/lib/validations/validation-currency/validation-currency.component.mjs +8 -6
  30. package/esm2020/lib/validations/validation-date/validation-date.component.mjs +12 -12
  31. package/esm2020/lib/validations/validation-datetime/validation-datetime.component.mjs +12 -12
  32. package/esm2020/lib/validations/validation-input/validation-input.component.mjs +11 -11
  33. package/esm2020/lib/validations/validation-select/validation-select.component.mjs +13 -13
  34. package/esm2020/lib/validations/validation-text-area/validation-text-area.component.mjs +8 -6
  35. package/esm2020/public-api.mjs +1 -2
  36. package/fesm2015/esfaenza-forms-and-validations.mjs +321 -207
  37. package/fesm2015/esfaenza-forms-and-validations.mjs.map +1 -1
  38. package/fesm2020/esfaenza-forms-and-validations.mjs +319 -207
  39. package/fesm2020/esfaenza-forms-and-validations.mjs.map +1 -1
  40. package/lib/forms/base-form-control.d.ts +20 -6
  41. package/lib/forms/form-adaptive/form-adaptive.component.d.ts +15 -2
  42. package/lib/forms/form-autocomplete/form-autocomplete.component.d.ts +5 -4
  43. package/lib/forms/form-date/form-date.component.d.ts +1 -2
  44. package/lib/forms/form-datetime/form-datetime.component.d.ts +1 -2
  45. package/lib/forms/form-file/form-file.component.d.ts +7 -4
  46. package/lib/forms/form-select/form-select.component.d.ts +5 -3
  47. package/lib/validations/base-validation.d.ts +24 -4
  48. package/lib/validations/validation-autocomplete/validation-autocomplete.component.d.ts +4 -4
  49. package/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.d.ts +4 -4
  50. package/lib/validations/validation-date/validation-date.component.d.ts +1 -2
  51. package/lib/validations/validation-datetime/validation-datetime.component.d.ts +1 -2
  52. package/lib/validations/validation-input/validation-input.component.d.ts +1 -2
  53. package/lib/validations/validation-select/validation-select.component.d.ts +1 -2
  54. package/package.json +14 -14
  55. package/public-api.d.ts +0 -1
@@ -2,7 +2,9 @@
2
2
  import { RequiredValidator } from "@angular/forms";
3
3
  import { EventEmitter, Input, Output, ViewChild, Optional, Inject, Directive } from "@angular/core";
4
4
  import { ACO_CUSTOMKEY, FAV_DEBUG_MODE } from '../tokens';
5
+ import { Subject } from "rxjs";
5
6
  import { ChangeEvent } from "../models/ChangeEvent";
7
+ import { takeUntil } from "rxjs/operators";
6
8
  import * as i0 from "@angular/core";
7
9
  import * as i1 from "@angular/forms";
8
10
  import * as i2 from "@esfaenza/access-control";
@@ -26,14 +28,20 @@ export class BaseFormControl {
26
28
  */
27
29
  this.firstBind = true;
28
30
  /**
29
- * Indica di utilizzare i validatori che l'utente piazza sul componente.
30
- * Da non usare nel caso di form-adaptive dato che i validatori vengono valutati in base al tipo ecc
31
- */
31
+ * Indica di utilizzare i validatori che l'utente piazza sul componente.
32
+ * Da non usare nel caso di form-adaptive dato che i validatori vengono valutati in base al tipo ecc
33
+ */
32
34
  this.UseUserValidators = true;
33
35
  /** Indica se il campo è obbligatorio i opzionale */
34
36
  this.Required = false;
35
37
  /** Indica se il Form che contiene questo campo è già stato registrato */
36
- this.formHasBeenBound = false;
38
+ this.formHasBennBound = false;
39
+ /**
40
+ * Indica se questo campo è staccato dal Form, ad esempio nel caso sia in un ng-template proiettato nel form.
41
+ *
42
+ * In quel caso la variabile **Form** del componente dev'essere valorizzata
43
+ */
44
+ this.detatchedFromform = false;
37
45
  /** @ignore */
38
46
  this.propagateChange = (_) => { };
39
47
  /** @ignore */
@@ -114,6 +122,7 @@ export class BaseFormControl {
114
122
  this.BindCheckingGroups = [];
115
123
  /** Cache delle proprietà scritte tipo --> {prop} */
116
124
  this.BindProperties = [];
125
+ this.destroyed$ = new Subject();
117
126
  if (ngControl == null) {
118
127
  if (!this.handleNullNgControl())
119
128
  console.error("ngControl nullo per qualche motivo! Il 90% delle funzionalità di questo input saranno disabilitate");
@@ -121,7 +130,7 @@ export class BaseFormControl {
121
130
  }
122
131
  //Se mi arriva l'injectable del contesto posso capire se questo campo deve essere in readonly o no, solo se ho già inizializzato i controller custom dell'access control
123
132
  if (this.AppContext && this.AppContext.name && this.ACO_CUSTOMKEY && this.ac && this.ac.InitializedCustom) {
124
- this.AppContextOwnership = !this.ac.has(this.ACO_CUSTOMKEY + ":" + this.AppContext.name);
133
+ this.AppContextOwnership = !this.ac.has(this.ACO_CUSTOMKEY + ":" + this.AppContext.name, true);
125
134
  this._readonly = !this.AppContextOwnership;
126
135
  }
127
136
  ngControl.valueAccessor = this;
@@ -131,6 +140,8 @@ export class BaseFormControl {
131
140
  //.. il quale a sua volta contiene il controllo <form-*> quindi avrò il form nell'input "Form"
132
141
  if (ngControl._parent)
133
142
  this.Form = ngControl._parent;
143
+ else
144
+ this.detatchedFromform = true;
134
145
  //Questa serve per impostare me stesso come si deve, il validatore invece lo passo al validation-input quando viene settato il validationControl
135
146
  if (this.ngControl) {
136
147
  //Per tutti i validatori: rigenero la funzione di validazione. Per qualche motivo a volte ho validatori senza...
@@ -275,9 +286,9 @@ export class BaseFormControl {
275
286
  this.GeneratedName = this.ngControl.name.toString() + "_internal";
276
287
  // ATTENZIONE: QUALSIASI SIA IL MOTIVO, SE STO COSO VIENE SPOSTATO DALL ngOnInit NON FUNZIONA PIU NULLA
277
288
  if (this.Form) {
278
- if (!this.formHasBeenBound && this.validationControl) {
289
+ if (!this.formHasBennBound && this.validationControl) {
279
290
  this.Form.addControl(this.validationControl);
280
- this.formHasBeenBound = true;
291
+ this.formHasBennBound = true;
281
292
  }
282
293
  // Quando un form viene submittato la variabile Form.submitted viene assegnata all'input [submitted] del val-control
283
294
  // Essendo che però la CD è OnPush per dire ad Angular che l'Input è cambiato e permettere i sideffects di assegnare [submitted]
@@ -289,6 +300,17 @@ export class BaseFormControl {
289
300
  return origFunc.apply(formOutsideRef);
290
301
  };
291
302
  }
303
+ if (this.SetValidationSubject) {
304
+ this.SetValidationSubject.pipe(takeUntil(this.destroyed$)).subscribe(v => {
305
+ if (v.fieldName + "_internal" == this.GeneratedName) {
306
+ let control = this.Form.getControl(this.validationControl);
307
+ control.setErrors({ forcedtoinvalid: true });
308
+ control.markAsTouched();
309
+ this.ngControl.control.setErrors({ forcedtoinvalid: true });
310
+ this.ngControl.control.markAsTouched();
311
+ }
312
+ });
313
+ }
292
314
  }
293
315
  /**
294
316
  * Se sono in modalità detatched devo rimuovere manualmente questo controllo quando entro nella dispose, altrimenti se poi ne andassi a riaggiungere
@@ -297,6 +319,8 @@ export class BaseFormControl {
297
319
  ngOnDestroy() {
298
320
  if (this.Form && this.validationControl && !!this.Form.getControl(this.validationControl))
299
321
  this.Form.removeControl(this.validationControl);
322
+ this.destroyed$.next();
323
+ this.destroyed$.complete();
300
324
  }
301
325
  /** Elabora i validatori iniettati e capisce se il valore è obbligatorio o meno */
302
326
  checkRequiredValidator() {
@@ -360,12 +384,11 @@ export class BaseFormControl {
360
384
  this.Form.removeControl(this.validationControl);
361
385
  this.validationControl = comp;
362
386
  //Questa serve per passare avanti i validatori
363
- if (this.UseUserValidators)
364
- this.validationControl.control.setValidators(this._validators);
387
+ this.validationControl.control.setValidators(this._validators);
365
388
  //Se sono staccato dal Form (vuol dire che sono ad esempio dentro un ng-template) aggiungo il controllo al Form passato come input (context del template)
366
- if (this.Form && !this.formHasBeenBound) {
389
+ if (this.detatchedFromform && this.Form && !this.formHasBennBound) {
367
390
  this.Form.addControl(this.validationControl);
368
- this.formHasBeenBound = true;
391
+ this.formHasBennBound = true;
369
392
  }
370
393
  if (this.ngControl)
371
394
  this.bindResetFunction();
@@ -376,7 +399,7 @@ export class BaseFormControl {
376
399
  registerForm(ngForm) {
377
400
  this.Form = ngForm;
378
401
  this.Form.addControl(this.validationControl);
379
- this.formHasBeenBound = true;
402
+ this.formHasBennBound = true;
380
403
  }
381
404
  /**
382
405
  * Aggiorna il valore e la validità dell'input sottostante. Non viene chiamato per input nativi come le checkbox
@@ -419,7 +442,7 @@ export class BaseFormControl {
419
442
  * Non posso tenerlo protected altrimenti posso eseguirlo solo dal .ts e non dall' .html
420
443
  */
421
444
  finalized() {
422
- this.inputFinalized.emit();
445
+ this.inputFinalized.emit(this.ngControl?.name?.toString());
423
446
  this.log("Control Value Finalized - " + this.GeneratedName);
424
447
  }
425
448
  /**
@@ -432,9 +455,9 @@ export class BaseFormControl {
432
455
  console.log("@forms-and-validations: " + message);
433
456
  }
434
457
  }
435
- BaseFormControl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BaseFormControl, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
436
- BaseFormControl.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: BaseFormControl, inputs: { FocusSubject: "FocusSubject", FieldAppearence: "FieldAppearence", FormLayout: "FormLayout", EmitPendingChanges: "EmitPendingChanges", Validation: "Validation", Frozen: "Frozen", Placeholder: "Placeholder", FormGroupClass: "FormGroupClass", FailedValidationMessage: "FailedValidationMessage", ForcedError: "ForcedError", Label: "Label", LabelColWidth: "LabelColWidth", InputColWidth: "InputColWidth", Last: "Last", Form: "Form", Source: "Source", IdField: "IdField", FloatingLabel: "FloatingLabel", DisplayMode: "DisplayMode", DisplayCondition: "DisplayCondition", DisplayModeTemplate: "DisplayModeTemplate", DisplayLayout: "DisplayLayout", InlineSeparator: "InlineSeparator", Display: "Display", Readonly: "Readonly", LabelInputRatio: "LabelInputRatio" }, outputs: { inputChange: "inputChange", inputFocus: "inputFocus", inputFinalized: "inputFinalized" }, viewQueries: [{ propertyName: "_validationControl", first: true, predicate: ["validationControl"], descendants: true }, { propertyName: "validationControl_static", first: true, predicate: ["validationControl"], descendants: true, static: true }], ngImport: i0 });
437
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BaseFormControl, decorators: [{
458
+ BaseFormControl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseFormControl, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
459
+ BaseFormControl.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: BaseFormControl, inputs: { FocusSubject: "FocusSubject", SetValidationSubject: "SetValidationSubject", FieldAppearence: "FieldAppearence", FormLayout: "FormLayout", EmitPendingChanges: "EmitPendingChanges", Validation: "Validation", Frozen: "Frozen", Placeholder: "Placeholder", FormGroupClass: "FormGroupClass", FailedValidationMessage: "FailedValidationMessage", ForcedError: "ForcedError", Label: "Label", LabelColWidth: "LabelColWidth", InputColWidth: "InputColWidth", Last: "Last", Form: "Form", Source: "Source", IdField: "IdField", FloatingLabel: "FloatingLabel", DisplayMode: "DisplayMode", DisplayCondition: "DisplayCondition", DisplayModeTemplate: "DisplayModeTemplate", DisplayLayout: "DisplayLayout", InlineSeparator: "InlineSeparator", Display: "Display", Readonly: "Readonly", LabelInputRatio: "LabelInputRatio" }, outputs: { inputChange: "inputChange", inputFocus: "inputFocus", inputFinalized: "inputFinalized" }, viewQueries: [{ propertyName: "_validationControl", first: true, predicate: ["validationControl"], descendants: true }, { propertyName: "validationControl_static", first: true, predicate: ["validationControl"], descendants: true, static: true }], ngImport: i0 });
460
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseFormControl, decorators: [{
438
461
  type: Directive
439
462
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NgControl }, { type: Array }, { type: i2.AccessControlService, decorators: [{
440
463
  type: Optional
@@ -452,6 +475,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
452
475
  args: [FAV_DEBUG_MODE]
453
476
  }] }, { type: undefined }]; }, propDecorators: { FocusSubject: [{
454
477
  type: Input
478
+ }], SetValidationSubject: [{
479
+ type: Input
455
480
  }], FieldAppearence: [{
456
481
  type: Input
457
482
  }], FormLayout: [{
@@ -515,4 +540,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
515
540
  }], inputFinalized: [{
516
541
  type: Output
517
542
  }] } });
518
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFvRCxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSXZILE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUVwRCxrRUFBa0U7QUFFbEUsTUFBTSxPQUFnQixlQUFlO0lBcU1qQywyQkFBMkI7SUFDM0IsWUFBc0IsR0FBc0IsRUFBUyxTQUFvQixFQUFZLFdBQXVCLEVBQXNCLEVBQXdCLEVBQXFCLFVBQTRCLEVBQTZDLGFBQXFCLEVBQThDLGNBQXVCLEVBQVUsY0FBdUIsS0FBSztRQUFsVyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBWSxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUFzQixPQUFFLEdBQUYsRUFBRSxDQUFzQjtRQUFxQixlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUE2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUE4QyxtQkFBYyxHQUFkLGNBQWMsQ0FBUztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQXBNeFg7Ozs7O1dBS0c7UUFDSyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRWxDOzs7V0FHRztRQUNPLHNCQUFpQixHQUFXLElBQUksQ0FBQztRQUUzQyxvREFBb0Q7UUFDN0MsYUFB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QUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFPRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBUUcsT0FBTztzQkFBZixLQUFLO2dCQW9CTyxRQUFRO3NCQUFwQixLQUFLO2dCQVVPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBY2lELGtCQUFrQjtzQkFBeEUsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0ssd0JBQXdCO3NCQUE3RSxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHdEMsV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wsIE5nRm9ybSwgTmdNb2RlbCwgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIE9wdGlvbmFsLCBJbmplY3QsIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UsIENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sXCI7XHJcbmltcG9ydCB7IEFDT19DVVNUT01LRVksIEZBVl9ERUJVR19NT0RFIH0gZnJvbSAnLi4vdG9rZW5zJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ2hhbmdlRXZlbnQgfSBmcm9tIFwiLi4vbW9kZWxzL0NoYW5nZUV2ZW50XCI7XHJcblxyXG4vKiogQ29tcG9uZW50ZSBiYXNlIGRhIGN1aSB0dXR0aSBpIGNvbXBvbmVudGkgRm9ybSBpbXBsZW1lbnRhbm8gKi9cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRm9ybUNvbnRyb2wgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNDk4OFxyXG4gICAgICogVEw6RFI7IElsIHByaW1vIHZhbG9yZSBwYXNzYXRvIGFsIHdyaXRlVmFsdWUgw6ggbnVsbG8gcGVyY2jDqSBxdWFuZG8gaSBjYWduYWNjaSBmYW5ubyBuZXcgRm9ybUNvbnRyb2woKVxyXG4gICAgICogc2NyaXZvbm8gdW4gd3JpdGVWYWx1ZSBudWxsby4uLiBxdWluZGkgYWwgcHJpbW8gYmluZGluZyBzYWx0byBsJ2luaXppYWxpenphemlvbmUgc2UgaG8gbGEgY29wcGlhIG51bGwtZmlyc3RCaW5kXHJcbiAgICAgKiBwb2kgbWV0dGVuZG8gZmlyc3RCaW5kIGEgZmFsc2UgZGkgbMOsIGluIHBvaSBmdW56aW9ubyBjb21lIGRldm8uIFZpc3RhIGxhIGNhc2lzdGljYSBldml0byBlc3NlbnppYWxtZW50ZSBtZXTDoCBkZXRlY3RDaGFuZ2VzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmlyc3RCaW5kOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBkaSB1dGlsaXp6YXJlIGkgdmFsaWRhdG9yaSBjaGUgbCd1dGVudGUgcGlhenphIHN1bCBjb21wb25lbnRlLiBcclxuICAgICAqIERhIG5vbiB1c2FyZSBuZWwgY2FzbyBkaSBmb3JtLWFkYXB0aXZlIGRhdG8gY2hlIGkgdmFsaWRhdG9yaSB2ZW5nb25vIHZhbHV0YXRpIGluIGJhc2UgYWwgdGlwbyBlY2NcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIFVzZVVzZXJWYWxpZGF0b3JzOmJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY2FtcG8gw6ggb2JibGlnYXRvcmlvIGkgb3B6aW9uYWxlICovXHJcbiAgICBwdWJsaWMgUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YXRvIGRhIHF1ZXN0byBjYW1wbyAqL1xyXG4gICAgcHVibGljIE1vZGVsOiBhbnk7XHJcblxyXG4gICAgLyoqIFZhbG9yZSBkZWwgTW9kZWxsbyAqL1xyXG4gICAgcHVibGljIEV2YWx1YXRlZE1vZGVsOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIE5vbWUgZ2VuZXJhdG8gcGVyIGlsIGNvbnRyb2xsbyBpbnRlcm5vLiBEaSBkZWZhdWx0IMOoIGlsIG5vbWUgZGVsIGNvbnRyb2xsbyBlc3Rlcm5vIGNvbiBsJ2FnZ2l1bnRhIGRpIFwiX2ludGVybmFsXCIuIFNlcnZlIHBlciBldml0YXJlIGNyb3NzLWJpbmQgKi9cclxuICAgIHB1YmxpYyBHZW5lcmF0ZWROYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpbCBGb3JtIGNoZSBjb250aWVuZSBxdWVzdG8gY2FtcG8gw6ggZ2nDoCBzdGF0byByZWdpc3RyYXRvICovXHJcbiAgICBwcm90ZWN0ZWQgZm9ybUhhc0JlZW5Cb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcm90ZWN0ZWQgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcm90ZWN0ZWQgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xyXG5cclxuICAgIC8qKiBAaWdub3JlIFZlZGkgZ2V0dGVyIGUgc2V0dGVyICovXHJcbiAgICBwcml2YXRlIF9yZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVhbG9yYSBjaSBmb3NzZSB1biBjb250ZXN0byBjb2xsZWdhdG8gcXVlc3RhIHZhcmlhYmlsZSBpZGVudGlmaWNhIHNlIFNvbm8gbCdPd25lciBvIG1lbm8uXHJcbiAgICAgKiBcclxuICAgICAqIFNlIG5vbiBsbyBzb25vLCBpbCBjYW1wbyByaXN1bHRlcsOgIGluIHNvbGEgbGV0dHVyYSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBBcHBDb250ZXh0T3duZXJzaGlwOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogU3ViamVjdCBhIGN1aSBsJ29nZ2V0dG8gaW50ZXJubyBzaSBjb2xsZWdhIHBlciBlZmZldHR1YXJlIGlsIGZvY3VzIGRlbGwnZWxlbWVudG8gaW5wdXQgc290dG9zdGFudGUgKi9cclxuICAgIEBJbnB1dCgpIEZvY3VzU3ViamVjdDogU3ViamVjdDx2b2lkPjtcclxuXHJcbiAgICAvKiogTW9kYWxpdMOgIGluIGN1aSB2aWVuZSBtb3N0cmF0byBpbCBjYW1wbywgMS0xIHJpc3BldHRvIGFsbGUgZGVmaW5pemlvbmkgZGkgQW5ndWxhciBNYXRlcmlhbCAgKi9cclxuICAgIEBJbnB1dCgpIEZpZWxkQXBwZWFyZW5jZTogXCJsZWdhY3lcIiB8IFwic3RhbmRhcmRcIiB8IFwiZmlsbFwiIHwgXCJvdXRsaW5lXCIgPSBcIm91dGxpbmVcIjtcclxuXHJcbiAgICAvKiogVXRpbGl6emEgbyBtZW5vIGlsIExheW91dCBkaSB1biBmb3JtIChMYWJlbCBjb24gaW5wdXQgZGkgZmlhbmNvKSwgc2UgZmFsc2UgbW9zdHJhIHNvbG8gbCdpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgRm9ybUxheW91dDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIERlZmluaXNjZSBzZSByaWNoaWFtYXJlIGwnRXZlbnRFbWl0dGVyICoqaW5wdXRDaGFuZ2UqKiBpbiBtYW5pZXJhIGNsYXNzaWNhICh0cnVlKSBvIHNvbG8gcGVyIGxhIGNoYW5nZSBjb25zaWRlcmF0ZSBkZWZpbml0aXZlIGNvbWUgdGFzdG8gaW52aW8gLyBibHVyIC8gZWNjLi4uIChmYWxzZSkgKi9cclxuICAgIEBJbnB1dCgpIEVtaXRQZW5kaW5nQ2hhbmdlczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIEF0dGl2YSBvIGRpc2F0dGl2YSBsYSB2YWxpZGF6aW9uZSBwZXIgcXVlc3RvIGNvbXBvbmVudGUgKi9cclxuICAgIEBJbnB1dCgpIFZhbGlkYXRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIFBlcm1ldHRlIGRpIHNjcml2ZXJlIG8gbWVubyBuZWwgY2FtcG8gZGkgSW5wdXQuIFNpIGRpZmZlcmVuemlhIGRhbCBSZWFkb25seSBpbiBxdWFudG8gZmlzaWNhbWVudGUgbCdJbnB1dCDDqCBzY3JpdmliaWxlIGUgdmVuZ29ubyBtYW50ZW51dGkgaSB0ZW1pIGRlbGxhIHZhbGlkYXppb25lXHJcbiAgICAgKiBtYSBpbnRlcmFnaXJlIGRpcmV0dGFtZW50ZSBjb24gbGEgY2FzZWxsYSBkaSBJbnB1dCBwZXIgbCd1dGVudGUgbm9uIMOoIHBvc3NpYmlsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGcm96ZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogUGxhY2Vob2xkZXIgcGVyIHF1YW5kbyBsJ2lucHV0IMOoIHZ1b3RvICovXHJcbiAgICBASW5wdXQoKSBQbGFjZWhvbGRlcjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogQ2xhc3NlIGV4dHJhIHBlciBpbCBmb3JtLWdyb3VwIGluIGN1aSB2aWVuZSB3cmFwcGF0byBsJ2lucHV0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtR3JvdXBDbGFzczogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogTWVzc2FnZ2lvIGRhIG1vc3RyYXJlIHF1YW5kbyBsYSB2YWxpZGF6aW9uZSBmYWxsaXNjZSBwZXIgcXVlc3RvIGNvbXBvbmVudGUuIERpIGRlZmF1bHQgdmllbmUgcHJvcG9zdGEgZGFsbGEgbGlicmVyaWEgKi9cclxuICAgIEBJbnB1dCgpIEZhaWxlZFZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBJbnB1dCBjaGUgZm9yemEgbCdpbnZhbGlkaXTDoCBkZWwgY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgRm9yY2VkRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogTW9zdHJhIHVuIHRlc3RvIGEgc2luaXN0cmEgZGVsbCdpbnB1dCAoRm9ybUxheW91dCBwZXJtZXR0ZW5kbykgKi9cclxuICAgIEBJbnB1dCgpIExhYmVsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBjb2wtbWQtWCBwZXIgbGEgbGFiZWwgKi9cclxuICAgIEBJbnB1dCgpIExhYmVsQ29sV2lkdGg6IG51bWJlciA9IDQ7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsJ2lucHV0ICovXHJcbiAgICBASW5wdXQoKSBJbnB1dENvbFdpZHRoOiBudW1iZXIgPSA4O1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2Ugw6ggbCd1bHRpbW8gY29tcG9uZW50ZSBkaSB1biBmb3JtIChzZXJ2ZSBwZXIgcmltdW92ZXJlIGlsIG1hcmdpbmUgZmluYWxlKSAqL1xyXG4gICAgQElucHV0KCkgTGFzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBBc3NvY2lhIGlsIGNvbXBvbmVudGUgRm9ybSBhIHF1ZXN0byBpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgRm9ybTogTmdGb3JtID0gbnVsbDtcclxuXHJcbiAgICAvKiogU29yZ2VudGUgZGEgY3VpIHNjZWdsaWVyZSB2YWxvcmkgcGVyIGkgY29tcG9uZW50aSBGb3JtIGNoZSBsbyBjb25zZW50b25vICovXHJcbiAgICBASW5wdXQoKSBTb3VyY2U6IGFueVtdO1xyXG5cclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSWQgZGVnbGkgb2dnZXR0aSBiaW5kYXRpIG5lbGxhICoqU291cmNlKiogKi9cclxuICAgIEBJbnB1dCgpIElkRmllbGQ6IHN0cmluZyA9ICdpZCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaWwgKipQbGFjZWhvbGRlcioqIGRldidlc3NlcmUgdXNhdG8gY29tZSB1bmEgZmxvYXRpbmcgbGFiZWwgZGkgbWF0ZXJpYWwgbyBzb2xvIGNvbWUgdW4gcGxhY2Vob2xkZXIgc3RhbmRhcmQgXHJcbiAgICAgKiBcclxuICAgICAqIElnbm9yYXRhIGxhdG8gYXV0b2NvbXBsZXRlLCBhdXRvY29tcGxldGUtbXVsdGkgZSBzZWxlY3QgaW4gcXVhbnRvIGhhbm5vIGdlc3Rpb25pIHBhcnRpY29sYXJpIGRpIHBsYWNlaG9sZGVyIGVjYy4uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGbG9hdGluZ0xhYmVsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGNoZSBsYSBwYXJ0ZSBpbnB1dCBkZWwgY29udHJvbGxvIGRldidlc3NlcmUgdW5hIGxhYmVsIHJlYWRvbmx5IGUgbGEgcGFydGUgbGFiZWwgZGkgdGl0b2xvIGRldidlc3NlcmUgaW4gYm9sZC4gUGVyIHV0aWxpenphcmUgdW4gc29sbyBjb21wb25lbnRlIHNpYSBwZXIgbGEgbW9kaWZpY2EgY2hlIHBlciBpbCBkZXR0YWdsaW8gKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXlNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEluZGljYSBsYSBjb25kaXppb25lIHBlciBjdWkgdW4gZWxlbWVudG8gaW4gTW9kYWxpdMOgIERpc3BsYXkgcHXDsiBlc3NlcmUgdmlzaWJpbGUgaW4gYmFzZSBhIHVsdGVyaW9yaSBjb250cm9sbGkgKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXlDb25kaXRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBUZW1wbGF0ZSBwZXIgdmlzdWFsaXp6YXJlIGxhIG1vZGFsaXTDoCAqKkRpc3BsYXlNb2RlKiogY29tZSB2dW9sZSBpbCBwcm9ncmFtbWF0b3JlIGZyb2NpbyBkaSB0dXJubyAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheU1vZGVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKiogTGF5b3V0IGRlbCBGb3JtIHF1YW5kbyDDqCBpbiBtb2RhbGl0w6AgRGlzcGxheS4gRGkgZGVmYXVsdCBtYW50aWVuZSBsYSBmb3JtYXR0YXppb25lIGEgZm9ybSAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheUxheW91dDogJ2Zvcm0nIHwgJ2lubGluZScgfCAnaGlkZGVuJyA9ICdmb3JtJztcclxuXHJcbiAgICAvKiogU2VwYXJhdG9yZSBkYSBtZXR0ZXJlIGluIGF1dG9tYXRpY28gZnJhIHVuIGVsZW1lbnRvIEZvcm0gZSBsJ2FsdHJvIHF1YW5kbyBzb25vIGluICoqRGlzcGxheU1vZGUqKiBjb24gKipEaXNwbGF5TGF5b3V0KiogaW5saW5lICovXHJcbiAgICBASW5wdXQoKSBJbmxpbmVTZXBhcmF0b3I6IHN0cmluZyA9ICcgJztcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3ByZXNzaW9uZSBzaW1pbC1Bbmd1bGFyIHBlciBjYW1iaWFyZSBpbCB0ZXN0byBkZWkgY29tcG9uZW50aSBjaGUgc2NlbGdvbm8gaWwgcHJvcHJpbyBtb2RlbGxvIGRhIHVuYSAqKlNvdXJjZSoqXHJcbiAgICAgKiBcclxuICAgICAqIElsIGZ1bnppb25hbWVudG8gw6ggaWRlbnRpY28gYWwgYmluZGVyIGRpIGFuZ3VsYXIsIHNvbG8gY29uIHVuYSBncmFmZmEgaW52ZWNlIGNoZSAyLlxyXG4gICAgICogw4ggaW5vbHRyZSBwb3NzaWJpbGUgYWdnaXVuZ2VyZSBwZXp6aSBkaSBkZXNjcml6aW9uZSBpbiBtYW5pZXJhIGNvbmRpemlvbmFsZSBjb24gbGEgc2ludGFzc2kgKio6cHJvcD8oUHJvcCB2YWxlIHtwcm9wfSkqKlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5OiBzdHJpbmcgPSAne2Rlc2NyaXB0aW9ufSc7XHJcblxyXG4gICAgLyoqIFJpc3VsdGF0byBkZWxsJ3VuaW9uZSBmcmEgbGUgaW5mb3JtYXppb25pIGRlZ2xpIG9nZ2V0dGkgaW4gKipTb3VyY2UqKiBlIGxlIGltcG9zdGF6aW9uaSBzcGVjaWZpY2F0ZSBuZWxsJ0lucHV0ICoqRGlzcGxheSoqICovXHJcbiAgICBwdWJsaWMgQm91bmRTb3VyY2U6IHsgaWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIGlsIHByaW1vIEJpbmQgZGVsbGEgU291cmNlICovXHJcbiAgICBwcm90ZWN0ZWQgU291cmNlRmlyc3RCaW5kOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKl9yZWFkb25seSoqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBzb2xhIGxldHR1cmEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFkb25seSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBvc3RhIGlsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipfcmVhZG9ubHkqKiBnZXN0ZW5kbyBhbmNoZSBpbCBDb250ZXN0byBhcHBsaWNhdGl2b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIFZhbG9yZSBkYSBpbXBvc3RhcmVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgc2V0IFJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuQXBwQ29udGV4dE93bmVyc2hpcClcclxuICAgICAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcm1ldHRlIGRpIHNldHRhcmUgaW4gdW5hIHZvbHRhIHNvbG8gZ2xpIGlucHV0IExhYmVsQ29sV2lkdGggZSBJbnB1dENvbFdpZHRoLCBiYXN0YSBzY3JpdmVybG8gY29uIGxhIHNpbnRhc3NpIFwiWCBZXCJcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IElucHV0IG5lbCBmb3JtYXRvIFwiWCBZXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgc2V0IExhYmVsSW5wdXRSYXRpbyhpbnB1dDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJhdGlvID0gaW5wdXQuc3BsaXQoL1xccy8pO1xyXG4gICAgICAgIHRoaXMuTGFiZWxDb2xXaWR0aCA9IHBhcnNlSW50KHJhdGlvWzBdKTtcclxuICAgICAgICB0aGlzLklucHV0Q29sV2lkdGggPSBwYXJzZUludChyYXRpb1sxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIHZhbC1xdWFsY29zYSBjaGUgZmEgZWZmZXR0aXZhbWVudGUgZGEgaW5wdXQsIG8gZXZlbnR1YWxtZW50ZSBpbCBzaW5nb2xvIGlucHV0IGluIGNhc2kgcGFydGljb2xhcmkgKGVzIGNoZWNrYm94KSAqL1xyXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRpb25Db250cm9sOiBOZ01vZGVsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVlcnkgc3VsbCdlbGVtZW50byAndmFsaWRhdGlvbkNvbnRyb2wnIGNoZSBmdW56aW9uYSBpbiBhbWJpZW50ZSBzdGF0aWNvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcInZhbGlkYXRpb25Db250cm9sXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBzZXQgX3ZhbGlkYXRpb25Db250cm9sKGNvbXA6IE5nTW9kZWwpIHsgdGhpcy5yZWdpc3RlclZhbENvbXAoY29tcCk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ3ZhbGlkYXRpb25Db250cm9sJyBjaGUgZnVuemlvbmEgaW4gYW1iaWVudGUgZGluYW1pY29cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjdmFsaWRhdGlvbkNvbnRyb2xcIlxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFwidmFsaWRhdGlvbkNvbnRyb2xcIiwgeyBzdGF0aWM6IHRydWUgfSkgc2V0IHZhbGlkYXRpb25Db250cm9sX3N0YXRpYyhjb21wOiBOZ01vZGVsKSB7IHRoaXMucmVnaXN0ZXJWYWxDb21wKGNvbXApOyB9O1xyXG5cclxuICAgIC8qKiBFdmVudG8gY2hpYW1hdG8gYWxsYSBtb2RpZmljYSBkZWwgdmFsb3JlIGNvbGxlZ2F0byBhIHF1ZXN0byBjYW1wbyAqL1xyXG4gICAgQE91dHB1dCgpIGlucHV0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8Q2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFuZ2VFdmVudD4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsIGZvY3VzIGRlbCBjYW1wbyBkaSB0ZXN0by9jb21iby9xdWVsY2hlw6gsIHJpZW1pdHRhIGwnZXZlbnRvIG9yaWdpbmFsZSBKYXZhc2NyaXB0ICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRGb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsIGZpbmFsaXplIGRlbCBjYW1wbyBkaSB0ZXN0by9jb21iby9xdWVsY2hlw6ggKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dEZpbmFsaXplZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKiogQ2FjaGUgZGVsbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gOnByb3A/KFJvYmEgY29uIHtwcm9wfSkgKi9cclxuICAgIHByaXZhdGUgQmluZENoZWNraW5nR3JvdXBzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHdoZW5leGlzdHM6IHN0cmluZyB9W10gPSBbXVxyXG5cclxuICAgIC8qKiBDYWNoZSBkZWxsZSBwcm9wcmlldMOgIHNjcml0dGUgdGlwbyAtLT4ge3Byb3B9ICovXHJcbiAgICBwcml2YXRlIEJpbmRQcm9wZXJ0aWVzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBwcm90ZWN0ZWQgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIHByaXZhdGUgYWM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwdWJsaWMgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBwcml2YXRlIEFDT19DVVNUT01LRVk6IHN0cmluZywgQE9wdGlvbmFsKCkgQEluamVjdChGQVZfREVCVUdfTU9ERSkgcHJpdmF0ZSBGQVZfREVCVUdfTU9ERTogYm9vbGVhbiwgcHJpdmF0ZSBuYXRpdmVJbnB1dDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlTnVsbE5nQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5nQ29udHJvbCBudWxsbyBwZXIgcXVhbGNoZSBtb3Rpdm8hIElsIDkwJSBkZWxsZSBmdW56aW9uYWxpdMOgIGRpIHF1ZXN0byBpbnB1dCBzYXJhbm5vIGRpc2FiaWxpdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2UgbWkgYXJyaXZhIGwnaW5qZWN0YWJsZSBkZWwgY29udGVzdG8gcG9zc28gY2FwaXJlIHNlIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBpbiByZWFkb25seSBvIG5vLCBzb2xvIHNlIGhvIGdpw6AgaW5pemlhbGl6emF0byBpIGNvbnRyb2xsZXIgY3VzdG9tIGRlbGwnYWNjZXNzIGNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0ICYmIHRoaXMuQXBwQ29udGV4dC5uYW1lICYmIHRoaXMuQUNPX0NVU1RPTUtFWSAmJiB0aGlzLmFjICYmIHRoaXMuYWMuSW5pdGlhbGl6ZWRDdXN0b20pIHtcclxuICAgICAgICAgICAgdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwID0gIXRoaXMuYWMuaGFzKHRoaXMuQUNPX0NVU1RPTUtFWSArIFwiOlwiICsgdGhpcy5BcHBDb250ZXh0Lm5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9ICF0aGlzLkFwcENvbnRleHRPd25lcnNoaXBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy9TZSBobyBnacOgIHVuIHBhcmVudCBpbXBvc3RhdG8gdnVvbCBkaXJlIGNoZSBzb3R0byBhbCB0YWcgPGZvcm0+IGhvIGRpcmV0dGFtZW50ZSB1biB0YWcgPGZvcm0tKj4uLlxyXG4gICAgICAgIC8vLi4gcXVpbmRpIHBvc3NvIGltcG9zdGFyZSBkaXJldHRhbWVudGUgaWwgcmlmZXJpbWVudG8gZGVsIEZvcm0gZGEgdXNhcmUgaW4gSFRNTCBwZXIgaWwgc3VibWl0dGVkXHJcblxyXG4gICAgICAgIC8vU2Ugbm9uIGMnw6ggdnVvbCBkaXJlIGNoZSBkZW50cm8gYWwgdGFnIDxmb3JtPiBjJ8OoIHVubyBzcGxlbmRpZG8gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAuLi4uXCI+Li5cclxuICAgICAgICAvLy4uIGlsIHF1YWxlIGEgc3VhIHZvbHRhIGNvbnRpZW5lIGlsIGNvbnRyb2xsbyA8Zm9ybS0qPiBxdWluZGkgYXZyw7IgaWwgZm9ybSBuZWxsJ2lucHV0IFwiRm9ybVwiXHJcbiAgICAgICAgaWYgKCg8YW55Pm5nQ29udHJvbCkuX3BhcmVudClcclxuICAgICAgICAgICAgdGhpcy5Gb3JtID0gPE5nRm9ybT4oPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQ7XHJcblxyXG4gICAgICAgIC8vUXVlc3RhIHNlcnZlIHBlciBpbXBvc3RhcmUgbWUgc3Rlc3NvIGNvbWUgc2kgZGV2ZSwgaWwgdmFsaWRhdG9yZSBpbnZlY2UgbG8gcGFzc28gYWwgdmFsaWRhdGlvbi1pbnB1dCBxdWFuZG8gdmllbmUgc2V0dGF0byBpbCB2YWxpZGF0aW9uQ29udHJvbFxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG4gICAgICAgICAgICAvL1BlciB0dXR0aSBpIHZhbGlkYXRvcmk6IHJpZ2VuZXJvIGxhIGZ1bnppb25lIGRpIHZhbGlkYXppb25lLiBQZXIgcXVhbGNoZSBtb3Rpdm8gYSB2b2x0ZSBobyB2YWxpZGF0b3JpIHNlbnphLi4uXHJcbiAgICAgICAgICAgIC8vLi4uIHF1ZXN0byDDqCB1biB3b3JrYXJvdW5kIHBlciBlc3NlcmUgc2ljdXJvIGRpIGF2ZXJsYSBzZW1wcmUuXHJcbiAgICAgICAgICAgIC8vU29sbyBpIHZhbGlkYXRvcmkgY29uIHBhcmFtZXRyaSBoYW5ubyBiaXNvZ25vIGRlbGxhIF9jcmVhdGVWYWxpZGF0b3IgKGVzLiBcIm1heGxlbmd0aFwiIGNoZSBoYSAxIHBhcmFtZXRybyksIHF1aW5kaSBubyB2YWxpZGF0b3JpIHRpcG8gXCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0b3JzLmZvckVhY2godiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYuX2NyZWF0ZVZhbGlkYXRvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi5fY3JlYXRlVmFsaWRhdG9yKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLmFkZFZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIEJpbmQvUGFyc2UgZGVsbGUgdmFyaWUgKipTb3VyY2UqKiB1bmVuZG8gbGUgaW5mb3JtYXppb25pIHNwZWNpZmljYXRlIGluICoqRGlzcGxheSoqXHJcbiAgICAgKiBcclxuICAgICAqIEV2ZW50dWFsbWVudGUgcmllZmZldHR1YSB1biBiaW5kIGFsIG1vZGVsbG8gaW4gYmFzZSBhbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqUmViaW5kTW9kZWxBZnRlclNvdXJjZSoqXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB0cnlCaW5kU291cmNlRGlzcGxheSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuU291cmNlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlNvdXJjZS5sZW5ndGggPT0gMCAmJiAhdGhpcy5Tb3VyY2VGaXJzdEJpbmQpXHJcbiAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5Tb3VyY2VGaXJzdEJpbmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gQ2FjaGUgbG9jYWxlIHBlciBldml0YXJlIGRpIHJpZmFyZSBkZWkgcmVnZXgubWF0Y2ggb2duaSBzYW50YSB2b2x0YVxyXG4gICAgICAgIGlmICh0aGlzLlNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVCaW5kQ2hlY2tpbmdHcm91cHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkJpbmRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUJpbmRQcm9wZXJ0aWVzKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBCbG9jY28gcGVyIGdlbmVyYXJlIGxhIGRlc2NyaXppb25lIGZpbmFsZSBkaSB1biBlbGVtZW50b1xyXG4gICAgICAgICAgICB0aGlzLlNvdXJjZS5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gQWdnaXVuZ28gYWxsYSBCb3VuZFNvdXJjZSBpbiBmb3JtYXRvIHN0YW5kYXJkIEtleVZhbHVlXHJcbiAgICAgICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlLnB1c2godGhpcy50cmFuc2Zvcm1Tb3VyY2VJdGVtKHMpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBQb3N0IHRyeWJpbmQgc2UgYyfDqCB1biBtb2RlbGxvIGFzc29jaWF0byByaWNhbGNvbG8gbCcqKkV2YWx1YXRlZE1vZGVsKipcclxuICAgICAgICAgICAgaWYgKHRoaXMuTW9kZWwpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkV2YWx1YXRlZE1vZGVsID0gdGhpcy5Cb3VuZFNvdXJjZS5maW5kKHQgPT4gdC5pZCA9PSB0aGlzLk1vZGVsKT8uZGVzY3JpcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBWYWx1dGEgaWwgY29udGVudXRvIGRlbGxhIHZhcmlhYmlsZSBCaW5kQ2hlY2tpbmdHcm91cHMgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVCaW5kQ2hlY2tpbmdHcm91cHMoKSB7XHJcbiAgICAgICAgLy8gQmxvY2NvIHBlciB0aXJhcmUgZnVvcmkgbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gLS0+IDpwcm9wPyhSb2JhIGNvbiB7cHJvcH0pXHJcbiAgICAgICAgdmFyIGlmZmVkTWF0Y2hlcyA9IHRoaXMuRGlzcGxheS5tYXRjaCgvOihbYS16XSspXFw/XFwoKFteXFwoXFwpXSspXFwpL2cpO1xyXG4gICAgICAgIGlmIChpZmZlZE1hdGNoZXMpIHtcclxuICAgICAgICAgICAgaWZmZWRNYXRjaGVzLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdGVzc2EgcmVnZXggZGkgc29wcmEgbWEgaWwgdGFnIFwiaVwiIHNlcnZlIHBlciB0aXJhcmUgZnVvcmkgaSBzaW5nb2xpIGNhcHR1cmluZyBncm91cCBlIHBlciBxdWFsY2hlIG1vdGl2byBcclxuICAgICAgICAgICAgICAgIC8vIG5ldyBSZWdFeHAoYmFzZVJlZ2V4LCBcImdcIikgbm9uIGZ1bnppb25hIHF1aW5kaSBub24gaG8gcG90dXRvIHJhemlvbmFsaXp6YXJsb1xyXG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwcyA9IG0ubWF0Y2goLzooW2Etel0rKVxcP1xcKChbXlxcKFxcKV0rKVxcKS9pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQmluZENoZWNraW5nR3JvdXBzLnB1c2goeyBnbG9iYWw6IG0sIHByb3A6IGdyb3Vwc1sxXSwgd2hlbmV4aXN0czogZ3JvdXBzWzJdIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFZhbHV0YSBpbCBjb250ZW51dG8gZGVsbGEgdmFyaWFiaWxlIEJpbmRQcm9wZXJ0aWVzICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlQmluZFByb3BlcnRpZXMoKSB7XHJcbiAgICAgICAgLy8gQmxvY2NvIHBlciB0aXJhcmUgZnVvcmkgbGUgcHJvcHJpZXTDoCBzY3JpdHRlIHRpcG8gLS0+IHtwcm9wfVxyXG4gICAgICAgIHZhciBtYXRjaGVzID0gdGhpcy5EaXNwbGF5Lm1hdGNoKC97W2Etel0rfS9naSk7XHJcbiAgICAgICAgaWYgKG1hdGNoZXMpXHJcbiAgICAgICAgICAgIG1hdGNoZXMuZm9yRWFjaChtID0+IHsgdGhpcy5CaW5kUHJvcGVydGllcy5wdXNoKHsgZ2xvYmFsOiBtLCBwcm9wOiBtLnN1YnN0cmluZygxLCBtLmxlbmd0aCAtIDEpIH0pOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXNmb3JtYSB1biBvZ2dldHRvIGRlbGxhIFNvdXJjZSBhbGxhIHN1YSB2ZXJzaW9uZSBcIm51b3ZhXCIgYmFzYW5kb3NpIHN1bGxlIGluZm9ybWF6aW9uaSBzdSBncnVwcGkgZSBwcm9wcmlldMOgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gZGEgdHJhc2Zvcm1hcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3tpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfX0gT2dnZXR0byBmaW5hbGUgdHJhc2Zvcm1hdG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Tb3VyY2VJdGVtKHM6IGFueSk6IHtpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfSB7XHJcbiAgICAgICAgLy8gUGFydG8gc2VtcHJlIGRhbGxhIHZhcmlhYmlsZSBkaSBEaXNwbGF5LCBwb2kgc29zdGl0dWlzY28gcGV6em8gcGVyIHBlenpvXHJcbiAgICAgICAgbGV0IGRlc2MgPSB0aGlzLkRpc3BsYXk7XHJcblxyXG4gICAgICAgIC8vIFRhZ2xpbyBvIG1hbnRlbmdvIGxlIGNvbmRpemlvbmkgaW4gYmFzZSBhbGxhIHByb3ByaWV0w6Agc3UgY3VpIGZhcmUgY2hlY2tcclxuICAgICAgICAvLyBEb3BvZGljaMOpIHNjcml2byB0dXR0ZSBsZSBwcm9wcmlldMOgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdCA9IHRoaXMuQmluZENoZWNraW5nR3JvdXBzW2ldO1xyXG4gICAgICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKHQuZ2xvYmFsLCAoc1t0LnByb3BdICE9IG51bGwgJiYgc1t0LnByb3BdICE9IHVuZGVmaW5lZCkgPyB0LndoZW5leGlzdHMgOiBcIlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5CaW5kUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdCA9IHRoaXMuQmluZFByb3BlcnRpZXNbaV07XHJcbiAgICAgICAgICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UodC5nbG9iYWwsIHNbdC5wcm9wXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBpZDogc1t0aGlzLklkRmllbGRdLCBkZXNjcmlwdGlvbjogZGVzYyB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGlsIGNvbW9wbmVudGUgaW4gcXVlc3Rpb25lIMOoIGluIGdyYWRvIGRpIGdlc3RpcmUgbmdDb250cm9sIG51bGxpLiBcclxuICAgICAqIERpIGRlZmF1bHQgw6ggKipmYWxzZSoqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBnZXN0aXNjbyBuZ0NvbnRyb2wgbnVsbGksICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIGhhbmRsZU51bGxOZ0NvbnRyb2woKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICAvLyBBIHZvbHRlIG5lbGwnbmdPbkluaXQgbm9uIGNpIHBhc3NhIHF1aW5kaSBsbyBtZXR0byBzaWEgcXVpIHNpYSBuZWxsJ2FmdGVydmlld2luaXQsIHBlbnNvIGNoZSB2YWxnYSBwZXIgaSBjb21wb25lbnRpIGRpIHRlcnplIHBhcnRpXHJcbiAgICAgICAgLy8gY2hlIHNpIGNvbGxlZ2FubyBwZXIgaSBjYXp6aSBsb3JvIGFsIGZvcm0gZWNjLCBxdWluZGkgbGEgcGFydGUgc29wcmEgbm9uIHNlcnZlLi4uIEJPSFxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG5cclxuICAgICAgICAvL0lsIG5vbWUgbm9uIGMnw6ggc2UgbWV0dG8gc3RhbmRhbG9uZSA6IHRydWUgKENIRSBOT04gw6kgREEgTUVUVEVSRSlcclxuICAgICAgICAvL0RhdG8gY2hlIGFuY2hlIGlsIGNvbnRyb2xsbyBlc3Rlcm5vIHZpZW5lIGNvbnNpZGVyYXRvIGNvbWUgY29tcG9uZW50ZSBkZWwgZm9ybSwgbm9uIHBvc3NvIGJhc2FybWkgc29sbyBzdWwgbm9tZSBtYSBkZXZvIGFnZ2l1bmdlcmUgdW4gdGFnLiBJbiBxdWVzdG8gY2FzbyBcIl9pbnRlcm5hbFwiXHJcbiAgICAgICAgLy8gQVRURU5aSU9ORTogUVVBTFNJQVNJIFNJQSBJTCBNT1RJVk8sIFNFIFNUTyBDT1NPIFZJRU5FIFNQT1NUQVRPIERBTEwgbmdPbkluaXQgTk9OIEZVTlpJT05BIFBJVSBOVUxMQVxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICB0aGlzLkdlbmVyYXRlZE5hbWUgPSB0aGlzLm5nQ29udHJvbC5uYW1lLnRvU3RyaW5nKCkgKyBcIl9pbnRlcm5hbFwiO1xyXG5cclxuICAgICAgICAvLyBBVFRFTlpJT05FOiBRVUFMU0lBU0kgU0lBIElMIE1PVElWTywgU0UgU1RPIENPU08gVklFTkUgU1BPU1RBVE8gREFMTCBuZ09uSW5pdCBOT04gRlVOWklPTkEgUElVIE5VTExBXHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybUhhc0JlZW5Cb3VuZCAmJiB0aGlzLnZhbGlkYXRpb25Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0JlZW5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFF1YW5kbyB1biBmb3JtIHZpZW5lIHN1Ym1pdHRhdG8gbGEgdmFyaWFiaWxlIEZvcm0uc3VibWl0dGVkIHZpZW5lIGFzc2VnbmF0YSBhbGwnaW5wdXQgW3N1Ym1pdHRlZF0gZGVsIHZhbC1jb250cm9sXHJcbiAgICAgICAgICAgIC8vIEVzc2VuZG8gY2hlIHBlcsOyIGxhIENEIMOoIE9uUHVzaCBwZXIgZGlyZSBhZCBBbmd1bGFyIGNoZSBsJ0lucHV0IMOoIGNhbWJpYXRvIGUgcGVybWV0dGVyZSBpIHNpZGVmZmVjdHMgZGkgYXNzZWduYXJlIFtzdWJtaXR0ZWRdXHJcbiAgICAgICAgICAgIC8vIGRldm8gYXR0YWNjYXJtaSBhbCBzdWJtaXQgYXR0dWFsZSBkZWwgZm9ybSBlIHByaW1hIGRpIGVzZWd1aXJsbyBkZXZvIG1hcmNhcmUgaWwgY29tcG9uZW50ZSBwZXIgaWwgY2hlY2tcclxuICAgICAgICAgICAgbGV0IG9yaWdGdW5jID0gdGhpcy5Gb3JtLm9uU3VibWl0O1xyXG4gICAgICAgICAgICB2YXIgZm9ybU91dHNpZGVSZWYgPSB0aGlzLkZvcm07XHJcbiAgICAgICAgICAgIHRoaXMuRm9ybS5vblN1Ym1pdCA9IChldik6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0Z1bmMuYXBwbHkoZm9ybU91dHNpZGVSZWYpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlIHNvbm8gaW4gbW9kYWxpdMOgIGRldGF0Y2hlZCBkZXZvIHJpbXVvdmVyZSBtYW51YWxtZW50ZSBxdWVzdG8gY29udHJvbGxvIHF1YW5kbyBlbnRybyBuZWxsYSBkaXNwb3NlLCBhbHRyaW1lbnRpIHNlIHBvaSBuZSBhbmRhc3NpIGEgcmlhZ2dpdW5nZXJlXHJcbiAgICAgKiB1biBhbHRybyBjb24gbG8gc3Rlc3NvIFwibmFtZVwiIG1hIG1hZ2FyaSByZXNldHRhdG8sIEFuZ3VsYXIgbG8gcmUtaWRyYXRlcmViYmUgY29uIGkgdmFsb3JpIHByZWNlZGVudGkgbm9ub3N0YW50ZSBpbCBtb2RlbGxvIGZvc3NlIHZ1b3RvXHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCl7XHJcbiAgICAgICAgaWYodGhpcy5Gb3JtICYmIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgJiYgISF0aGlzLkZvcm0uZ2V0Q29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKSlcclxuICAgICAgICAgICAgdGhpcy5Gb3JtLnJlbW92ZUNvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVsYWJvcmEgaSB2YWxpZGF0b3JpIGluaWV0dGF0aSBlIGNhcGlzY2Ugc2UgaWwgdmFsb3JlIMOoIG9iYmxpZ2F0b3JpbyBvIG1lbm8gKi9cclxuICAgIGNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgLy8gY29udHJvbGxvIHNlIMOoIHNldHRhdG8gdW4gcmVxdWlyZWQgcGVyIGRlY2lkZXJlIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIHNlIHV0aWxpenphcmUgaWwgdmFsaWRhdG9yZSByZXF1aXJlZCBuZWwgY29tcG9uZW50ZSBpbnRlcm5vXHJcbiAgICAgICAgLy8gTG8gZmFjY2lvIHF1aSBlIG5vbiBpbiB1biBldmVudHVhbGUgbmdPbkluaXQgbyBjb3N0cnV0dG9yZSBwZXJjaMOpIG5nT25Jbml0IG5vbiBzZW1wcmUgdmllbmUgY2hpYW1hdG8gZSBkYSBjb3N0cnV0dG9yZSBpbCB2YWxpZGF0b3JlIG5vbiBoYSBhbmNvcmEgaWwgdmFsb3JlIGdpdXN0b1xyXG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzICYmIHRoaXMuX3ZhbGlkYXRvcnMuc29tZShlbGVtID0+IGVsZW0gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvciAmJiBlbGVtLnJlcXVpcmVkKSlcclxuICAgICAgICAgICAgdGhpcy5SZXF1aXJlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIZWxwZXIgY2hlIGNvbGxlZ2EgbGEgZnVuemlvbmUgZGkgcmVzZXQgZGVsIGNvbnRyb2xsbyBmb3JtIGFsIGNvbnRyb2xsbyBkaSB2YWxpZGF6aW9uZSBzb3R0b3N0YW50ZSAqL1xyXG4gICAgcHJpdmF0ZSBiaW5kUmVzZXRGdW5jdGlvbigpIHtcclxuICAgICAgICAvL2ZhY2NpbyBpbiBtb2RvIGNoZSBzZSBjaGlhbW8gaWwgcmVzZXQgZGVsIGNvbnRyb2xsbyAobyBkZWxsYSBmb3JtKSBkYWxsJ2VzdGVybm8gc2kgcmVzZXR0aSBhbmNoZSBpbCBjb250cm9sbG8gbmF0aXZvXHJcbiAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5yZXNldDtcclxuICAgICAgICB2YXIgbmdDb250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgICAgIHZhciB2YWxpZGF0aW9uQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlID0gdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sO1xyXG5cclxuICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBvcmlnRnVuYy5hcHBseShuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UucmVzZXQoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL1BlciBjb25zZW50aXJlIHJpY2hpYW1pIG11bHRpcGxpIGRpIHF1ZXN0YSBmdW56aW9uZSBwcmVuZGVuZG8gc2VtcHJlIGxhIGZpdW56aW9uZSBkaSByZXNldCBiYXNlXHJcbiAgICAgICAgKDxhbnk+dGhpcy5uZ0NvbnRyb2wuY29udHJvbCkuX19vcmlnaW5hbF9yZXNldF9fID0gb3JpZ0Z1bmNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCAmJiB0aGlzLmZpcnN0QmluZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0QmluZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLk1vZGVsID0gb2JqO1xyXG5cclxuICAgICAgICAvL1BlciBzdmVnbGlhcmUgQW5ndWxhci4gSWwgdmFsb3JlIGNoZSBlbnRyYSBwb3RyZWJiZSBlc3NlcmUgdmFsaWRvL25vbiB2YWxpZG8gZSBxdWVzdG8gbG8gYmluZGEgYSB0dXR0bywgZm9ybSBjb21wcmVzb1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICB0aGlzLm9uTm90TnVsbFZhbHVlU2V0KCk7XHJcblxyXG4gICAgICAgIC8vIG1hcmtGb3JDaGVjayBub24gdmEgYmVuZSBpbiBxdWFudG8gYXJyaXZhbm8gcG9zc2liaWxtZW50ZSAyIHVwZGF0ZSBzdSB1biBzb2xvIGNpY2xvIGRpIHN0YWNrXHJcbiAgICAgICAgLy8gc2V0VGltZSp1dCBjaGUgd3JhcHBhIHR1dHRvIG5vbiB2YSBiZW5lIHNlbm7DsiBzcGFtbWEgZGVsbGUgY2hhbmdlIGRldGVjdGlvbiBhIHN1b24gZGkgaW50ZXJ2YWwgY2hlIHJhbGxlbnRhbm8gdGFudGlzc2ltbyBsJ2FwcFxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RyYSBpbnRlcm5hbWVudGUgaWwgY29tcG9uZW50ZSBkaSB2YWxpZGF6aW9uZSwgbmUgaW1wb3N0YSBpIHZhbGlkYXRvcmkgZSBjb2xsZWdhIGlsIEZvcm0sIHNlIHByZXNlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJWYWxDb21wKGNvbXA6IE5nTW9kZWwpIHtcclxuICAgICAgICBpZiAoY29tcCkge1xyXG4gICAgICAgICAgICAvLyDDiCBhcnJpdmF0byB1biBudW92byB2YWxpZGF0aW9uQ29udG9ybCAoc3VjY2VkZSBzb2xvIG5lbCBmb3JtLXNlbGVjdCBxdWFuZG8gY2FtYmlhIGxhIHNvdXJjZSBkYSAwIGVsZW1lbnRpIC8gbnVsbCBhZCBOIGVsZW1lbnRpLCBxdWluZGkgYWwgbWFzc2ltbyB1bmEgdm9sdGEpIFxyXG4gICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uQ29udHJvbCAmJiB0aGlzLkZvcm0pXHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgPSBjb21wO1xyXG5cclxuICAgICAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIHBhc3NhcmUgYXZhbnRpIGkgdmFsaWRhdG9yaVxyXG4gICAgICAgICAgICBpZih0aGlzLlVzZVVzZXJWYWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7XHJcblxyXG4gICAgICAgICAgICAvL1NlIHNvbm8gc3RhY2NhdG8gZGFsIEZvcm0gKHZ1b2wgZGlyZSBjaGUgc29ubyBhZCBlc2VtcGlvIGRlbnRybyB1biBuZy10ZW1wbGF0ZSkgYWdnaXVuZ28gaWwgY29udHJvbGxvIGFsIEZvcm0gcGFzc2F0byBjb21lIGlucHV0IChjb250ZXh0IGRlbCB0ZW1wbGF0ZSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuRm9ybSAmJiAhdGhpcy5mb3JtSGFzQmVlbkJvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtSGFzQmVlbkJvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kUmVzZXRGdW5jdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgLy9JIHZhbC1yb2JhIHF1ZXN0byBsbyBmYW5ubyBhdXRvbWF0aWNhbWVudGUgZGVudHJvLi4uIGdsaSBhbHRyaSBubyAoZXMuIHNlbXBsaWNlIGlucHV0IGNoZWNrYm94KVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdGVyRm9ybShuZ0Zvcm06IE5nRm9ybSkge1xyXG4gICAgICAgIHRoaXMuRm9ybSA9IG5nRm9ybTtcclxuICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKVxyXG4gICAgICAgIHRoaXMuZm9ybUhhc0JlZW5Cb3VuZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ2dpb3JuYSBpbCB2YWxvcmUgZSBsYSB2YWxpZGl0w6AgZGVsbCdpbnB1dCBzb3R0b3N0YW50ZS4gTm9uIHZpZW5lIGNoaWFtYXRvIHBlciBpbnB1dCBuYXRpdmkgY29tZSBsZSBjaGVja2JveFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlZFZhbHVlIEZvcnphIGwnYWdnaW9ybmFtZW50byBhbmNoZSBzZSBub24gw6ggdW4gaW5wdXQgbmF0aXZvIChpbnB1dCBuYXRpdm8gPSBjaGVja2JveCwgYWQgZXNlbXBpbylcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVmFsaWRpdHlGb3JOYXRpdmVJbnB1dChmb3JjZWRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKGZvcmNlZFZhbHVlIHx8IHRoaXMubmF0aXZlSW5wdXQpXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIuIE1hbnRlbmdvIGxvIHN0ZXNzbyBub21lIGRlbGwnZXZlbnRvIGRlaSA8dmFsLSo+IChpbnB1dENoYW5nZSkgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AuXHJcbiAgICAgKiBcclxuICAgICAqIE5vbiBwb3NzbyB0ZW5lcmxvIHByb3RlY3RlZCBhbHRyaW1lbnRpIHBvc3NvIGVzZWd1aXJsbyBzb2xvIGRhbCAudHMgZSBub24gZGFsbCcgLmh0bWxcclxuICAgICAqL1xyXG4gICAgY2hhbmdlZChmb3JjZWRWYWx1ZTogYW55ID0gbnVsbCwgbWFya0ZvckNoZWNrOiBib29sZWFuID0gZmFsc2UsIG1vZGVsRXZhbHVhdGlvbkhhbmRsZWQ6IGJvb2xlYW4gPSBmYWxzZSwgaW50ZXJuYWw6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCB0b0VtaXQgPSBmb3JjZWRWYWx1ZSA9PSBudWxsIHx8IGZvcmNlZFZhbHVlID09IFwiXCIgPyB0aGlzLk1vZGVsID8/IFwiXCIgOiBmb3JjZWRWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYoIW1vZGVsRXZhbHVhdGlvbkhhbmRsZWQpXHJcbiAgICAgICAgICAgIHRoaXMuRXZhbHVhdGVkTW9kZWwgPSB0b0VtaXQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodG9FbWl0KTtcclxuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQobmV3IENoYW5nZUV2ZW50KGludGVybmFsLCB0b0VtaXQpKTtcclxuICAgICAgICBpZiAobWFya0ZvckNoZWNrKVxyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIiBzdWwgZm9jdXMuIE1hbnRlbmdvIGxvIHN0ZXNzbyBub21lIGRlbGwnZXZlbnRvIGRlaSA8dmFsLSo+IChpbnB1dENoYW5nZSkgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AuXHJcbiAgICAgKiBcclxuICAgICAqIE5vbiBwb3NzbyB0ZW5lcmxvIHByb3RlY3RlZCBhbHRyaW1lbnRpIHBvc3NvIGVzZWd1aXJsbyBzb2xvIGRhbCAudHMgZSBub24gZGFsbCcgLmh0bWxcclxuICAgICAqL1xyXG4gICAgZm9jdXNlZChldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZvY3VzLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgIHRoaXMubG9nKFwiQ29udHJvbCBGb2N1c2VkIC0gXCIgKyB0aGlzLkdlbmVyYXRlZE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiIHN1bGxhIGZpbmFsaXp6YXppb25lIGRlbCB2YWxvcmUgZGVsbCdpbnB1dCAoYmx1ciAvIHRhc3RvIGludmlvLCBlY2MuLi4pLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGZpbmFsaXplZCgpIHtcclxuICAgICAgICB0aGlzLmlucHV0RmluYWxpemVkLmVtaXQoKTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgVmFsdWUgRmluYWxpemVkIC0gXCIgKyB0aGlzLkdlbmVyYXRlZE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhbXBhIHVuIGxvZyBhIGNvbnNvbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIHN0YW1wYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2cobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRkFWX0RFQlVHX01PREUpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQGZvcm1zLWFuZC12YWxpZGF0aW9uczogXCIgKyBtZXNzYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBhYnN0cmFjdCBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkO1xyXG59Il19
543
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFvRCxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSXZILE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUUzQyxrRUFBa0U7QUFFbEUsTUFBTSxPQUFnQixlQUFlO0lBZ05qQywyQkFBMkI7SUFDM0IsWUFBc0IsR0FBc0IsRUFBUyxTQUFvQixFQUFZLFdBQXVCLEVBQXNCLEVBQXdCLEVBQXFCLFVBQTRCLEVBQTZDLGFBQXFCLEVBQThDLGNBQXVCLEVBQVUsY0FBdUIsS0FBSztRQUFsVyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBWSxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUFzQixPQUFFLEdBQUYsRUFBRSxDQUFzQjtRQUFxQixlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUE2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUE4QyxtQkFBYyxHQUFkLGNBQWMsQ0FBUztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQS9NeFg7Ozs7O1dBS0c7UUFD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QUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFPRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBUUcsT0FBTztzQkFBZixLQUFLO2dCQW9CTyxRQUFRO3NCQUFwQixLQUFLO2dCQVVPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBY2lELGtCQUFrQjtzQkFBeEUsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0ssd0JBQXdCO3NCQUE3RSxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHdEMsV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wsIE5nRm9ybSwgTmdNb2RlbCwgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIE9wdGlvbmFsLCBJbmplY3QsIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UsIENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sXCI7XHJcbmltcG9ydCB7IEFDT19DVVNUT01LRVksIEZBVl9ERUJVR19NT0RFIH0gZnJvbSAnLi4vdG9rZW5zJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ2hhbmdlRXZlbnQgfSBmcm9tIFwiLi4vbW9kZWxzL0NoYW5nZUV2ZW50XCI7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuLyoqIENvbXBvbmVudGUgYmFzZSBkYSBjdWkgdHV0dGkgaSBjb21wb25lbnRpIEZvcm0gaW1wbGVtZW50YW5vICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUZvcm1Db250cm9sIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5ODhcclxuICAgICAqIFRMOkRSOyBJbCBwcmltbyB2YWxvcmUgcGFzc2F0byBhbCB3cml0ZVZhbHVlIMOoIG51bGxvIHBlcmNow6kgcXVhbmRvIGkgY2FnbmFjY2kgZmFubm8gbmV3IEZvcm1Db250cm9sKClcclxuICAgICAqIHNjcml2b25vIHVuIHdyaXRlVmFsdWUgbnVsbG8uLi4gcXVpbmRpIGFsIHByaW1vIGJpbmRpbmcgc2FsdG8gbCdpbml6aWFsaXp6YXppb25lIHNlIGhvIGxhIGNvcHBpYSBudWxsLWZpcnN0QmluZFxyXG4gICAgICogcG9pIG1ldHRlbmRvIGZpcnN0QmluZCBhIGZhbHNlIGRpIGzDrCBpbiBwb2kgZnVuemlvbm8gY29tZSBkZXZvLiBWaXN0YSBsYSBjYXNpc3RpY2EgZXZpdG8gZXNzZW56aWFsbWVudGUgbWV0w6AgZGV0ZWN0Q2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEluZGljYSBkaSB1dGlsaXp6YXJlIGkgdmFsaWRhdG9yaSBjaGUgbCd1dGVudGUgcGlhenphIHN1bCBjb21wb25lbnRlLiBcclxuICAgICogRGEgbm9uIHVzYXJlIG5lbCBjYXNvIGRpIGZvcm0tYWRhcHRpdmUgZGF0byBjaGUgaSB2YWxpZGF0b3JpIHZlbmdvbm8gdmFsdXRhdGkgaW4gYmFzZSBhbCB0aXBvIGVjY1xyXG4gICAgKi9cclxuICAgIHByb3RlY3RlZCBVc2VVc2VyVmFsaWRhdG9yczpib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGlsIGNhbXBvIMOoIG9iYmxpZ2F0b3JpbyBpIG9wemlvbmFsZSAqL1xyXG4gICAgcHVibGljIFJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGF0byBkYSBxdWVzdG8gY2FtcG8gKi9cclxuICAgIHB1YmxpYyBNb2RlbDogYW55O1xyXG5cclxuICAgIC8qKiBWYWxvcmUgZGVsIE1vZGVsbG8gKi9cclxuICAgIHB1YmxpYyBFdmFsdWF0ZWRNb2RlbDogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBOb21lIGdlbmVyYXRvIHBlciBpbCBjb250cm9sbG8gaW50ZXJuby4gRGkgZGVmYXVsdCDDqCBpbCBub21lIGRlbCBjb250cm9sbG8gZXN0ZXJubyBjb24gbCdhZ2dpdW50YSBkaSBcIl9pbnRlcm5hbFwiLiBTZXJ2ZSBwZXIgZXZpdGFyZSBjcm9zcy1iaW5kICovXHJcbiAgICBwdWJsaWMgR2VuZXJhdGVkTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgRm9ybSBjaGUgY29udGllbmUgcXVlc3RvIGNhbXBvIMOoIGdpw6Agc3RhdG8gcmVnaXN0cmF0byAqL1xyXG4gICAgcHJvdGVjdGVkIGZvcm1IYXNCZW5uQm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBxdWVzdG8gY2FtcG8gw6ggc3RhY2NhdG8gZGFsIEZvcm0sIGFkIGVzZW1waW8gbmVsIGNhc28gc2lhIGluIHVuIG5nLXRlbXBsYXRlIHByb2lldHRhdG8gbmVsIGZvcm0uXHJcbiAgICAgKiBcclxuICAgICAqIEluIHF1ZWwgY2FzbyBsYSB2YXJpYWJpbGUgKipGb3JtKiogZGVsIGNvbXBvbmVudGUgZGV2J2Vzc2VyZSB2YWxvcml6emF0YVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZGV0YXRjaGVkRnJvbWZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJvdGVjdGVkIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJvdGVjdGVkIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSBWZWRpIGdldHRlciBlIHNldHRlciAqL1xyXG4gICAgcHJpdmF0ZSBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1YWxvcmEgY2kgZm9zc2UgdW4gY29udGVzdG8gY29sbGVnYXRvIHF1ZXN0YSB2YXJpYWJpbGUgaWRlbnRpZmljYSBzZSBTb25vIGwnT3duZXIgbyBtZW5vLlxyXG4gICAgICogXHJcbiAgICAgKiBTZSBub24gbG8gc29ubywgaWwgY2FtcG8gcmlzdWx0ZXLDoCBpbiBzb2xhIGxldHR1cmEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgQXBwQ29udGV4dE93bmVyc2hpcDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIFN1YmplY3QgYSBjdWkgbCdvZ2dldHRvIGludGVybm8gc2kgY29sbGVnYSBwZXIgZWZmZXR0dWFyZSBpbCBmb2N1cyBkZWxsJ2VsZW1lbnRvIGlucHV0IHNvdHRvc3RhbnRlICovXHJcbiAgICBASW5wdXQoKSBGb2N1c1N1YmplY3Q6IFN1YmplY3Q8dm9pZD47XHJcbiAgICAvKipcclxuICAgICogQEVYUEVSSU1FTlRBTFxyXG4gICAgKi9cclxuICAgIEBJbnB1dCgpIFNldFZhbGlkYXRpb25TdWJqZWN0OiBTdWJqZWN0PHsgZmllbGROYW1lOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcgfT47XHJcblxyXG4gICAgLyoqIE1vZGFsaXTDoCBpbiBjdWkgdmllbmUgbW9zdHJhdG8gaWwgY2FtcG8sIDEtMSByaXNwZXR0byBhbGxlIGRlZmluaXppb25pIGRpIEFuZ3VsYXIgTWF0ZXJpYWwgICovXHJcbiAgICBASW5wdXQoKSBGaWVsZEFwcGVhcmVuY2U6IFwibGVnYWN5XCIgfCBcInN0YW5kYXJkXCIgfCBcImZpbGxcIiB8IFwib3V0bGluZVwiID0gXCJvdXRsaW5lXCI7XHJcblxyXG4gICAgLyoqIFV0aWxpenphIG8gbWVubyBpbCBMYXlvdXQgZGkgdW4gZm9ybSAoTGFiZWwgY29uIGlucHV0IGRpIGZpYW5jbyksIHNlIGZhbHNlIG1vc3RyYSBzb2xvIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm1MYXlvdXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBEZWZpbmlzY2Ugc2UgcmljaGlhbWFyZSBsJ0V2ZW50RW1pdHRlciAqKmlucHV0Q2hhbmdlKiogaW4gbWFuaWVyYSBjbGFzc2ljYSAodHJ1ZSkgbyBzb2xvIHBlciBsYSBjaGFuZ2UgY29uc2lkZXJhdGUgZGVmaW5pdGl2ZSBjb21lIHRhc3RvIGludmlvIC8gYmx1ciAvIGVjYy4uLiAoZmFsc2UpICovXHJcbiAgICBASW5wdXQoKSBFbWl0UGVuZGluZ0NoYW5nZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBBdHRpdmEgbyBkaXNhdHRpdmEgbGEgdmFsaWRhemlvbmUgcGVyIHF1ZXN0byBjb21wb25lbnRlICovXHJcbiAgICBASW5wdXQoKSBWYWxpZGF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzY3JpdmVyZSBvIG1lbm8gbmVsIGNhbXBvIGRpIElucHV0LiBTaSBkaWZmZXJlbnppYSBkYWwgUmVhZG9ubHkgaW4gcXVhbnRvIGZpc2ljYW1lbnRlIGwnSW5wdXQgw6ggc2NyaXZpYmlsZSBlIHZlbmdvbm8gbWFudGVudXRpIGkgdGVtaSBkZWxsYSB2YWxpZGF6aW9uZVxyXG4gICAgICogbWEgaW50ZXJhZ2lyZSBkaXJldHRhbWVudGUgY29uIGxhIGNhc2VsbGEgZGkgSW5wdXQgcGVyIGwndXRlbnRlIG5vbiDDqCBwb3NzaWJpbGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRnJvemVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFBsYWNlaG9sZGVyIHBlciBxdWFuZG8gbCdpbnB1dCDDqCB2dW90byAqL1xyXG4gICAgQElucHV0KCkgUGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIENsYXNzZSBleHRyYSBwZXIgaWwgZm9ybS1ncm91cCBpbiBjdWkgdmllbmUgd3JhcHBhdG8gbCdpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgRm9ybUdyb3VwQ2xhc3M6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIE1lc3NhZ2dpbyBkYSBtb3N0cmFyZSBxdWFuZG8gbGEgdmFsaWRhemlvbmUgZmFsbGlzY2UgcGVyIHF1ZXN0byBjb21wb25lbnRlLiBEaSBkZWZhdWx0IHZpZW5lIHByb3Bvc3RhIGRhbGxhIGxpYnJlcmlhICovXHJcbiAgICBASW5wdXQoKSBGYWlsZWRWYWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogSW5wdXQgY2hlIGZvcnphIGwnaW52YWxpZGl0w6AgZGVsIGNvbXBvbmVudGUgKi9cclxuICAgIEBJbnB1dCgpIEZvcmNlZEVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIE1vc3RyYSB1biB0ZXN0byBhIHNpbmlzdHJhIGRlbGwnaW5wdXQgKEZvcm1MYXlvdXQgcGVybWV0dGVuZG8pICovXHJcbiAgICBASW5wdXQoKSBMYWJlbDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGxhIGxhYmVsICovXHJcbiAgICBASW5wdXQoKSBMYWJlbENvbFdpZHRoOiBudW1iZXIgPSA0O1xyXG5cclxuICAgIC8qKiBjb2wtbWQtWCBwZXIgbCdpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgSW5wdXRDb2xXaWR0aDogbnVtYmVyID0gODtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIGwndWx0aW1vIGNvbXBvbmVudGUgZGkgdW4gZm9ybSAoc2VydmUgcGVyIHJpbXVvdmVyZSBpbCBtYXJnaW5lIGZpbmFsZSkgKi9cclxuICAgIEBJbnB1dCgpIExhc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQXNzb2NpYSBpbCBjb21wb25lbnRlIEZvcm0gYSBxdWVzdG8gaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm06IE5nRm9ybSA9IG51bGw7XHJcblxyXG4gICAgLyoqIFNvcmdlbnRlIGRhIGN1aSBzY2VnbGllcmUgdmFsb3JpIHBlciBpIGNvbXBvbmVudGkgRm9ybSBjaGUgbG8gY29uc2VudG9ubyAqL1xyXG4gICAgQElucHV0KCkgU291cmNlOiBhbnlbXTtcclxuXHJcbiAgICAvKiogTm9tZSBkZWxsYSBwcm9wcmlldMOgIGNoZSBjb250aWVuZSBsJ0lkIGRlZ2xpIG9nZ2V0dGkgYmluZGF0aSBuZWxsYSAqKlNvdXJjZSoqICovXHJcbiAgICBASW5wdXQoKSBJZEZpZWxkOiBzdHJpbmcgPSAnaWQnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGlsICoqUGxhY2Vob2xkZXIqKiBkZXYnZXNzZXJlIHVzYXRvIGNvbWUgdW5hIGZsb2F0aW5nIGxhYmVsIGRpIG1hdGVyaWFsIG8gc29sbyBjb21lIHVuIHBsYWNlaG9sZGVyIHN0YW5kYXJkIFxyXG4gICAgICogXHJcbiAgICAgKiBJZ25vcmF0YSBsYXRvIGF1dG9jb21wbGV0ZSwgYXV0b2NvbXBsZXRlLW11bHRpIGUgc2VsZWN0IGluIHF1YW50byBoYW5ubyBnZXN0aW9uaSBwYXJ0aWNvbGFyaSBkaSBwbGFjZWhvbGRlciBlY2MuLi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRmxvYXRpbmdMYWJlbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIEluZGljYSBjaGUgbGEgcGFydGUgaW5wdXQgZGVsIGNvbnRyb2xsbyBkZXYnZXNzZXJlIHVuYSBsYWJlbCByZWFkb25seSBlIGxhIHBhcnRlIGxhYmVsIGRpIHRpdG9sbyBkZXYnZXNzZXJlIGluIGJvbGQuIFBlciB1dGlsaXp6YXJlIHVuIHNvbG8gY29tcG9uZW50ZSBzaWEgcGVyIGxhIG1vZGlmaWNhIGNoZSBwZXIgaWwgZGV0dGFnbGlvICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBJbmRpY2EgbGEgY29uZGl6aW9uZSBwZXIgY3VpIHVuIGVsZW1lbnRvIGluIE1vZGFsaXTDoCBEaXNwbGF5IHB1w7IgZXNzZXJlIHZpc2liaWxlIGluIGJhc2UgYSB1bHRlcmlvcmkgY29udHJvbGxpICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5Q29uZGl0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogVGVtcGxhdGUgcGVyIHZpc3VhbGl6emFyZSBsYSBtb2RhbGl0w6AgKipEaXNwbGF5TW9kZSoqIGNvbWUgdnVvbGUgaWwgcHJvZ3JhbW1hdG9yZSBmcm9jaW8gZGkgdHVybm8gKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXlNb2RlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqIExheW91dCBkZWwgRm9ybSBxdWFuZG8gw6ggaW4gbW9kYWxpdMOgIERpc3BsYXkuIERpIGRlZmF1bHQgbWFudGllbmUgbGEgZm9ybWF0dGF6aW9uZSBhIGZvcm0gKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXlMYXlvdXQ6ICdmb3JtJyB8ICdpbmxpbmUnIHwgJ2hpZGRlbicgPSAnZm9ybSc7XHJcblxyXG4gICAgLyoqIFNlcGFyYXRvcmUgZGEgbWV0dGVyZSBpbiBhdXRvbWF0aWNvIGZyYSB1biBlbGVtZW50byBGb3JtIGUgbCdhbHRybyBxdWFuZG8gc29ubyBpbiAqKkRpc3BsYXlNb2RlKiogY29uICoqRGlzcGxheUxheW91dCoqIGlubGluZSAqL1xyXG4gICAgQElucHV0KCkgSW5saW5lU2VwYXJhdG9yOiBzdHJpbmcgPSAnICc7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRXNwcmVzc2lvbmUgc2ltaWwtQW5ndWxhciBwZXIgY2FtYmlhcmUgaWwgdGVzdG8gZGVpIGNvbXBvbmVudGkgY2hlIHNjZWxnb25vIGlsIHByb3ByaW8gbW9kZWxsbyBkYSB1bmEgKipTb3VyY2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBJbCBmdW56aW9uYW1lbnRvIMOoIGlkZW50aWNvIGFsIGJpbmRlciBkaSBhbmd1bGFyLCBzb2xvIGNvbiB1bmEgZ3JhZmZhIGludmVjZSBjaGUgMi5cclxuICAgICAqIMOIIGlub2x0cmUgcG9zc2liaWxlIGFnZ2l1bmdlcmUgcGV6emkgZGkgZGVzY3JpemlvbmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgY29uIGxhIHNpbnRhc3NpICoqOnByb3A/KFByb3AgdmFsZSB7cHJvcH0pKipcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheTogc3RyaW5nID0gJ3tkZXNjcmlwdGlvbn0nO1xyXG5cclxuICAgIC8qKiBSaXN1bHRhdG8gZGVsbCd1bmlvbmUgZnJhIGxlIGluZm9ybWF6aW9uaSBkZWdsaSBvZ2dldHRpIGluICoqU291cmNlKiogZSBsZSBpbXBvc3Rhemlvbmkgc3BlY2lmaWNhdGUgbmVsbCdJbnB1dCAqKkRpc3BsYXkqKiAqL1xyXG4gICAgcHVibGljIEJvdW5kU291cmNlOiB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSDDqCBpbCBwcmltbyBCaW5kIGRlbGxhIFNvdXJjZSAqL1xyXG4gICAgcHJvdGVjdGVkIFNvdXJjZUZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipfcmVhZG9ubHkqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2Ugc29sYSBsZXR0dXJhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhZG9ubHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZWFkb25seTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KiogZ2VzdGVuZG8gYW5jaGUgaWwgQ29udGVzdG8gYXBwbGljYXRpdm9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSBWYWxvcmUgZGEgaW1wb3N0YXJlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBSZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLkFwcENvbnRleHRPd25lcnNoaXApXHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZXR0YXJlIGluIHVuYSB2b2x0YSBzb2xvIGdsaSBpbnB1dCBMYWJlbENvbFdpZHRoIGUgSW5wdXRDb2xXaWR0aCwgYmFzdGEgc2NyaXZlcmxvIGNvbiBsYSBzaW50YXNzaSBcIlggWVwiXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBJbnB1dCBuZWwgZm9ybWF0byBcIlggWVwiXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBMYWJlbElucHV0UmF0aW8oaW5wdXQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByYXRpbyA9IGlucHV0LnNwbGl0KC9cXHMvKTtcclxuICAgICAgICB0aGlzLkxhYmVsQ29sV2lkdGggPSBwYXJzZUludChyYXRpb1swXSk7XHJcbiAgICAgICAgdGhpcy5JbnB1dENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiB2YWwtcXVhbGNvc2EgY2hlIGZhIGVmZmV0dGl2YW1lbnRlIGRhIGlucHV0LCBvIGV2ZW50dWFsbWVudGUgaWwgc2luZ29sbyBpbnB1dCBpbiBjYXNpIHBhcnRpY29sYXJpIChlcyBjaGVja2JveCkgKi9cclxuICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uQ29udHJvbDogTmdNb2RlbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ3ZhbGlkYXRpb25Db250cm9sJyBjaGUgZnVuemlvbmEgaW4gYW1iaWVudGUgc3RhdGljb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJ2YWxpZGF0aW9uQ29udHJvbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IF92YWxpZGF0aW9uQ29udHJvbChjb21wOiBOZ01vZGVsKSB7IHRoaXMucmVnaXN0ZXJWYWxDb21wKGNvbXApOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyeSBzdWxsJ2VsZW1lbnRvICd2YWxpZGF0aW9uQ29udHJvbCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIGRpbmFtaWNvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcInZhbGlkYXRpb25Db250cm9sXCIsIHsgc3RhdGljOiB0cnVlIH0pIHNldCB2YWxpZGF0aW9uQ29udHJvbF9zdGF0aWMoY29tcDogTmdNb2RlbCkgeyB0aGlzLnJlZ2lzdGVyVmFsQ29tcChjb21wKTsgfTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsbGEgbW9kaWZpY2EgZGVsIHZhbG9yZSBjb2xsZWdhdG8gYSBxdWVzdG8gY2FtcG8gKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dENoYW5nZTogRXZlbnRFbWl0dGVyPENoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gICAgLyoqIEV2ZW50byBjaGlhbWF0byBhbCBmb2N1cyBkZWwgY2FtcG8gZGkgdGVzdG8vY29tYm8vcXVlbGNoZcOoLCByaWVtaXR0YSBsJ2V2ZW50byBvcmlnaW5hbGUgSmF2YXNjcmlwdCAqL1xyXG4gICAgQE91dHB1dCgpIGlucHV0Rm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLyoqIEV2ZW50byBjaGlhbWF0byBhbCBmaW5hbGl6ZSBkZWwgY2FtcG8gZGkgdGVzdG8vY29tYm8vcXVlbGNoZcOoICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRGaW5hbGl6ZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgLyoqIENhY2hlIGRlbGxlIGNvbmRpemlvbmkgc2NyaXR0ZSB0aXBvIDpwcm9wPyhSb2JhIGNvbiB7cHJvcH0pICovXHJcbiAgICBwcml2YXRlIEJpbmRDaGVja2luZ0dyb3VwczogeyBnbG9iYWw6IHN0cmluZywgcHJvcDogc3RyaW5nLCB3aGVuZXhpc3RzOiBzdHJpbmcgfVtdID0gW11cclxuXHJcbiAgICAvKiogQ2FjaGUgZGVsbGUgcHJvcHJpZXTDoCBzY3JpdHRlIHRpcG8gLS0+IHtwcm9wfSAqL1xyXG4gICAgcHJpdmF0ZSBCaW5kUHJvcGVydGllczogeyBnbG9iYWw6IHN0cmluZywgcHJvcDogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBAaWdub3JlIENvc3RydXR0b3JlICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCwgcHJvdGVjdGVkIF92YWxpZGF0b3JzOiBBcnJheTxhbnk+LCBAT3B0aW9uYWwoKSBwcml2YXRlIGFjOiBBY2Nlc3NDb250cm9sU2VydmljZSwgQE9wdGlvbmFsKCkgcHVibGljIEFwcENvbnRleHQ6IENvbXBvbmVudENvbnRleHQsIEBPcHRpb25hbCgpIEBJbmplY3QoQUNPX0NVU1RPTUtFWSkgcHJpdmF0ZSBBQ09fQ1VTVE9NS0VZOiBzdHJpbmcsIEBPcHRpb25hbCgpIEBJbmplY3QoRkFWX0RFQlVHX01PREUpIHByaXZhdGUgRkFWX0RFQlVHX01PREU6IGJvb2xlYW4sIHByaXZhdGUgbmF0aXZlSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAobmdDb250cm9sID09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhbmRsZU51bGxOZ0NvbnRyb2woKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJuZ0NvbnRyb2wgbnVsbG8gcGVyIHF1YWxjaGUgbW90aXZvISBJbCA5MCUgZGVsbGUgZnVuemlvbmFsaXTDoCBkaSBxdWVzdG8gaW5wdXQgc2FyYW5ubyBkaXNhYmlsaXRhdGVcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1NlIG1pIGFycml2YSBsJ2luamVjdGFibGUgZGVsIGNvbnRlc3RvIHBvc3NvIGNhcGlyZSBzZSBxdWVzdG8gY2FtcG8gZGV2ZSBlc3NlcmUgaW4gcmVhZG9ubHkgbyBubywgc29sbyBzZSBobyBnacOgIGluaXppYWxpenphdG8gaSBjb250cm9sbGVyIGN1c3RvbSBkZWxsJ2FjY2VzcyBjb250cm9sXHJcbiAgICAgICAgaWYgKHRoaXMuQXBwQ29udGV4dCAmJiB0aGlzLkFwcENvbnRleHQubmFtZSAmJiB0aGlzLkFDT19DVVNUT01LRVkgJiYgdGhpcy5hYyAmJiB0aGlzLmFjLkluaXRpYWxpemVkQ3VzdG9tKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXBwQ29udGV4dE93bmVyc2hpcCA9ICF0aGlzLmFjLmhhcyh0aGlzLkFDT19DVVNUT01LRVkgKyBcIjpcIiArIHRoaXMuQXBwQ29udGV4dC5uYW1lLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSAhdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vU2UgaG8gZ2nDoCB1biBwYXJlbnQgaW1wb3N0YXRvIHZ1b2wgZGlyZSBjaGUgc290dG8gYWwgdGFnIDxmb3JtPiBobyBkaXJldHRhbWVudGUgdW4gdGFnIDxmb3JtLSo+Li5cclxuICAgICAgICAvLy4uIHF1aW5kaSBwb3NzbyBpbXBvc3RhcmUgZGlyZXR0YW1lbnRlIGlsIHJpZmVyaW1lbnRvIGRlbCBGb3JtIGRhIHVzYXJlIGluIEhUTUwgcGVyIGlsIHN1Ym1pdHRlZFxyXG5cclxuICAgICAgICAvL1NlIG5vbiBjJ8OoIHZ1b2wgZGlyZSBjaGUgZGVudHJvIGFsIHRhZyA8Zm9ybT4gYyfDqCB1bm8gc3BsZW5kaWRvIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogLi4uLlwiPi4uXHJcbiAgICAgICAgLy8uLiBpbCBxdWFsZSBhIHN1YSB2b2x0YSBjb250aWVuZSBpbCBjb250cm9sbG8gPGZvcm0tKj4gcXVpbmRpIGF2csOyIGlsIGZvcm0gbmVsbCdpbnB1dCBcIkZvcm1cIlxyXG4gICAgICAgIGlmICgoPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQpXHJcbiAgICAgICAgICAgIHRoaXMuRm9ybSA9IDxOZ0Zvcm0+KDxhbnk+bmdDb250cm9sKS5fcGFyZW50O1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5kZXRhdGNoZWRGcm9tZm9ybSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vUXVlc3RhIHNlcnZlIHBlciBpbXBvc3RhcmUgbWUgc3Rlc3NvIGNvbWUgc2kgZGV2ZSwgaWwgdmFsaWRhdG9yZSBpbnZlY2UgbG8gcGFzc28gYWwgdmFsaWRhdGlvbi1pbnB1dCBxdWFuZG8gdmllbmUgc2V0dGF0byBpbCB2YWxpZGF0aW9uQ29udHJvbFxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG4gICAgICAgICAgICAvL1BlciB0dXR0aSBpIHZhbGlkYXRvcmk6IHJpZ2VuZXJvIGxhIGZ1bnppb25lIGRpIHZhbGlkYXppb25lLiBQZXIgcXVhbGNoZSBtb3Rpdm8gYSB2b2x0ZSBobyB2YWxpZGF0b3JpIHNlbnphLi4uXHJcbiAgICAgICAgICAgIC8vLi4uIHF1ZXN0byDDqCB1biB3b3JrYXJvdW5kIHBlciBlc3NlcmUgc2ljdXJvIGRpIGF2ZXJsYSBzZW1wcmUuXHJcbiAgICAgICAgICAgIC8vU29sbyBpIHZhbGlkYXRvcmkgY29uIHBhcmFtZXRyaSBoYW5ubyBiaXNvZ25vIGRlbGxhIF9jcmVhdGVWYWxpZGF0b3IgKGVzLiBcIm1heGxlbmd0aFwiIGNoZSBoYSAxIHBhcmFtZXRybyksIHF1aW5kaSBubyB2YWxpZGF0b3JpIHRpcG8gXCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0b3JzLmZvckVhY2godiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYuX2NyZWF0ZVZhbGlkYXRvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi5fY3JlYXRlVmFsaWRhdG9yKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLmFkZFZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIEJpbmQvUGFyc2UgZGVsbGUgdmFyaWUgKipTb3VyY2UqKiB1bmVuZG8gbGUgaW5mb3JtYXppb25pIHNwZWNpZmljYXRlIGluICoqRGlzcGxheSoqXHJcbiAgICAgKiBcclxuICAgICAqIEV2ZW50dWFsbWVudGUgcmllZmZldHR1YSB1biBiaW5kIGFsIG1vZGVsbG8gaW4gYmFzZSBhbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqUmViaW5kTW9kZWxBZnRlclNvdXJjZSoqXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB0cnlCaW5kU291cmNlRGlzcGxheSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuU291cmNlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlNvdXJjZS5sZW5ndGggPT0gMCAmJiAhdGhpcy5Tb3VyY2VGaXJzdEJpbmQpXHJcbiAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5Tb3VyY2VGaXJzdEJpbmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gQ2FjaGUgbG9jYWxlIHBlciBldml0YXJlIGRpIHJpZmFyZSBkZWkgcmVnZXgubWF0Y2ggb2duaSBzYW50YSB2b2x0YVxyXG4gICAgICAgIGlmICh0aGlzLlNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVCaW5kQ2hlY2tpbmdHcm91cHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkJpbmRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUJpbmRQcm9wZXJ0aWVzKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBCbG9jY28gcGVyIGdlbmVyYXJlIGxhIGRlc2NyaXppb25lIGZpbmFsZSBkaSB1biBlbGVtZW50b1xyXG4gICAgICAgICAgICB0aGlzLlNvdXJjZS5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gQWdnaXVuZ28gYWxsYSBCb3VuZFNvdXJjZSBpbiBmb3JtYXRvIHN0YW5kYXJkIEtleVZhbHVlXHJcbiAgICAgICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlLnB1c2godGhpcy50cmFuc2Zvcm1Tb3VyY2VJdGVtKHMpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBQb3N0IHRyeWJpbmQgc2UgYyfDqCB1biBtb2RlbGxvIGFzc29jaWF0byByaWNhbGNvbG8gbCcqKkV2YWx1YXRlZE1vZGVsKipcclxuICAgICAgICAgICAgaWYgKHRoaXMuTW9kZWwpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkV2YWx1YXRlZE1vZGVsID0gdGhpcy5Cb3VuZFNvdXJjZS5maW5kKHQgPT4gdC5pZCA9PSB0aGlzLk1vZGVsKT8uZGVzY3JpcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBWYWx1dGEgaWwgY29udGVudXRvIGRlbGxhIHZhcmlhYmlsZSBCaW5kQ2hlY2tpbmdHcm91cHMgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVCaW5kQ2hlY2tpbmdHcm91cHMoKSB7XHJcbiAgICAgICAgLy8gQmxvY2NvIHBlciB0aXJhcmUgZnVvcmkgbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gLS0+IDpwcm9wPyhSb2JhIGNvbiB7cHJvcH0pXHJcbiAgICAgICAgdmFyIGlmZmVkTWF0Y2hlcyA9IHRoaXMuRGlzcGxheS5tYXRjaCgvOihbYS16XSspXFw/XFwoKFteXFwoXFwpXSspXFwpL2cpO1xyXG4gICAgICAgIGlmIChpZmZlZE1hdGNoZXMpIHtcclxuICAgICAgICAgICAgaWZmZWRNYXRjaGVzLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdGVzc2EgcmVnZXggZGkgc29wcmEgbWEgaWwgdGFnIFwiaVwiIHNlcnZlIHBlciB0aXJhcmUgZnVvcmkgaSBzaW5nb2xpIGNhcHR1cmluZyBncm91cCBlIHBlciBxdWFsY2hlIG1vdGl2byBcclxuICAgICAgICAgICAgICAgIC8vIG5ldyBSZWdFeHAoYmFzZVJlZ2V4LCBcImdcIikgbm9uIGZ1bnppb25hIHF1aW5kaSBub24gaG8gcG90dXRvIHJhemlvbmFsaXp6YXJsb1xyXG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwcyA9IG0ubWF0Y2goLzooW2Etel0rKVxcP1xcKChbXlxcKFxcKV0rKVxcKS9pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQmluZENoZWNraW5nR3JvdXBzLnB1c2goeyBnbG9iYWw6IG0sIHByb3A6IGdyb3Vwc1sxXSwgd2hlbmV4aXN0czogZ3JvdXBzWzJdIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFZhbHV0YSBpbCBjb250ZW51dG8gZGVsbGEgdmFyaWFiaWxlIEJpbmRQcm9wZXJ0aWVzICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlQmluZFByb3BlcnRpZXMoKSB7XHJcbiAgICAgICAgLy8gQmxvY2NvIHBlciB0aXJhcmUgZnVvcmkgbGUgcHJvcHJpZXTDoCBzY3JpdHRlIHRpcG8gLS0+IHtwcm9wfVxyXG4gICAgICAgIHZhciBtYXRjaGVzID0gdGhpcy5EaXNwbGF5Lm1hdGNoKC97W2Etel0rfS9naSk7XHJcbiAgICAgICAgaWYgKG1hdGNoZXMpXHJcbiAgICAgICAgICAgIG1hdGNoZXMuZm9yRWFjaChtID0+IHsgdGhpcy5CaW5kUHJvcGVydGllcy5wdXNoKHsgZ2xvYmFsOiBtLCBwcm9wOiBtLnN1YnN0cmluZygxLCBtLmxlbmd0aCAtIDEpIH0pOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXNmb3JtYSB1biBvZ2dldHRvIGRlbGxhIFNvdXJjZSBhbGxhIHN1YSB2ZXJzaW9uZSBcIm51b3ZhXCIgYmFzYW5kb3NpIHN1bGxlIGluZm9ybWF6aW9uaSBzdSBncnVwcGkgZSBwcm9wcmlldMOgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gZGEgdHJhc2Zvcm1hcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3tpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfX0gT2dnZXR0byBmaW5hbGUgdHJhc2Zvcm1hdG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Tb3VyY2VJdGVtKHM6IGFueSk6IHtpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfSB7XHJcbiAgICAgICAgLy8gUGFydG8gc2VtcHJlIGRhbGxhIHZhcmlhYmlsZSBkaSBEaXNwbGF5LCBwb2kgc29zdGl0dWlzY28gcGV6em8gcGVyIHBlenpvXHJcbiAgICAgICAgbGV0IGRlc2MgPSB0aGlzLkRpc3BsYXk7XHJcblxyXG4gICAgICAgIC8vIFRhZ2xpbyBvIG1hbnRlbmdvIGxlIGNvbmRpemlvbmkgaW4gYmFzZSBhbGxhIHByb3ByaWV0w6Agc3UgY3VpIGZhcmUgY2hlY2tcclxuICAgICAgICAvLyBEb3BvZGljaMOpIHNjcml2byB0dXR0ZSBsZSBwcm9wcmlldMOgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdCA9IHRoaXMuQmluZENoZWNraW5nR3JvdXBzW2ldO1xyXG4gICAgICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKHQuZ2xvYmFsLCAoc1t0LnByb3BdICE9IG51bGwgJiYgc1t0LnByb3BdICE9IHVuZGVmaW5lZCkgPyB0LndoZW5leGlzdHMgOiBcIlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5CaW5kUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdCA9IHRoaXMuQmluZFByb3BlcnRpZXNbaV07XHJcbiAgICAgICAgICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UodC5nbG9iYWwsIHNbdC5wcm9wXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBpZDogc1t0aGlzLklkRmllbGRdLCBkZXNjcmlwdGlvbjogZGVzYyB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGlsIGNvbW9wbmVudGUgaW4gcXVlc3Rpb25lIMOoIGluIGdyYWRvIGRpIGdlc3RpcmUgbmdDb250cm9sIG51bGxpLiBcclxuICAgICAqIERpIGRlZmF1bHQgw6ggKipmYWxzZSoqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBnZXN0aXNjbyBuZ0NvbnRyb2wgbnVsbGksICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIGhhbmRsZU51bGxOZ0NvbnRyb2woKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICAvLyBBIHZvbHRlIG5lbGwnbmdPbkluaXQgbm9uIGNpIHBhc3NhIHF1aW5kaSBsbyBtZXR0byBzaWEgcXVpIHNpYSBuZWxsJ2FmdGVydmlld2luaXQsIHBlbnNvIGNoZSB2YWxnYSBwZXIgaSBjb21wb25lbnRpIGRpIHRlcnplIHBhcnRpXHJcbiAgICAgICAgLy8gY2hlIHNpIGNvbGxlZ2FubyBwZXIgaSBjYXp6aSBsb3JvIGFsIGZvcm0gZWNjLCBxdWluZGkgbGEgcGFydGUgc29wcmEgbm9uIHNlcnZlLi4uIEJPSFxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG5cclxuICAgICAgICAvL0lsIG5vbWUgbm9uIGMnw6ggc2UgbWV0dG8gc3RhbmRhbG9uZSA6IHRydWUgKENIRSBOT04gw6kgREEgTUVUVEVSRSlcclxuICAgICAgICAvL0RhdG8gY2hlIGFuY2hlIGlsIGNvbnRyb2xsbyBlc3Rlcm5vIHZpZW5lIGNvbnNpZGVyYXRvIGNvbWUgY29tcG9uZW50ZSBkZWwgZm9ybSwgbm9uIHBvc3NvIGJhc2FybWkgc29sbyBzdWwgbm9tZSBtYSBkZXZvIGFnZ2l1bmdlcmUgdW4gdGFnLiBJbiBxdWVzdG8gY2FzbyBcIl9pbnRlcm5hbFwiXHJcbiAgICAgICAgLy8gQVRURU5aSU9ORTogUVVBTFNJQVNJIFNJQSBJTCBNT1RJVk8sIFNFIFNUTyBDT1NPIFZJRU5FIFNQT1NUQVRPIERBTEwgbmdPbkluaXQgTk9OIEZVTlpJT05BIFBJVSBOVUxMQVxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICB0aGlzLkdlbmVyYXRlZE5hbWUgPSB0aGlzLm5nQ29udHJvbC5uYW1lLnRvU3RyaW5nKCkgKyBcIl9pbnRlcm5hbFwiO1xyXG5cclxuICAgICAgICAvLyBBVFRFTlpJT05FOiBRVUFMU0lBU0kgU0lBIElMIE1PVElWTywgU0UgU1RPIENPU08gVklFTkUgU1BPU1RBVE8gREFMTCBuZ09uSW5pdCBOT04gRlVOWklPTkEgUElVIE5VTExBXHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCAmJiB0aGlzLnZhbGlkYXRpb25Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFF1YW5kbyB1biBmb3JtIHZpZW5lIHN1Ym1pdHRhdG8gbGEgdmFyaWFiaWxlIEZvcm0uc3VibWl0dGVkIHZpZW5lIGFzc2VnbmF0YSBhbGwnaW5wdXQgW3N1Ym1pdHRlZF0gZGVsIHZhbC1jb250cm9sXHJcbiAgICAgICAgICAgIC8vIEVzc2VuZG8gY2hlIHBlcsOyIGxhIENEIMOoIE9uUHVzaCBwZXIgZGlyZSBhZCBBbmd1bGFyIGNoZSBsJ0lucHV0IMOoIGNhbWJpYXRvIGUgcGVybWV0dGVyZSBpIHNpZGVmZmVjdHMgZGkgYXNzZWduYXJlIFtzdWJtaXR0ZWRdXHJcbiAgICAgICAgICAgIC8vIGRldm8gYXR0YWNjYXJtaSBhbCBzdWJtaXQgYXR0dWFsZSBkZWwgZm9ybSBlIHByaW1hIGRpIGVzZWd1aXJsbyBkZXZvIG1hcmNhcmUgaWwgY29tcG9uZW50ZSBwZXIgaWwgY2hlY2tcclxuICAgICAgICAgICAgbGV0IG9yaWdGdW5jID0gdGhpcy5Gb3JtLm9uU3VibWl0O1xyXG4gICAgICAgICAgICB2YXIgZm9ybU91dHNpZGVSZWYgPSB0aGlzLkZvcm07XHJcbiAgICAgICAgICAgIHRoaXMuRm9ybS5vblN1Ym1pdCA9IChldik6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0Z1bmMuYXBwbHkoZm9ybU91dHNpZGVSZWYpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU2V0VmFsaWRhdGlvblN1YmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5TZXRWYWxpZGF0aW9uU3ViamVjdC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodi5maWVsZE5hbWUgKyBcIl9pbnRlcm5hbFwiID09IHRoaXMuR2VuZXJhdGVkTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gdGhpcy5Gb3JtLmdldENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoeyBmb3JjZWR0b2ludmFsaWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuc2V0RXJyb3JzKHsgZm9yY2VkdG9pbnZhbGlkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlIHNvbm8gaW4gbW9kYWxpdMOgIGRldGF0Y2hlZCBkZXZvIHJpbXVvdmVyZSBtYW51YWxtZW50ZSBxdWVzdG8gY29udHJvbGxvIHF1YW5kbyBlbnRybyBuZWxsYSBkaXNwb3NlLCBhbHRyaW1lbnRpIHNlIHBvaSBuZSBhbmRhc3NpIGEgcmlhZ2dpdW5nZXJlXHJcbiAgICAgKiB1biBhbHRybyBjb24gbG8gc3Rlc3NvIFwibmFtZVwiIG1hIG1hZ2FyaSByZXNldHRhdG8sIEFuZ3VsYXIgbG8gcmUtaWRyYXRlcmViYmUgY29uIGkgdmFsb3JpIHByZWNlZGVudGkgbm9ub3N0YW50ZSBpbCBtb2RlbGxvIGZvc3NlIHZ1b3RvXHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0gJiYgdGhpcy52YWxpZGF0aW9uQ29udHJvbCAmJiAhIXRoaXMuRm9ybS5nZXRDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpKVxyXG4gICAgICAgICAgICB0aGlzLkZvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVsYWJvcmEgaSB2YWxpZGF0b3JpIGluaWV0dGF0aSBlIGNhcGlzY2Ugc2UgaWwgdmFsb3JlIMOoIG9iYmxpZ2F0b3JpbyBvIG1lbm8gKi9cclxuICAgIGNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgLy8gY29udHJvbGxvIHNlIMOoIHNldHRhdG8gdW4gcmVxdWlyZWQgcGVyIGRlY2lkZXJlIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIHNlIHV0aWxpenphcmUgaWwgdmFsaWRhdG9yZSByZXF1aXJlZCBuZWwgY29tcG9uZW50ZSBpbnRlcm5vXHJcbiAgICAgICAgLy8gTG8gZmFjY2lvIHF1aSBlIG5vbiBpbiB1biBldmVudHVhbGUgbmdPbkluaXQgbyBjb3N0cnV0dG9yZSBwZXJjaMOpIG5nT25Jbml0IG5vbiBzZW1wcmUgdmllbmUgY2hpYW1hdG8gZSBkYSBjb3N0cnV0dG9yZSBpbCB2YWxpZGF0b3JlIG5vbiBoYSBhbmNvcmEgaWwgdmFsb3JlIGdpdXN0b1xyXG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzICYmIHRoaXMuX3ZhbGlkYXRvcnMuc29tZShlbGVtID0+IGVsZW0gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvciAmJiBlbGVtLnJlcXVpcmVkKSlcclxuICAgICAgICAgICAgdGhpcy5SZXF1aXJlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIZWxwZXIgY2hlIGNvbGxlZ2EgbGEgZnVuemlvbmUgZGkgcmVzZXQgZGVsIGNvbnRyb2xsbyBmb3JtIGFsIGNvbnRyb2xsbyBkaSB2YWxpZGF6aW9uZSBzb3R0b3N0YW50ZSAqL1xyXG4gICAgcHJpdmF0ZSBiaW5kUmVzZXRGdW5jdGlvbigpIHtcclxuICAgICAgICAvL2ZhY2NpbyBpbiBtb2RvIGNoZSBzZSBjaGlhbW8gaWwgcmVzZXQgZGVsIGNvbnRyb2xsbyAobyBkZWxsYSBmb3JtKSBkYWxsJ2VzdGVybm8gc2kgcmVzZXR0aSBhbmNoZSBpbCBjb250cm9sbG8gbmF0aXZvXHJcbiAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5yZXNldDtcclxuICAgICAgICB2YXIgbmdDb250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgICAgIHZhciB2YWxpZGF0aW9uQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlID0gdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sO1xyXG5cclxuICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBvcmlnRnVuYy5hcHBseShuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UucmVzZXQoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL1BlciBjb25zZW50aXJlIHJpY2hpYW1pIG11bHRpcGxpIGRpIHF1ZXN0YSBmdW56aW9uZSBwcmVuZGVuZG8gc2VtcHJlIGxhIGZpdW56aW9uZSBkaSByZXNldCBiYXNlXHJcbiAgICAgICAgKDxhbnk+dGhpcy5uZ0NvbnRyb2wuY29udHJvbCkuX19vcmlnaW5hbF9yZXNldF9fID0gb3JpZ0Z1bmNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCAmJiB0aGlzLmZpcnN0QmluZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0QmluZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLk1vZGVsID0gb2JqO1xyXG5cclxuICAgICAgICAvL1BlciBzdmVnbGlhcmUgQW5ndWxhci4gSWwgdmFsb3JlIGNoZSBlbnRyYSBwb3RyZWJiZSBlc3NlcmUgdmFsaWRvL25vbiB2YWxpZG8gZSBxdWVzdG8gbG8gYmluZGEgYSB0dXR0bywgZm9ybSBjb21wcmVzb1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICB0aGlzLm9uTm90TnVsbFZhbHVlU2V0KCk7XHJcblxyXG4gICAgICAgIC8vIG1hcmtGb3JDaGVjayBub24gdmEgYmVuZSBpbiBxdWFudG8gYXJyaXZhbm8gcG9zc2liaWxtZW50ZSAyIHVwZGF0ZSBzdSB1biBzb2xvIGNpY2xvIGRpIHN0YWNrXHJcbiAgICAgICAgLy8gc2V0VGltZSp1dCBjaGUgd3JhcHBhIHR1dHRvIG5vbiB2YSBiZW5lIHNlbm7DsiBzcGFtbWEgZGVsbGUgY2hhbmdlIGRldGVjdGlvbiBhIHN1b24gZGkgaW50ZXJ2YWwgY2hlIHJhbGxlbnRhbm8gdGFudGlzc2ltbyBsJ2FwcFxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RyYSBpbnRlcm5hbWVudGUgaWwgY29tcG9uZW50ZSBkaSB2YWxpZGF6aW9uZSwgbmUgaW1wb3N0YSBpIHZhbGlkYXRvcmkgZSBjb2xsZWdhIGlsIEZvcm0sIHNlIHByZXNlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJWYWxDb21wKGNvbXA6IE5nTW9kZWwpIHtcclxuICAgICAgICBpZiAoY29tcCkge1xyXG4gICAgICAgICAgICAvLyDDiCBhcnJpdmF0byB1biBudW92byB2YWxpZGF0aW9uQ29udG9ybCAoc3VjY2VkZSBzb2xvIG5lbCBmb3JtLXNlbGVjdCBxdWFuZG8gY2FtYmlhIGxhIHNvdXJjZSBkYSAwIGVsZW1lbnRpIC8gbnVsbCBhZCBOIGVsZW1lbnRpLCBxdWluZGkgYWwgbWFzc2ltbyB1bmEgdm9sdGEpIFxyXG4gICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uQ29udHJvbCAmJiB0aGlzLkZvcm0pXHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgPSBjb21wO1xyXG5cclxuICAgICAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIHBhc3NhcmUgYXZhbnRpIGkgdmFsaWRhdG9yaVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2Ugc29ubyBzdGFjY2F0byBkYWwgRm9ybSAodnVvbCBkaXJlIGNoZSBzb25vIGFkIGVzZW1waW8gZGVudHJvIHVuIG5nLXRlbXBsYXRlKSBhZ2dpdW5nbyBpbCBjb250cm9sbG8gYWwgRm9ybSBwYXNzYXRvIGNvbWUgaW5wdXQgKGNvbnRleHQgZGVsIHRlbXBsYXRlKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5kZXRhdGNoZWRGcm9tZm9ybSAmJiB0aGlzLkZvcm0gJiYgIXRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZFJlc2V0RnVuY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIC8vSSB2YWwtcm9iYSBxdWVzdG8gbG8gZmFubm8gYXV0b21hdGljYW1lbnRlIGRlbnRyby4uLiBnbGkgYWx0cmkgbm8gKGVzLiBzZW1wbGljZSBpbnB1dCBjaGVja2JveClcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eUZvck5hdGl2ZUlucHV0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckZvcm0obmdGb3JtOiBOZ0Zvcm0pIHtcclxuICAgICAgICB0aGlzLkZvcm0gPSBuZ0Zvcm07XHJcbiAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICB0aGlzLmZvcm1IYXNCZW5uQm91bmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaW9ybmEgaWwgdmFsb3JlIGUgbGEgdmFsaWRpdMOgIGRlbGwnaW5wdXQgc290dG9zdGFudGUuIE5vbiB2aWVuZSBjaGlhbWF0byBwZXIgaW5wdXQgbmF0aXZpIGNvbWUgbGUgY2hlY2tib3hcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWx1ZSBGb3J6YSBsJ2FnZ2lvcm5hbWVudG8gYW5jaGUgc2Ugbm9uIMOoIHVuIGlucHV0IG5hdGl2byAoaW5wdXQgbmF0aXZvID0gY2hlY2tib3gsIGFkIGVzZW1waW8pXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoZm9yY2VkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChmb3JjZWRWYWx1ZSB8fCB0aGlzLm5hdGl2ZUlucHV0KVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWQoZm9yY2VkVmFsdWU6IGFueSA9IG51bGwsIG1hcmtGb3JDaGVjazogYm9vbGVhbiA9IGZhbHNlLCBtb2RlbEV2YWx1YXRpb25IYW5kbGVkOiBib29sZWFuID0gZmFsc2UsIGludGVybmFsOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgdG9FbWl0ID0gZm9yY2VkVmFsdWUgPT0gbnVsbCB8fCBmb3JjZWRWYWx1ZSA9PSBcIlwiID8gdGhpcy5Nb2RlbCA/PyBcIlwiIDogZm9yY2VkVmFsdWU7XHJcblxyXG4gICAgICAgIGlmKCFtb2RlbEV2YWx1YXRpb25IYW5kbGVkKVxyXG4gICAgICAgICAgICB0aGlzLkV2YWx1YXRlZE1vZGVsID0gdG9FbWl0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRvRW1pdCk7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KG5ldyBDaGFuZ2VFdmVudChpbnRlcm5hbCwgdG9FbWl0KSk7XHJcbiAgICAgICAgaWYgKG1hcmtGb3JDaGVjaylcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIgc3VsIGZvY3VzLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGZvY3VzZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cy5lbWl0KGV2ZW50KTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgRm9jdXNlZCAtIFwiICsgdGhpcy5HZW5lcmF0ZWROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIiBzdWxsYSBmaW5hbGl6emF6aW9uZSBkZWwgdmFsb3JlIGRlbGwnaW5wdXQgKGJsdXIgLyB0YXN0byBpbnZpbywgZWNjLi4uKS4gTWFudGVuZ28gbG8gc3Rlc3NvIG5vbWUgZGVsbCdldmVudG8gZGVpIDx2YWwtKj4gKGlucHV0Q2hhbmdlKSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoC5cclxuICAgICAqIFxyXG4gICAgICogTm9uIHBvc3NvIHRlbmVybG8gcHJvdGVjdGVkIGFsdHJpbWVudGkgcG9zc28gZXNlZ3VpcmxvIHNvbG8gZGFsIC50cyBlIG5vbiBkYWxsJyAuaHRtbFxyXG4gICAgICovXHJcbiAgICBmaW5hbGl6ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZpbmFsaXplZC5lbWl0KHRoaXMubmdDb250cm9sPy5uYW1lPy50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgVmFsdWUgRmluYWxpemVkIC0gXCIgKyB0aGlzLkdlbmVyYXRlZE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhbXBhIHVuIGxvZyBhIGNvbnNvbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIHN0YW1wYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2cobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRkFWX0RFQlVHX01PREUpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQGZvcm1zLWFuZC12YWxpZGF0aW9uczogXCIgKyBtZXNzYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBhYnN0cmFjdCBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkO1xyXG59Il19
@@ -15,9 +15,9 @@ export class FormAdaptiveComponentLoc extends LocalizationService {
15
15
  super.set("en->it", "Files Selected", ["File Selezionati"]);
16
16
  }
17
17
  }
18
- FormAdaptiveComponentLoc.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: FormAdaptiveComponentLoc, deps: [{ token: FAV_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
19
- FormAdaptiveComponentLoc.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: FormAdaptiveComponentLoc });
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: FormAdaptiveComponentLoc, decorators: [{
18
+ FormAdaptiveComponentLoc.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormAdaptiveComponentLoc, deps: [{ token: FAV_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
19
+ FormAdaptiveComponentLoc.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormAdaptiveComponentLoc });
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormAdaptiveComponentLoc, decorators: [{
21
21
  type: Injectable
22
22
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
23
23
  type: Optional
@@ -25,4 +25,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
25
25
  type: Inject,
26
26
  args: [FAV_LOCALE]
27
27
  }] }]; } });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQubG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvZm9ybXMvZm9ybS1hZGFwdGl2ZS9mb3JtLWFkYXB0aXZlLmNvbXBvbmVudC5sb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRTFDOztHQUVHO0FBRUgsTUFBTSxPQUFPLHdCQUF5QixTQUFRLG1CQUFtQjtJQUU3RDs7T0FFRztJQUNILFlBQTRDLFVBQWtCO1FBQzFELEtBQUssQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLENBQUM7UUFFN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQzVELEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7O3NIQVZRLHdCQUF3QixrQkFLRCxVQUFVOzBIQUxqQyx3QkFBd0I7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVTs7MEJBTU0sUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuaW1wb3J0IHsgRkFWX0xPQ0FMRSB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGRpIGxvY2FsaXp6YXppb25lIHBlciBpbCBjb21wb25lbnRlICoqRm9ybUFkYXB0aXZlQ29tcG9uZW50KipcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZvcm1BZGFwdGl2ZUNvbXBvbmVudExvYyBleHRlbmRzIExvY2FsaXphdGlvblNlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KEZBVl9MT0NBTEUpIExPQ19MT0NBTEU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKExPQ19MT0NBTEUgPz8gJ2l0LUlUJyk7XHJcblxyXG4gICAgICAgIHN1cGVyLnNldChcImVuLT5pdFwiLCBcIlNlbGVjdCBhIGZpbGVcIiwgW1wiU2VsZXppb25hIHVuIGZpbGVcIl0pO1xyXG4gICAgICAgIHN1cGVyLnNldChcImVuLT5pdFwiLCBcIkZpbGVzIFNlbGVjdGVkXCIsIFtcIkZpbGUgU2VsZXppb25hdGlcIl0pO1xyXG4gICAgfVxyXG59Il19
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQubG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvZm9ybXMvZm9ybS1hZGFwdGl2ZS9mb3JtLWFkYXB0aXZlLmNvbXBvbmVudC5sb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRTFDOztHQUVHO0FBRUgsTUFBTSxPQUFPLHdCQUF5QixTQUFRLG1CQUFtQjtJQUU3RDs7T0FFRztJQUNILFlBQTRDLFVBQWtCO1FBQzFELEtBQUssQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLENBQUM7UUFFN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQzVELEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7O3FIQVZRLHdCQUF3QixrQkFLRCxVQUFVO3lIQUxqQyx3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVTs7MEJBTU0sUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuaW1wb3J0IHsgRkFWX0xPQ0FMRSB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGRpIGxvY2FsaXp6YXppb25lIHBlciBpbCBjb21wb25lbnRlICoqRm9ybUFkYXB0aXZlQ29tcG9uZW50KipcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZvcm1BZGFwdGl2ZUNvbXBvbmVudExvYyBleHRlbmRzIExvY2FsaXphdGlvblNlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KEZBVl9MT0NBTEUpIExPQ19MT0NBTEU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKExPQ19MT0NBTEUgPz8gJ2l0LUlUJyk7XHJcblxyXG4gICAgICAgIHN1cGVyLnNldChcImVuLT5pdFwiLCBcIlNlbGVjdCBhIGZpbGVcIiwgW1wiU2VsZXppb25hIHVuIGZpbGVcIl0pO1xyXG4gICAgICAgIHN1cGVyLnNldChcImVuLT5pdFwiLCBcIkZpbGVzIFNlbGVjdGVkXCIsIFtcIkZpbGUgU2VsZXppb25hdGlcIl0pO1xyXG4gICAgfVxyXG59Il19