@esfaenza/forms-and-validations 13.3.3 → 13.3.6

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 (42) hide show
  1. package/esm2020/lib/forms/base-form-control.mjs +67 -119
  2. package/esm2020/lib/forms/form-adaptive/form-adaptive.component.mjs +53 -66
  3. package/esm2020/lib/forms/form-autocomplete/form-autocomplete.component.mjs +25 -47
  4. package/esm2020/lib/forms/form-checkbox/form-checkbox.component.mjs +21 -21
  5. package/esm2020/lib/forms/form-date/form-date.component.mjs +30 -28
  6. package/esm2020/lib/forms/form-datetime/form-datetime.component.mjs +29 -25
  7. package/esm2020/lib/forms/form-empty/form-empty.component.mjs +4 -10
  8. package/esm2020/lib/forms/form-error/form-error.component.mjs +6 -16
  9. package/esm2020/lib/forms/form-file/form-file.component.mjs +21 -31
  10. package/esm2020/lib/forms/form-info/form-info.component.mjs +6 -16
  11. package/esm2020/lib/forms/form-input/form-input.component.mjs +26 -36
  12. package/esm2020/lib/forms/form-multiselect/form-multiselect.component.mjs +22 -36
  13. package/esm2020/lib/forms/form-select/form-select.component.mjs +33 -34
  14. package/esm2020/lib/forms/form-template/form-template.component.mjs +10 -28
  15. package/esm2020/lib/forms/form-textarea/form-textarea.component.mjs +20 -18
  16. package/esm2020/lib/forms/form-time/form-time.component.mjs +18 -35
  17. package/esm2020/lib/forms-and-validations.module.mjs +3 -2
  18. package/esm2020/lib/models/FormsAndValidationsModuleConfig.mjs +1 -1
  19. package/esm2020/lib/tokens.mjs +5 -7
  20. package/fesm2015/esfaenza-forms-and-validations.mjs +378 -554
  21. package/fesm2015/esfaenza-forms-and-validations.mjs.map +1 -1
  22. package/fesm2020/esfaenza-forms-and-validations.mjs +375 -554
  23. package/fesm2020/esfaenza-forms-and-validations.mjs.map +1 -1
  24. package/lib/forms/base-form-control.d.ts +57 -131
  25. package/lib/forms/form-adaptive/form-adaptive.component.d.ts +26 -73
  26. package/lib/forms/form-autocomplete/form-autocomplete.component.d.ts +14 -42
  27. package/lib/forms/form-checkbox/form-checkbox.component.d.ts +9 -13
  28. package/lib/forms/form-date/form-date.component.d.ts +10 -16
  29. package/lib/forms/form-datetime/form-datetime.component.d.ts +9 -13
  30. package/lib/forms/form-empty/form-empty.component.d.ts +3 -9
  31. package/lib/forms/form-error/form-error.component.d.ts +5 -15
  32. package/lib/forms/form-file/form-file.component.d.ts +10 -28
  33. package/lib/forms/form-info/form-info.component.d.ts +5 -15
  34. package/lib/forms/form-input/form-input.component.d.ts +15 -37
  35. package/lib/forms/form-multiselect/form-multiselect.component.d.ts +11 -31
  36. package/lib/forms/form-select/form-select.component.d.ts +12 -25
  37. package/lib/forms/form-template/form-template.component.d.ts +9 -27
  38. package/lib/forms/form-textarea/form-textarea.component.d.ts +8 -16
  39. package/lib/forms/form-time/form-time.component.d.ts +10 -30
  40. package/lib/models/FormsAndValidationsModuleConfig.d.ts +6 -8
  41. package/lib/tokens.d.ts +4 -6
  42. package/package.json +1 -1
@@ -1,26 +1,21 @@
1
1
  // Angular
2
2
  import { RequiredValidator } from "@angular/forms";
3
3
  import { EventEmitter, Input, Output, ViewChild, Optional, Inject, Directive } from "@angular/core";
4
- import { ACO_CUSTOMKEY } from '../tokens';
4
+ import { ACO_CUSTOMKEY, FAV_DEBUG_MODE } from '../tokens';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/forms";
7
7
  import * as i2 from "@esfaenza/access-control";
8
- /**
9
- * Componente base da cui tutti i componenti Form implementano
10
- */
8
+ /** Componente base da cui tutti i componenti Form implementano */
11
9
  export class BaseFormControl {
12
- /**
13
- * Costruttore
14
- *
15
- * @ignore
16
- */
17
- constructor(cdr, ngControl, _validators, ac, AppContext, ACO_CUSTOMKEY, nativeInput = false) {
10
+ /** @ignore Costruttore */
11
+ constructor(cdr, ngControl, _validators, ac, AppContext, ACO_CUSTOMKEY, FAV_DEBUG_MODE, nativeInput = false) {
18
12
  this.cdr = cdr;
19
13
  this.ngControl = ngControl;
20
14
  this._validators = _validators;
21
15
  this.ac = ac;
22
16
  this.AppContext = AppContext;
23
17
  this.ACO_CUSTOMKEY = ACO_CUSTOMKEY;
18
+ this.FAV_DEBUG_MODE = FAV_DEBUG_MODE;
24
19
  this.nativeInput = nativeInput;
25
20
  /**
26
21
  * https://github.com/angular/angular/issues/14988
@@ -29,13 +24,9 @@ export class BaseFormControl {
29
24
  * poi mettendo firstBind a false di lì in poi funziono come devo. Vista la casistica evito essenzialmente metà detectChanges
30
25
  */
31
26
  this.firstBind = true;
32
- /**
33
- * Indica se il campo è obbligatorio i opzionale
34
- */
27
+ /** Indica se il campo è obbligatorio i opzionale */
35
28
  this.Required = false;
36
- /**
37
- * Indica se il Form che contiene questo campo è già stato registrato
38
- */
29
+ /** Indica se il Form che contiene questo campo è già stato registrato */
39
30
  this.formHasBennBound = false;
40
31
  /**
41
32
  * Indica se questo campo è staccato dal Form, ad esempio nel caso sia in un ng-template proiettato nel form.
@@ -43,17 +34,11 @@ export class BaseFormControl {
43
34
  * In quel caso la variabile **Form** del componente dev'essere valorizzata
44
35
  */
45
36
  this.detatchedFromform = false;
46
- /**
47
- * @ignore
48
- */
37
+ /** @ignore */
49
38
  this.propagateChange = (_) => { };
50
- /**
51
- * @ignore
52
- */
39
+ /** @ignore */
53
40
  this.onTouched = () => { };
54
- /**
55
- * @ignore Vedi getter e setter
56
- */
41
+ /** @ignore Vedi getter e setter */
57
42
  this._readonly = false;
58
43
  /**
59
44
  * Qualora ci fosse un contesto collegato questa variabile identifica se Sono l'Owner o meno.
@@ -61,61 +46,35 @@ export class BaseFormControl {
61
46
  * Se non lo sono, il campo risulterà in sola lettura
62
47
  */
63
48
  this.AppContextOwnership = true;
64
- /**
65
- * Modalità in cui viene mostrato il campo, 1-1 rispetto alle definizioni di Angular Material
66
- */
49
+ /** Modalità in cui viene mostrato il campo, 1-1 rispetto alle definizioni di Angular Material */
67
50
  this.FieldAppearence = "outline";
68
- /**
69
- * Utilizza o meno il Layout di un form (Label con input di fianco), se false mostra solo l'input
70
- */
51
+ /** Utilizza o meno il Layout di un form (Label con input di fianco), se false mostra solo l'input */
71
52
  this.FormLayout = true;
72
- /**
73
- * Definisce se richiamare l'EventEmitter **inputChange** in maniera classica (true) o solo per la change considerate definitive come tasto invio / blur / ecc... (false)
74
- */
53
+ /** Indica che la parte input del controllo dev'essere una label readonly e la parte label di titolo dev'essere in bold. Per utilizzare un solo componente sia per la modifica che per il dettaglio */
54
+ this.DisplayMode = false;
55
+ /** Definisce se richiamare l'EventEmitter **inputChange** in maniera classica (true) o solo per la change considerate definitive come tasto invio / blur / ecc... (false) */
75
56
  this.EmitPendingChanges = true;
76
- /**
77
- * Attiva o disattiva la validazione per questo componente
78
- */
57
+ /** Attiva o disattiva la validazione per questo componente */
79
58
  this.Validation = true;
80
- /**
81
- * Placeholder per quando l'input è vuoto
82
- */
59
+ /** Placeholder per quando l'input è vuoto */
83
60
  this.Placeholder = "";
84
- /**
85
- * Classe extra per il form-group in cui viene wrappato l'input
86
- */
61
+ /** Classe extra per il form-group in cui viene wrappato l'input */
87
62
  this.FormGroupClass = "";
88
- /**
89
- * Messaggio da mostrare quando la validazione fallisce per questo componente. Di default viene proposta dalla libreria
90
- */
63
+ /** Messaggio da mostrare quando la validazione fallisce per questo componente. Di default viene proposta dalla libreria */
91
64
  this.FailedValidationMessage = "";
92
- /**
93
- * Input che forza l'invalidità del componente
94
- */
65
+ /** Input che forza l'invalidità del componente */
95
66
  this.ForcedError = false;
96
- /**
97
- * Mostra un testo a sinistra dell'input (FormLayout permettendo)
98
- */
67
+ /** Mostra un testo a sinistra dell'input (FormLayout permettendo) */
99
68
  this.Label = "";
100
- /**
101
- * col-md-X per la label
102
- */
69
+ /** col-md-X per la label */
103
70
  this.LabelColWidth = 4;
104
- /**
105
- * col-md-X per l'input
106
- */
71
+ /** col-md-X per l'input */
107
72
  this.InputColWidth = 8;
108
- /**
109
- * Indica se è l'ultimo componente di un form (serve per rimuovere il margine finale)
110
- */
73
+ /** Indica se è l'ultimo componente di un form (serve per rimuovere il margine finale) */
111
74
  this.Last = false;
112
- /**
113
- * Associa il componente Form a questo input
114
- */
75
+ /** Associa il componente Form a questo input */
115
76
  this.Form = null;
116
- /**
117
- * Nome della proprietà che contiene l'Id degli oggetti bindati nella **Source**
118
- */
77
+ /** Nome della proprietà che contiene l'Id degli oggetti bindati nella **Source** */
119
78
  this.IdField = 'id';
120
79
  /**
121
80
  * Espressione simil-Angular per cambiare il testo dei componenti che scelgono il proprio modello da una **Source**
@@ -124,33 +83,19 @@ export class BaseFormControl {
124
83
  * È inoltre possibile aggiungere pezzi di descrizione in maniera condizionale con la sintassi **:prop?(Prop vale {prop})**
125
84
  */
126
85
  this.Display = '{description}';
127
- /**
128
- * Risultato dell'unione fra le informazioni degli oggetti in **Source** e le impostazioni specificate nell'Input **Display**
129
- */
86
+ /** Risultato dell'unione fra le informazioni degli oggetti in **Source** e le impostazioni specificate nell'Input **Display** */
130
87
  this.BoundSource = [];
131
- /**
132
- * Indica se è il primo Bind della Source
133
- */
88
+ /** Indica se è il primo Bind della Source */
134
89
  this.SourceFirstBind = true;
135
- /**
136
- * Evento chiamato alla modifica del valore collegato a questo campo
137
- */
90
+ /** Evento chiamato alla modifica del valore collegato a questo campo */
138
91
  this.inputChange = new EventEmitter();
139
- /**
140
- * Evento chiamato al focus del campo di testo/combo/quelcheè, riemitta l'evento originale Javascript
141
- */
92
+ /** Evento chiamato al focus del campo di testo/combo/quelcheè, riemitta l'evento originale Javascript */
142
93
  this.inputFocus = new EventEmitter();
143
- /**
144
- * Evento chiamato al finalize del campo di testo/combo/quelcheè
145
- */
94
+ /** Evento chiamato al finalize del campo di testo/combo/quelcheè */
146
95
  this.inputFinalized = new EventEmitter();
147
- /**
148
- * Cache delle condizioni scritte tipo :prop?(Roba con {prop})
149
- */
96
+ /** Cache delle condizioni scritte tipo :prop?(Roba con {prop}) */
150
97
  this.BindCheckingGroups = [];
151
- /**
152
- * Cache delle proprietà scritte tipo --> {prop}
153
- */
98
+ /** Cache delle proprietà scritte tipo --> {prop} */
154
99
  this.BindProperties = [];
155
100
  if (ngControl == null) {
156
101
  if (!this.handleNullNgControl())
@@ -247,11 +192,12 @@ export class BaseFormControl {
247
192
  // Aggiungo alla BoundSource in formato standard KeyValue
248
193
  this.BoundSource.push(this.transformSourceItem(s));
249
194
  });
195
+ // Post trybind se c'è un modello associato ricalcolo l'**EvaluatedModel**
196
+ if (this.Model)
197
+ this.EvaluatedModel = this.BoundSource.find(t => t.id == this.Model)?.description;
250
198
  }
251
199
  }
252
- /**
253
- * Valuta il contenuto della variabile BindCheckingGroups
254
- */
200
+ /** Valuta il contenuto della variabile BindCheckingGroups */
255
201
  evaluateBindCheckingGroups() {
256
202
  // Blocco per tirare fuori le condizioni scritte tipo --> :prop?(Roba con {prop})
257
203
  var iffedMatches = this.Display.match(/:([a-z]+)\?\(([^\(\)]+)\)/g);
@@ -264,9 +210,7 @@ export class BaseFormControl {
264
210
  });
265
211
  }
266
212
  }
