@esfaenza/forms-and-validations 11.2.158 → 11.2.159-beta1

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.
@@ -145,8 +145,13 @@ export class BaseFormControl {
145
145
  });
146
146
  }
147
147
  // Escludo tutti i validatori che in realtà sono componenti
148
- if (this._validators)
149
- this.ngControl.control.setValidators(this._validators.filter(v => !v.ngOnInit));
148
+ if (this._validators) {
149
+ var validatorsToSet = this._validators.filter(v => !v.ngOnInit);
150
+ this.ngControl.control.setValidators(validatorsToSet);
151
+ //#DEBUG
152
+ console.log("Validatori impostati a livello di base form per il controllo: " + ngControl.name);
153
+ console.log(validatorsToSet);
154
+ }
150
155
  this.ngControl.control.updateValueAndValidity();
151
156
  }
152
157
  }
@@ -320,8 +325,12 @@ export class BaseFormControl {
320
325
  checkRequiredValidator() {
321
326
  // controllo se è settato un required per decidere in maniera condizionale se utilizzare il validatore required nel componente interno
322
327
  // 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
323
- if (this._validators && this._validators.some(elem => elem instanceof RequiredValidator && (elem.required === true || elem.required === null || elem.required === undefined)))
328
+ if (this._validators && this._validators.some(elem => elem instanceof RequiredValidator && (elem.required === true || elem.required === null || elem.required === undefined))) {
329
+ //#DEBUG
330
+ console.log("Controllo impostato required: " + this.ngControl.name + " a causa dei seguenti validatori");
331
+ console.log(this._validators.filter(elem => elem instanceof RequiredValidator && (elem.required === true || elem.required === null || elem.required === undefined)));
324
332
  this.Required = true;
333
+ }
325
334
  }
326
335
  /** @ignore */
327
336
  ngAfterViewInit() {
@@ -378,8 +387,12 @@ export class BaseFormControl {
378
387
  this.Form.removeControl(this.validationControl);
379
388
  this.validationControl = comp;
380
389
  //Questa serve per passare avanti i validatori
381
- if (this.UseUserValidators)
390
+ if (this.UseUserValidators) {
391
+ //#DEBUG
392
+ console.log("Validatori impostati a livello di base form per il validation control: " + this.validationControl.name);
393
+ console.log(this._validators);
382
394
  this.validationControl.control.setValidators(this._validators);
395
+ }
383
396
  //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)
384
397
  if (this.Form && !this.formHasBeenBound) {
385
398
  this.Form.addControl(this.validationControl);
@@ -499,4 +512,4 @@ BaseFormControl.propDecorators = {
499
512
  inputFocus: [{ type: Output }],
500
513
  inputFinalized: [{ type: Output }]
501
514
  };
502
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUF3QixTQUFTLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2SCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLGtFQUFrRTtBQUVsRSxNQUFNLE9BQWdCLGVBQWU7SUF5TWpDLDJCQUEyQjtJQUMzQixZQUFzQixHQUFzQixFQUFTLFNBQW9CLEVBQVksV0FBdUIsRUFBc0IsRUFBd0IsRUFBcUIsVUFBNEIsRUFBNkMsYUFBcUIsRUFBOEMsY0FBdUIsRUFBVSxjQUF1QixLQUFLO1FBQWxXLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQXNCLE9BQUUsR0FBRixFQUFFLENBQXNCO1FBQXFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQTZDLGtCQUFh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UUFBUTtZQW5ONUYsZ0JBQWdCLHVCQW1Oa0gsUUFBUTt5Q0FBeUMsUUFBUSxZQUFJLE1BQU0sU0FBQyxhQUFhOzBDQUFrQyxRQUFRLFlBQUksTUFBTSxTQUFDLGNBQWM7Ozs7MkJBMUpoVCxLQUFLO21DQUlMLEtBQUs7OEJBR0wsS0FBSzt5QkFHTCxLQUFLO2lDQUdMLEtBQUs7eUJBR0wsS0FBSztxQkFNTCxLQUFLOzBCQUdMLEtBQUs7NkJBR0wsS0FBSztzQ0FHTCxLQUFLOzBCQUdMLEtBQUs7b0JBR0wsS0FBSzs0QkFHTCxLQUFLOzRCQUdMLEtBQUs7bUJBR0wsS0FBSzttQkFHTCxLQUFLO3FCQUdMLEtBQUs7c0JBR0wsS0FBSzs0QkFPTCxLQUFLOzBCQUdMLEtBQUs7K0JBR0wsS0FBSztrQ0FHTCxLQUFLOzRCQUdMLEtBQUs7OEJBR0wsS0FBSztzQkFRTCxLQUFLO3VCQW9CTCxLQUFLOzhCQVVMLEtBQUs7aUNBY0wsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTt1Q0FPaEQsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTswQkFHL0MsTUFBTTt5QkFHTixNQUFNOzZCQUdOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wsIE5nRm9ybSwgTmdNb2RlbCwgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIE9wdGlvbmFsLCBJbmplY3QsIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UsIENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sXCI7XHJcbmltcG9ydCB7IEFDT19DVVNUT01LRVksIEZBVl9ERUJVR19NT0RFIH0gZnJvbSAnLi4vdG9rZW5zJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ2hhbmdlRXZlbnQgfSBmcm9tIFwiLi4vbW9kZWxzL0NoYW5nZUV2ZW50XCI7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuLyoqIENvbXBvbmVudGUgYmFzZSBkYSBjdWkgdHV0dGkgaSBjb21wb25lbnRpIEZvcm0gaW1wbGVtZW50YW5vICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUZvcm1Db250cm9sIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5ODhcclxuICAgICAqIFRMOkRSOyBJbCBwcmltbyB2YWxvcmUgcGFzc2F0byBhbCB3cml0ZVZhbHVlIMOoIG51bGxvIHBlcmNow6kgcXVhbmRvIGkgY2FnbmFjY2kgZmFubm8gbmV3IEZvcm1Db250cm9sKClcclxuICAgICAqIHNjcml2b25vIHVuIHdyaXRlVmFsdWUgbnVsbG8uLi4gcXVpbmRpIGFsIHByaW1vIGJpbmRpbmcgc2FsdG8gbCdpbml6aWFsaXp6YXppb25lIHNlIGhvIGxhIGNvcHBpYSBudWxsLWZpcnN0QmluZFxyXG4gICAgICogcG9pIG1ldHRlbmRvIGZpcnN0QmluZCBhIGZhbHNlIGRpIGzDrCBpbiBwb2kgZnVuemlvbm8gY29tZSBkZXZvLiBWaXN0YSBsYSBjYXNpc3RpY2EgZXZpdG8gZXNzZW56aWFsbWVudGUgbWV0w6AgZGV0ZWN0Q2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2EgZGkgdXRpbGl6emFyZSBpIHZhbGlkYXRvcmkgY2hlIGwndXRlbnRlIHBpYXp6YSBzdWwgY29tcG9uZW50ZS4gXHJcbiAgICAgKiBEYSBub24gdXNhcmUgbmVsIGNhc28gZGkgZm9ybS1hZGFwdGl2ZSBkYXRvIGNoZSBpIHZhbGlkYXRvcmkgdmVuZ29ubyB2YWx1dGF0aSBpbiBiYXNlIGFsIHRpcG8gZWNjXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBVc2VVc2VyVmFsaWRhdG9yczpib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGlsIGNhbXBvIMOoIG9iYmxpZ2F0b3JpbyBpIG9wemlvbmFsZSAqL1xyXG4gICAgcHVibGljIFJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGF0byBkYSBxdWVzdG8gY2FtcG8gKi9cclxuICAgIHB1YmxpYyBNb2RlbDogYW55O1xyXG5cclxuICAgIC8qKiBWYWxvcmUgZGVsIE1vZGVsbG8gKi9cclxuICAgIHB1YmxpYyBFdmFsdWF0ZWRNb2RlbDogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBOb21lIGdlbmVyYXRvIHBlciBpbCBjb250cm9sbG8gaW50ZXJuby4gRGkgZGVmYXVsdCDDqCBpbCBub21lIGRlbCBjb250cm9sbG8gZXN0ZXJubyBjb24gbCdhZ2dpdW50YSBkaSBcIl9pbnRlcm5hbFwiLiBTZXJ2ZSBwZXIgZXZpdGFyZSBjcm9zcy1iaW5kICovXHJcbiAgICBwdWJsaWMgR2VuZXJhdGVkTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgRm9ybSBjaGUgY29udGllbmUgcXVlc3RvIGNhbXBvIMOoIGdpw6Agc3RhdG8gcmVnaXN0cmF0byAqL1xyXG4gICAgcHJvdGVjdGVkIGZvcm1IYXNCZWVuQm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJvdGVjdGVkIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJvdGVjdGVkIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSBWZWRpIGdldHRlciBlIHNldHRlciAqL1xyXG4gICAgcHJpdmF0ZSBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1YWxvcmEgY2kgZm9zc2UgdW4gY29udGVzdG8gY29sbGVnYXRvIHF1ZXN0YSB2YXJpYWJpbGUgaWRlbnRpZmljYSBzZSBTb25vIGwnT3duZXIgbyBtZW5vLlxyXG4gICAgICogXHJcbiAgICAgKiBTZSBub24gbG8gc29ubywgaWwgY2FtcG8gcmlzdWx0ZXLDoCBpbiBzb2xhIGxldHR1cmEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgQXBwQ29udGV4dE93bmVyc2hpcDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIFN1YmplY3QgYSBjdWkgbCdvZ2dldHRvIGludGVybm8gc2kgY29sbGVnYSBwZXIgZWZmZXR0dWFyZSBpbCBmb2N1cyBkZWxsJ2VsZW1lbnRvIGlucHV0IHNvdHRvc3RhbnRlICovXHJcbiAgICBASW5wdXQoKSBGb2N1c1N1YmplY3Q6IFN1YmplY3Q8dm9pZD47XHJcbiAgICAvKipcclxuICAgICogQEVYUEVSSU1FTlRBTFxyXG4gICAgKi9cclxuICAgIEBJbnB1dCgpIFNldFZhbGlkYXRpb25TdWJqZWN0OiBTdWJqZWN0PHsgZmllbGROYW1lOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcgfT47XHJcblxyXG4gICAgLyoqIE1vZGFsaXTDoCBpbiBjdWkgdmllbmUgbW9zdHJhdG8gaWwgY2FtcG8sIDEtMSByaXNwZXR0byBhbGxlIGRlZmluaXppb25pIGRpIEFuZ3VsYXIgTWF0ZXJpYWwgICovXHJcbiAgICBASW5wdXQoKSBGaWVsZEFwcGVhcmVuY2U6IFwibGVnYWN5XCIgfCBcInN0YW5kYXJkXCIgfCBcImZpbGxcIiB8IFwib3V0bGluZVwiID0gXCJvdXRsaW5lXCI7XHJcblxyXG4gICAgLyoqIFV0aWxpenphIG8gbWVubyBpbCBMYXlvdXQgZGkgdW4gZm9ybSAoTGFiZWwgY29uIGlucHV0IGRpIGZpYW5jbyksIHNlIGZhbHNlIG1vc3RyYSBzb2xvIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm1MYXlvdXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBEZWZpbmlzY2Ugc2UgcmljaGlhbWFyZSBsJ0V2ZW50RW1pdHRlciAqKmlucHV0Q2hhbmdlKiogaW4gbWFuaWVyYSBjbGFzc2ljYSAodHJ1ZSkgbyBzb2xvIHBlciBsYSBjaGFuZ2UgY29uc2lkZXJhdGUgZGVmaW5pdGl2ZSBjb21lIHRhc3RvIGludmlvIC8gYmx1ciAvIGVjYy4uLiAoZmFsc2UpICovXHJcbiAgICBASW5wdXQoKSBFbWl0UGVuZGluZ0NoYW5nZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBBdHRpdmEgbyBkaXNhdHRpdmEgbGEgdmFsaWRhemlvbmUgcGVyIHF1ZXN0byBjb21wb25lbnRlICovXHJcbiAgICBASW5wdXQoKSBWYWxpZGF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzY3JpdmVyZSBvIG1lbm8gbmVsIGNhbXBvIGRpIElucHV0LiBTaSBkaWZmZXJlbnppYSBkYWwgUmVhZG9ubHkgaW4gcXVhbnRvIGZpc2ljYW1lbnRlIGwnSW5wdXQgw6ggc2NyaXZpYmlsZSBlIHZlbmdvbm8gbWFudGVudXRpIGkgdGVtaSBkZWxsYSB2YWxpZGF6aW9uZVxyXG4gICAgICogbWEgaW50ZXJhZ2lyZSBkaXJldHRhbWVudGUgY29uIGxhIGNhc2VsbGEgZGkgSW5wdXQgcGVyIGwndXRlbnRlIG5vbiDDqCBwb3NzaWJpbGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRnJvemVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFBsYWNlaG9sZGVyIHBlciBxdWFuZG8gbCdpbnB1dCDDqCB2dW90byAqL1xyXG4gICAgQElucHV0KCkgUGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIENsYXNzZSBleHRyYSBwZXIgaWwgZm9ybS1ncm91cCBpbiBjdWkgdmllbmUgd3JhcHBhdG8gbCdpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgRm9ybUdyb3VwQ2xhc3M6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIE1lc3NhZ2dpbyBkYSBtb3N0cmFyZSBxdWFuZG8gbGEgdmFsaWRhemlvbmUgZmFsbGlzY2UgcGVyIHF1ZXN0byBjb21wb25lbnRlLiBEaSBkZWZhdWx0IHZpZW5lIHByb3Bvc3RhIGRhbGxhIGxpYnJlcmlhICovXHJcbiAgICBASW5wdXQoKSBGYWlsZWRWYWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogSW5wdXQgY2hlIGZvcnphIGwnaW52YWxpZGl0w6AgZGVsIGNvbXBvbmVudGUgKi9cclxuICAgIEBJbnB1dCgpIEZvcmNlZEVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIE1vc3RyYSB1biB0ZXN0byBhIHNpbmlzdHJhIGRlbGwnaW5wdXQgKEZvcm1MYXlvdXQgcGVybWV0dGVuZG8pICovXHJcbiAgICBASW5wdXQoKSBMYWJlbDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGxhIGxhYmVsICovXHJcbiAgICBASW5wdXQoKSBMYWJlbENvbFdpZHRoOiBudW1iZXIgPSA0O1xyXG5cclxuICAgIC8qKiBjb2wtbWQtWCBwZXIgbCdpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgSW5wdXRDb2xXaWR0aDogbnVtYmVyID0gODtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIGwndWx0aW1vIGNvbXBvbmVudGUgZGkgdW4gZm9ybSAoc2VydmUgcGVyIHJpbXVvdmVyZSBpbCBtYXJnaW5lIGZpbmFsZSkgKi9cclxuICAgIEBJbnB1dCgpIExhc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQXNzb2NpYSBpbCBjb21wb25lbnRlIEZvcm0gYSBxdWVzdG8gaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm06IE5nRm9ybSA9IG51bGw7XHJcblxyXG4gICAgLyoqIFNvcmdlbnRlIGRhIGN1aSBzY2VnbGllcmUgdmFsb3JpIHBlciBpIGNvbXBvbmVudGkgRm9ybSBjaGUgbG8gY29uc2VudG9ubyAqL1xyXG4gICAgQElucHV0KCkgU291cmNlOiBhbnlbXTtcclxuXHJcbiAgICAvKiogTm9tZSBkZWxsYSBwcm9wcmlldMOgIGNoZSBjb250aWVuZSBsJ0lkIGRlZ2xpIG9nZ2V0dGkgYmluZGF0aSBuZWxsYSAqKlNvdXJjZSoqICovXHJcbiAgICBASW5wdXQoKSBJZEZpZWxkOiBzdHJpbmcgPSAnaWQnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGlsICoqUGxhY2Vob2xkZXIqKiBkZXYnZXNzZXJlIHVzYXRvIGNvbWUgdW5hIGZsb2F0aW5nIGxhYmVsIGRpIG1hdGVyaWFsIG8gc29sbyBjb21lIHVuIHBsYWNlaG9sZGVyIHN0YW5kYXJkIFxyXG4gICAgICogXHJcbiAgICAgKiBJZ25vcmF0YSBsYXRvIGF1dG9jb21wbGV0ZSwgYXV0b2NvbXBsZXRlLW11bHRpIGUgc2VsZWN0IGluIHF1YW50byBoYW5ubyBnZXN0aW9uaSBwYXJ0aWNvbGFyaSBkaSBwbGFjZWhvbGRlciBlY2MuLi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRmxvYXRpbmdMYWJlbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIEluZGljYSBjaGUgbGEgcGFydGUgaW5wdXQgZGVsIGNvbnRyb2xsbyBkZXYnZXNzZXJlIHVuYSBsYWJlbCByZWFkb25seSBlIGxhIHBhcnRlIGxhYmVsIGRpIHRpdG9sbyBkZXYnZXNzZXJlIGluIGJvbGQuIFBlciB1dGlsaXp6YXJlIHVuIHNvbG8gY29tcG9uZW50ZSBzaWEgcGVyIGxhIG1vZGlmaWNhIGNoZSBwZXIgaWwgZGV0dGFnbGlvICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBJbmRpY2EgbGEgY29uZGl6aW9uZSBwZXIgY3VpIHVuIGVsZW1lbnRvIGluIE1vZGFsaXTDoCBEaXNwbGF5IHB1w7IgZXNzZXJlIHZpc2liaWxlIGluIGJhc2UgYSB1bHRlcmlvcmkgY29udHJvbGxpICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5Q29uZGl0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogVGVtcGxhdGUgcGVyIHZpc3VhbGl6emFyZSBsYSBtb2RhbGl0w6AgKipEaXNwbGF5TW9kZSoqIGNvbWUgdnVvbGUgaWwgcHJvZ3JhbW1hdG9yZSBmcm9jaW8gZGkgdHVybm8gKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXlNb2RlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqIExheW91dCBkZWwgRm9ybSBxdWFuZG8gw6ggaW4gbW9kYWxpdMOgIERpc3BsYXkuIERpIGRlZmF1bHQgbWFudGllbmUgbGEgZm9ybWF0dGF6aW9uZSBhIGZvcm0gKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXlMYXlvdXQ6ICdmb3JtJyB8ICdpbmxpbmUnIHwgJ2hpZGRlbicgPSAnZm9ybSc7XHJcblxyXG4gICAgLyoqIFNlcGFyYXRvcmUgZGEgbWV0dGVyZSBpbiBhdXRvbWF0aWNvIGZyYSB1biBlbGVtZW50byBGb3JtIGUgbCdhbHRybyBxdWFuZG8gc29ubyBpbiAqKkRpc3BsYXlNb2RlKiogY29uICoqRGlzcGxheUxheW91dCoqIGlubGluZSAqL1xyXG4gICAgQElucHV0KCkgSW5saW5lU2VwYXJhdG9yOiBzdHJpbmcgPSAnICc7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRXNwcmVzc2lvbmUgc2ltaWwtQW5ndWxhciBwZXIgY2FtYmlhcmUgaWwgdGVzdG8gZGVpIGNvbXBvbmVudGkgY2hlIHNjZWxnb25vIGlsIHByb3ByaW8gbW9kZWxsbyBkYSB1bmEgKipTb3VyY2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBJbCBmdW56aW9uYW1lbnRvIMOoIGlkZW50aWNvIGFsIGJpbmRlciBkaSBhbmd1bGFyLCBzb2xvIGNvbiB1bmEgZ3JhZmZhIGludmVjZSBjaGUgMi5cclxuICAgICAqIMOIIGlub2x0cmUgcG9zc2liaWxlIGFnZ2l1bmdlcmUgcGV6emkgZGkgZGVzY3JpemlvbmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgY29uIGxhIHNpbnRhc3NpICoqOnByb3A/KFByb3AgdmFsZSB7cHJvcH0pKipcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheTogc3RyaW5nID0gJ3tkZXNjcmlwdGlvbn0nO1xyXG5cclxuICAgIC8qKiBSaXN1bHRhdG8gZGVsbCd1bmlvbmUgZnJhIGxlIGluZm9ybWF6aW9uaSBkZWdsaSBvZ2dldHRpIGluICoqU291cmNlKiogZSBsZSBpbXBvc3Rhemlvbmkgc3BlY2lmaWNhdGUgbmVsbCdJbnB1dCAqKkRpc3BsYXkqKiAqL1xyXG4gICAgcHVibGljIEJvdW5kU291cmNlOiB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSDDqCBpbCBwcmltbyBCaW5kIGRlbGxhIFNvdXJjZSAqL1xyXG4gICAgcHJvdGVjdGVkIFNvdXJjZUZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipfcmVhZG9ubHkqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2Ugc29sYSBsZXR0dXJhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhZG9ubHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZWFkb25seTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KiogZ2VzdGVuZG8gYW5jaGUgaWwgQ29udGVzdG8gYXBwbGljYXRpdm9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSBWYWxvcmUgZGEgaW1wb3N0YXJlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBSZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLkFwcENvbnRleHRPd25lcnNoaXApXHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZXR0YXJlIGluIHVuYSB2b2x0YSBzb2xvIGdsaSBpbnB1dCBMYWJlbENvbFdpZHRoIGUgSW5wdXRDb2xXaWR0aCwgYmFzdGEgc2NyaXZlcmxvIGNvbiBsYSBzaW50YXNzaSBcIlggWVwiXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBJbnB1dCBuZWwgZm9ybWF0byBcIlggWVwiXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBMYWJlbElucHV0UmF0aW8oaW5wdXQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByYXRpbyA9IGlucHV0LnNwbGl0KC9cXHMvKTtcclxuICAgICAgICB0aGlzLkxhYmVsQ29sV2lkdGggPSBwYXJzZUludChyYXRpb1swXSk7XHJcbiAgICAgICAgdGhpcy5JbnB1dENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiB2YWwtcXVhbGNvc2EgY2hlIGZhIGVmZmV0dGl2YW1lbnRlIGRhIGlucHV0LCBvIGV2ZW50dWFsbWVudGUgaWwgc2luZ29sbyBpbnB1dCBpbiBjYXNpIHBhcnRpY29sYXJpIChlcyBjaGVja2JveCkgKi9cclxuICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uQ29udHJvbDogTmdNb2RlbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ3ZhbGlkYXRpb25Db250cm9sJyBjaGUgZnVuemlvbmEgaW4gYW1iaWVudGUgc3RhdGljb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJ2YWxpZGF0aW9uQ29udHJvbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IF92YWxpZGF0aW9uQ29udHJvbChjb21wOiBOZ01vZGVsKSB7IHRoaXMucmVnaXN0ZXJWYWxDb21wKGNvbXApOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyeSBzdWxsJ2VsZW1lbnRvICd2YWxpZGF0aW9uQ29udHJvbCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIGRpbmFtaWNvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcInZhbGlkYXRpb25Db250cm9sXCIsIHsgc3RhdGljOiB0cnVlIH0pIHNldCB2YWxpZGF0aW9uQ29udHJvbF9zdGF0aWMoY29tcDogTmdNb2RlbCkgeyB0aGlzLnJlZ2lzdGVyVmFsQ29tcChjb21wKTsgfTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsbGEgbW9kaWZpY2EgZGVsIHZhbG9yZSBjb2xsZWdhdG8gYSBxdWVzdG8gY2FtcG8gKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dENoYW5nZTogRXZlbnRFbWl0dGVyPENoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gICAgLyoqIEV2ZW50byBjaGlhbWF0byBhbCBmb2N1cyBkZWwgY2FtcG8gZGkgdGVzdG8vY29tYm8vcXVlbGNoZcOoLCByaWVtaXR0YSBsJ2V2ZW50byBvcmlnaW5hbGUgSmF2YXNjcmlwdCAqL1xyXG4gICAgQE91dHB1dCgpIGlucHV0Rm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLyoqIEV2ZW50byBjaGlhbWF0byBhbCBmaW5hbGl6ZSBkZWwgY2FtcG8gZGkgdGVzdG8vY29tYm8vcXVlbGNoZcOoICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRGaW5hbGl6ZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgLyoqIENhY2hlIGRlbGxlIGNvbmRpemlvbmkgc2NyaXR0ZSB0aXBvIDpwcm9wPyhSb2JhIGNvbiB7cHJvcH0pICovXHJcbiAgICBwcml2YXRlIEJpbmRDaGVja2luZ0dyb3VwczogeyBnbG9iYWw6IHN0cmluZywgcHJvcDogc3RyaW5nLCB3aGVuZXhpc3RzOiBzdHJpbmcgfVtdID0gW11cclxuXHJcbiAgICAvKiogQ2FjaGUgZGVsbGUgcHJvcHJpZXTDoCBzY3JpdHRlIHRpcG8gLS0+IHtwcm9wfSAqL1xyXG4gICAgcHJpdmF0ZSBCaW5kUHJvcGVydGllczogeyBnbG9iYWw6IHN0cmluZywgcHJvcDogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBAaWdub3JlIENvc3RydXR0b3JlICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCwgcHJvdGVjdGVkIF92YWxpZGF0b3JzOiBBcnJheTxhbnk+LCBAT3B0aW9uYWwoKSBwcml2YXRlIGFjOiBBY2Nlc3NDb250cm9sU2VydmljZSwgQE9wdGlvbmFsKCkgcHVibGljIEFwcENvbnRleHQ6IENvbXBvbmVudENvbnRleHQsIEBPcHRpb25hbCgpIEBJbmplY3QoQUNPX0NVU1RPTUtFWSkgcHJpdmF0ZSBBQ09fQ1VTVE9NS0VZOiBzdHJpbmcsIEBPcHRpb25hbCgpIEBJbmplY3QoRkFWX0RFQlVHX01PREUpIHByaXZhdGUgRkFWX0RFQlVHX01PREU6IGJvb2xlYW4sIHByaXZhdGUgbmF0aXZlSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAobmdDb250cm9sID09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhbmRsZU51bGxOZ0NvbnRyb2woKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJuZ0NvbnRyb2wgbnVsbG8gcGVyIHF1YWxjaGUgbW90aXZvISBJbCA5MCUgZGVsbGUgZnVuemlvbmFsaXTDoCBkaSBxdWVzdG8gaW5wdXQgc2FyYW5ubyBkaXNhYmlsaXRhdGVcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1NlIG1pIGFycml2YSBsJ2luamVjdGFibGUgZGVsIGNvbnRlc3RvIHBvc3NvIGNhcGlyZSBzZSBxdWVzdG8gY2FtcG8gZGV2ZSBlc3NlcmUgaW4gcmVhZG9ubHkgbyBubywgc29sbyBzZSBobyBnacOgIGluaXppYWxpenphdG8gaSBjb250cm9sbGVyIGN1c3RvbSBkZWxsJ2FjY2VzcyBjb250cm9sXHJcbiAgICAgICAgaWYgKHRoaXMuQXBwQ29udGV4dCAmJiB0aGlzLkFwcENvbnRleHQubmFtZSAmJiB0aGlzLkFDT19DVVNUT01LRVkgJiYgdGhpcy5hYyAmJiB0aGlzLmFjLkluaXRpYWxpemVkQ3VzdG9tKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXBwQ29udGV4dE93bmVyc2hpcCA9ICF0aGlzLmFjLmhhcyh0aGlzLkFDT19DVVNUT01LRVkgKyBcIjpcIiArIHRoaXMuQXBwQ29udGV4dC5uYW1lLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSAhdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vU2UgaG8gZ2nDoCB1biBwYXJlbnQgaW1wb3N0YXRvIHZ1b2wgZGlyZSBjaGUgc290dG8gYWwgdGFnIDxmb3JtPiBobyBkaXJldHRhbWVudGUgdW4gdGFnIDxmb3JtLSo+Li5cclxuICAgICAgICAvLy4uIHF1aW5kaSBwb3NzbyBpbXBvc3RhcmUgZGlyZXR0YW1lbnRlIGlsIHJpZmVyaW1lbnRvIGRlbCBGb3JtIGRhIHVzYXJlIGluIEhUTUwgcGVyIGlsIHN1Ym1pdHRlZFxyXG5cclxuICAgICAgICAvL1NlIG5vbiBjJ8OoIHZ1b2wgZGlyZSBjaGUgZGVudHJvIGFsIHRhZyA8Zm9ybT4gYyfDqCB1bm8gc3BsZW5kaWRvIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogLi4uLlwiPi4uXHJcbiAgICAgICAgLy8uLiBpbCBxdWFsZSBhIHN1YSB2b2x0YSBjb250aWVuZSBpbCBjb250cm9sbG8gPGZvcm0tKj4gcXVpbmRpIGF2csOyIGlsIGZvcm0gbmVsbCdpbnB1dCBcIkZvcm1cIlxyXG4gICAgICAgIGlmICgoPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQpXHJcbiAgICAgICAgICAgIHRoaXMuRm9ybSA9IDxOZ0Zvcm0+KDxhbnk+bmdDb250cm9sKS5fcGFyZW50O1xyXG5cclxuICAgICAgICAvL1F1ZXN0YSBzZXJ2ZSBwZXIgaW1wb3N0YXJlIG1lIHN0ZXNzbyBjb21lIHNpIGRldmUsIGlsIHZhbGlkYXRvcmUgaW52ZWNlIGxvIHBhc3NvIGFsIHZhbGlkYXRpb24taW5wdXQgcXVhbmRvIHZpZW5lIHNldHRhdG8gaWwgdmFsaWRhdGlvbkNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgLy9QZXIgdHV0dGkgaSB2YWxpZGF0b3JpOiByaWdlbmVybyBsYSBmdW56aW9uZSBkaSB2YWxpZGF6aW9uZS4gUGVyIHF1YWxjaGUgbW90aXZvIGEgdm9sdGUgaG8gdmFsaWRhdG9yaSBzZW56YS4uLlxyXG4gICAgICAgICAgICAvLy4uLiBxdWVzdG8gw6ggdW4gd29ya2Fyb3VuZCBwZXIgZXNzZXJlIHNpY3VybyBkaSBhdmVybGEgc2VtcHJlLlxyXG4gICAgICAgICAgICAvL1NvbG8gaSB2YWxpZGF0b3JpIGNvbiBwYXJhbWV0cmkgaGFubm8gYmlzb2dubyBkZWxsYSBfY3JlYXRlVmFsaWRhdG9yIChlcy4gXCJtYXhsZW5ndGhcIiBjaGUgaGEgMSBwYXJhbWV0cm8pLCBxdWluZGkgbm8gdmFsaWRhdG9yaSB0aXBvIFwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsaWRhdG9ycy5mb3JFYWNoKHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2Ll9jcmVhdGVWYWxpZGF0b3IpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuX2NyZWF0ZVZhbGlkYXRvcigpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEVzY2x1ZG8gdHV0dGkgaSB2YWxpZGF0b3JpIGNoZSBpbiByZWFsdMOgIHNvbm8gY29tcG9uZW50aVxyXG4gICAgICAgICAgICBpZih0aGlzLl92YWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMuZmlsdGVyKHYgPT4gIXYubmdPbkluaXQpKTtcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgaWwgQmluZC9QYXJzZSBkZWxsZSB2YXJpZSAqKlNvdXJjZSoqIHVuZW5kbyBsZSBpbmZvcm1hemlvbmkgc3BlY2lmaWNhdGUgaW4gKipEaXNwbGF5KipcclxuICAgICAqIFxyXG4gICAgICogRXZlbnR1YWxtZW50ZSByaWVmZmV0dHVhIHVuIGJpbmQgYWwgbW9kZWxsbyBpbiBiYXNlIGFsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipSZWJpbmRNb2RlbEFmdGVyU291cmNlKipcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHRyeUJpbmRTb3VyY2VEaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5Tb3VyY2UpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA9PSAwICYmICF0aGlzLlNvdXJjZUZpcnN0QmluZClcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLlNvdXJjZUZpcnN0QmluZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBDYWNoZSBsb2NhbGUgcGVyIGV2aXRhcmUgZGkgcmlmYXJlIGRlaSByZWdleC5tYXRjaCBvZ25pIHNhbnRhIHZvbHRhXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQmluZENoZWNraW5nR3JvdXBzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUJpbmRDaGVja2luZ0dyb3VwcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQmluZFByb3BlcnRpZXMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlQmluZFByb3BlcnRpZXMoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEJsb2NjbyBwZXIgZ2VuZXJhcmUgbGEgZGVzY3JpemlvbmUgZmluYWxlIGRpIHVuIGVsZW1lbnRvXHJcbiAgICAgICAgICAgIHRoaXMuU291cmNlLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBBZ2dpdW5nbyBhbGxhIEJvdW5kU291cmNlIGluIGZvcm1hdG8gc3RhbmRhcmQgS2V5VmFsdWVcclxuICAgICAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UucHVzaCh0aGlzLnRyYW5zZm9ybVNvdXJjZUl0ZW0ocykpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFBvc3QgdHJ5YmluZCBzZSBjJ8OoIHVuIG1vZGVsbG8gYXNzb2NpYXRvIHJpY2FsY29sbyBsJyoqRXZhbHVhdGVkTW9kZWwqKlxyXG4gICAgICAgICAgICBpZiAodGhpcy5Nb2RlbClcclxuICAgICAgICAgICAgICAgIHRoaXMuRXZhbHVhdGVkTW9kZWwgPSB0aGlzLkJvdW5kU291cmNlLmZpbmQodCA9PiB0LmlkID09IHRoaXMuTW9kZWwpPy5kZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFZhbHV0YSBpbCBjb250ZW51dG8gZGVsbGEgdmFyaWFiaWxlIEJpbmRDaGVja2luZ0dyb3VwcyAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJpbmRDaGVja2luZ0dyb3VwcygpIHtcclxuICAgICAgICAvLyBCbG9jY28gcGVyIHRpcmFyZSBmdW9yaSBsZSBjb25kaXppb25pIHNjcml0dGUgdGlwbyAtLT4gOnByb3A/KFJvYmEgY29uIHtwcm9wfSlcclxuICAgICAgICB2YXIgaWZmZWRNYXRjaGVzID0gdGhpcy5EaXNwbGF5Lm1hdGNoKC86KFthLXpdKylcXD9cXCgoW15cXChcXCldKylcXCkvZyk7XHJcbiAgICAgICAgaWYgKGlmZmVkTWF0Y2hlcykge1xyXG4gICAgICAgICAgICBpZmZlZE1hdGNoZXMuZm9yRWFjaChtID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFN0ZXNzYSByZWdleCBkaSBzb3ByYSBtYSBpbCB0YWcgXCJpXCIgc2VydmUgcGVyIHRpcmFyZSBmdW9yaSBpIHNpbmdvbGkgY2FwdHVyaW5nIGdyb3VwIGUgcGVyIHF1YWxjaGUgbW90aXZvIFxyXG4gICAgICAgICAgICAgICAgLy8gbmV3IFJlZ0V4cChiYXNlUmVnZXgsIFwiZ1wiKSBub24gZnVuemlvbmEgcXVpbmRpIG5vbiBobyBwb3R1dG8gcmF6aW9uYWxpenphcmxvXHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBzID0gbS5tYXRjaCgvOihbYS16XSspXFw/XFwoKFteXFwoXFwpXSspXFwpL2kpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMucHVzaCh7IGdsb2JhbDogbSwgcHJvcDogZ3JvdXBzWzFdLCB3aGVuZXhpc3RzOiBncm91cHNbMl0gfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVmFsdXRhIGlsIGNvbnRlbnV0byBkZWxsYSB2YXJpYWJpbGUgQmluZFByb3BlcnRpZXMgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVCaW5kUHJvcGVydGllcygpIHtcclxuICAgICAgICAvLyBCbG9jY28gcGVyIHRpcmFyZSBmdW9yaSBsZSBwcm9wcmlldMOgIHNjcml0dGUgdGlwbyAtLT4ge3Byb3B9XHJcbiAgICAgICAgdmFyIG1hdGNoZXMgPSB0aGlzLkRpc3BsYXkubWF0Y2goL3tbYS16XSt9L2dpKTtcclxuICAgICAgICBpZiAobWF0Y2hlcylcclxuICAgICAgICAgICAgbWF0Y2hlcy5mb3JFYWNoKG0gPT4geyB0aGlzLkJpbmRQcm9wZXJ0aWVzLnB1c2goeyBnbG9iYWw6IG0sIHByb3A6IG0uc3Vic3RyaW5nKDEsIG0ubGVuZ3RoIC0gMSkgfSk7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhc2Zvcm1hIHVuIG9nZ2V0dG8gZGVsbGEgU291cmNlIGFsbGEgc3VhIHZlcnNpb25lIFwibnVvdmFcIiBiYXNhbmRvc2kgc3VsbGUgaW5mb3JtYXppb25pIHN1IGdydXBwaSBlIHByb3ByaWV0w6BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gT2dnZXR0byBkYSB0cmFzZm9ybWFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7e2lkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmd9fSBPZ2dldHRvIGZpbmFsZSB0cmFzZm9ybWF0b1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYW5zZm9ybVNvdXJjZUl0ZW0oczogYW55KToge2lkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmd9IHtcclxuICAgICAgICAvLyBQYXJ0byBzZW1wcmUgZGFsbGEgdmFyaWFiaWxlIGRpIERpc3BsYXksIHBvaSBzb3N0aXR1aXNjbyBwZXp6byBwZXIgcGV6em9cclxuICAgICAgICBsZXQgZGVzYyA9IHRoaXMuRGlzcGxheTtcclxuXHJcbiAgICAgICAgLy8gVGFnbGlvIG8gbWFudGVuZ28gbGUgY29uZGl6aW9uaSBpbiBiYXNlIGFsbGEgcHJvcHJpZXTDoCBzdSBjdWkgZmFyZSBjaGVja1xyXG4gICAgICAgIC8vIERvcG9kaWNow6kgc2NyaXZvIHR1dHRlIGxlIHByb3ByaWV0w6BcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQmluZENoZWNraW5nR3JvdXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHNbaV07XHJcbiAgICAgICAgICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UodC5nbG9iYWwsIChzW3QucHJvcF0gIT0gbnVsbCAmJiBzW3QucHJvcF0gIT0gdW5kZWZpbmVkKSA/IHQud2hlbmV4aXN0cyA6IFwiXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkJpbmRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gdGhpcy5CaW5kUHJvcGVydGllc1tpXTtcclxuICAgICAgICAgICAgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgc1t0LnByb3BdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGlkOiBzW3RoaXMuSWRGaWVsZF0sIGRlc2NyaXB0aW9uOiBkZXNjIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaWwgY29tb3BuZW50ZSBpbiBxdWVzdGlvbmUgw6ggaW4gZ3JhZG8gZGkgZ2VzdGlyZSBuZ0NvbnRyb2wgbnVsbGkuIFxyXG4gICAgICogRGkgZGVmYXVsdCDDqCAqKmZhbHNlKipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGdlc3Rpc2NvIG5nQ29udHJvbCBudWxsaSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgaGFuZGxlTnVsbE5nQ29udHJvbCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIEEgdm9sdGUgbmVsbCduZ09uSW5pdCBub24gY2kgcGFzc2EgcXVpbmRpIGxvIG1ldHRvIHNpYSBxdWkgc2lhIG5lbGwnYWZ0ZXJ2aWV3aW5pdCwgcGVuc28gY2hlIHZhbGdhIHBlciBpIGNvbXBvbmVudGkgZGkgdGVyemUgcGFydGlcclxuICAgICAgICAvLyBjaGUgc2kgY29sbGVnYW5vIHBlciBpIGNhenppIGxvcm8gYWwgZm9ybSBlY2MsIHF1aW5kaSBsYSBwYXJ0ZSBzb3ByYSBub24gc2VydmUuLi4gQk9IXHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsaWRhdG9yKCk7XHJcblxyXG4gICAgICAgIC8vSWwgbm9tZSBub24gYyfDqCBzZSBtZXR0byBzdGFuZGFsb25lIDogdHJ1ZSAoQ0hFIE5PTiDDqSBEQSBNRVRURVJFKVxyXG4gICAgICAgIC8vRGF0byBjaGUgYW5jaGUgaWwgY29udHJvbGxvIGVzdGVybm8gdmllbmUgY29uc2lkZXJhdG8gY29tZSBjb21wb25lbnRlIGRlbCBmb3JtLCBub24gcG9zc28gYmFzYXJtaSBzb2xvIHN1bCBub21lIG1hIGRldm8gYWdnaXVuZ2VyZSB1biB0YWcuIEluIHF1ZXN0byBjYXNvIFwiX2ludGVybmFsXCJcclxuICAgICAgICAvLyBBVFRFTlpJT05FOiBRVUFMU0lBU0kgU0lBIElMIE1PVElWTywgU0UgU1RPIENPU08gVklFTkUgU1BPU1RBVE8gREFMTCBuZ09uSW5pdCBOT04gRlVOWklPTkEgUElVIE5VTExBXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLm5hbWUpXHJcbiAgICAgICAgICAgIHRoaXMuR2VuZXJhdGVkTmFtZSA9IHRoaXMubmdDb250cm9sLm5hbWUudG9TdHJpbmcoKSArIFwiX2ludGVybmFsXCI7XHJcblxyXG4gICAgICAgIC8vIEFUVEVOWklPTkU6IFFVQUxTSUFTSSBTSUEgSUwgTU9USVZPLCBTRSBTVE8gQ09TTyBWSUVORSBTUE9TVEFUTyBEQUxMIG5nT25Jbml0IE5PTiBGVU5aSU9OQSBQSVUgTlVMTEFcclxuICAgICAgICBpZiAodGhpcy5Gb3JtKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtSGFzQmVlbkJvdW5kICYmIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRm9ybS5hZGRDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtSGFzQmVlbkJvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUXVhbmRvIHVuIGZvcm0gdmllbmUgc3VibWl0dGF0byBsYSB2YXJpYWJpbGUgRm9ybS5zdWJtaXR0ZWQgdmllbmUgYXNzZWduYXRhIGFsbCdpbnB1dCBbc3VibWl0dGVkXSBkZWwgdmFsLWNvbnRyb2xcclxuICAgICAgICAgICAgLy8gRXNzZW5kbyBjaGUgcGVyw7IgbGEgQ0Qgw6ggT25QdXNoIHBlciBkaXJlIGFkIEFuZ3VsYXIgY2hlIGwnSW5wdXQgw6ggY2FtYmlhdG8gZSBwZXJtZXR0ZXJlIGkgc2lkZWZmZWN0cyBkaSBhc3NlZ25hcmUgW3N1Ym1pdHRlZF1cclxuICAgICAgICAgICAgLy8gZGV2byBhdHRhY2Nhcm1pIGFsIHN1Ym1pdCBhdHR1YWxlIGRlbCBmb3JtIGUgcHJpbWEgZGkgZXNlZ3VpcmxvIGRldm8gbWFyY2FyZSBpbCBjb21wb25lbnRlIHBlciBpbCBjaGVja1xyXG4gICAgICAgICAgICBsZXQgb3JpZ0Z1bmMgPSB0aGlzLkZvcm0ub25TdWJtaXQ7XHJcbiAgICAgICAgICAgIHZhciBmb3JtT3V0c2lkZVJlZiA9IHRoaXMuRm9ybTtcclxuICAgICAgICAgICAgdGhpcy5Gb3JtLm9uU3VibWl0ID0gKGV2KTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnRnVuYy5hcHBseShmb3JtT3V0c2lkZVJlZik7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5TZXRWYWxpZGF0aW9uU3ViamVjdCkge1xyXG4gICAgICAgICAgICB0aGlzLlNldFZhbGlkYXRpb25TdWJqZWN0LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpLnN1YnNjcmliZSh2ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh2LmZpZWxkTmFtZSArIFwiX2ludGVybmFsXCIgPT0gdGhpcy5HZW5lcmF0ZWROYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSB0aGlzLkZvcm0uZ2V0Q29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEVycm9ycyh7IGZvcmNlZHRvaW52YWxpZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRFcnJvcnMoeyBmb3JjZWR0b2ludmFsaWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3llZCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Ugc29ubyBpbiBtb2RhbGl0w6AgZGV0YXRjaGVkIGRldm8gcmltdW92ZXJlIG1hbnVhbG1lbnRlIHF1ZXN0byBjb250cm9sbG8gcXVhbmRvIGVudHJvIG5lbGxhIGRpc3Bvc2UsIGFsdHJpbWVudGkgc2UgcG9pIG5lIGFuZGFzc2kgYSByaWFnZ2l1bmdlcmVcclxuICAgICAqIHVuIGFsdHJvIGNvbiBsbyBzdGVzc28gXCJuYW1lXCIgbWEgbWFnYXJpIHJlc2V0dGF0bywgQW5ndWxhciBsbyByZS1pZHJhdGVyZWJiZSBjb24gaSB2YWxvcmkgcHJlY2VkZW50aSBub25vc3RhbnRlIGlsIG1vZGVsbG8gZm9zc2UgdnVvdG9cclxuICAgICAqL1xyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybSAmJiB0aGlzLnZhbGlkYXRpb25Db250cm9sICYmICEhdGhpcy5Gb3JtLmdldENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCkpXHJcbiAgICAgICAgICAgIHRoaXMuRm9ybS5yZW1vdmVDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRWxhYm9yYSBpIHZhbGlkYXRvcmkgaW5pZXR0YXRpIGUgY2FwaXNjZSBzZSBpbCB2YWxvcmUgw6ggb2JibGlnYXRvcmlvIG8gbWVubyAqL1xyXG4gICAgY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpIHtcclxuICAgICAgICAvLyBjb250cm9sbG8gc2Ugw6ggc2V0dGF0byB1biByZXF1aXJlZCBwZXIgZGVjaWRlcmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgc2UgdXRpbGl6emFyZSBpbCB2YWxpZGF0b3JlIHJlcXVpcmVkIG5lbCBjb21wb25lbnRlIGludGVybm9cclxuICAgICAgICAvLyBMbyBmYWNjaW8gcXVpIGUgbm9uIGluIHVuIGV2ZW50dWFsZSBuZ09uSW5pdCBvIGNvc3RydXR0b3JlIHBlcmNow6kgbmdPbkluaXQgbm9uIHNlbXByZSB2aWVuZSBjaGlhbWF0byBlIGRhIGNvc3RydXR0b3JlIGlsIHZhbGlkYXRvcmUgbm9uIGhhIGFuY29yYSBpbCB2YWxvcmUgZ2l1c3RvXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMgJiYgdGhpcy5fdmFsaWRhdG9ycy5zb21lKGVsZW0gPT4gZWxlbSBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yICYmIChlbGVtLnJlcXVpcmVkID09PSB0cnVlIHx8IGVsZW0ucmVxdWlyZWQgPT09IG51bGwgfHwgZWxlbS5yZXF1aXJlZCA9PT0gdW5kZWZpbmVkKSkpXHJcbiAgICAgICAgICAgIHRoaXMuUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogSGVscGVyIGNoZSBjb2xsZWdhIGxhIGZ1bnppb25lIGRpIHJlc2V0IGRlbCBjb250cm9sbG8gZm9ybSBhbCBjb250cm9sbG8gZGkgdmFsaWRhemlvbmUgc290dG9zdGFudGUgKi9cclxuICAgIHByaXZhdGUgYmluZFJlc2V0RnVuY3Rpb24oKSB7XHJcbiAgICAgICAgLy9mYWNjaW8gaW4gbW9kbyBjaGUgc2UgY2hpYW1vIGlsIHJlc2V0IGRlbCBjb250cm9sbG8gKG8gZGVsbGEgZm9ybSkgZGFsbCdlc3Rlcm5vIHNpIHJlc2V0dGkgYW5jaGUgaWwgY29udHJvbGxvIG5hdGl2b1xyXG4gICAgICAgIGNvbnN0IG9yaWdGdW5jID0gKDxhbnk+dGhpcy5uZ0NvbnRyb2wuY29udHJvbCkuX19vcmlnaW5hbF9yZXNldF9fIHx8IHRoaXMubmdDb250cm9sLmNvbnRyb2wucmVzZXQ7XHJcbiAgICAgICAgdmFyIG5nQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbDtcclxuICAgICAgICB2YXIgdmFsaWRhdGlvbkNvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSA9IHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbDtcclxuXHJcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5yZXNldCA9ICgpID0+IHtcclxuICAgICAgICAgICAgb3JpZ0Z1bmMuYXBwbHkobmdDb250cm9sX291dHNpZGVSZWZlcmVuY2UpO1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlLnJlc2V0KCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy9QZXIgY29uc2VudGlyZSByaWNoaWFtaSBtdWx0aXBsaSBkaSBxdWVzdGEgZnVuemlvbmUgcHJlbmRlbmRvIHNlbXByZSBsYSBmaXVuemlvbmUgZGkgcmVzZXQgYmFzZVxyXG4gICAgICAgICg8YW55PnRoaXMubmdDb250cm9sLmNvbnRyb2wpLl9fb3JpZ2luYWxfcmVzZXRfXyA9IG9yaWdGdW5jXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAob2JqID09IG51bGwgJiYgdGhpcy5maXJzdEJpbmQpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJzdEJpbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5Nb2RlbCA9IG9iajtcclxuXHJcbiAgICAgICAgLy9QZXIgc3ZlZ2xpYXJlIEFuZ3VsYXIuIElsIHZhbG9yZSBjaGUgZW50cmEgcG90cmViYmUgZXNzZXJlIHZhbGlkby9ub24gdmFsaWRvIGUgcXVlc3RvIGxvIGJpbmRhIGEgdHV0dG8sIGZvcm0gY29tcHJlc29cclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Nb2RlbClcclxuICAgICAgICAgICAgdGhpcy5vbk5vdE51bGxWYWx1ZVNldCgpO1xyXG5cclxuICAgICAgICAvLyBtYXJrRm9yQ2hlY2sgbm9uIHZhIGJlbmUgaW4gcXVhbnRvIGFycml2YW5vIHBvc3NpYmlsbWVudGUgMiB1cGRhdGUgc3UgdW4gc29sbyBjaWNsbyBkaSBzdGFja1xyXG4gICAgICAgIC8vIHNldFRpbWUqdXQgY2hlIHdyYXBwYSB0dXR0byBub24gdmEgYmVuZSBzZW5uw7Igc3BhbW1hIGRlbGxlIGNoYW5nZSBkZXRlY3Rpb24gYSBzdW9uIGRpIGludGVydmFsIGNoZSByYWxsZW50YW5vIHRhbnRpc3NpbW8gbCdhcHBcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0cmEgaW50ZXJuYW1lbnRlIGlsIGNvbXBvbmVudGUgZGkgdmFsaWRhemlvbmUsIG5lIGltcG9zdGEgaSB2YWxpZGF0b3JpIGUgY29sbGVnYSBpbCBGb3JtLCBzZSBwcmVzZW50ZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyVmFsQ29tcChjb21wOiBOZ01vZGVsKSB7XHJcbiAgICAgICAgaWYgKGNvbXApIHtcclxuICAgICAgICAgICAgLy8gw4ggYXJyaXZhdG8gdW4gbnVvdm8gdmFsaWRhdGlvbkNvbnRvcmwgKHN1Y2NlZGUgc29sbyBuZWwgZm9ybS1zZWxlY3QgcXVhbmRvIGNhbWJpYSBsYSBzb3VyY2UgZGEgMCBlbGVtZW50aSAvIG51bGwgYWQgTiBlbGVtZW50aSwgcXVpbmRpIGFsIG1hc3NpbW8gdW5hIHZvbHRhKSBcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgJiYgdGhpcy5Gb3JtKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLnJlbW92ZUNvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sID0gY29tcDtcclxuXHJcbiAgICAgICAgICAgIC8vUXVlc3RhIHNlcnZlIHBlciBwYXNzYXJlIGF2YW50aSBpIHZhbGlkYXRvcmlcclxuICAgICAgICAgICAgaWYodGhpcy5Vc2VVc2VyVmFsaWRhdG9ycylcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG5cclxuICAgICAgICAgICAgLy9TZSBzb25vIHN0YWNjYXRvIGRhbCBGb3JtICh2dW9sIGRpcmUgY2hlIHNvbm8gYWQgZXNlbXBpbyBkZW50cm8gdW4gbmctdGVtcGxhdGUpIGFnZ2l1bmdvIGlsIGNvbnRyb2xsbyBhbCBGb3JtIHBhc3NhdG8gY29tZSBpbnB1dCAoY29udGV4dCBkZWwgdGVtcGxhdGUpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkZvcm0gJiYgIXRoaXMuZm9ybUhhc0JlZW5Cb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0JlZW5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZFJlc2V0RnVuY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIC8vSSB2YWwtcm9iYSBxdWVzdG8gbG8gZmFubm8gYXV0b21hdGljYW1lbnRlIGRlbnRyby4uLiBnbGkgYWx0cmkgbm8gKGVzLiBzZW1wbGljZSBpbnB1dCBjaGVja2JveClcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eUZvck5hdGl2ZUlucHV0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckZvcm0obmdGb3JtOiBOZ0Zvcm0pIHtcclxuICAgICAgICB0aGlzLkZvcm0gPSBuZ0Zvcm07XHJcbiAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICB0aGlzLmZvcm1IYXNCZWVuQm91bmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaW9ybmEgaWwgdmFsb3JlIGUgbGEgdmFsaWRpdMOgIGRlbGwnaW5wdXQgc290dG9zdGFudGUuIE5vbiB2aWVuZSBjaGlhbWF0byBwZXIgaW5wdXQgbmF0aXZpIGNvbWUgbGUgY2hlY2tib3hcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWx1ZSBGb3J6YSBsJ2FnZ2lvcm5hbWVudG8gYW5jaGUgc2Ugbm9uIMOoIHVuIGlucHV0IG5hdGl2byAoaW5wdXQgbmF0aXZvID0gY2hlY2tib3gsIGFkIGVzZW1waW8pXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoZm9yY2VkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChmb3JjZWRWYWx1ZSB8fCB0aGlzLm5hdGl2ZUlucHV0KVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWQoZm9yY2VkVmFsdWU6IGFueSA9IG51bGwsIG1hcmtGb3JDaGVjazogYm9vbGVhbiA9IGZhbHNlLCBtb2RlbEV2YWx1YXRpb25IYW5kbGVkOiBib29sZWFuID0gZmFsc2UsIGludGVybmFsOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgdG9FbWl0ID0gZm9yY2VkVmFsdWUgPT0gbnVsbCB8fCBmb3JjZWRWYWx1ZSA9PSBcIlwiID8gdGhpcy5Nb2RlbCA/PyBcIlwiIDogZm9yY2VkVmFsdWU7XHJcblxyXG4gICAgICAgIGlmKCFtb2RlbEV2YWx1YXRpb25IYW5kbGVkKVxyXG4gICAgICAgICAgICB0aGlzLkV2YWx1YXRlZE1vZGVsID0gdG9FbWl0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRvRW1pdCk7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KG5ldyBDaGFuZ2VFdmVudChpbnRlcm5hbCwgdG9FbWl0KSk7XHJcbiAgICAgICAgaWYgKG1hcmtGb3JDaGVjaylcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIgc3VsIGZvY3VzLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGZvY3VzZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cy5lbWl0KGV2ZW50KTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgRm9jdXNlZCAtIFwiICsgdGhpcy5HZW5lcmF0ZWROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIiBzdWxsYSBmaW5hbGl6emF6aW9uZSBkZWwgdmFsb3JlIGRlbGwnaW5wdXQgKGJsdXIgLyB0YXN0byBpbnZpbywgZWNjLi4uKS4gTWFudGVuZ28gbG8gc3Rlc3NvIG5vbWUgZGVsbCdldmVudG8gZGVpIDx2YWwtKj4gKGlucHV0Q2hhbmdlKSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoC5cclxuICAgICAqIFxyXG4gICAgICogTm9uIHBvc3NvIHRlbmVybG8gcHJvdGVjdGVkIGFsdHJpbWVudGkgcG9zc28gZXNlZ3VpcmxvIHNvbG8gZGFsIC50cyBlIG5vbiBkYWxsJyAuaHRtbFxyXG4gICAgICovXHJcbiAgICBmaW5hbGl6ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZpbmFsaXplZC5lbWl0KHRoaXMubmdDb250cm9sPy5uYW1lPy50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgVmFsdWUgRmluYWxpemVkIC0gXCIgKyB0aGlzLkdlbmVyYXRlZE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhbXBhIHVuIGxvZyBhIGNvbnNvbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIHN0YW1wYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2cobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRkFWX0RFQlVHX01PREUpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQGZvcm1zLWFuZC12YWxpZGF0aW9uczogXCIgKyBtZXNzYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBhYnN0cmFjdCBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkO1xyXG59Il19
515
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUF3QixTQUFTLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2SCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLGtFQUFrRTtBQUVsRSxNQUFNLE9BQWdCLGVBQWU7SUF5TWpDLDJCQUEyQjtJQUMzQixZQUFzQixHQUFzQixFQUFTLFNBQW9CLEVBQVksV0FBdUIsRUFBc0IsRUFBd0IsRUFBcUIsVUFBNEIsRUFBNkMsYUFBcUIsRUFBOEMsY0FBdUIsRUFBVSxjQUF1QixLQUFLO1FBQWxXLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQXNCLE9BQUUsR0FBRixFQUFFLENBQXNCO1FBQXFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQTZDLGtCQUFh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QkFHTCxLQUFLO3NCQUdMLEtBQUs7NEJBT0wsS0FBSzswQkFHTCxLQUFLOytCQUdMLEtBQUs7a0NBR0wsS0FBSzs0QkFHTCxLQUFLOzhCQUdMLEtBQUs7c0JBUUwsS0FBSzt1QkFvQkwsS0FBSzs4QkFVTCxLQUFLO2lDQWNMLFNBQVMsU0FBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7dUNBT2hELFNBQVMsU0FBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7MEJBRy9DLE1BQU07eUJBR04sTUFBTTs2QkFHTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBOZ0Zvcm0sIE5nTW9kZWwsIFJlcXVpcmVkVmFsaWRhdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBPcHRpb25hbCwgSW5qZWN0LCBEaXJlY3RpdmUsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIC8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBDb21wb25lbnRDb250ZXh0IH0gZnJvbSBcIkBlc2ZhZW56YS9hY2Nlc3MtY29udHJvbFwiO1xyXG5pbXBvcnQgeyBBQ09fQ1VTVE9NS0VZLCBGQVZfREVCVUdfTU9ERSB9IGZyb20gJy4uL3Rva2Vucyc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENoYW5nZUV2ZW50IH0gZnJvbSBcIi4uL21vZGVscy9DaGFuZ2VFdmVudFwiO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8qKiBDb21wb25lbnRlIGJhc2UgZGEgY3VpIHR1dHRpIGkgY29tcG9uZW50aSBGb3JtIGltcGxlbWVudGFubyAqL1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VGb3JtQ29udHJvbCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0OTg4XHJcbiAgICAgKiBUTDpEUjsgSWwgcHJpbW8gdmFsb3JlIHBhc3NhdG8gYWwgd3JpdGVWYWx1ZSDDqCBudWxsbyBwZXJjaMOpIHF1YW5kbyBpIGNhZ25hY2NpIGZhbm5vIG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgICAgKiBzY3Jpdm9ubyB1biB3cml0ZVZhbHVlIG51bGxvLi4uIHF1aW5kaSBhbCBwcmltbyBiaW5kaW5nIHNhbHRvIGwnaW5pemlhbGl6emF6aW9uZSBzZSBobyBsYSBjb3BwaWEgbnVsbC1maXJzdEJpbmRcclxuICAgICAqIHBvaSBtZXR0ZW5kbyBmaXJzdEJpbmQgYSBmYWxzZSBkaSBsw6wgaW4gcG9pIGZ1bnppb25vIGNvbWUgZGV2by4gVmlzdGEgbGEgY2FzaXN0aWNhIGV2aXRvIGVzc2VuemlhbG1lbnRlIG1ldMOgIGRldGVjdENoYW5nZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIGRpIHV0aWxpenphcmUgaSB2YWxpZGF0b3JpIGNoZSBsJ3V0ZW50ZSBwaWF6emEgc3VsIGNvbXBvbmVudGUuIFxyXG4gICAgICogRGEgbm9uIHVzYXJlIG5lbCBjYXNvIGRpIGZvcm0tYWRhcHRpdmUgZGF0byBjaGUgaSB2YWxpZGF0b3JpIHZlbmdvbm8gdmFsdXRhdGkgaW4gYmFzZSBhbCB0aXBvIGVjY1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgVXNlVXNlclZhbGlkYXRvcnM6Ym9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjYW1wbyDDqCBvYmJsaWdhdG9yaW8gaSBvcHppb25hbGUgKi9cclxuICAgIHB1YmxpYyBSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhdG8gZGEgcXVlc3RvIGNhbXBvICovXHJcbiAgICBwdWJsaWMgTW9kZWw6IGFueTtcclxuXHJcbiAgICAvKiogVmFsb3JlIGRlbCBNb2RlbGxvICovXHJcbiAgICBwdWJsaWMgRXZhbHVhdGVkTW9kZWw6IHN0cmluZztcclxuXHJcbiAgICAvKiogTm9tZSBnZW5lcmF0byBwZXIgaWwgY29udHJvbGxvIGludGVybm8uIERpIGRlZmF1bHQgw6ggaWwgbm9tZSBkZWwgY29udHJvbGxvIGVzdGVybm8gY29uIGwnYWdnaXVudGEgZGkgXCJfaW50ZXJuYWxcIi4gU2VydmUgcGVyIGV2aXRhcmUgY3Jvc3MtYmluZCAqL1xyXG4gICAgcHVibGljIEdlbmVyYXRlZE5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGlsIEZvcm0gY2hlIGNvbnRpZW5lIHF1ZXN0byBjYW1wbyDDqCBnacOgIHN0YXRvIHJlZ2lzdHJhdG8gKi9cclxuICAgIHByb3RlY3RlZCBmb3JtSGFzQmVlbkJvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByb3RlY3RlZCBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByb3RlY3RlZCBvblRvdWNoZWQgPSAoKSA9PiB7IH07XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgVmVkaSBnZXR0ZXIgZSBzZXR0ZXIgKi9cclxuICAgIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWFsb3JhIGNpIGZvc3NlIHVuIGNvbnRlc3RvIGNvbGxlZ2F0byBxdWVzdGEgdmFyaWFiaWxlIGlkZW50aWZpY2Egc2UgU29ubyBsJ093bmVyIG8gbWVuby5cclxuICAgICAqIFxyXG4gICAgICogU2Ugbm9uIGxvIHNvbm8sIGlsIGNhbXBvIHJpc3VsdGVyw6AgaW4gc29sYSBsZXR0dXJhIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEFwcENvbnRleHRPd25lcnNoaXA6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBTdWJqZWN0IGEgY3VpIGwnb2dnZXR0byBpbnRlcm5vIHNpIGNvbGxlZ2EgcGVyIGVmZmV0dHVhcmUgaWwgZm9jdXMgZGVsbCdlbGVtZW50byBpbnB1dCBzb3R0b3N0YW50ZSAqL1xyXG4gICAgQElucHV0KCkgRm9jdXNTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+O1xyXG4gICAgLyoqXHJcbiAgICAqIEBFWFBFUklNRU5UQUxcclxuICAgICovXHJcbiAgICBASW5wdXQoKSBTZXRWYWxpZGF0aW9uU3ViamVjdDogU3ViamVjdDx7IGZpZWxkTmFtZTogc3RyaW5nLCBlcnJvcjogc3RyaW5nIH0+O1xyXG5cclxuICAgIC8qKiBNb2RhbGl0w6AgaW4gY3VpIHZpZW5lIG1vc3RyYXRvIGlsIGNhbXBvLCAxLTEgcmlzcGV0dG8gYWxsZSBkZWZpbml6aW9uaSBkaSBBbmd1bGFyIE1hdGVyaWFsICAqL1xyXG4gICAgQElucHV0KCkgRmllbGRBcHBlYXJlbmNlOiBcImxlZ2FjeVwiIHwgXCJzdGFuZGFyZFwiIHwgXCJmaWxsXCIgfCBcIm91dGxpbmVcIiA9IFwib3V0bGluZVwiO1xyXG5cclxuICAgIC8qKiBVdGlsaXp6YSBvIG1lbm8gaWwgTGF5b3V0IGRpIHVuIGZvcm0gKExhYmVsIGNvbiBpbnB1dCBkaSBmaWFuY28pLCBzZSBmYWxzZSBtb3N0cmEgc29sbyBsJ2lucHV0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtTGF5b3V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogRGVmaW5pc2NlIHNlIHJpY2hpYW1hcmUgbCdFdmVudEVtaXR0ZXIgKippbnB1dENoYW5nZSoqIGluIG1hbmllcmEgY2xhc3NpY2EgKHRydWUpIG8gc29sbyBwZXIgbGEgY2hhbmdlIGNvbnNpZGVyYXRlIGRlZmluaXRpdmUgY29tZSB0YXN0byBpbnZpbyAvIGJsdXIgLyBlY2MuLi4gKGZhbHNlKSAqL1xyXG4gICAgQElucHV0KCkgRW1pdFBlbmRpbmdDaGFuZ2VzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogQXR0aXZhIG8gZGlzYXR0aXZhIGxhIHZhbGlkYXppb25lIHBlciBxdWVzdG8gY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogUGVybWV0dGUgZGkgc2NyaXZlcmUgbyBtZW5vIG5lbCBjYW1wbyBkaSBJbnB1dC4gU2kgZGlmZmVyZW56aWEgZGFsIFJlYWRvbmx5IGluIHF1YW50byBmaXNpY2FtZW50ZSBsJ0lucHV0IMOoIHNjcml2aWJpbGUgZSB2ZW5nb25vIG1hbnRlbnV0aSBpIHRlbWkgZGVsbGEgdmFsaWRhemlvbmVcclxuICAgICAqIG1hIGludGVyYWdpcmUgZGlyZXR0YW1lbnRlIGNvbiBsYSBjYXNlbGxhIGRpIElucHV0IHBlciBsJ3V0ZW50ZSBub24gw6ggcG9zc2liaWxlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZyb3plbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBQbGFjZWhvbGRlciBwZXIgcXVhbmRvIGwnaW5wdXQgw6ggdnVvdG8gKi9cclxuICAgIEBJbnB1dCgpIFBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBDbGFzc2UgZXh0cmEgcGVyIGlsIGZvcm0tZ3JvdXAgaW4gY3VpIHZpZW5lIHdyYXBwYXRvIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm1Hcm91cENsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBNZXNzYWdnaW8gZGEgbW9zdHJhcmUgcXVhbmRvIGxhIHZhbGlkYXppb25lIGZhbGxpc2NlIHBlciBxdWVzdG8gY29tcG9uZW50ZS4gRGkgZGVmYXVsdCB2aWVuZSBwcm9wb3N0YSBkYWxsYSBsaWJyZXJpYSAqL1xyXG4gICAgQElucHV0KCkgRmFpbGVkVmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIElucHV0IGNoZSBmb3J6YSBsJ2ludmFsaWRpdMOgIGRlbCBjb21wb25lbnRlICovXHJcbiAgICBASW5wdXQoKSBGb3JjZWRFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBNb3N0cmEgdW4gdGVzdG8gYSBzaW5pc3RyYSBkZWxsJ2lucHV0IChGb3JtTGF5b3V0IHBlcm1ldHRlbmRvKSAqL1xyXG4gICAgQElucHV0KCkgTGFiZWw6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsYSBsYWJlbCAqL1xyXG4gICAgQElucHV0KCkgTGFiZWxDb2xXaWR0aDogbnVtYmVyID0gNDtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIElucHV0Q29sV2lkdGg6IG51bWJlciA9IDg7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSDDqCBsJ3VsdGltbyBjb21wb25lbnRlIGRpIHVuIGZvcm0gKHNlcnZlIHBlciByaW11b3ZlcmUgaWwgbWFyZ2luZSBmaW5hbGUpICovXHJcbiAgICBASW5wdXQoKSBMYXN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEFzc29jaWEgaWwgY29tcG9uZW50ZSBGb3JtIGEgcXVlc3RvIGlucHV0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtOiBOZ0Zvcm0gPSBudWxsO1xyXG5cclxuICAgIC8qKiBTb3JnZW50ZSBkYSBjdWkgc2NlZ2xpZXJlIHZhbG9yaSBwZXIgaSBjb21wb25lbnRpIEZvcm0gY2hlIGxvIGNvbnNlbnRvbm8gKi9cclxuICAgIEBJbnB1dCgpIFNvdXJjZTogYW55W107XHJcblxyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJZCBkZWdsaSBvZ2dldHRpIGJpbmRhdGkgbmVsbGEgKipTb3VyY2UqKiAqL1xyXG4gICAgQElucHV0KCkgSWRGaWVsZDogc3RyaW5nID0gJ2lkJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCAqKlBsYWNlaG9sZGVyKiogZGV2J2Vzc2VyZSB1c2F0byBjb21lIHVuYSBmbG9hdGluZyBsYWJlbCBkaSBtYXRlcmlhbCBvIHNvbG8gY29tZSB1biBwbGFjZWhvbGRlciBzdGFuZGFyZCBcclxuICAgICAqIFxyXG4gICAgICogSWdub3JhdGEgbGF0byBhdXRvY29tcGxldGUsIGF1dG9jb21wbGV0ZS1tdWx0aSBlIHNlbGVjdCBpbiBxdWFudG8gaGFubm8gZ2VzdGlvbmkgcGFydGljb2xhcmkgZGkgcGxhY2Vob2xkZXIgZWNjLi4uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZsb2F0aW5nTGFiZWw6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBJbmRpY2EgY2hlIGxhIHBhcnRlIGlucHV0IGRlbCBjb250cm9sbG8gZGV2J2Vzc2VyZSB1bmEgbGFiZWwgcmVhZG9ubHkgZSBsYSBwYXJ0ZSBsYWJlbCBkaSB0aXRvbG8gZGV2J2Vzc2VyZSBpbiBib2xkLiBQZXIgdXRpbGl6emFyZSB1biBzb2xvIGNvbXBvbmVudGUgc2lhIHBlciBsYSBtb2RpZmljYSBjaGUgcGVyIGlsIGRldHRhZ2xpbyAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGxhIGNvbmRpemlvbmUgcGVyIGN1aSB1biBlbGVtZW50byBpbiBNb2RhbGl0w6AgRGlzcGxheSBwdcOyIGVzc2VyZSB2aXNpYmlsZSBpbiBiYXNlIGEgdWx0ZXJpb3JpIGNvbnRyb2xsaSAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheUNvbmRpdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIFRlbXBsYXRlIHBlciB2aXN1YWxpenphcmUgbGEgbW9kYWxpdMOgICoqRGlzcGxheU1vZGUqKiBjb21lIHZ1b2xlIGlsIHByb2dyYW1tYXRvcmUgZnJvY2lvIGRpIHR1cm5vICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TW9kZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKiBMYXlvdXQgZGVsIEZvcm0gcXVhbmRvIMOoIGluIG1vZGFsaXTDoCBEaXNwbGF5LiBEaSBkZWZhdWx0IG1hbnRpZW5lIGxhIGZvcm1hdHRhemlvbmUgYSBmb3JtICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TGF5b3V0OiAnZm9ybScgfCAnaW5saW5lJyB8ICdoaWRkZW4nID0gJ2Zvcm0nO1xyXG5cclxuICAgIC8qKiBTZXBhcmF0b3JlIGRhIG1ldHRlcmUgaW4gYXV0b21hdGljbyBmcmEgdW4gZWxlbWVudG8gRm9ybSBlIGwnYWx0cm8gcXVhbmRvIHNvbm8gaW4gKipEaXNwbGF5TW9kZSoqIGNvbiAqKkRpc3BsYXlMYXlvdXQqKiBpbmxpbmUgKi9cclxuICAgIEBJbnB1dCgpIElubGluZVNlcGFyYXRvcjogc3RyaW5nID0gJyAnO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEVzcHJlc3Npb25lIHNpbWlsLUFuZ3VsYXIgcGVyIGNhbWJpYXJlIGlsIHRlc3RvIGRlaSBjb21wb25lbnRpIGNoZSBzY2VsZ29ubyBpbCBwcm9wcmlvIG1vZGVsbG8gZGEgdW5hICoqU291cmNlKipcclxuICAgICAqIFxyXG4gICAgICogSWwgZnVuemlvbmFtZW50byDDqCBpZGVudGljbyBhbCBiaW5kZXIgZGkgYW5ndWxhciwgc29sbyBjb24gdW5hIGdyYWZmYSBpbnZlY2UgY2hlIDIuXHJcbiAgICAgKiDDiCBpbm9sdHJlIHBvc3NpYmlsZSBhZ2dpdW5nZXJlIHBlenppIGRpIGRlc2NyaXppb25lIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIGNvbiBsYSBzaW50YXNzaSAqKjpwcm9wPyhQcm9wIHZhbGUge3Byb3B9KSoqXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXk6IHN0cmluZyA9ICd7ZGVzY3JpcHRpb259JztcclxuXHJcbiAgICAvKiogUmlzdWx0YXRvIGRlbGwndW5pb25lIGZyYSBsZSBpbmZvcm1hemlvbmkgZGVnbGkgb2dnZXR0aSBpbiAqKlNvdXJjZSoqIGUgbGUgaW1wb3N0YXppb25pIHNwZWNpZmljYXRlIG5lbGwnSW5wdXQgKipEaXNwbGF5KiogKi9cclxuICAgIHB1YmxpYyBCb3VuZFNvdXJjZTogeyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2Ugw6ggaWwgcHJpbW8gQmluZCBkZWxsYSBTb3VyY2UgKi9cclxuICAgIHByb3RlY3RlZCBTb3VyY2VGaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIHNvbGEgbGV0dHVyYSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWRvbmx5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVhZG9ubHk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9zdGEgaWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKl9yZWFkb25seSoqIGdlc3RlbmRvIGFuY2hlIGlsIENvbnRlc3RvIGFwcGxpY2F0aXZvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgVmFsb3JlIGRhIGltcG9zdGFyZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgUmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0T3duZXJzaGlwKVxyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgc2V0dGFyZSBpbiB1bmEgdm9sdGEgc29sbyBnbGkgaW5wdXQgTGFiZWxDb2xXaWR0aCBlIElucHV0Q29sV2lkdGgsIGJhc3RhIHNjcml2ZXJsbyBjb24gbGEgc2ludGFzc2kgXCJYIFlcIlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgSW5wdXQgbmVsIGZvcm1hdG8gXCJYIFlcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgTGFiZWxJbnB1dFJhdGlvKGlucHV0OiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmF0aW8gPSBpbnB1dC5zcGxpdCgvXFxzLyk7XHJcbiAgICAgICAgdGhpcy5MYWJlbENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMF0pO1xyXG4gICAgICAgIHRoaXMuSW5wdXRDb2xXaWR0aCA9IHBhcnNlSW50KHJhdGlvWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogdmFsLXF1YWxjb3NhIGNoZSBmYSBlZmZldHRpdmFtZW50ZSBkYSBpbnB1dCwgbyBldmVudHVhbG1lbnRlIGlsIHNpbmdvbG8gaW5wdXQgaW4gY2FzaSBwYXJ0aWNvbGFyaSAoZXMgY2hlY2tib3gpICovXHJcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbkNvbnRyb2w6IE5nTW9kZWw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyeSBzdWxsJ2VsZW1lbnRvICd2YWxpZGF0aW9uQ29udHJvbCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIHN0YXRpY29cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjdmFsaWRhdGlvbkNvbnRyb2xcIlxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFwidmFsaWRhdGlvbkNvbnRyb2xcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBfdmFsaWRhdGlvbkNvbnRyb2woY29tcDogTmdNb2RlbCkgeyB0aGlzLnJlZ2lzdGVyVmFsQ29tcChjb21wKTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVlcnkgc3VsbCdlbGVtZW50byAndmFsaWRhdGlvbkNvbnRyb2wnIGNoZSBmdW56aW9uYSBpbiBhbWJpZW50ZSBkaW5hbWljb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJ2YWxpZGF0aW9uQ29udHJvbFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZXQgdmFsaWRhdGlvbkNvbnRyb2xfc3RhdGljKGNvbXA6IE5nTW9kZWwpIHsgdGhpcy5yZWdpc3RlclZhbENvbXAoY29tcCk7IH07XHJcblxyXG4gICAgLyoqIEV2ZW50byBjaGlhbWF0byBhbGxhIG1vZGlmaWNhIGRlbCB2YWxvcmUgY29sbGVnYXRvIGEgcXVlc3RvIGNhbXBvICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPENoYW5nZUV2ZW50PigpO1xyXG5cclxuICAgIC8qKiBFdmVudG8gY2hpYW1hdG8gYWwgZm9jdXMgZGVsIGNhbXBvIGRpIHRlc3RvL2NvbWJvL3F1ZWxjaGXDqCwgcmllbWl0dGEgbCdldmVudG8gb3JpZ2luYWxlIEphdmFzY3JpcHQgKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dEZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIC8qKiBFdmVudG8gY2hpYW1hdG8gYWwgZmluYWxpemUgZGVsIGNhbXBvIGRpIHRlc3RvL2NvbWJvL3F1ZWxjaGXDqCAqL1xyXG4gICAgQE91dHB1dCgpIGlucHV0RmluYWxpemVkOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAgIC8qKiBDYWNoZSBkZWxsZSBjb25kaXppb25pIHNjcml0dGUgdGlwbyA6cHJvcD8oUm9iYSBjb24ge3Byb3B9KSAqL1xyXG4gICAgcHJpdmF0ZSBCaW5kQ2hlY2tpbmdHcm91cHM6IHsgZ2xvYmFsOiBzdHJpbmcsIHByb3A6IHN0cmluZywgd2hlbmV4aXN0czogc3RyaW5nIH1bXSA9IFtdXHJcblxyXG4gICAgLyoqIENhY2hlIGRlbGxlIHByb3ByaWV0w6Agc2NyaXR0ZSB0aXBvIC0tPiB7cHJvcH0gKi9cclxuICAgIHByaXZhdGUgQmluZFByb3BlcnRpZXM6IHsgZ2xvYmFsOiBzdHJpbmcsIHByb3A6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSBDb3N0cnV0dG9yZSAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsIHByb3RlY3RlZCBfdmFsaWRhdG9yczogQXJyYXk8YW55PiwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBhYzogQWNjZXNzQ29udHJvbFNlcnZpY2UsIEBPcHRpb25hbCgpIHB1YmxpYyBBcHBDb250ZXh0OiBDb21wb25lbnRDb250ZXh0LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFDT19DVVNUT01LRVkpIHByaXZhdGUgQUNPX0NVU1RPTUtFWTogc3RyaW5nLCBAT3B0aW9uYWwoKSBASW5qZWN0KEZBVl9ERUJVR19NT0RFKSBwcml2YXRlIEZBVl9ERUJVR19NT0RFOiBib29sZWFuLCBwcml2YXRlIG5hdGl2ZUlucHV0OiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKG5nQ29udHJvbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oYW5kbGVOdWxsTmdDb250cm9sKCkpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwibmdDb250cm9sIG51bGxvIHBlciBxdWFsY2hlIG1vdGl2byEgSWwgOTAlIGRlbGxlIGZ1bnppb25hbGl0w6AgZGkgcXVlc3RvIGlucHV0IHNhcmFubm8gZGlzYWJpbGl0YXRlXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9TZSBtaSBhcnJpdmEgbCdpbmplY3RhYmxlIGRlbCBjb250ZXN0byBwb3NzbyBjYXBpcmUgc2UgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGluIHJlYWRvbmx5IG8gbm8sIHNvbG8gc2UgaG8gZ2nDoCBpbml6aWFsaXp6YXRvIGkgY29udHJvbGxlciBjdXN0b20gZGVsbCdhY2Nlc3MgY29udHJvbFxyXG4gICAgICAgIGlmICh0aGlzLkFwcENvbnRleHQgJiYgdGhpcy5BcHBDb250ZXh0Lm5hbWUgJiYgdGhpcy5BQ09fQ1VTVE9NS0VZICYmIHRoaXMuYWMgJiYgdGhpcy5hYy5Jbml0aWFsaXplZEN1c3RvbSkge1xyXG4gICAgICAgICAgICB0aGlzLkFwcENvbnRleHRPd25lcnNoaXAgPSAhdGhpcy5hYy5oYXModGhpcy5BQ09fQ1VTVE9NS0VZICsgXCI6XCIgKyB0aGlzLkFwcENvbnRleHQubmFtZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gIXRoaXMuQXBwQ29udGV4dE93bmVyc2hpcFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG5cclxuICAgICAgICAvL1NlIGhvIGdpw6AgdW4gcGFyZW50IGltcG9zdGF0byB2dW9sIGRpcmUgY2hlIHNvdHRvIGFsIHRhZyA8Zm9ybT4gaG8gZGlyZXR0YW1lbnRlIHVuIHRhZyA8Zm9ybS0qPi4uXHJcbiAgICAgICAgLy8uLiBxdWluZGkgcG9zc28gaW1wb3N0YXJlIGRpcmV0dGFtZW50ZSBpbCByaWZlcmltZW50byBkZWwgRm9ybSBkYSB1c2FyZSBpbiBIVE1MIHBlciBpbCBzdWJtaXR0ZWRcclxuXHJcbiAgICAgICAgLy9TZSBub24gYyfDqCB2dW9sIGRpcmUgY2hlIGRlbnRybyBhbCB0YWcgPGZvcm0+IGMnw6ggdW5vIHNwbGVuZGlkbyA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGU7IGNvbnRleHQ6IC4uLi5cIj4uLlxyXG4gICAgICAgIC8vLi4gaWwgcXVhbGUgYSBzdWEgdm9sdGEgY29udGllbmUgaWwgY29udHJvbGxvIDxmb3JtLSo+IHF1aW5kaSBhdnLDsiBpbCBmb3JtIG5lbGwnaW5wdXQgXCJGb3JtXCJcclxuICAgICAgICBpZiAoKDxhbnk+bmdDb250cm9sKS5fcGFyZW50KVxyXG4gICAgICAgICAgICB0aGlzLkZvcm0gPSA8TmdGb3JtPig8YW55Pm5nQ29udHJvbCkuX3BhcmVudDtcclxuXHJcbiAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIGltcG9zdGFyZSBtZSBzdGVzc28gY29tZSBzaSBkZXZlLCBpbCB2YWxpZGF0b3JlIGludmVjZSBsbyBwYXNzbyBhbCB2YWxpZGF0aW9uLWlucHV0IHF1YW5kbyB2aWVuZSBzZXR0YXRvIGlsIHZhbGlkYXRpb25Db250cm9sXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgICAgICAgIC8vUGVyIHR1dHRpIGkgdmFsaWRhdG9yaTogcmlnZW5lcm8gbGEgZnVuemlvbmUgZGkgdmFsaWRhemlvbmUuIFBlciBxdWFsY2hlIG1vdGl2byBhIHZvbHRlIGhvIHZhbGlkYXRvcmkgc2VuemEuLi5cclxuICAgICAgICAgICAgLy8uLi4gcXVlc3RvIMOoIHVuIHdvcmthcm91bmQgcGVyIGVzc2VyZSBzaWN1cm8gZGkgYXZlcmxhIHNlbXByZS5cclxuICAgICAgICAgICAgLy9Tb2xvIGkgdmFsaWRhdG9yaSBjb24gcGFyYW1ldHJpIGhhbm5vIGJpc29nbm8gZGVsbGEgX2NyZWF0ZVZhbGlkYXRvciAoZXMuIFwibWF4bGVuZ3RoXCIgY2hlIGhhIDEgcGFyYW1ldHJvKSwgcXVpbmRpIG5vIHZhbGlkYXRvcmkgdGlwbyBcInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodi5fY3JlYXRlVmFsaWRhdG9yKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2Ll9jcmVhdGVWYWxpZGF0b3IoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBFc2NsdWRvIHR1dHRpIGkgdmFsaWRhdG9yaSBjaGUgaW4gcmVhbHTDoCBzb25vIGNvbXBvbmVudGlcclxuICAgICAgICAgICAgaWYodGhpcy5fdmFsaWRhdG9ycylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkYXRvcnNUb1NldCA9IHRoaXMuX3ZhbGlkYXRvcnMuZmlsdGVyKHYgPT4gIXYubmdPbkluaXQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnNUb1NldCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8jREVCVUdcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmFsaWRhdG9yaSBpbXBvc3RhdGkgYSBsaXZlbGxvIGRpIGJhc2UgZm9ybSBwZXIgaWwgY29udHJvbGxvOiBcIiArIG5nQ29udHJvbC5uYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZhbGlkYXRvcnNUb1NldCk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIEJpbmQvUGFyc2UgZGVsbGUgdmFyaWUgKipTb3VyY2UqKiB1bmVuZG8gbGUgaW5mb3JtYXppb25pIHNwZWNpZmljYXRlIGluICoqRGlzcGxheSoqXHJcbiAgICAgKiBcclxuICAgICAqIEV2ZW50dWFsbWVudGUgcmllZmZldHR1YSB1biBiaW5kIGFsIG1vZGVsbG8gaW4gYmFzZSBhbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqUmViaW5kTW9kZWxBZnRlclNvdXJjZSoqXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB0cnlCaW5kU291cmNlRGlzcGxheSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuU291cmNlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlNvdXJjZS5sZW5ndGggPT0gMCAmJiAhdGhpcy5Tb3VyY2VGaXJzdEJpbmQpXHJcbiAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5Tb3VyY2VGaXJzdEJpbmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gQ2FjaGUgbG9jYWxlIHBlciBldml0YXJlIGRpIHJpZmFyZSBkZWkgcmVnZXgubWF0Y2ggb2duaSBzYW50YSB2b2x0YVxyXG4gICAgICAgIGlmICh0aGlzLlNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVCaW5kQ2hlY2tpbmdHcm91cHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkJpbmRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUJpbmRQcm9wZXJ0aWVzKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBCbG9jY28gcGVyIGdlbmVyYXJlIGxhIGRlc2NyaXppb25lIGZpbmFsZSBkaSB1biBlbGVtZW50b1xyXG4gICAgICAgICAgICB0aGlzLlNvdXJjZS5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gQWdnaXVuZ28gYWxsYSBCb3VuZFNvdXJjZSBpbiBmb3JtYXRvIHN0YW5kYXJkIEtleVZhbHVlXHJcbiAgICAgICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlLnB1c2godGhpcy50cmFuc2Zvcm1Tb3VyY2VJdGVtKHMpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBQb3N0IHRyeWJpbmQgc2UgYyfDqCB1biBtb2RlbGxvIGFzc29jaWF0byByaWNhbGNvbG8gbCcqKkV2YWx1YXRlZE1vZGVsKipcclxuICAgICAgICAgICAgaWYgKHRoaXMuTW9kZWwpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkV2YWx1YXRlZE1vZGVsID0gdGhpcy5Cb3VuZFNvdXJjZS5maW5kKHQgPT4gdC5pZCA9PSB0aGlzLk1vZGVsKT8uZGVzY3JpcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBWYWx1dGEgaWwgY29udGVudXRvIGRlbGxhIHZhcmlhYmlsZSBCaW5kQ2hlY2tpbmdHcm91cHMgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVCaW5kQ2hlY2tpbmdHcm91cHMoKSB7XHJcbiAgICAgICAgLy8gQmxvY2NvIHBlciB0aXJhcmUgZnVvcmkgbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gLS0+IDpwcm9wPyhSb2JhIGNvbiB7cHJvcH0pXHJcbiAgICAgICAgdmFyIGlmZmVkTWF0Y2hlcyA9IHRoaXMuRGlzcGxheS5tYXRjaCgvOihbYS16XSspXFw/XFwoKFteXFwoXFwpXSspXFwpL2cpO1xyXG4gICAgICAgIGlmIChpZmZlZE1hdGNoZXMpIHtcclxuICAgICAgICAgICAgaWZmZWRNYXRjaGVzLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdGVzc2EgcmVnZXggZGkgc29wcmEgbWEgaWwgdGFnIFwiaVwiIHNlcnZlIHBlciB0aXJhcmUgZnVvcmkgaSBzaW5nb2xpIGNhcHR1cmluZyBncm91cCBlIHBlciBxdWFsY2hlIG1vdGl2byBcclxuICAgICAgICAgICAgICAgIC8vIG5ldyBSZWdFeHAoYmFzZVJlZ2V4LCBcImdcIikgbm9uIGZ1bnppb25hIHF1aW5kaSBub24gaG8gcG90dXRvIHJhemlvbmFsaXp6YXJsb1xyXG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwcyA9IG0ubWF0Y2goLzooW2Etel0rKVxcP1xcKChbXlxcKFxcKV0rKVxcKS9pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQmluZENoZWNraW5nR3JvdXBzLnB1c2goeyBnbG9iYWw6IG0sIHByb3A6IGdyb3Vwc1sxXSwgd2hlbmV4aXN0czogZ3JvdXBzWzJdIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFZhbHV0YSBpbCBjb250ZW51dG8gZGVsbGEgdmFyaWFiaWxlIEJpbmRQcm9wZXJ0aWVzICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlQmluZFByb3BlcnRpZXMoKSB7XHJcbiAgICAgICAgLy8gQmxvY2NvIHBlciB0aXJhcmUgZnVvcmkgbGUgcHJvcHJpZXTDoCBzY3JpdHRlIHRpcG8gLS0+IHtwcm9wfVxyXG4gICAgICAgIHZhciBtYXRjaGVzID0gdGhpcy5EaXNwbGF5Lm1hdGNoKC97W2Etel0rfS9naSk7XHJcbiAgICAgICAgaWYgKG1hdGNoZXMpXHJcbiAgICAgICAgICAgIG1hdGNoZXMuZm9yRWFjaChtID0+IHsgdGhpcy5CaW5kUHJvcGVydGllcy5wdXNoKHsgZ2xvYmFsOiBtLCBwcm9wOiBtLnN1YnN0cmluZygxLCBtLmxlbmd0aCAtIDEpIH0pOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXNmb3JtYSB1biBvZ2dldHRvIGRlbGxhIFNvdXJjZSBhbGxhIHN1YSB2ZXJzaW9uZSBcIm51b3ZhXCIgYmFzYW5kb3NpIHN1bGxlIGluZm9ybWF6aW9uaSBzdSBncnVwcGkgZSBwcm9wcmlldMOgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gZGEgdHJhc2Zvcm1hcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3tpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfX0gT2dnZXR0byBmaW5hbGUgdHJhc2Zvcm1hdG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Tb3VyY2VJdGVtKHM6IGFueSk6IHtpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfSB7XHJcbiAgICAgICAgLy8gUGFydG8gc2VtcHJlIGRhbGxhIHZhcmlhYmlsZSBkaSBEaXNwbGF5LCBwb2kgc29zdGl0dWlzY28gcGV6em8gcGVyIHBlenpvXHJcbiAgICAgICAgbGV0IGRlc2MgPSB0aGlzLkRpc3BsYXk7XHJcblxyXG4gICAgICAgIC8vIFRhZ2xpbyBvIG1hbnRlbmdvIGxlIGNvbmRpemlvbmkgaW4gYmFzZSBhbGxhIHByb3ByaWV0w6Agc3UgY3VpIGZhcmUgY2hlY2tcclxuICAgICAgICAvLyBEb3BvZGljaMOpIHNjcml2byB0dXR0ZSBsZSBwcm9wcmlldMOgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdCA9IHRoaXMuQmluZENoZWNraW5nR3JvdXBzW2ldO1xyXG4gICAgICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKHQuZ2xvYmFsLCAoc1t0LnByb3BdICE9IG51bGwgJiYgc1t0LnByb3BdICE9IHVuZGVmaW5lZCkgPyB0LndoZW5leGlzdHMgOiBcIlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5CaW5kUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdCA9IHRoaXMuQmluZFByb3BlcnRpZXNbaV07XHJcbiAgICAgICAgICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UodC5nbG9iYWwsIHNbdC5wcm9wXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBpZDogc1t0aGlzLklkRmllbGRdLCBkZXNjcmlwdGlvbjogZGVzYyB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGlsIGNvbW9wbmVudGUgaW4gcXVlc3Rpb25lIMOoIGluIGdyYWRvIGRpIGdlc3RpcmUgbmdDb250cm9sIG51bGxpLiBcclxuICAgICAqIERpIGRlZmF1bHQgw6ggKipmYWxzZSoqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBnZXN0aXNjbyBuZ0NvbnRyb2wgbnVsbGksICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIGhhbmRsZU51bGxOZ0NvbnRyb2woKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICAvLyBBIHZvbHRlIG5lbGwnbmdPbkluaXQgbm9uIGNpIHBhc3NhIHF1aW5kaSBsbyBtZXR0byBzaWEgcXVpIHNpYSBuZWxsJ2FmdGVydmlld2luaXQsIHBlbnNvIGNoZSB2YWxnYSBwZXIgaSBjb21wb25lbnRpIGRpIHRlcnplIHBhcnRpXHJcbiAgICAgICAgLy8gY2hlIHNpIGNvbGxlZ2FubyBwZXIgaSBjYXp6aSBsb3JvIGFsIGZvcm0gZWNjLCBxdWluZGkgbGEgcGFydGUgc29wcmEgbm9uIHNlcnZlLi4uIEJPSFxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG5cclxuICAgICAgICAvL0lsIG5vbWUgbm9uIGMnw6ggc2UgbWV0dG8gc3RhbmRhbG9uZSA6IHRydWUgKENIRSBOT04gw6kgREEgTUVUVEVSRSlcclxuICAgICAgICAvL0RhdG8gY2hlIGFuY2hlIGlsIGNvbnRyb2xsbyBlc3Rlcm5vIHZpZW5lIGNvbnNpZGVyYXRvIGNvbWUgY29tcG9uZW50ZSBkZWwgZm9ybSwgbm9uIHBvc3NvIGJhc2FybWkgc29sbyBzdWwgbm9tZSBtYSBkZXZvIGFnZ2l1bmdlcmUgdW4gdGFnLiBJbiBxdWVzdG8gY2FzbyBcIl9pbnRlcm5hbFwiXHJcbiAgICAgICAgLy8gQVRURU5aSU9ORTogUVVBTFNJQVNJIFNJQSBJTCBNT1RJVk8sIFNFIFNUTyBDT1NPIFZJRU5FIFNQT1NUQVRPIERBTEwgbmdPbkluaXQgTk9OIEZVTlpJT05BIFBJVSBOVUxMQVxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICB0aGlzLkdlbmVyYXRlZE5hbWUgPSB0aGlzLm5nQ29udHJvbC5uYW1lLnRvU3RyaW5nKCkgKyBcIl9pbnRlcm5hbFwiO1xyXG5cclxuICAgICAgICAvLyBBVFRFTlpJT05FOiBRVUFMU0lBU0kgU0lBIElMIE1PVElWTywgU0UgU1RPIENPU08gVklFTkUgU1BPU1RBVE8gREFMTCBuZ09uSW5pdCBOT04gRlVOWklPTkEgUElVIE5VTExBXHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybUhhc0JlZW5Cb3VuZCAmJiB0aGlzLnZhbGlkYXRpb25Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0JlZW5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFF1YW5kbyB1biBmb3JtIHZpZW5lIHN1Ym1pdHRhdG8gbGEgdmFyaWFiaWxlIEZvcm0uc3VibWl0dGVkIHZpZW5lIGFzc2VnbmF0YSBhbGwnaW5wdXQgW3N1Ym1pdHRlZF0gZGVsIHZhbC1jb250cm9sXHJcbiAgICAgICAgICAgIC8vIEVzc2VuZG8gY2hlIHBlcsOyIGxhIENEIMOoIE9uUHVzaCBwZXIgZGlyZSBhZCBBbmd1bGFyIGNoZSBsJ0lucHV0IMOoIGNhbWJpYXRvIGUgcGVybWV0dGVyZSBpIHNpZGVmZmVjdHMgZGkgYXNzZWduYXJlIFtzdWJtaXR0ZWRdXHJcbiAgICAgICAgICAgIC8vIGRldm8gYXR0YWNjYXJtaSBhbCBzdWJtaXQgYXR0dWFsZSBkZWwgZm9ybSBlIHByaW1hIGRpIGVzZWd1aXJsbyBkZXZvIG1hcmNhcmUgaWwgY29tcG9uZW50ZSBwZXIgaWwgY2hlY2tcclxuICAgICAgICAgICAgbGV0IG9yaWdGdW5jID0gdGhpcy5Gb3JtLm9uU3VibWl0O1xyXG4gICAgICAgICAgICB2YXIgZm9ybU91dHNpZGVSZWYgPSB0aGlzLkZvcm07XHJcbiAgICAgICAgICAgIHRoaXMuRm9ybS5vblN1Ym1pdCA9IChldik6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0Z1bmMuYXBwbHkoZm9ybU91dHNpZGVSZWYpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU2V0VmFsaWRhdGlvblN1YmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5TZXRWYWxpZGF0aW9uU3ViamVjdC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodi5maWVsZE5hbWUgKyBcIl9pbnRlcm5hbFwiID09IHRoaXMuR2VuZXJhdGVkTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gdGhpcy5Gb3JtLmdldENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoeyBmb3JjZWR0b2ludmFsaWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuc2V0RXJyb3JzKHsgZm9yY2VkdG9pbnZhbGlkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlIHNvbm8gaW4gbW9kYWxpdMOgIGRldGF0Y2hlZCBkZXZvIHJpbXVvdmVyZSBtYW51YWxtZW50ZSBxdWVzdG8gY29udHJvbGxvIHF1YW5kbyBlbnRybyBuZWxsYSBkaXNwb3NlLCBhbHRyaW1lbnRpIHNlIHBvaSBuZSBhbmRhc3NpIGEgcmlhZ2dpdW5nZXJlXHJcbiAgICAgKiB1biBhbHRybyBjb24gbG8gc3Rlc3NvIFwibmFtZVwiIG1hIG1hZ2FyaSByZXNldHRhdG8sIEFuZ3VsYXIgbG8gcmUtaWRyYXRlcmViYmUgY29uIGkgdmFsb3JpIHByZWNlZGVudGkgbm9ub3N0YW50ZSBpbCBtb2RlbGxvIGZvc3NlIHZ1b3RvXHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0gJiYgdGhpcy52YWxpZGF0aW9uQ29udHJvbCAmJiAhIXRoaXMuRm9ybS5nZXRDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpKVxyXG4gICAgICAgICAgICB0aGlzLkZvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVsYWJvcmEgaSB2YWxpZGF0b3JpIGluaWV0dGF0aSBlIGNhcGlzY2Ugc2UgaWwgdmFsb3JlIMOoIG9iYmxpZ2F0b3JpbyBvIG1lbm8gKi9cclxuICAgIGNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgLy8gY29udHJvbGxvIHNlIMOoIHNldHRhdG8gdW4gcmVxdWlyZWQgcGVyIGRlY2lkZXJlIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIHNlIHV0aWxpenphcmUgaWwgdmFsaWRhdG9yZSByZXF1aXJlZCBuZWwgY29tcG9uZW50ZSBpbnRlcm5vXHJcbiAgICAgICAgLy8gTG8gZmFjY2lvIHF1aSBlIG5vbiBpbiB1biBldmVudHVhbGUgbmdPbkluaXQgbyBjb3N0cnV0dG9yZSBwZXJjaMOpIG5nT25Jbml0IG5vbiBzZW1wcmUgdmllbmUgY2hpYW1hdG8gZSBkYSBjb3N0cnV0dG9yZSBpbCB2YWxpZGF0b3JlIG5vbiBoYSBhbmNvcmEgaWwgdmFsb3JlIGdpdXN0b1xyXG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzICYmIHRoaXMuX3ZhbGlkYXRvcnMuc29tZShlbGVtID0+IGVsZW0gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvciAmJiAoZWxlbS5yZXF1aXJlZCA9PT0gdHJ1ZSB8fCBlbGVtLnJlcXVpcmVkID09PSBudWxsIHx8IGVsZW0ucmVxdWlyZWQgPT09IHVuZGVmaW5lZCkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8jREVCVUdcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDb250cm9sbG8gaW1wb3N0YXRvIHJlcXVpcmVkOiBcIiArIHRoaXMubmdDb250cm9sLm5hbWUgKyBcIiBhIGNhdXNhIGRlaSBzZWd1ZW50aSB2YWxpZGF0b3JpXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLl92YWxpZGF0b3JzLmZpbHRlcihlbGVtID0+IGVsZW0gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvciAmJiAoZWxlbS5yZXF1aXJlZCA9PT0gdHJ1ZSB8fCBlbGVtLnJlcXVpcmVkID09PSBudWxsIHx8IGVsZW0ucmVxdWlyZWQgPT09IHVuZGVmaW5lZCkpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsaWRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhlbHBlciBjaGUgY29sbGVnYSBsYSBmdW56aW9uZSBkaSByZXNldCBkZWwgY29udHJvbGxvIGZvcm0gYWwgY29udHJvbGxvIGRpIHZhbGlkYXppb25lIHNvdHRvc3RhbnRlICovXHJcbiAgICBwcml2YXRlIGJpbmRSZXNldEZ1bmN0aW9uKCkge1xyXG4gICAgICAgIC8vZmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICBjb25zdCBvcmlnRnVuYyA9ICg8YW55PnRoaXMubmdDb250cm9sLmNvbnRyb2wpLl9fb3JpZ2luYWxfcmVzZXRfXyB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0O1xyXG4gICAgICAgIHZhciBuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSA9IHRoaXMubmdDb250cm9sLmNvbnRyb2w7XHJcbiAgICAgICAgdmFyIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2w7XHJcblxyXG4gICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wucmVzZXQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIG9yaWdGdW5jLmFwcGx5KG5nQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlKTtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZS5yZXNldCgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vUGVyIGNvbnNlbnRpcmUgcmljaGlhbWkgbXVsdGlwbGkgZGkgcXVlc3RhIGZ1bnppb25lIHByZW5kZW5kbyBzZW1wcmUgbGEgZml1bnppb25lIGRpIHJlc2V0IGJhc2VcclxuICAgICAgICAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gPSBvcmlnRnVuY1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsICYmIHRoaXMuZmlyc3RCaW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RCaW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuTW9kZWwgPSBvYmo7XHJcblxyXG4gICAgICAgIC8vUGVyIHN2ZWdsaWFyZSBBbmd1bGFyLiBJbCB2YWxvcmUgY2hlIGVudHJhIHBvdHJlYmJlIGVzc2VyZSB2YWxpZG8vbm9uIHZhbGlkbyBlIHF1ZXN0byBsbyBiaW5kYSBhIHR1dHRvLCBmb3JtIGNvbXByZXNvXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuTW9kZWwpXHJcbiAgICAgICAgICAgIHRoaXMub25Ob3ROdWxsVmFsdWVTZXQoKTtcclxuXHJcbiAgICAgICAgLy8gbWFya0ZvckNoZWNrIG5vbiB2YSBiZW5lIGluIHF1YW50byBhcnJpdmFubyBwb3NzaWJpbG1lbnRlIDIgdXBkYXRlIHN1IHVuIHNvbG8gY2ljbG8gZGkgc3RhY2tcclxuICAgICAgICAvLyBzZXRUaW1lKnV0IGNoZSB3cmFwcGEgdHV0dG8gbm9uIHZhIGJlbmUgc2VubsOyIHNwYW1tYSBkZWxsZSBjaGFuZ2UgZGV0ZWN0aW9uIGEgc3VvbiBkaSBpbnRlcnZhbCBjaGUgcmFsbGVudGFubyB0YW50aXNzaW1vIGwnYXBwXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdHJhIGludGVybmFtZW50ZSBpbCBjb21wb25lbnRlIGRpIHZhbGlkYXppb25lLCBuZSBpbXBvc3RhIGkgdmFsaWRhdG9yaSBlIGNvbGxlZ2EgaWwgRm9ybSwgc2UgcHJlc2VudGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjdmFsaWRhdGlvbkNvbnRyb2xcIlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlclZhbENvbXAoY29tcDogTmdNb2RlbCkge1xyXG4gICAgICAgIGlmIChjb21wKSB7XHJcbiAgICAgICAgICAgIC8vIMOIIGFycml2YXRvIHVuIG51b3ZvIHZhbGlkYXRpb25Db250b3JsIChzdWNjZWRlIHNvbG8gbmVsIGZvcm0tc2VsZWN0IHF1YW5kbyBjYW1iaWEgbGEgc291cmNlIGRhIDAgZWxlbWVudGkgLyBudWxsIGFkIE4gZWxlbWVudGksIHF1aW5kaSBhbCBtYXNzaW1vIHVuYSB2b2x0YSkgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25Db250cm9sICYmIHRoaXMuRm9ybSlcclxuICAgICAgICAgICAgICAgIHRoaXMuRm9ybS5yZW1vdmVDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbCA9IGNvbXA7XHJcblxyXG4gICAgICAgICAgICAvL1F1ZXN0YSBzZXJ2ZSBwZXIgcGFzc2FyZSBhdmFudGkgaSB2YWxpZGF0b3JpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlVzZVVzZXJWYWxpZGF0b3JzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8jREVCVUdcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmFsaWRhdG9yaSBpbXBvc3RhdGkgYSBsaXZlbGxvIGRpIGJhc2UgZm9ybSBwZXIgaWwgdmFsaWRhdGlvbiBjb250cm9sOiBcIiArIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wubmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLl92YWxpZGF0b3JzKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TZSBzb25vIHN0YWNjYXRvIGRhbCBGb3JtICh2dW9sIGRpcmUgY2hlIHNvbm8gYWQgZXNlbXBpbyBkZW50cm8gdW4gbmctdGVtcGxhdGUpIGFnZ2l1bmdvIGlsIGNvbnRyb2xsbyBhbCBGb3JtIHBhc3NhdG8gY29tZSBpbnB1dCAoY29udGV4dCBkZWwgdGVtcGxhdGUpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkZvcm0gJiYgIXRoaXMuZm9ybUhhc0JlZW5Cb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0JlZW5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZFJlc2V0RnVuY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIC8vSSB2YWwtcm9iYSBxdWVzdG8gbG8gZmFubm8gYXV0b21hdGljYW1lbnRlIGRlbnRyby4uLiBnbGkgYWx0cmkgbm8gKGVzLiBzZW1wbGljZSBpbnB1dCBjaGVja2JveClcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eUZvck5hdGl2ZUlucHV0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckZvcm0obmdGb3JtOiBOZ0Zvcm0pIHtcclxuICAgICAgICB0aGlzLkZvcm0gPSBuZ0Zvcm07XHJcbiAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICB0aGlzLmZvcm1IYXNCZWVuQm91bmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaW9ybmEgaWwgdmFsb3JlIGUgbGEgdmFsaWRpdMOgIGRlbGwnaW5wdXQgc290dG9zdGFudGUuIE5vbiB2aWVuZSBjaGlhbWF0byBwZXIgaW5wdXQgbmF0aXZpIGNvbWUgbGUgY2hlY2tib3hcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWx1ZSBGb3J6YSBsJ2FnZ2lvcm5hbWVudG8gYW5jaGUgc2Ugbm9uIMOoIHVuIGlucHV0IG5hdGl2byAoaW5wdXQgbmF0aXZvID0gY2hlY2tib3gsIGFkIGVzZW1waW8pXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoZm9yY2VkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChmb3JjZWRWYWx1ZSB8fCB0aGlzLm5hdGl2ZUlucHV0KVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWQoZm9yY2VkVmFsdWU6IGFueSA9IG51bGwsIG1hcmtGb3JDaGVjazogYm9vbGVhbiA9IGZhbHNlLCBtb2RlbEV2YWx1YXRpb25IYW5kbGVkOiBib29sZWFuID0gZmFsc2UsIGludGVybmFsOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgdG9FbWl0ID0gZm9yY2VkVmFsdWUgPT0gbnVsbCB8fCBmb3JjZWRWYWx1ZSA9PSBcIlwiID8gdGhpcy5Nb2RlbCA/PyBcIlwiIDogZm9yY2VkVmFsdWU7XHJcblxyXG4gICAgICAgIGlmKCFtb2RlbEV2YWx1YXRpb25IYW5kbGVkKVxyXG4gICAgICAgICAgICB0aGlzLkV2YWx1YXRlZE1vZGVsID0gdG9FbWl0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRvRW1pdCk7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KG5ldyBDaGFuZ2VFdmVudChpbnRlcm5hbCwgdG9FbWl0KSk7XHJcbiAgICAgICAgaWYgKG1hcmtGb3JDaGVjaylcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIgc3VsIGZvY3VzLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGZvY3VzZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cy5lbWl0KGV2ZW50KTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgRm9jdXNlZCAtIFwiICsgdGhpcy5HZW5lcmF0ZWROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIiBzdWxsYSBmaW5hbGl6emF6aW9uZSBkZWwgdmFsb3JlIGRlbGwnaW5wdXQgKGJsdXIgLyB0YXN0byBpbnZpbywgZWNjLi4uKS4gTWFudGVuZ28gbG8gc3Rlc3NvIG5vbWUgZGVsbCdldmVudG8gZGVpIDx2YWwtKj4gKGlucHV0Q2hhbmdlKSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoC5cclxuICAgICAqIFxyXG4gICAgICogTm9uIHBvc3NvIHRlbmVybG8gcHJvdGVjdGVkIGFsdHJpbWVudGkgcG9zc28gZXNlZ3VpcmxvIHNvbG8gZGFsIC50cyBlIG5vbiBkYWxsJyAuaHRtbFxyXG4gICAgICovXHJcbiAgICBmaW5hbGl6ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZpbmFsaXplZC5lbWl0KHRoaXMubmdDb250cm9sPy5uYW1lPy50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgVmFsdWUgRmluYWxpemVkIC0gXCIgKyB0aGlzLkdlbmVyYXRlZE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhbXBhIHVuIGxvZyBhIGNvbnNvbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIHN0YW1wYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2cobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRkFWX0RFQlVHX01PREUpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQGZvcm1zLWFuZC12YWxpZGF0aW9uczogXCIgKyBtZXNzYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBhYnN0cmFjdCBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkO1xyXG59Il19
@@ -1751,8 +1751,13 @@ class BaseFormControl {
1751
1751
  });
1752
1752
  }
1753
1753
  // Escludo tutti i validatori che in realtà sono componenti
1754
- if (this._validators)
1755
- this.ngControl.control.setValidators(this._validators.filter(v => !v.ngOnInit));
1754
+ if (this._validators) {
1755
+ var validatorsToSet = this._validators.filter(v => !v.ngOnInit);
1756
+ this.ngControl.control.setValidators(validatorsToSet);
1757
+ //#DEBUG
1758
+ console.log("Validatori impostati a livello di base form per il controllo: " + ngControl.name);
1759
+ console.log(validatorsToSet);
1760
+ }
1756
1761
  this.ngControl.control.updateValueAndValidity();
1757
1762
  }
1758
1763
  }