267
- /**
268
- * Valuta il contenuto della variabile BindProperties
269
- */
213
+ /** Valuta il contenuto della variabile BindProperties */
270
214
  evaluateBindProperties() {
271
215
  // Blocco per tirare fuori le proprietà scritte tipo --> {prop}
272
216
  var matches = this.Display.match(/{[a-z]+}/gi);
@@ -304,9 +248,7 @@ export class BaseFormControl {
304
248
  handleNullNgControl() {
305
249
  return false;
306
250
  }
307
- /**
308
- * @ignore
309
- */
251
+ /** @ignore */
310
252
  ngOnInit() {
311
253
  // A volte nell'ngOnInit non ci passa quindi lo metto sia qui sia nell'afterviewinit, penso che valga per i componenti di terze parti
312
254
  // che si collegano per i cazzi loro al form ecc, quindi la parte sopra non serve... BOH
@@ -341,26 +283,20 @@ export class BaseFormControl {
341
283
  if (this.detatchedFromform && this.Form)
342
284
  this.Form.removeControl(this.validationControl);
343
285
  }
344
- /**
345
- * Elabora i validatori iniettati e capisce se il valore è obbligatorio o meno
346
- */
286
+ /** Elabora i validatori iniettati e capisce se il valore è obbligatorio o meno */
347
287
  checkRequiredValidator() {
348
288
  // controllo se è settato un required per decidere in maniera condizionale se utilizzare il validatore required nel componente interno
349
289
  // Lo faccio qui e non in un eventuale ngOnInit o costruttore perché ngOnInit non sempre viene chiamato e da costruttore il validatore non ha ancora il valore giusto
350
290
  if (this._validators && this._validators.some(elem => elem instanceof RequiredValidator && elem.required))
351
291
  this.Required = true;
352
292
  }
353
- /**
354
- * @ignore
355
- */
293
+ /** @ignore */
356
294
  ngAfterViewInit() {
357
295
  if (!this.ngControl)
358
296
  return;
359
297
  this.checkRequiredValidator();
360
298
  }
361
- /**
362
- * Helper che collega la funzione di reset del controllo form al controllo di validazione sottostante
363
- */
299
+ /** Helper che collega la funzione di reset del controllo form al controllo di validazione sottostante */
364
300
  bindResetFunction() {
365
301
  //faccio in modo che se chiamo il reset del controllo (o della form) dall'esterno si resetti anche il controllo nativo
366
302
  const origFunc = this.ngControl.control.__original_reset__ || this.ngControl.control.reset;
@@ -373,9 +309,7 @@ export class BaseFormControl {
373
309
  //Per consentire richiami multipli di questa funzione prendendo sempre la fiunzione di reset base
374
310
  this.ngControl.control.__original_reset__ = origFunc;
375
311
  }
376
- /**
377
- * @ignore
378
- */
312
+ /** @ignore */
379
313
  writeValue(obj) {
380
314
  if (obj == null && this.firstBind) {
381
315
  this.firstBind = false;
@@ -391,15 +325,11 @@ export class BaseFormControl {
391
325
  // setTime*ut che wrappa tutto non va bene sennò spamma delle change detection a suon di interval che rallentano tantissimo l'app
392
326
  this.cdr.detectChanges();
393
327
  }
394
- /**
395
- * @ignore
396
- */
328
+ /** @ignore */
397
329
  registerOnChange(fn) {
398
330
  this.propagateChange = fn;
399
331
  }
400
- /**
401
- * @ignore
402
- */
332
+ /** @ignore */
403
333
  registerOnTouched(fn) {
404
334
  this.onTouched = fn;
405
335
  }
@@ -456,7 +386,7 @@ export class BaseFormControl {
456
386
  */
457
387
  focused(event) {
458
388
  this.inputFocus.emit(event);
459
- console.log("Control Focused: " + this.GeneratedName);
389
+ this.log("Control Focused - " + this.GeneratedName);
460
390
  }
461
391
  /**
462
392
  * @ignore
@@ -466,11 +396,20 @@ export class BaseFormControl {
466
396
  */
467
397
  finalized() {
468
398
  this.inputFinalized.emit();
469
- console.log("Control Value Finalized: " + this.GeneratedName);
399
+ this.log("Control Value Finalized - " + this.GeneratedName);
400
+ }
401
+ /**
402
+ * Stampa un log a console
403
+ *
404
+ * @param {string} message Messaggio da stampare
405
+ */
406
+ log(message) {
407
+ if (this.FAV_DEBUG_MODE)
408
+ console.log("@forms-and-validations: " + message);
470
409
  }
471
410
  }
472
411
  BaseFormControl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: BaseFormControl, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
473
- BaseFormControl.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.9", type: BaseFormControl, inputs: { FocusSubject: "FocusSubject", FieldAppearence: "FieldAppearence", FormLayout: "FormLayout", EmitPendingChanges: "EmitPendingChanges", Validation: "Validation", Placeholder: "Placeholder", FormGroupClass: "FormGroupClass", FailedValidationMessage: "FailedValidationMessage", ForcedError: "ForcedError", Label: "Label", LabelColWidth: "LabelColWidth", InputColWidth: "InputColWidth", Last: "Last", Form: "Form", Source: "Source", IdField: "IdField", 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 });
412
+ BaseFormControl.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.9", type: BaseFormControl, inputs: { FocusSubject: "FocusSubject", FieldAppearence: "FieldAppearence", FormLayout: "FormLayout", DisplayMode: "DisplayMode", EmitPendingChanges: "EmitPendingChanges", Validation: "Validation", Placeholder: "Placeholder", FormGroupClass: "FormGroupClass", FailedValidationMessage: "FailedValidationMessage", ForcedError: "ForcedError", Label: "Label", LabelColWidth: "LabelColWidth", InputColWidth: "InputColWidth", Last: "Last", Form: "Form", Source: "Source", IdField: "IdField", DisplayModeTemplate: "DisplayModeTemplate", 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 });
474
413
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: BaseFormControl, decorators: [{
475
414
  type: Directive
476
415
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NgControl }, { type: Array }, { type: i2.AccessControlService, decorators: [{
@@ -482,12 +421,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
482
421
  }, {
483
422
  type: Inject,
484
423
  args: [ACO_CUSTOMKEY]
424
+ }] }, { type: undefined, decorators: [{
425
+ type: Optional
426
+ }, {
427
+ type: Inject,
428
+ args: [FAV_DEBUG_MODE]
485
429
  }] }, { type: undefined }]; }, propDecorators: { FocusSubject: [{
486
430
  type: Input
487
431
  }], FieldAppearence: [{
488
432
  type: Input
489
433
  }], FormLayout: [{
490
434
  type: Input
435
+ }], DisplayMode: [{
436
+ type: Input
491
437
  }], EmitPendingChanges: [{
492
438
  type: Input
493
439
  }], Validation: [{
@@ -514,6 +460,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
514
460
  type: Input
515
461
  }], IdField: [{
516
462
  type: Input
463
+ }], DisplayModeTemplate: [{
464
+ type: Input
517
465
  }], Display: [{
518
466
  type: Input
519
467
  }], Readonly: [{
@@ -533,4 +481,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
533
481
  }], inputFinalized: [{
534
482
  type: Output
535
483
  }] } });
536
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFvRCxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSXZILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7QUFHMUM7O0dBRUc7QUFFSCxNQUFNLE9BQWdCLGVBQWU7SUFxT2pDOzs7O09BSUc7SUFDSCxZQUFzQixHQUFzQixFQUFTLFNBQW9CLEVBQVksV0FBdUIsRUFBc0IsRUFBd0IsRUFBcUIsVUFBNEIsRUFBNkMsYUFBcUIsRUFBVSxjQUF1QixLQUFLO1FBQTdSLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQXNCLE9BQUUsR0FBRixFQUFFLENBQXNCO1FBQXFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQTZDLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBeE9uVDs7Ozs7V0FLRztRQUNLLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFbEM7O1dBRUc7UUFDSSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBWWpDOztXQUVHO1FBQ08scUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRTVDOzs7O1dBSUc7UUFDTyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFN0M7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLENBQUMsQ0FBTSxF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S0FBSztzQkFBYixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLE1BQU07c0JBQWQsS0FBSztnQkFLRyxPQUFPO3NCQUFmLEtBQUs7Z0JBUUcsT0FBTztzQkFBZixLQUFLO2dCQXdCTyxRQUFRO3NCQUFwQixLQUFLO2dCQVVPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBZ0JpRCxrQkFBa0I7c0JBQXhFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU9LLHdCQUF3QjtzQkFBN0UsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBS3RDLFdBQVc7c0JBQXBCLE1BQU07Z0JBS0csVUFBVTtzQkFBbkIsTUFBTTtnQkFLRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBOZ0Zvcm0sIE5nTW9kZWwsIFJlcXVpcmVkVmFsaWRhdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBPcHRpb25hbCwgSW5qZWN0LCBEaXJlY3RpdmUsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIC8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBDb21wb25lbnRDb250ZXh0IH0gZnJvbSBcIkBlc2ZhZW56YS9hY2Nlc3MtY29udHJvbFwiO1xyXG5pbXBvcnQgeyBBQ09fQ1VTVE9NS0VZIH0gZnJvbSAnLi4vdG9rZW5zJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSBiYXNlIGRhIGN1aSB0dXR0aSBpIGNvbXBvbmVudGkgRm9ybSBpbXBsZW1lbnRhbm9cclxuICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUZvcm1Db250cm9sIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5ODhcclxuICAgICAqIFRMOkRSOyBJbCBwcmltbyB2YWxvcmUgcGFzc2F0byBhbCB3cml0ZVZhbHVlIMOoIG51bGxvIHBlcmNow6kgcXVhbmRvIGkgY2FnbmFjY2kgZmFubm8gbmV3IEZvcm1Db250cm9sKClcclxuICAgICAqIHNjcml2b25vIHVuIHdyaXRlVmFsdWUgbnVsbG8uLi4gcXVpbmRpIGFsIHByaW1vIGJpbmRpbmcgc2FsdG8gbCdpbml6aWFsaXp6YXppb25lIHNlIGhvIGxhIGNvcHBpYSBudWxsLWZpcnN0QmluZFxyXG4gICAgICogcG9pIG1ldHRlbmRvIGZpcnN0QmluZCBhIGZhbHNlIGRpIGzDrCBpbiBwb2kgZnVuemlvbm8gY29tZSBkZXZvLiBWaXN0YSBsYSBjYXNpc3RpY2EgZXZpdG8gZXNzZW56aWFsbWVudGUgbWV0w6AgZGV0ZWN0Q2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaWwgY2FtcG8gw6ggb2JibGlnYXRvcmlvIGkgb3B6aW9uYWxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW9kZWxsbyByYXBwcmVzZW50YXRvIGRhIHF1ZXN0byBjYW1wb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTW9kZWw6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vbWUgZ2VuZXJhdG8gcGVyIGlsIGNvbnRyb2xsbyBpbnRlcm5vLiBEaSBkZWZhdWx0IMOoIGlsIG5vbWUgZGVsIGNvbnRyb2xsbyBlc3Rlcm5vIGNvbiBsJ2FnZ2l1bnRhIGRpIFwiX2ludGVybmFsXCIuIFNlcnZlIHBlciBldml0YXJlIGNyb3NzLWJpbmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdlbmVyYXRlZE5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCBGb3JtIGNoZSBjb250aWVuZSBxdWVzdG8gY2FtcG8gw6ggZ2nDoCBzdGF0byByZWdpc3RyYXRvXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBmb3JtSGFzQmVubkJvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgcXVlc3RvIGNhbXBvIMOoIHN0YWNjYXRvIGRhbCBGb3JtLCBhZCBlc2VtcGlvIG5lbCBjYXNvIHNpYSBpbiB1biBuZy10ZW1wbGF0ZSBwcm9pZXR0YXRvIG5lbCBmb3JtLlxyXG4gICAgICogXHJcbiAgICAgKiBJbiBxdWVsIGNhc28gbGEgdmFyaWFiaWxlICoqRm9ybSoqIGRlbCBjb21wb25lbnRlIGRldidlc3NlcmUgdmFsb3JpenphdGFcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGRldGF0Y2hlZEZyb21mb3JtOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvblRvdWNoZWQgPSAoKSA9PiB7IH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFZlZGkgZ2V0dGVyIGUgc2V0dGVyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWFsb3JhIGNpIGZvc3NlIHVuIGNvbnRlc3RvIGNvbGxlZ2F0byBxdWVzdGEgdmFyaWFiaWxlIGlkZW50aWZpY2Egc2UgU29ubyBsJ093bmVyIG8gbWVuby5cclxuICAgICAqIFxyXG4gICAgICogU2Ugbm9uIGxvIHNvbm8sIGlsIGNhbXBvIHJpc3VsdGVyw6AgaW4gc29sYSBsZXR0dXJhIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEFwcENvbnRleHRPd25lcnNoaXA6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3ViamVjdCBhIGN1aSBsJ29nZ2V0dG8gaW50ZXJubyBzaSBjb2xsZWdhIHBlciBlZmZldHR1YXJlIGlsIGZvY3VzIGRlbGwnZWxlbWVudG8gaW5wdXQgc290dG9zdGFudGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRm9jdXNTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW9kYWxpdMOgIGluIGN1aSB2aWVuZSBtb3N0cmF0byBpbCBjYW1wbywgMS0xIHJpc3BldHRvIGFsbGUgZGVmaW5pemlvbmkgZGkgQW5ndWxhciBNYXRlcmlhbCBcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRmllbGRBcHBlYXJlbmNlOiBcImxlZ2FjeVwiIHwgXCJzdGFuZGFyZFwiIHwgXCJmaWxsXCIgfCBcIm91dGxpbmVcIiA9IFwib3V0bGluZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXRpbGl6emEgbyBtZW5vIGlsIExheW91dCBkaSB1biBmb3JtIChMYWJlbCBjb24gaW5wdXQgZGkgZmlhbmNvKSwgc2UgZmFsc2UgbW9zdHJhIHNvbG8gbCdpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGb3JtTGF5b3V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluaXNjZSBzZSByaWNoaWFtYXJlIGwnRXZlbnRFbWl0dGVyICoqaW5wdXRDaGFuZ2UqKiBpbiBtYW5pZXJhIGNsYXNzaWNhICh0cnVlKSBvIHNvbG8gcGVyIGxhIGNoYW5nZSBjb25zaWRlcmF0ZSBkZWZpbml0aXZlIGNvbWUgdGFzdG8gaW52aW8gLyBibHVyIC8gZWNjLi4uIChmYWxzZSlcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRW1pdFBlbmRpbmdDaGFuZ2VzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGl2YSBvIGRpc2F0dGl2YSBsYSB2YWxpZGF6aW9uZSBwZXIgcXVlc3RvIGNvbXBvbmVudGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQbGFjZWhvbGRlciBwZXIgcXVhbmRvIGwnaW5wdXQgw6ggdnVvdG9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgUGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGFzc2UgZXh0cmEgcGVyIGlsIGZvcm0tZ3JvdXAgaW4gY3VpIHZpZW5lIHdyYXBwYXRvIGwnaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRm9ybUdyb3VwQ2xhc3M6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXNzYWdnaW8gZGEgbW9zdHJhcmUgcXVhbmRvIGxhIHZhbGlkYXppb25lIGZhbGxpc2NlIHBlciBxdWVzdG8gY29tcG9uZW50ZS4gRGkgZGVmYXVsdCB2aWVuZSBwcm9wb3N0YSBkYWxsYSBsaWJyZXJpYVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGYWlsZWRWYWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElucHV0IGNoZSBmb3J6YSBsJ2ludmFsaWRpdMOgIGRlbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZvcmNlZEVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3N0cmEgdW4gdGVzdG8gYSBzaW5pc3RyYSBkZWxsJ2lucHV0IChGb3JtTGF5b3V0IHBlcm1ldHRlbmRvKVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBMYWJlbDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbC1tZC1YIHBlciBsYSBsYWJlbFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBMYWJlbENvbFdpZHRoOiBudW1iZXIgPSA0O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29sLW1kLVggcGVyIGwnaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgSW5wdXRDb2xXaWR0aDogbnVtYmVyID0gODtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSDDqCBsJ3VsdGltbyBjb21wb25lbnRlIGRpIHVuIGZvcm0gKHNlcnZlIHBlciByaW11b3ZlcmUgaWwgbWFyZ2luZSBmaW5hbGUpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIExhc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzc29jaWEgaWwgY29tcG9uZW50ZSBGb3JtIGEgcXVlc3RvIGlucHV0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZvcm06IE5nRm9ybSA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTb3JnZW50ZSBkYSBjdWkgc2NlZ2xpZXJlIHZhbG9yaSBwZXIgaSBjb21wb25lbnRpIEZvcm0gY2hlIGxvIGNvbnNlbnRvbm9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU291cmNlOiBhbnlbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJZCBkZWdsaSBvZ2dldHRpIGJpbmRhdGkgbmVsbGEgKipTb3VyY2UqKlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBJZEZpZWxkOiBzdHJpbmcgPSAnaWQnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNwcmVzc2lvbmUgc2ltaWwtQW5ndWxhciBwZXIgY2FtYmlhcmUgaWwgdGVzdG8gZGVpIGNvbXBvbmVudGkgY2hlIHNjZWxnb25vIGlsIHByb3ByaW8gbW9kZWxsbyBkYSB1bmEgKipTb3VyY2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBJbCBmdW56aW9uYW1lbnRvIMOoIGlkZW50aWNvIGFsIGJpbmRlciBkaSBhbmd1bGFyLCBzb2xvIGNvbiB1bmEgZ3JhZmZhIGludmVjZSBjaGUgMi5cclxuICAgICAqIMOIIGlub2x0cmUgcG9zc2liaWxlIGFnZ2l1bmdlcmUgcGV6emkgZGkgZGVzY3JpemlvbmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgY29uIGxhIHNpbnRhc3NpICoqOnByb3A/KFByb3AgdmFsZSB7cHJvcH0pKipcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheTogc3RyaW5nID0gJ3tkZXNjcmlwdGlvbn0nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmlzdWx0YXRvIGRlbGwndW5pb25lIGZyYSBsZSBpbmZvcm1hemlvbmkgZGVnbGkgb2dnZXR0aSBpbiAqKlNvdXJjZSoqIGUgbGUgaW1wb3N0YXppb25pIHNwZWNpZmljYXRlIG5lbGwnSW5wdXQgKipEaXNwbGF5KipcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJvdW5kU291cmNlOiB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2Ugw6ggaWwgcHJpbW8gQmluZCBkZWxsYSBTb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIFNvdXJjZUZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipfcmVhZG9ubHkqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2Ugc29sYSBsZXR0dXJhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhZG9ubHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZWFkb25seTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KiogZ2VzdGVuZG8gYW5jaGUgaWwgQ29udGVzdG8gYXBwbGljYXRpdm9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSBWYWxvcmUgZGEgaW1wb3N0YXJlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBSZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLkFwcENvbnRleHRPd25lcnNoaXApXHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZXR0YXJlIGluIHVuYSB2b2x0YSBzb2xvIGdsaSBpbnB1dCBMYWJlbENvbFdpZHRoIGUgSW5wdXRDb2xXaWR0aCwgYmFzdGEgc2NyaXZlcmxvIGNvbiBsYSBzaW50YXNzaSBcIlggWVwiXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBJbnB1dCBuZWwgZm9ybWF0byBcIlggWVwiXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBMYWJlbElucHV0UmF0aW8oaW5wdXQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByYXRpbyA9IGlucHV0LnNwbGl0KC9cXHMvKTtcclxuICAgICAgICB0aGlzLkxhYmVsQ29sV2lkdGggPSBwYXJzZUludChyYXRpb1swXSk7XHJcbiAgICAgICAgdGhpcy5JbnB1dENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdmFsLXF1YWxjb3NhIGNoZSBmYSBlZmZldHRpdmFtZW50ZSBkYSBpbnB1dCwgbyBldmVudHVhbG1lbnRlIGlsIHNpbmdvbG8gaW5wdXQgaW4gY2FzaSBwYXJ0aWNvbGFyaSAoZXMgY2hlY2tib3gpXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uQ29udHJvbDogTmdNb2RlbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ3ZhbGlkYXRpb25Db250cm9sJyBjaGUgZnVuemlvbmEgaW4gYW1iaWVudGUgc3RhdGljb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJ2YWxpZGF0aW9uQ29udHJvbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IF92YWxpZGF0aW9uQ29udHJvbChjb21wOiBOZ01vZGVsKSB7IHRoaXMucmVnaXN0ZXJWYWxDb21wKGNvbXApOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyeSBzdWxsJ2VsZW1lbnRvICd2YWxpZGF0aW9uQ29udHJvbCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIGRpbmFtaWNvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcInZhbGlkYXRpb25Db250cm9sXCIsIHsgc3RhdGljOiB0cnVlIH0pIHNldCB2YWxpZGF0aW9uQ29udHJvbF9zdGF0aWMoY29tcDogTmdNb2RlbCkgeyB0aGlzLnJlZ2lzdGVyVmFsQ29tcChjb21wKTsgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byBjaGlhbWF0byBhbGxhIG1vZGlmaWNhIGRlbCB2YWxvcmUgY29sbGVnYXRvIGEgcXVlc3RvIGNhbXBvXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byBjaGlhbWF0byBhbCBmb2N1cyBkZWwgY2FtcG8gZGkgdGVzdG8vY29tYm8vcXVlbGNoZcOoLCByaWVtaXR0YSBsJ2V2ZW50byBvcmlnaW5hbGUgSmF2YXNjcmlwdFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRGb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byBjaGlhbWF0byBhbCBmaW5hbGl6ZSBkZWwgY2FtcG8gZGkgdGVzdG8vY29tYm8vcXVlbGNoZcOoXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dEZpbmFsaXplZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhY2hlIGRlbGxlIGNvbmRpemlvbmkgc2NyaXR0ZSB0aXBvIDpwcm9wPyhSb2JhIGNvbiB7cHJvcH0pXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgQmluZENoZWNraW5nR3JvdXBzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHdoZW5leGlzdHM6IHN0cmluZyB9W10gPSBbXVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FjaGUgZGVsbGUgcHJvcHJpZXTDoCBzY3JpdHRlIHRpcG8gLS0+IHtwcm9wfVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEJpbmRQcm9wZXJ0aWVzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3N0cnV0dG9yZSBcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBwcm90ZWN0ZWQgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIHByaXZhdGUgYWM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwdWJsaWMgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBwcml2YXRlIEFDT19DVVNUT01LRVk6IHN0cmluZywgcHJpdmF0ZSBuYXRpdmVJbnB1dDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlTnVsbE5nQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5nQ29udHJvbCBudWxsbyBwZXIgcXVhbGNoZSBtb3Rpdm8hIElsIDkwJSBkZWxsZSBmdW56aW9uYWxpdMOgIGRpIHF1ZXN0byBpbnB1dCBzYXJhbm5vIGRpc2FiaWxpdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2UgbWkgYXJyaXZhIGwnaW5qZWN0YWJsZSBkZWwgY29udGVzdG8gcG9zc28gY2FwaXJlIHNlIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBpbiByZWFkb25seSBvIG5vLCBzb2xvIHNlIGhvIGdpw6AgaW5pemlhbGl6emF0byBpIGNvbnRyb2xsZXIgY3VzdG9tIGRlbGwnYWNjZXNzIGNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0ICYmIHRoaXMuQXBwQ29udGV4dC5uYW1lICYmIHRoaXMuQUNPX0NVU1RPTUtFWSAmJiB0aGlzLmFjICYmIHRoaXMuYWMuSW5pdGlhbGl6ZWRDdXN0b20pIHtcclxuICAgICAgICAgICAgdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwID0gIXRoaXMuYWMuaGFzKHRoaXMuQUNPX0NVU1RPTUtFWSArIFwiOlwiICsgdGhpcy5BcHBDb250ZXh0Lm5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9ICF0aGlzLkFwcENvbnRleHRPd25lcnNoaXBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy9TZSBobyBnacOgIHVuIHBhcmVudCBpbXBvc3RhdG8gdnVvbCBkaXJlIGNoZSBzb3R0byBhbCB0YWcgPGZvcm0+IGhvIGRpcmV0dGFtZW50ZSB1biB0YWcgPGZvcm0tKj4uLlxyXG4gICAgICAgIC8vLi4gcXVpbmRpIHBvc3NvIGltcG9zdGFyZSBkaXJldHRhbWVudGUgaWwgcmlmZXJpbWVudG8gZGVsIEZvcm0gZGEgdXNhcmUgaW4gSFRNTCBwZXIgaWwgc3VibWl0dGVkXHJcblxyXG4gICAgICAgIC8vU2Ugbm9uIGMnw6ggdnVvbCBkaXJlIGNoZSBkZW50cm8gYWwgdGFnIDxmb3JtPiBjJ8OoIHVubyBzcGxlbmRpZG8gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAuLi4uXCI+Li5cclxuICAgICAgICAvLy4uIGlsIHF1YWxlIGEgc3VhIHZvbHRhIGNvbnRpZW5lIGlsIGNvbnRyb2xsbyA8Zm9ybS0qPiBxdWluZGkgYXZyw7IgaWwgZm9ybSBuZWxsJ2lucHV0IFwiRm9ybVwiXHJcbiAgICAgICAgaWYgKCg8YW55Pm5nQ29udHJvbCkuX3BhcmVudClcclxuICAgICAgICAgICAgdGhpcy5Gb3JtID0gPE5nRm9ybT4oPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQ7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmRldGF0Y2hlZEZyb21mb3JtID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIGltcG9zdGFyZSBtZSBzdGVzc28gY29tZSBzaSBkZXZlLCBpbCB2YWxpZGF0b3JlIGludmVjZSBsbyBwYXNzbyBhbCB2YWxpZGF0aW9uLWlucHV0IHF1YW5kbyB2aWVuZSBzZXR0YXRvIGlsIHZhbGlkYXRpb25Db250cm9sXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgICAgICAgIC8vUGVyIHR1dHRpIGkgdmFsaWRhdG9yaTogcmlnZW5lcm8gbGEgZnVuemlvbmUgZGkgdmFsaWRhemlvbmUuIFBlciBxdWFsY2hlIG1vdGl2byBhIHZvbHRlIGhvIHZhbGlkYXRvcmkgc2VuemEuLi5cclxuICAgICAgICAgICAgLy8uLi4gcXVlc3RvIMOoIHVuIHdvcmthcm91bmQgcGVyIGVzc2VyZSBzaWN1cm8gZGkgYXZlcmxhIHNlbXByZS5cclxuICAgICAgICAgICAgLy9Tb2xvIGkgdmFsaWRhdG9yaSBjb24gcGFyYW1ldHJpIGhhbm5vIGJpc29nbm8gZGVsbGEgX2NyZWF0ZVZhbGlkYXRvciAoZXMuIFwibWF4bGVuZ3RoXCIgY2hlIGhhIDEgcGFyYW1ldHJvKSwgcXVpbmRpIG5vIHZhbGlkYXRvcmkgdGlwbyBcInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodi5fY3JlYXRlVmFsaWRhdG9yKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2Ll9jcmVhdGVWYWxpZGF0b3IoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuYWRkVmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgaWwgQmluZC9QYXJzZSBkZWxsZSB2YXJpZSAqKlNvdXJjZSoqIHVuZW5kbyBsZSBpbmZvcm1hemlvbmkgc3BlY2lmaWNhdGUgaW4gKipEaXNwbGF5KipcclxuICAgICAqIFxyXG4gICAgICogRXZlbnR1YWxtZW50ZSByaWVmZmV0dHVhIHVuIGJpbmQgYWwgbW9kZWxsbyBpbiBiYXNlIGFsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipSZWJpbmRNb2RlbEFmdGVyU291cmNlKipcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHRyeUJpbmRTb3VyY2VEaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5Tb3VyY2UpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA9PSAwICYmICF0aGlzLlNvdXJjZUZpcnN0QmluZClcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLlNvdXJjZUZpcnN0QmluZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBDYWNoZSBsb2NhbGUgcGVyIGV2aXRhcmUgZGkgcmlmYXJlIGRlaSByZWdleC5tYXRjaCBvZ25pIHNhbnRhIHZvbHRhXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQmluZENoZWNraW5nR3JvdXBzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUJpbmRDaGVja2luZ0dyb3VwcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQmluZFByb3BlcnRpZXMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlQmluZFByb3BlcnRpZXMoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEJsb2NjbyBwZXIgZ2VuZXJhcmUgbGEgZGVzY3JpemlvbmUgZmluYWxlIGRpIHVuIGVsZW1lbnRvXHJcbiAgICAgICAgICAgIHRoaXMuU291cmNlLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBBZ2dpdW5nbyBhbGxhIEJvdW5kU291cmNlIGluIGZvcm1hdG8gc3RhbmRhcmQgS2V5VmFsdWVcclxuICAgICAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UucHVzaCh0aGlzLnRyYW5zZm9ybVNvdXJjZUl0ZW0ocykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWx1dGEgaWwgY29udGVudXRvIGRlbGxhIHZhcmlhYmlsZSBCaW5kQ2hlY2tpbmdHcm91cHNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJpbmRDaGVja2luZ0dyb3VwcygpIHtcclxuICAgICAgICAvLyBCbG9jY28gcGVyIHRpcmFyZSBmdW9yaSBsZSBjb25kaXppb25pIHNjcml0dGUgdGlwbyAtLT4gOnByb3A/KFJvYmEgY29uIHtwcm9wfSlcclxuICAgICAgICB2YXIgaWZmZWRNYXRjaGVzID0gdGhpcy5EaXNwbGF5Lm1hdGNoKC86KFthLXpdKylcXD9cXCgoW15cXChcXCldKylcXCkvZyk7XHJcbiAgICAgICAgaWYgKGlmZmVkTWF0Y2hlcykge1xyXG4gICAgICAgICAgICBpZmZlZE1hdGNoZXMuZm9yRWFjaChtID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFN0ZXNzYSByZWdleCBkaSBzb3ByYSBtYSBpbCB0YWcgXCJpXCIgc2VydmUgcGVyIHRpcmFyZSBmdW9yaSBpIHNpbmdvbGkgY2FwdHVyaW5nIGdyb3VwIGUgcGVyIHF1YWxjaGUgbW90aXZvIFxyXG4gICAgICAgICAgICAgICAgLy8gbmV3IFJlZ0V4cChiYXNlUmVnZXgsIFwiZ1wiKSBub24gZnVuemlvbmEgcXVpbmRpIG5vbiBobyBwb3R1dG8gcmF6aW9uYWxpenphcmxvXHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBzID0gbS5tYXRjaCgvOihbYS16XSspXFw/XFwoKFteXFwoXFwpXSspXFwpL2kpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMucHVzaCh7IGdsb2JhbDogbSwgcHJvcDogZ3JvdXBzWzFdLCB3aGVuZXhpc3RzOiBncm91cHNbMl0gfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbHV0YSBpbCBjb250ZW51dG8gZGVsbGEgdmFyaWFiaWxlIEJpbmRQcm9wZXJ0aWVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVCaW5kUHJvcGVydGllcygpIHtcclxuICAgICAgICAvLyBCbG9jY28gcGVyIHRpcmFyZSBmdW9yaSBsZSBwcm9wcmlldMOgIHNjcml0dGUgdGlwbyAtLT4ge3Byb3B9XHJcbiAgICAgICAgdmFyIG1hdGNoZXMgPSB0aGlzLkRpc3BsYXkubWF0Y2goL3tbYS16XSt9L2dpKTtcclxuICAgICAgICBpZiAobWF0Y2hlcylcclxuICAgICAgICAgICAgbWF0Y2hlcy5mb3JFYWNoKG0gPT4geyB0aGlzLkJpbmRQcm9wZXJ0aWVzLnB1c2goeyBnbG9iYWw6IG0sIHByb3A6IG0uc3Vic3RyaW5nKDEsIG0ubGVuZ3RoIC0gMSkgfSk7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhc2Zvcm1hIHVuIG9nZ2V0dG8gZGVsbGEgU291cmNlIGFsbGEgc3VhIHZlcnNpb25lIFwibnVvdmFcIiBiYXNhbmRvc2kgc3VsbGUgaW5mb3JtYXppb25pIHN1IGdydXBwaSBlIHByb3ByaWV0w6BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gT2dnZXR0byBkYSB0cmFzZm9ybWFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7e2lkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmd9fSBPZ2dldHRvIGZpbmFsZSB0cmFzZm9ybWF0b1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYW5zZm9ybVNvdXJjZUl0ZW0oczogYW55KToge2lkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmd9IHtcclxuICAgICAgICAvLyBQYXJ0byBzZW1wcmUgZGFsbGEgdmFyaWFiaWxlIGRpIERpc3BsYXksIHBvaSBzb3N0aXR1aXNjbyBwZXp6byBwZXIgcGV6em9cclxuICAgICAgICBsZXQgZGVzYyA9IHRoaXMuRGlzcGxheTtcclxuXHJcbiAgICAgICAgLy8gVGFnbGlvIG8gbWFudGVuZ28gbGUgY29uZGl6aW9uaSBpbiBiYXNlIGFsbGEgcHJvcHJpZXTDoCBzdSBjdWkgZmFyZSBjaGVja1xyXG4gICAgICAgIC8vIERvcG9kaWNow6kgc2NyaXZvIHR1dHRlIGxlIHByb3ByaWV0w6BcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQmluZENoZWNraW5nR3JvdXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHNbaV07XHJcbiAgICAgICAgICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UodC5nbG9iYWwsIChzW3QucHJvcF0gIT0gbnVsbCAmJiBzW3QucHJvcF0gIT0gdW5kZWZpbmVkKSA/IHQud2hlbmV4aXN0cyA6IFwiXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkJpbmRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gdGhpcy5CaW5kUHJvcGVydGllc1tpXTtcclxuICAgICAgICAgICAgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgc1t0LnByb3BdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGlkOiBzW3RoaXMuSWRGaWVsZF0sIGRlc2NyaXB0aW9uOiBkZXNjIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaWwgY29tb3BuZW50ZSBpbiBxdWVzdGlvbmUgw6ggaW4gZ3JhZG8gZGkgZ2VzdGlyZSBuZ0NvbnRyb2wgbnVsbGkuIFxyXG4gICAgICogRGkgZGVmYXVsdCDDqCAqKmZhbHNlKipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGdlc3Rpc2NvIG5nQ29udHJvbCBudWxsaSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgaGFuZGxlTnVsbE5nQ29udHJvbCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIEEgdm9sdGUgbmVsbCduZ09uSW5pdCBub24gY2kgcGFzc2EgcXVpbmRpIGxvIG1ldHRvIHNpYSBxdWkgc2lhIG5lbGwnYWZ0ZXJ2aWV3aW5pdCwgcGVuc28gY2hlIHZhbGdhIHBlciBpIGNvbXBvbmVudGkgZGkgdGVyemUgcGFydGlcclxuICAgICAgICAvLyBjaGUgc2kgY29sbGVnYW5vIHBlciBpIGNhenppIGxvcm8gYWwgZm9ybSBlY2MsIHF1aW5kaSBsYSBwYXJ0ZSBzb3ByYSBub24gc2VydmUuLi4gQk9IXHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsaWRhdG9yKCk7XHJcblxyXG4gICAgICAgIC8vSWwgbm9tZSBub24gYyfDqCBzZSBtZXR0byBzdGFuZGFsb25lIDogdHJ1ZSAoQ0hFIE5PTiDDqSBEQSBNRVRURVJFKVxyXG4gICAgICAgIC8vRGF0byBjaGUgYW5jaGUgaWwgY29udHJvbGxvIGVzdGVybm8gdmllbmUgY29uc2lkZXJhdG8gY29tZSBjb21wb25lbnRlIGRlbCBmb3JtLCBub24gcG9zc28gYmFzYXJtaSBzb2xvIHN1bCBub21lIG1hIGRldm8gYWdnaXVuZ2VyZSB1biB0YWcuIEluIHF1ZXN0byBjYXNvIFwiX2ludGVybmFsXCJcclxuICAgICAgICAvLyBBVFRFTlpJT05FOiBRVUFMU0lBU0kgU0lBIElMIE1PVElWTywgU0UgU1RPIENPU08gVklFTkUgU1BPU1RBVE8gREFMTCBuZ09uSW5pdCBOT04gRlVOWklPTkEgUElVIE5VTExBXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLm5hbWUpXHJcbiAgICAgICAgICAgIHRoaXMuR2VuZXJhdGVkTmFtZSA9IHRoaXMubmdDb250cm9sLm5hbWUudG9TdHJpbmcoKSArIFwiX2ludGVybmFsXCI7XHJcblxyXG4gICAgICAgIC8vIEFUVEVOWklPTkU6IFFVQUxTSUFTSSBTSUEgSUwgTU9USVZPLCBTRSBTVE8gQ09TTyBWSUVORSBTUE9TVEFUTyBEQUxMIG5nT25Jbml0IE5PTiBGVU5aSU9OQSBQSVUgTlVMTEFcclxuICAgICAgICBpZiAodGhpcy5Gb3JtKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtSGFzQmVubkJvdW5kICYmIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRm9ybS5hZGRDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtSGFzQmVubkJvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUXVhbmRvIHVuIGZvcm0gdmllbmUgc3VibWl0dGF0byBsYSB2YXJpYWJpbGUgRm9ybS5zdWJtaXR0ZWQgdmllbmUgYXNzZWduYXRhIGFsbCdpbnB1dCBbc3VibWl0dGVkXSBkZWwgdmFsLWNvbnRyb2xcclxuICAgICAgICAgICAgLy8gRXNzZW5kbyBjaGUgcGVyw7IgbGEgQ0Qgw6ggT25QdXNoIHBlciBkaXJlIGFkIEFuZ3VsYXIgY2hlIGwnSW5wdXQgw6ggY2FtYmlhdG8gZSBwZXJtZXR0ZXJlIGkgc2lkZWZmZWN0cyBkaSBhc3NlZ25hcmUgW3N1Ym1pdHRlZF1cclxuICAgICAgICAgICAgLy8gZGV2byBhdHRhY2Nhcm1pIGFsIHN1Ym1pdCBhdHR1YWxlIGRlbCBmb3JtIGUgcHJpbWEgZGkgZXNlZ3VpcmxvIGRldm8gbWFyY2FyZSBpbCBjb21wb25lbnRlIHBlciBpbCBjaGVja1xyXG4gICAgICAgICAgICBsZXQgb3JpZ0Z1bmMgPSB0aGlzLkZvcm0ub25TdWJtaXQ7XHJcbiAgICAgICAgICAgIHZhciBmb3JtT3V0c2lkZVJlZiA9IHRoaXMuRm9ybTtcclxuICAgICAgICAgICAgdGhpcy5Gb3JtLm9uU3VibWl0ID0gKGV2KTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnRnVuYy5hcHBseShmb3JtT3V0c2lkZVJlZik7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Ugc29ubyBpbiBtb2RhbGl0w6AgZGV0YXRjaGVkIGRldm8gcmltdW92ZXJlIG1hbnVhbG1lbnRlIHF1ZXN0byBjb250cm9sbG8gcXVhbmRvIGVudHJvIG5lbGxhIGRpc3Bvc2UsIGFsdHJpbWVudGkgc2UgcG9pIG5lIGFuZGFzc2kgYSByaWFnZ2l1bmdlcmVcclxuICAgICAqIHVuIGFsdHJvIGNvbiBsbyBzdGVzc28gXCJuYW1lXCIgbWEgbWFnYXJpIHJlc2V0dGF0bywgQW5ndWxhciBsbyByZS1pZHJhdGVyZWJiZSBjb24gaSB2YWxvcmkgcHJlY2VkZW50aSBub25vc3RhbnRlIGlsIG1vZGVsbG8gZm9zc2UgdnVvdG9cclxuICAgICAqL1xyXG4gICAgbmdPbkRlc3Ryb3koKXtcclxuICAgICAgICBpZih0aGlzLmRldGF0Y2hlZEZyb21mb3JtICYmIHRoaXMuRm9ybSlcclxuICAgICAgICAgICAgdGhpcy5Gb3JtLnJlbW92ZUNvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGFib3JhIGkgdmFsaWRhdG9yaSBpbmlldHRhdGkgZSBjYXBpc2NlIHNlIGlsIHZhbG9yZSDDqCBvYmJsaWdhdG9yaW8gbyBtZW5vXHJcbiAgICAgKi9cclxuICAgIGNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgLy8gY29udHJvbGxvIHNlIMOoIHNldHRhdG8gdW4gcmVxdWlyZWQgcGVyIGRlY2lkZXJlIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIHNlIHV0aWxpenphcmUgaWwgdmFsaWRhdG9yZSByZXF1aXJlZCBuZWwgY29tcG9uZW50ZSBpbnRlcm5vXHJcbiAgICAgICAgLy8gTG8gZmFjY2lvIHF1aSBlIG5vbiBpbiB1biBldmVudHVhbGUgbmdPbkluaXQgbyBjb3N0cnV0dG9yZSBwZXJjaMOpIG5nT25Jbml0IG5vbiBzZW1wcmUgdmllbmUgY2hpYW1hdG8gZSBkYSBjb3N0cnV0dG9yZSBpbCB2YWxpZGF0b3JlIG5vbiBoYSBhbmNvcmEgaWwgdmFsb3JlIGdpdXN0b1xyXG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzICYmIHRoaXMuX3ZhbGlkYXRvcnMuc29tZShlbGVtID0+IGVsZW0gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvciAmJiBlbGVtLnJlcXVpcmVkKSlcclxuICAgICAgICAgICAgdGhpcy5SZXF1aXJlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGNoZSBjb2xsZWdhIGxhIGZ1bnppb25lIGRpIHJlc2V0IGRlbCBjb250cm9sbG8gZm9ybSBhbCBjb250cm9sbG8gZGkgdmFsaWRhemlvbmUgc290dG9zdGFudGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBiaW5kUmVzZXRGdW5jdGlvbigpIHtcclxuICAgICAgICAvL2ZhY2NpbyBpbiBtb2RvIGNoZSBzZSBjaGlhbW8gaWwgcmVzZXQgZGVsIGNvbnRyb2xsbyAobyBkZWxsYSBmb3JtKSBkYWxsJ2VzdGVybm8gc2kgcmVzZXR0aSBhbmNoZSBpbCBjb250cm9sbG8gbmF0aXZvXHJcbiAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5yZXNldDtcclxuICAgICAgICB2YXIgbmdDb250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgICAgIHZhciB2YWxpZGF0aW9uQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlID0gdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sO1xyXG5cclxuICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBvcmlnRnVuYy5hcHBseShuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UucmVzZXQoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL1BlciBjb25zZW50aXJlIHJpY2hpYW1pIG11bHRpcGxpIGRpIHF1ZXN0YSBmdW56aW9uZSBwcmVuZGVuZG8gc2VtcHJlIGxhIGZpdW56aW9uZSBkaSByZXNldCBiYXNlXHJcbiAgICAgICAgKDxhbnk+dGhpcy5uZ0NvbnRyb2wuY29udHJvbCkuX19vcmlnaW5hbF9yZXNldF9fID0gb3JpZ0Z1bmNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCAmJiB0aGlzLmZpcnN0QmluZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0QmluZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLk1vZGVsID0gb2JqO1xyXG5cclxuICAgICAgICAvL1BlciBzdmVnbGlhcmUgQW5ndWxhci4gSWwgdmFsb3JlIGNoZSBlbnRyYSBwb3RyZWJiZSBlc3NlcmUgdmFsaWRvL25vbiB2YWxpZG8gZSBxdWVzdG8gbG8gYmluZGEgYSB0dXR0bywgZm9ybSBjb21wcmVzb1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICB0aGlzLm9uTm90TnVsbFZhbHVlU2V0KCk7XHJcblxyXG4gICAgICAgIC8vIG1hcmtGb3JDaGVjayBub24gdmEgYmVuZSBpbiBxdWFudG8gYXJyaXZhbm8gcG9zc2liaWxtZW50ZSAyIHVwZGF0ZSBzdSB1biBzb2xvIGNpY2xvIGRpIHN0YWNrXHJcbiAgICAgICAgLy8gc2V0VGltZSp1dCBjaGUgd3JhcHBhIHR1dHRvIG5vbiB2YSBiZW5lIHNlbm7DsiBzcGFtbWEgZGVsbGUgY2hhbmdlIGRldGVjdGlvbiBhIHN1b24gZGkgaW50ZXJ2YWwgY2hlIHJhbGxlbnRhbm8gdGFudGlzc2ltbyBsJ2FwcFxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RyYSBpbnRlcm5hbWVudGUgaWwgY29tcG9uZW50ZSBkaSB2YWxpZGF6aW9uZSwgbmUgaW1wb3N0YSBpIHZhbGlkYXRvcmkgZSBjb2xsZWdhIGlsIEZvcm0sIHNlIHByZXNlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJWYWxDb21wKGNvbXA6IE5nTW9kZWwpIHtcclxuICAgICAgICBpZiAoY29tcCkge1xyXG4gICAgICAgICAgICAvLyDDiCBhcnJpdmF0byB1biBudW92byB2YWxpZGF0aW9uQ29udG9ybCAoc3VjY2VkZSBzb2xvIG5lbCBmb3JtLXNlbGVjdCBxdWFuZG8gY2FtYmlhIGxhIHNvdXJjZSBkYSAwIGVsZW1lbnRpIC8gbnVsbCBhZCBOIGVsZW1lbnRpLCBxdWluZGkgYWwgbWFzc2ltbyB1bmEgdm9sdGEpIFxyXG4gICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uQ29udHJvbCAmJiB0aGlzLkZvcm0pXHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgPSBjb21wO1xyXG5cclxuICAgICAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIHBhc3NhcmUgYXZhbnRpIGkgdmFsaWRhdG9yaVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2Ugc29ubyBzdGFjY2F0byBkYWwgRm9ybSAodnVvbCBkaXJlIGNoZSBzb25vIGFkIGVzZW1waW8gZGVudHJvIHVuIG5nLXRlbXBsYXRlKSBhZ2dpdW5nbyBpbCBjb250cm9sbG8gYWwgRm9ybSBwYXNzYXRvIGNvbWUgaW5wdXQgKGNvbnRleHQgZGVsIHRlbXBsYXRlKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5kZXRhdGNoZWRGcm9tZm9ybSAmJiB0aGlzLkZvcm0gJiYgIXRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZFJlc2V0RnVuY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIC8vSSB2YWwtcm9iYSBxdWVzdG8gbG8gZmFubm8gYXV0b21hdGljYW1lbnRlIGRlbnRyby4uLiBnbGkgYWx0cmkgbm8gKGVzLiBzZW1wbGljZSBpbnB1dCBjaGVja2JveClcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eUZvck5hdGl2ZUlucHV0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaW9ybmEgaWwgdmFsb3JlIGUgbGEgdmFsaWRpdMOgIGRlbGwnaW5wdXQgc290dG9zdGFudGUuIE5vbiB2aWVuZSBjaGlhbWF0byBwZXIgaW5wdXQgbmF0aXZpIGNvbWUgbGUgY2hlY2tib3hcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWx1ZSBGb3J6YSBsJ2FnZ2lvcm5hbWVudG8gYW5jaGUgc2Ugbm9uIMOoIHVuIGlucHV0IG5hdGl2byAoaW5wdXQgbmF0aXZvID0gY2hlY2tib3gsIGFkIGVzZW1waW8pXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoZm9yY2VkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChmb3JjZWRWYWx1ZSB8fCB0aGlzLm5hdGl2ZUlucHV0KVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWQoZm9yY2VkVmFsdWU6IGFueSA9IG51bGwsIG1hcmtGb3JDaGVjazogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoZm9yY2VkVmFsdWUgPT0gbnVsbCA/IHRoaXMuTW9kZWwgOiBmb3JjZWRWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KGZvcmNlZFZhbHVlID09IG51bGwgPyB0aGlzLk1vZGVsIDogZm9yY2VkVmFsdWUpO1xyXG4gICAgICAgIGlmIChtYXJrRm9yQ2hlY2spXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiIHN1bCBmb2N1cy4gTWFudGVuZ28gbG8gc3Rlc3NvIG5vbWUgZGVsbCdldmVudG8gZGVpIDx2YWwtKj4gKGlucHV0Q2hhbmdlKSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoC5cclxuICAgICAqIFxyXG4gICAgICogTm9uIHBvc3NvIHRlbmVybG8gcHJvdGVjdGVkIGFsdHJpbWVudGkgcG9zc28gZXNlZ3VpcmxvIHNvbG8gZGFsIC50cyBlIG5vbiBkYWxsJyAuaHRtbFxyXG4gICAgICovXHJcbiAgICBmb2N1c2VkKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLmlucHV0Rm9jdXMuZW1pdChldmVudCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJDb250cm9sIEZvY3VzZWQ6IFwiICsgdGhpcy5HZW5lcmF0ZWROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIiBzdWxsYSBmaW5hbGl6emF6aW9uZSBkZWwgdmFsb3JlIGRlbGwnaW5wdXQgKGJsdXIgLyB0YXN0byBpbnZpbywgZWNjLi4uKS4gTWFudGVuZ28gbG8gc3Rlc3NvIG5vbWUgZGVsbCdldmVudG8gZGVpIDx2YWwtKj4gKGlucHV0Q2hhbmdlKSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoC5cclxuICAgICAqIFxyXG4gICAgICogTm9uIHBvc3NvIHRlbmVybG8gcHJvdGVjdGVkIGFsdHJpbWVudGkgcG9zc28gZXNlZ3VpcmxvIHNvbG8gZGFsIC50cyBlIG5vbiBkYWxsJyAuaHRtbFxyXG4gICAgICovXHJcbiAgICBmaW5hbGl6ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZpbmFsaXplZC5lbWl0KCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJDb250cm9sIFZhbHVlIEZpbmFsaXplZDogXCIgKyB0aGlzLkdlbmVyYXRlZE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkO1xyXG59Il19
484
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFvRCxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSXZILE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7O0FBSTFELGtFQUFrRTtBQUVsRSxNQUFNLE9BQWdCLGVBQWU7SUFnTGpDLDJCQUEyQjtJQUMzQixZQUFzQixHQUFzQixFQUFTLFNBQW9CLEVBQVksV0FBdUIsRUFBc0IsRUFBd0IsRUFBcUIsVUFBNEIsRUFBNkMsYUFBcUIsRUFBOEMsY0FBdUIsRUFBVSxjQUF1QixLQUFLO1FBQWxXLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQXNCLE9BQUUsR0FBRixFQUFFLENBQXNCO1FBQXFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQTZDLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQThDLG1CQUFjLEdBQWQsY0FBYyxDQUFTO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBL0t4WDs7Ozs7V0FLRztRQUNLLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFbEMsb0RBQW9EO1FBQzdDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFXakMseUVBQXlFO1FBQy9ELHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUU1Qzs7OztXQUlHO1FBQ08sc0JBQWlC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RyxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wsIE5nRm9ybSwgTmdNb2RlbCwgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIE9wdGlvbmFsLCBJbmplY3QsIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UsIENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sXCI7XHJcbmltcG9ydCB7IEFDT19DVVNUT01LRVksIEZBVl9ERUJVR19NT0RFIH0gZnJvbSAnLi4vdG9rZW5zJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKiBDb21wb25lbnRlIGJhc2UgZGEgY3VpIHR1dHRpIGkgY29tcG9uZW50aSBGb3JtIGltcGxlbWVudGFubyAqL1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VGb3JtQ29udHJvbCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0OTg4XHJcbiAgICAgKiBUTDpEUjsgSWwgcHJpbW8gdmFsb3JlIHBhc3NhdG8gYWwgd3JpdGVWYWx1ZSDDqCBudWxsbyBwZXJjaMOpIHF1YW5kbyBpIGNhZ25hY2NpIGZhbm5vIG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgICAgKiBzY3Jpdm9ubyB1biB3cml0ZVZhbHVlIG51bGxvLi4uIHF1aW5kaSBhbCBwcmltbyBiaW5kaW5nIHNhbHRvIGwnaW5pemlhbGl6emF6aW9uZSBzZSBobyBsYSBjb3BwaWEgbnVsbC1maXJzdEJpbmRcclxuICAgICAqIHBvaSBtZXR0ZW5kbyBmaXJzdEJpbmQgYSBmYWxzZSBkaSBsw6wgaW4gcG9pIGZ1bnppb25vIGNvbWUgZGV2by4gVmlzdGEgbGEgY2FzaXN0aWNhIGV2aXRvIGVzc2VuemlhbG1lbnRlIG1ldMOgIGRldGVjdENoYW5nZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY2FtcG8gw6ggb2JibGlnYXRvcmlvIGkgb3B6aW9uYWxlICovXHJcbiAgICBwdWJsaWMgUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YXRvIGRhIHF1ZXN0byBjYW1wbyAqL1xyXG4gICAgcHVibGljIE1vZGVsOiBhbnk7XHJcblxyXG4gICAgLyoqIFZhbG9yZSBkZWwgTW9kZWxsbyAqL1xyXG4gICAgcHVibGljIEV2YWx1YXRlZE1vZGVsOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIE5vbWUgZ2VuZXJhdG8gcGVyIGlsIGNvbnRyb2xsbyBpbnRlcm5vLiBEaSBkZWZhdWx0IMOoIGlsIG5vbWUgZGVsIGNvbnRyb2xsbyBlc3Rlcm5vIGNvbiBsJ2FnZ2l1bnRhIGRpIFwiX2ludGVybmFsXCIuIFNlcnZlIHBlciBldml0YXJlIGNyb3NzLWJpbmQgKi9cclxuICAgIHB1YmxpYyBHZW5lcmF0ZWROYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpbCBGb3JtIGNoZSBjb250aWVuZSBxdWVzdG8gY2FtcG8gw6ggZ2nDoCBzdGF0byByZWdpc3RyYXRvICovXHJcbiAgICBwcm90ZWN0ZWQgZm9ybUhhc0Jlbm5Cb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIHF1ZXN0byBjYW1wbyDDqCBzdGFjY2F0byBkYWwgRm9ybSwgYWQgZXNlbXBpbyBuZWwgY2FzbyBzaWEgaW4gdW4gbmctdGVtcGxhdGUgcHJvaWV0dGF0byBuZWwgZm9ybS5cclxuICAgICAqIFxyXG4gICAgICogSW4gcXVlbCBjYXNvIGxhIHZhcmlhYmlsZSAqKkZvcm0qKiBkZWwgY29tcG9uZW50ZSBkZXYnZXNzZXJlIHZhbG9yaXp6YXRhXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBkZXRhdGNoZWRGcm9tZm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcm90ZWN0ZWQgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcm90ZWN0ZWQgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xyXG5cclxuICAgIC8qKiBAaWdub3JlIFZlZGkgZ2V0dGVyIGUgc2V0dGVyICovXHJcbiAgICBwcml2YXRlIF9yZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVhbG9yYSBjaSBmb3NzZSB1biBjb250ZXN0byBjb2xsZWdhdG8gcXVlc3RhIHZhcmlhYmlsZSBpZGVudGlmaWNhIHNlIFNvbm8gbCdPd25lciBvIG1lbm8uXHJcbiAgICAgKiBcclxuICAgICAqIFNlIG5vbiBsbyBzb25vLCBpbCBjYW1wbyByaXN1bHRlcsOgIGluIHNvbGEgbGV0dHVyYSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBBcHBDb250ZXh0T3duZXJzaGlwOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogU3ViamVjdCBhIGN1aSBsJ29nZ2V0dG8gaW50ZXJubyBzaSBjb2xsZWdhIHBlciBlZmZldHR1YXJlIGlsIGZvY3VzIGRlbGwnZWxlbWVudG8gaW5wdXQgc290dG9zdGFudGUgKi9cclxuICAgIEBJbnB1dCgpIEZvY3VzU3ViamVjdDogU3ViamVjdDx2b2lkPjtcclxuXHJcbiAgICAvKiogTW9kYWxpdMOgIGluIGN1aSB2aWVuZSBtb3N0cmF0byBpbCBjYW1wbywgMS0xIHJpc3BldHRvIGFsbGUgZGVmaW5pemlvbmkgZGkgQW5ndWxhciBNYXRlcmlhbCAgKi9cclxuICAgIEBJbnB1dCgpIEZpZWxkQXBwZWFyZW5jZTogXCJsZWdhY3lcIiB8IFwic3RhbmRhcmRcIiB8IFwiZmlsbFwiIHwgXCJvdXRsaW5lXCIgPSBcIm91dGxpbmVcIjtcclxuXHJcbiAgICAvKiogVXRpbGl6emEgbyBtZW5vIGlsIExheW91dCBkaSB1biBmb3JtIChMYWJlbCBjb24gaW5wdXQgZGkgZmlhbmNvKSwgc2UgZmFsc2UgbW9zdHJhIHNvbG8gbCdpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgRm9ybUxheW91dDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIEluZGljYSBjaGUgbGEgcGFydGUgaW5wdXQgZGVsIGNvbnRyb2xsbyBkZXYnZXNzZXJlIHVuYSBsYWJlbCByZWFkb25seSBlIGxhIHBhcnRlIGxhYmVsIGRpIHRpdG9sbyBkZXYnZXNzZXJlIGluIGJvbGQuIFBlciB1dGlsaXp6YXJlIHVuIHNvbG8gY29tcG9uZW50ZSBzaWEgcGVyIGxhIG1vZGlmaWNhIGNoZSBwZXIgaWwgZGV0dGFnbGlvICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBEZWZpbmlzY2Ugc2UgcmljaGlhbWFyZSBsJ0V2ZW50RW1pdHRlciAqKmlucHV0Q2hhbmdlKiogaW4gbWFuaWVyYSBjbGFzc2ljYSAodHJ1ZSkgbyBzb2xvIHBlciBsYSBjaGFuZ2UgY29uc2lkZXJhdGUgZGVmaW5pdGl2ZSBjb21lIHRhc3RvIGludmlvIC8gYmx1ciAvIGVjYy4uLiAoZmFsc2UpICovXHJcbiAgICBASW5wdXQoKSBFbWl0UGVuZGluZ0NoYW5nZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBBdHRpdmEgbyBkaXNhdHRpdmEgbGEgdmFsaWRhemlvbmUgcGVyIHF1ZXN0byBjb21wb25lbnRlICovXHJcbiAgICBASW5wdXQoKSBWYWxpZGF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogUGxhY2Vob2xkZXIgcGVyIHF1YW5kbyBsJ2lucHV0IMOoIHZ1b3RvICovXHJcbiAgICBASW5wdXQoKSBQbGFjZWhvbGRlcjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogQ2xhc3NlIGV4dHJhIHBlciBpbCBmb3JtLWdyb3VwIGluIGN1aSB2aWVuZSB3cmFwcGF0byBsJ2lucHV0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtR3JvdXBDbGFzczogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogTWVzc2FnZ2lvIGRhIG1vc3RyYXJlIHF1YW5kbyBsYSB2YWxpZGF6aW9uZSBmYWxsaXNjZSBwZXIgcXVlc3RvIGNvbXBvbmVudGUuIERpIGRlZmF1bHQgdmllbmUgcHJvcG9zdGEgZGFsbGEgbGlicmVyaWEgKi9cclxuICAgIEBJbnB1dCgpIEZhaWxlZFZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBJbnB1dCBjaGUgZm9yemEgbCdpbnZhbGlkaXTDoCBkZWwgY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgRm9yY2VkRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogTW9zdHJhIHVuIHRlc3RvIGEgc2luaXN0cmEgZGVsbCdpbnB1dCAoRm9ybUxheW91dCBwZXJtZXR0ZW5kbykgKi9cclxuICAgIEBJbnB1dCgpIExhYmVsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBjb2wtbWQtWCBwZXIgbGEgbGFiZWwgKi9cclxuICAgIEBJbnB1dCgpIExhYmVsQ29sV2lkdGg6IG51bWJlciA9IDQ7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsJ2lucHV0ICovXHJcbiAgICBASW5wdXQoKSBJbnB1dENvbFdpZHRoOiBudW1iZXIgPSA4O1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2Ugw6ggbCd1bHRpbW8gY29tcG9uZW50ZSBkaSB1biBmb3JtIChzZXJ2ZSBwZXIgcmltdW92ZXJlIGlsIG1hcmdpbmUgZmluYWxlKSAqL1xyXG4gICAgQElucHV0KCkgTGFzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBBc3NvY2lhIGlsIGNvbXBvbmVudGUgRm9ybSBhIHF1ZXN0byBpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgRm9ybTogTmdGb3JtID0gbnVsbDtcclxuXHJcbiAgICAvKiogU29yZ2VudGUgZGEgY3VpIHNjZWdsaWVyZSB2YWxvcmkgcGVyIGkgY29tcG9uZW50aSBGb3JtIGNoZSBsbyBjb25zZW50b25vICovXHJcbiAgICBASW5wdXQoKSBTb3VyY2U6IGFueVtdO1xyXG5cclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSWQgZGVnbGkgb2dnZXR0aSBiaW5kYXRpIG5lbGxhICoqU291cmNlKiogKi9cclxuICAgIEBJbnB1dCgpIElkRmllbGQ6IHN0cmluZyA9ICdpZCc7XHJcblxyXG4gICAgLyoqIFRlbXBsYXRlIHBlciB2aXN1YWxpenphcmUgbGEgbW9kYWxpdMOgICoqRGlzcGxheU1vZGUqKiBjb21lIHZ1b2xlIGlsIHByb2dyYW1tYXRvcmUgZnJvY2lvIGRpIHR1cm5vICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TW9kZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNwcmVzc2lvbmUgc2ltaWwtQW5ndWxhciBwZXIgY2FtYmlhcmUgaWwgdGVzdG8gZGVpIGNvbXBvbmVudGkgY2hlIHNjZWxnb25vIGlsIHByb3ByaW8gbW9kZWxsbyBkYSB1bmEgKipTb3VyY2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBJbCBmdW56aW9uYW1lbnRvIMOoIGlkZW50aWNvIGFsIGJpbmRlciBkaSBhbmd1bGFyLCBzb2xvIGNvbiB1bmEgZ3JhZmZhIGludmVjZSBjaGUgMi5cclxuICAgICAqIMOIIGlub2x0cmUgcG9zc2liaWxlIGFnZ2l1bmdlcmUgcGV6emkgZGkgZGVzY3JpemlvbmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgY29uIGxhIHNpbnRhc3NpICoqOnByb3A/KFByb3AgdmFsZSB7cHJvcH0pKipcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheTogc3RyaW5nID0gJ3tkZXNjcmlwdGlvbn0nO1xyXG5cclxuICAgIC8qKiBSaXN1bHRhdG8gZGVsbCd1bmlvbmUgZnJhIGxlIGluZm9ybWF6aW9uaSBkZWdsaSBvZ2dldHRpIGluICoqU291cmNlKiogZSBsZSBpbXBvc3Rhemlvbmkgc3BlY2lmaWNhdGUgbmVsbCdJbnB1dCAqKkRpc3BsYXkqKiAqL1xyXG4gICAgcHVibGljIEJvdW5kU291cmNlOiB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSDDqCBpbCBwcmltbyBCaW5kIGRlbGxhIFNvdXJjZSAqL1xyXG4gICAgcHJvdGVjdGVkIFNvdXJjZUZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipfcmVhZG9ubHkqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2Ugc29sYSBsZXR0dXJhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhZG9ubHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZWFkb25seTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KiogZ2VzdGVuZG8gYW5jaGUgaWwgQ29udGVzdG8gYXBwbGljYXRpdm9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSBWYWxvcmUgZGEgaW1wb3N0YXJlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBSZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLkFwcENvbnRleHRPd25lcnNoaXApXHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZXR0YXJlIGluIHVuYSB2b2x0YSBzb2xvIGdsaSBpbnB1dCBMYWJlbENvbFdpZHRoIGUgSW5wdXRDb2xXaWR0aCwgYmFzdGEgc2NyaXZlcmxvIGNvbiBsYSBzaW50YXNzaSBcIlggWVwiXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBJbnB1dCBuZWwgZm9ybWF0byBcIlggWVwiXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBMYWJlbElucHV0UmF0aW8oaW5wdXQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByYXRpbyA9IGlucHV0LnNwbGl0KC9cXHMvKTtcclxuICAgICAgICB0aGlzLkxhYmVsQ29sV2lkdGggPSBwYXJzZUludChyYXRpb1swXSk7XHJcbiAgICAgICAgdGhpcy5JbnB1dENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiB2YWwtcXVhbGNvc2EgY2hlIGZhIGVmZmV0dGl2YW1lbnRlIGRhIGlucHV0LCBvIGV2ZW50dWFsbWVudGUgaWwgc2luZ29sbyBpbnB1dCBpbiBjYXNpIHBhcnRpY29sYXJpIChlcyBjaGVja2JveCkgKi9cclxuICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uQ29udHJvbDogTmdNb2RlbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ3ZhbGlkYXRpb25Db250cm9sJyBjaGUgZnVuemlvbmEgaW4gYW1iaWVudGUgc3RhdGljb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJ2YWxpZGF0aW9uQ29udHJvbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IF92YWxpZGF0aW9uQ29udHJvbChjb21wOiBOZ01vZGVsKSB7IHRoaXMucmVnaXN0ZXJWYWxDb21wKGNvbXApOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyeSBzdWxsJ2VsZW1lbnRvICd2YWxpZGF0aW9uQ29udHJvbCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIGRpbmFtaWNvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcInZhbGlkYXRpb25Db250cm9sXCIsIHsgc3RhdGljOiB0cnVlIH0pIHNldCB2YWxpZGF0aW9uQ29udHJvbF9zdGF0aWMoY29tcDogTmdNb2RlbCkgeyB0aGlzLnJlZ2lzdGVyVmFsQ29tcChjb21wKTsgfTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsbGEgbW9kaWZpY2EgZGVsIHZhbG9yZSBjb2xsZWdhdG8gYSBxdWVzdG8gY2FtcG8gKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsIGZvY3VzIGRlbCBjYW1wbyBkaSB0ZXN0by9jb21iby9xdWVsY2hlw6gsIHJpZW1pdHRhIGwnZXZlbnRvIG9yaWdpbmFsZSBKYXZhc2NyaXB0ICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRGb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsIGZpbmFsaXplIGRlbCBjYW1wbyBkaSB0ZXN0by9jb21iby9xdWVsY2hlw6ggKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dEZpbmFsaXplZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKiogQ2FjaGUgZGVsbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gOnByb3A/KFJvYmEgY29uIHtwcm9wfSkgKi9cclxuICAgIHByaXZhdGUgQmluZENoZWNraW5nR3JvdXBzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHdoZW5leGlzdHM6IHN0cmluZyB9W10gPSBbXVxyXG5cclxuICAgIC8qKiBDYWNoZSBkZWxsZSBwcm9wcmlldMOgIHNjcml0dGUgdGlwbyAtLT4ge3Byb3B9ICovXHJcbiAgICBwcml2YXRlIEJpbmRQcm9wZXJ0aWVzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBwcm90ZWN0ZWQgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIHByaXZhdGUgYWM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwdWJsaWMgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBwcml2YXRlIEFDT19DVVNUT01LRVk6IHN0cmluZywgQE9wdGlvbmFsKCkgQEluamVjdChGQVZfREVCVUdfTU9ERSkgcHJpdmF0ZSBGQVZfREVCVUdfTU9ERTogYm9vbGVhbiwgcHJpdmF0ZSBuYXRpdmVJbnB1dDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlTnVsbE5nQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5nQ29udHJvbCBudWxsbyBwZXIgcXVhbGNoZSBtb3Rpdm8hIElsIDkwJSBkZWxsZSBmdW56aW9uYWxpdMOgIGRpIHF1ZXN0byBpbnB1dCBzYXJhbm5vIGRpc2FiaWxpdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2UgbWkgYXJyaXZhIGwnaW5qZWN0YWJsZSBkZWwgY29udGVzdG8gcG9zc28gY2FwaXJlIHNlIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBpbiByZWFkb25seSBvIG5vLCBzb2xvIHNlIGhvIGdpw6AgaW5pemlhbGl6emF0byBpIGNvbnRyb2xsZXIgY3VzdG9tIGRlbGwnYWNjZXNzIGNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0ICYmIHRoaXMuQXBwQ29udGV4dC5uYW1lICYmIHRoaXMuQUNPX0NVU1RPTUtFWSAmJiB0aGlzLmFjICYmIHRoaXMuYWMuSW5pdGlhbGl6ZWRDdXN0b20pIHtcclxuICAgICAgICAgICAgdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwID0gIXRoaXMuYWMuaGFzKHRoaXMuQUNPX0NVU1RPTUtFWSArIFwiOlwiICsgdGhpcy5BcHBDb250ZXh0Lm5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9ICF0aGlzLkFwcENvbnRleHRPd25lcnNoaXBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy9TZSBobyBnacOgIHVuIHBhcmVudCBpbXBvc3RhdG8gdnVvbCBkaXJlIGNoZSBzb3R0byBhbCB0YWcgPGZvcm0+IGhvIGRpcmV0dGFtZW50ZSB1biB0YWcgPGZvcm0tKj4uLlxyXG4gICAgICAgIC8vLi4gcXVpbmRpIHBvc3NvIGltcG9zdGFyZSBkaXJldHRhbWVudGUgaWwgcmlmZXJpbWVudG8gZGVsIEZvcm0gZGEgdXNhcmUgaW4gSFRNTCBwZXIgaWwgc3VibWl0dGVkXHJcblxyXG4gICAgICAgIC8vU2Ugbm9uIGMnw6ggdnVvbCBkaXJlIGNoZSBkZW50cm8gYWwgdGFnIDxmb3JtPiBjJ8OoIHVubyBzcGxlbmRpZG8gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAuLi4uXCI+Li5cclxuICAgICAgICAvLy4uIGlsIHF1YWxlIGEgc3VhIHZvbHRhIGNvbnRpZW5lIGlsIGNvbnRyb2xsbyA8Zm9ybS0qPiBxdWluZGkgYXZyw7IgaWwgZm9ybSBuZWxsJ2lucHV0IFwiRm9ybVwiXHJcbiAgICAgICAgaWYgKCg8YW55Pm5nQ29udHJvbCkuX3BhcmVudClcclxuICAgICAgICAgICAgdGhpcy5Gb3JtID0gPE5nRm9ybT4oPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQ7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmRldGF0Y2hlZEZyb21mb3JtID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIGltcG9zdGFyZSBtZSBzdGVzc28gY29tZSBzaSBkZXZlLCBpbCB2YWxpZGF0b3JlIGludmVjZSBsbyBwYXNzbyBhbCB2YWxpZGF0aW9uLWlucHV0IHF1YW5kbyB2aWVuZSBzZXR0YXRvIGlsIHZhbGlkYXRpb25Db250cm9sXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgICAgICAgIC8vUGVyIHR1dHRpIGkgdmFsaWRhdG9yaTogcmlnZW5lcm8gbGEgZnVuemlvbmUgZGkgdmFsaWRhemlvbmUuIFBlciBxdWFsY2hlIG1vdGl2byBhIHZvbHRlIGhvIHZhbGlkYXRvcmkgc2VuemEuLi5cclxuICAgICAgICAgICAgLy8uLi4gcXVlc3RvIMOoIHVuIHdvcmthcm91bmQgcGVyIGVzc2VyZSBzaWN1cm8gZGkgYXZlcmxhIHNlbXByZS5cclxuICAgICAgICAgICAgLy9Tb2xvIGkgdmFsaWRhdG9yaSBjb24gcGFyYW1ldHJpIGhhbm5vIGJpc29nbm8gZGVsbGEgX2NyZWF0ZVZhbGlkYXRvciAoZXMuIFwibWF4bGVuZ3RoXCIgY2hlIGhhIDEgcGFyYW1ldHJvKSwgcXVpbmRpIG5vIHZhbGlkYXRvcmkgdGlwbyBcInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodi5fY3JlYXRlVmFsaWRhdG9yKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2Ll9jcmVhdGVWYWxpZGF0b3IoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuYWRkVmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgaWwgQmluZC9QYXJzZSBkZWxsZSB2YXJpZSAqKlNvdXJjZSoqIHVuZW5kbyBsZSBpbmZvcm1hemlvbmkgc3BlY2lmaWNhdGUgaW4gKipEaXNwbGF5KipcclxuICAgICAqIFxyXG4gICAgICogRXZlbnR1YWxtZW50ZSByaWVmZmV0dHVhIHVuIGJpbmQgYWwgbW9kZWxsbyBpbiBiYXNlIGFsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipSZWJpbmRNb2RlbEFmdGVyU291cmNlKipcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHRyeUJpbmRTb3VyY2VEaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5Tb3VyY2UpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA9PSAwICYmICF0aGlzLlNvdXJjZUZpcnN0QmluZClcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLlNvdXJjZUZpcnN0QmluZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBDYWNoZSBsb2NhbGUgcGVyIGV2aXRhcmUgZGkgcmlmYXJlIGRlaSByZWdleC5tYXRjaCBvZ25pIHNhbnRhIHZvbHRhXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQmluZENoZWNraW5nR3JvdXBzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUJpbmRDaGVja2luZ0dyb3VwcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQmluZFByb3BlcnRpZXMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlQmluZFByb3BlcnRpZXMoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEJsb2NjbyBwZXIgZ2VuZXJhcmUgbGEgZGVzY3JpemlvbmUgZmluYWxlIGRpIHVuIGVsZW1lbnRvXHJcbiAgICAgICAgICAgIHRoaXMuU291cmNlLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBBZ2dpdW5nbyBhbGxhIEJvdW5kU291cmNlIGluIGZvcm1hdG8gc3RhbmRhcmQgS2V5VmFsdWVcclxuICAgICAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UucHVzaCh0aGlzLnRyYW5zZm9ybVNvdXJjZUl0ZW0ocykpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFBvc3QgdHJ5YmluZCBzZSBjJ8OoIHVuIG1vZGVsbG8gYXNzb2NpYXRvIHJpY2FsY29sbyBsJyoqRXZhbHVhdGVkTW9kZWwqKlxyXG4gICAgICAgICAgICBpZih0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmFsdWF0ZWRNb2RlbCA9IHRoaXMuQm91bmRTb3VyY2UuZmluZCh0ID0+IHQuaWQgPT0gdGhpcy5Nb2RlbCk/LmRlc2NyaXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVmFsdXRhIGlsIGNvbnRlbnV0byBkZWxsYSB2YXJpYWJpbGUgQmluZENoZWNraW5nR3JvdXBzICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlQmluZENoZWNraW5nR3JvdXBzKCkge1xyXG4gICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIGNvbmRpemlvbmkgc2NyaXR0ZSB0aXBvIC0tPiA6cHJvcD8oUm9iYSBjb24ge3Byb3B9KVxyXG4gICAgICAgIHZhciBpZmZlZE1hdGNoZXMgPSB0aGlzLkRpc3BsYXkubWF0Y2goLzooW2Etel0rKVxcP1xcKChbXlxcKFxcKV0rKVxcKS9nKTtcclxuICAgICAgICBpZiAoaWZmZWRNYXRjaGVzKSB7XHJcbiAgICAgICAgICAgIGlmZmVkTWF0Y2hlcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gU3Rlc3NhIHJlZ2V4IGRpIHNvcHJhIG1hIGlsIHRhZyBcImlcIiBzZXJ2ZSBwZXIgdGlyYXJlIGZ1b3JpIGkgc2luZ29saSBjYXB0dXJpbmcgZ3JvdXAgZSBwZXIgcXVhbGNoZSBtb3Rpdm8gXHJcbiAgICAgICAgICAgICAgICAvLyBuZXcgUmVnRXhwKGJhc2VSZWdleCwgXCJnXCIpIG5vbiBmdW56aW9uYSBxdWluZGkgbm9uIGhvIHBvdHV0byByYXppb25hbGl6emFybG9cclxuICAgICAgICAgICAgICAgIGxldCBncm91cHMgPSBtLm1hdGNoKC86KFthLXpdKylcXD9cXCgoW15cXChcXCldKylcXCkvaSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5wdXNoKHsgZ2xvYmFsOiBtLCBwcm9wOiBncm91cHNbMV0sIHdoZW5leGlzdHM6IGdyb3Vwc1syXSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBWYWx1dGEgaWwgY29udGVudXRvIGRlbGxhIHZhcmlhYmlsZSBCaW5kUHJvcGVydGllcyAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJpbmRQcm9wZXJ0aWVzKCkge1xyXG4gICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIHByb3ByaWV0w6Agc2NyaXR0ZSB0aXBvIC0tPiB7cHJvcH1cclxuICAgICAgICB2YXIgbWF0Y2hlcyA9IHRoaXMuRGlzcGxheS5tYXRjaCgve1thLXpdK30vZ2kpO1xyXG4gICAgICAgIGlmIChtYXRjaGVzKVxyXG4gICAgICAgICAgICBtYXRjaGVzLmZvckVhY2gobSA9PiB7IHRoaXMuQmluZFByb3BlcnRpZXMucHVzaCh7IGdsb2JhbDogbSwgcHJvcDogbS5zdWJzdHJpbmcoMSwgbS5sZW5ndGggLSAxKSB9KTsgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFzZm9ybWEgdW4gb2dnZXR0byBkZWxsYSBTb3VyY2UgYWxsYSBzdWEgdmVyc2lvbmUgXCJudW92YVwiIGJhc2FuZG9zaSBzdWxsZSBpbmZvcm1hemlvbmkgc3UgZ3J1cHBpIGUgcHJvcHJpZXTDoFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGRhIHRyYXNmb3JtYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHt7aWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ319IE9nZ2V0dG8gZmluYWxlIHRyYXNmb3JtYXRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhbnNmb3JtU291cmNlSXRlbShzOiBhbnkpOiB7aWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ30ge1xyXG4gICAgICAgIC8vIFBhcnRvIHNlbXByZSBkYWxsYSB2YXJpYWJpbGUgZGkgRGlzcGxheSwgcG9pIHNvc3RpdHVpc2NvIHBlenpvIHBlciBwZXp6b1xyXG4gICAgICAgIGxldCBkZXNjID0gdGhpcy5EaXNwbGF5O1xyXG5cclxuICAgICAgICAvLyBUYWdsaW8gbyBtYW50ZW5nbyBsZSBjb25kaXppb25pIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgIHN1IGN1aSBmYXJlIGNoZWNrXHJcbiAgICAgICAgLy8gRG9wb2RpY2jDqSBzY3Jpdm8gdHV0dGUgbGUgcHJvcHJpZXTDoFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwc1tpXTtcclxuICAgICAgICAgICAgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgKHNbdC5wcm9wXSAhPSBudWxsICYmIHNbdC5wcm9wXSAhPSB1bmRlZmluZWQpID8gdC53aGVuZXhpc3RzIDogXCJcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQmluZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLkJpbmRQcm9wZXJ0aWVzW2ldO1xyXG4gICAgICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKHQuZ2xvYmFsLCBzW3QucHJvcF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgaWQ6IHNbdGhpcy5JZEZpZWxkXSwgZGVzY3JpcHRpb246IGRlc2MgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCBjb21vcG5lbnRlIGluIHF1ZXN0aW9uZSDDqCBpbiBncmFkbyBkaSBnZXN0aXJlIG5nQ29udHJvbCBudWxsaS4gXHJcbiAgICAgKiBEaSBkZWZhdWx0IMOoICoqZmFsc2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgZ2VzdGlzY28gbmdDb250cm9sIG51bGxpLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBoYW5kbGVOdWxsTmdDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy8gQSB2b2x0ZSBuZWxsJ25nT25Jbml0IG5vbiBjaSBwYXNzYSBxdWluZGkgbG8gbWV0dG8gc2lhIHF1aSBzaWEgbmVsbCdhZnRlcnZpZXdpbml0LCBwZW5zbyBjaGUgdmFsZ2EgcGVyIGkgY29tcG9uZW50aSBkaSB0ZXJ6ZSBwYXJ0aVxyXG4gICAgICAgIC8vIGNoZSBzaSBjb2xsZWdhbm8gcGVyIGkgY2F6emkgbG9ybyBhbCBmb3JtIGVjYywgcXVpbmRpIGxhIHBhcnRlIHNvcHJhIG5vbiBzZXJ2ZS4uLiBCT0hcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKTtcclxuXHJcbiAgICAgICAgLy9JbCBub21lIG5vbiBjJ8OoIHNlIG1ldHRvIHN0YW5kYWxvbmUgOiB0cnVlIChDSEUgTk9OIMOpIERBIE1FVFRFUkUpXHJcbiAgICAgICAgLy9EYXRvIGNoZSBhbmNoZSBpbCBjb250cm9sbG8gZXN0ZXJubyB2aWVuZSBjb25zaWRlcmF0byBjb21lIGNvbXBvbmVudGUgZGVsIGZvcm0sIG5vbiBwb3NzbyBiYXNhcm1pIHNvbG8gc3VsIG5vbWUgbWEgZGV2byBhZ2dpdW5nZXJlIHVuIHRhZy4gSW4gcXVlc3RvIGNhc28gXCJfaW50ZXJuYWxcIlxyXG4gICAgICAgIC8vIEFUVEVOWklPTkU6IFFVQUxTSUFTSSBTSUEgSUwgTU9USVZPLCBTRSBTVE8gQ09TTyBWSUVORSBTUE9TVEFUTyBEQUxMIG5nT25Jbml0IE5PTiBGVU5aSU9OQSBQSVUgTlVMTEFcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgdGhpcy5HZW5lcmF0ZWROYW1lID0gdGhpcy5uZ0NvbnRyb2wubmFtZS50b1N0cmluZygpICsgXCJfaW50ZXJuYWxcIjtcclxuXHJcbiAgICAgICAgLy8gQVRURU5aSU9ORTogUVVBTFNJQVNJIFNJQSBJTCBNT1RJVk8sIFNFIFNUTyBDT1NPIFZJRU5FIFNQT1NUQVRPIERBTEwgbmdPbkluaXQgTk9OIEZVTlpJT05BIFBJVSBOVUxMQVxyXG4gICAgICAgIGlmICh0aGlzLkZvcm0pIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1IYXNCZW5uQm91bmQgJiYgdGhpcy52YWxpZGF0aW9uQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1IYXNCZW5uQm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBRdWFuZG8gdW4gZm9ybSB2aWVuZSBzdWJtaXR0YXRvIGxhIHZhcmlhYmlsZSBGb3JtLnN1Ym1pdHRlZCB2aWVuZSBhc3NlZ25hdGEgYWxsJ2lucHV0IFtzdWJtaXR0ZWRdIGRlbCB2YWwtY29udHJvbFxyXG4gICAgICAgICAgICAvLyBFc3NlbmRvIGNoZSBwZXLDsiBsYSBDRCDDqCBPblB1c2ggcGVyIGRpcmUgYWQgQW5ndWxhciBjaGUgbCdJbnB1dCDDqCBjYW1iaWF0byBlIHBlcm1ldHRlcmUgaSBzaWRlZmZlY3RzIGRpIGFzc2VnbmFyZSBbc3VibWl0dGVkXVxyXG4gICAgICAgICAgICAvLyBkZXZvIGF0dGFjY2FybWkgYWwgc3VibWl0IGF0dHVhbGUgZGVsIGZvcm0gZSBwcmltYSBkaSBlc2VndWlybG8gZGV2byBtYXJjYXJlIGlsIGNvbXBvbmVudGUgcGVyIGlsIGNoZWNrXHJcbiAgICAgICAgICAgIGxldCBvcmlnRnVuYyA9IHRoaXMuRm9ybS5vblN1Ym1pdDtcclxuICAgICAgICAgICAgdmFyIGZvcm1PdXRzaWRlUmVmID0gdGhpcy5Gb3JtO1xyXG4gICAgICAgICAgICB0aGlzLkZvcm0ub25TdWJtaXQgPSAoZXYpOiBib29sZWFuID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdGdW5jLmFwcGx5KGZvcm1PdXRzaWRlUmVmKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZSBzb25vIGluIG1vZGFsaXTDoCBkZXRhdGNoZWQgZGV2byByaW11b3ZlcmUgbWFudWFsbWVudGUgcXVlc3RvIGNvbnRyb2xsbyBxdWFuZG8gZW50cm8gbmVsbGEgZGlzcG9zZSwgYWx0cmltZW50aSBzZSBwb2kgbmUgYW5kYXNzaSBhIHJpYWdnaXVuZ2VyZVxyXG4gICAgICogdW4gYWx0cm8gY29uIGxvIHN0ZXNzbyBcIm5hbWVcIiBtYSBtYWdhcmkgcmVzZXR0YXRvLCBBbmd1bGFyIGxvIHJlLWlkcmF0ZXJlYmJlIGNvbiBpIHZhbG9yaSBwcmVjZWRlbnRpIG5vbm9zdGFudGUgaWwgbW9kZWxsbyBmb3NzZSB2dW90b1xyXG4gICAgICovXHJcbiAgICBuZ09uRGVzdHJveSgpe1xyXG4gICAgICAgIGlmKHRoaXMuZGV0YXRjaGVkRnJvbWZvcm0gJiYgdGhpcy5Gb3JtKVxyXG4gICAgICAgICAgICB0aGlzLkZvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRWxhYm9yYSBpIHZhbGlkYXRvcmkgaW5pZXR0YXRpIGUgY2FwaXNjZSBzZSBpbCB2YWxvcmUgw6ggb2JibGlnYXRvcmlvIG8gbWVubyAqL1xyXG4gICAgY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpIHtcclxuICAgICAgICAvLyBjb250cm9sbG8gc2Ugw6ggc2V0dGF0byB1biByZXF1aXJlZCBwZXIgZGVjaWRlcmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgc2UgdXRpbGl6emFyZSBpbCB2YWxpZGF0b3JlIHJlcXVpcmVkIG5lbCBjb21wb25lbnRlIGludGVybm9cclxuICAgICAgICAvLyBMbyBmYWNjaW8gcXVpIGUgbm9uIGluIHVuIGV2ZW50dWFsZSBuZ09uSW5pdCBvIGNvc3RydXR0b3JlIHBlcmNow6kgbmdPbkluaXQgbm9uIHNlbXByZSB2aWVuZSBjaGlhbWF0byBlIGRhIGNvc3RydXR0b3JlIGlsIHZhbGlkYXRvcmUgbm9uIGhhIGFuY29yYSBpbCB2YWxvcmUgZ2l1c3RvXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMgJiYgdGhpcy5fdmFsaWRhdG9ycy5zb21lKGVsZW0gPT4gZWxlbSBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yICYmIGVsZW0ucmVxdWlyZWQpKVxyXG4gICAgICAgICAgICB0aGlzLlJlcXVpcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsaWRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhlbHBlciBjaGUgY29sbGVnYSBsYSBmdW56aW9uZSBkaSByZXNldCBkZWwgY29udHJvbGxvIGZvcm0gYWwgY29udHJvbGxvIGRpIHZhbGlkYXppb25lIHNvdHRvc3RhbnRlICovXHJcbiAgICBwcml2YXRlIGJpbmRSZXNldEZ1bmN0aW9uKCkge1xyXG4gICAgICAgIC8vZmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICBjb25zdCBvcmlnRnVuYyA9ICg8YW55PnRoaXMubmdDb250cm9sLmNvbnRyb2wpLl9fb3JpZ2luYWxfcmVzZXRfXyB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0O1xyXG4gICAgICAgIHZhciBuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSA9IHRoaXMubmdDb250cm9sLmNvbnRyb2w7XHJcbiAgICAgICAgdmFyIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2w7XHJcblxyXG4gICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wucmVzZXQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIG9yaWdGdW5jLmFwcGx5KG5nQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlKTtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZS5yZXNldCgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vUGVyIGNvbnNlbnRpcmUgcmljaGlhbWkgbXVsdGlwbGkgZGkgcXVlc3RhIGZ1bnppb25lIHByZW5kZW5kbyBzZW1wcmUgbGEgZml1bnppb25lIGRpIHJlc2V0IGJhc2VcclxuICAgICAgICAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gPSBvcmlnRnVuY1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsICYmIHRoaXMuZmlyc3RCaW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RCaW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuTW9kZWwgPSBvYmo7XHJcblxyXG4gICAgICAgIC8vUGVyIHN2ZWdsaWFyZSBBbmd1bGFyLiBJbCB2YWxvcmUgY2hlIGVudHJhIHBvdHJlYmJlIGVzc2VyZSB2YWxpZG8vbm9uIHZhbGlkbyBlIHF1ZXN0byBsbyBiaW5kYSBhIHR1dHRvLCBmb3JtIGNvbXByZXNvXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuTW9kZWwpXHJcbiAgICAgICAgICAgIHRoaXMub25Ob3ROdWxsVmFsdWVTZXQoKTtcclxuXHJcbiAgICAgICAgLy8gbWFya0ZvckNoZWNrIG5vbiB2YSBiZW5lIGluIHF1YW50byBhcnJpdmFubyBwb3NzaWJpbG1lbnRlIDIgdXBkYXRlIHN1IHVuIHNvbG8gY2ljbG8gZGkgc3RhY2tcclxuICAgICAgICAvLyBzZXRUaW1lKnV0IGNoZSB3cmFwcGEgdHV0dG8gbm9uIHZhIGJlbmUgc2VubsOyIHNwYW1tYSBkZWxsZSBjaGFuZ2UgZGV0ZWN0aW9uIGEgc3VvbiBkaSBpbnRlcnZhbCBjaGUgcmFsbGVudGFubyB0YW50aXNzaW1vIGwnYXBwXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdHJhIGludGVybmFtZW50ZSBpbCBjb21wb25lbnRlIGRpIHZhbGlkYXppb25lLCBuZSBpbXBvc3RhIGkgdmFsaWRhdG9yaSBlIGNvbGxlZ2EgaWwgRm9ybSwgc2UgcHJlc2VudGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjdmFsaWRhdGlvbkNvbnRyb2xcIlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlclZhbENvbXAoY29tcDogTmdNb2RlbCkge1xyXG4gICAgICAgIGlmIChjb21wKSB7XHJcbiAgICAgICAgICAgIC8vIMOIIGFycml2YXRvIHVuIG51b3ZvIHZhbGlkYXRpb25Db250b3JsIChzdWNjZWRlIHNvbG8gbmVsIGZvcm0tc2VsZWN0IHF1YW5kbyBjYW1iaWEgbGEgc291cmNlIGRhIDAgZWxlbWVudGkgLyBudWxsIGFkIE4gZWxlbWVudGksIHF1aW5kaSBhbCBtYXNzaW1vIHVuYSB2b2x0YSkgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25Db250cm9sICYmIHRoaXMuRm9ybSlcclxuICAgICAgICAgICAgICAgIHRoaXMuRm9ybS5yZW1vdmVDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbCA9IGNvbXA7XHJcblxyXG4gICAgICAgICAgICAvL1F1ZXN0YSBzZXJ2ZSBwZXIgcGFzc2FyZSBhdmFudGkgaSB2YWxpZGF0b3JpXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG5cclxuICAgICAgICAgICAgLy9TZSBzb25vIHN0YWNjYXRvIGRhbCBGb3JtICh2dW9sIGRpcmUgY2hlIHNvbm8gYWQgZXNlbXBpbyBkZW50cm8gdW4gbmctdGVtcGxhdGUpIGFnZ2l1bmdvIGlsIGNvbnRyb2xsbyBhbCBGb3JtIHBhc3NhdG8gY29tZSBpbnB1dCAoY29udGV4dCBkZWwgdGVtcGxhdGUpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRldGF0Y2hlZEZyb21mb3JtICYmIHRoaXMuRm9ybSAmJiAhdGhpcy5mb3JtSGFzQmVubkJvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtSGFzQmVubkJvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kUmVzZXRGdW5jdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgLy9JIHZhbC1yb2JhIHF1ZXN0byBsbyBmYW5ubyBhdXRvbWF0aWNhbWVudGUgZGVudHJvLi4uIGdsaSBhbHRyaSBubyAoZXMuIHNlbXBsaWNlIGlucHV0IGNoZWNrYm94KVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ2dpb3JuYSBpbCB2YWxvcmUgZSBsYSB2YWxpZGl0w6AgZGVsbCdpbnB1dCBzb3R0b3N0YW50ZS4gTm9uIHZpZW5lIGNoaWFtYXRvIHBlciBpbnB1dCBuYXRpdmkgY29tZSBsZSBjaGVja2JveFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlZFZhbHVlIEZvcnphIGwnYWdnaW9ybmFtZW50byBhbmNoZSBzZSBub24gw6ggdW4gaW5wdXQgbmF0aXZvIChpbnB1dCBuYXRpdm8gPSBjaGVja2JveCwgYWQgZXNlbXBpbylcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVmFsaWRpdHlGb3JOYXRpdmVJbnB1dChmb3JjZWRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKGZvcmNlZFZhbHVlIHx8IHRoaXMubmF0aXZlSW5wdXQpXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIuIE1hbnRlbmdvIGxvIHN0ZXNzbyBub21lIGRlbGwnZXZlbnRvIGRlaSA8dmFsLSo+IChpbnB1dENoYW5nZSkgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AuXHJcbiAgICAgKiBcclxuICAgICAqIE5vbiBwb3NzbyB0ZW5lcmxvIHByb3RlY3RlZCBhbHRyaW1lbnRpIHBvc3NvIGVzZWd1aXJsbyBzb2xvIGRhbCAudHMgZSBub24gZGFsbCcgLmh0bWxcclxuICAgICAqL1xyXG4gICAgY2hhbmdlZChmb3JjZWRWYWx1ZTogYW55ID0gbnVsbCwgbWFya0ZvckNoZWNrOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZShmb3JjZWRWYWx1ZSA9PSBudWxsID8gdGhpcy5Nb2RlbCA6IGZvcmNlZFZhbHVlKTtcclxuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQoZm9yY2VkVmFsdWUgPT0gbnVsbCA/IHRoaXMuTW9kZWwgOiBmb3JjZWRWYWx1ZSk7XHJcbiAgICAgICAgaWYgKG1hcmtGb3JDaGVjaylcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIgc3VsIGZvY3VzLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGZvY3VzZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cy5lbWl0KGV2ZW50KTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgRm9jdXNlZCAtIFwiICsgdGhpcy5HZW5lcmF0ZWROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIiBzdWxsYSBmaW5hbGl6emF6aW9uZSBkZWwgdmFsb3JlIGRlbGwnaW5wdXQgKGJsdXIgLyB0YXN0byBpbnZpbywgZWNjLi4uKS4gTWFudGVuZ28gbG8gc3Rlc3NvIG5vbWUgZGVsbCdldmVudG8gZGVpIDx2YWwtKj4gKGlucHV0Q2hhbmdlKSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoC5cclxuICAgICAqIFxyXG4gICAgICogTm9uIHBvc3NvIHRlbmVybG8gcHJvdGVjdGVkIGFsdHJpbWVudGkgcG9zc28gZXNlZ3VpcmxvIHNvbG8gZGFsIC50cyBlIG5vbiBkYWxsJyAuaHRtbFxyXG4gICAgICovXHJcbiAgICBmaW5hbGl6ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZpbmFsaXplZC5lbWl0KCk7XHJcbiAgICAgICAgdGhpcy5sb2coXCJDb250cm9sIFZhbHVlIEZpbmFsaXplZCAtIFwiICsgdGhpcy5HZW5lcmF0ZWROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YW1wYSB1biBsb2cgYSBjb25zb2xlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkYSBzdGFtcGFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9nKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLkZBVl9ERUJVR19NT0RFKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkBmb3Jtcy1hbmQtdmFsaWRhdGlvbnM6IFwiICsgbWVzc2FnZSlcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgYWJzdHJhY3Qgb25Ob3ROdWxsVmFsdWVTZXQoKTogdm9pZDtcclxufSJdfQ==