@@ -1926,8 +1931,12 @@ class BaseFormControl {
1926
1931
  checkRequiredValidator() {
1927
1932
  // controllo se è settato un required per decidere in maniera condizionale se utilizzare il validatore required nel componente interno
1928
1933
  // 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
1929
- if (this._validators && this._validators.some(elem => elem instanceof RequiredValidator && (elem.required === true || elem.required === null || elem.required === undefined)))
1934
+ if (this._validators && this._validators.some(elem => elem instanceof RequiredValidator && (elem.required === true || elem.required === null || elem.required === undefined))) {
1935
+ //#DEBUG
1936
+ console.log("Controllo impostato required: " + this.ngControl.name + " a causa dei seguenti validatori");
1937
+ console.log(this._validators.filter(elem => elem instanceof RequiredValidator && (elem.required === true || elem.required === null || elem.required === undefined)));
1930
1938
  this.Required = true;
1939
+ }
1931
1940
  }
1932
1941
  /** @ignore */
1933
1942
  ngAfterViewInit() {
@@ -1984,8 +1993,12 @@ class BaseFormControl {
1984
1993
  this.Form.removeControl(this.validationControl);
1985
1994
  this.validationControl = comp;
1986
1995
  //Questa serve per passare avanti i validatori
1987
- if (this.UseUserValidators)
1996
+ if (this.UseUserValidators) {
1997
+ //#DEBUG
1998
+ console.log("Validatori impostati a livello di base form per il validation control: " + this.validationControl.name);
1999
+ console.log(this._validators);
1988
2000
  this.validationControl.control.setValidators(this._validators);
2001
+ }
1989
2002
  //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)
1990
2003
  if (this.Form && !this.formHasBeenBound) {
1991
2004
  this.Form.addControl(this.validationControl);