igniteui-angular 13.0.15 → 13.0.16

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.
@@ -347,8 +347,8 @@ export class IgxOverlayService {
347
347
  }
348
348
  this.updateSize(info);
349
349
  info.settings.positionStrategy.position(info.elementRef.nativeElement.parentElement, { width: info.initialSize.width, height: info.initialSize.height }, document, true, info.settings.target);
350
+ this.addModalClasses(info);
350
351
  if (info.settings.positionStrategy.settings.openAnimation) {
351
- this.buildAnimationPlayers(info);
352
352
  this.playOpenAnimation(info);
353
353
  }
354
354
  else {
@@ -448,6 +448,7 @@ export class IgxOverlayService {
448
448
  if (eventArgs.cancel) {
449
449
  return;
450
450
  }
451
+ this.removeModalClasses(info);
451
452
  if (info.settings.positionStrategy.settings.closeAnimation) {
452
453
  this.playCloseAnimation(info, event);
453
454
  }
@@ -627,7 +628,6 @@ export class IgxOverlayService {
627
628
  // to eliminate flickering show the element just before animation start
628
629
  info.wrapperElement.style.visibility = '';
629
630
  info.visible = true;
630
- this.addModalClasses(info);
631
631
  info.openAnimationPlayer.play();
632
632
  }
633
633
  playCloseAnimation(info, event) {
@@ -652,7 +652,6 @@ export class IgxOverlayService {
652
652
  }
653
653
  this.animationStarting.emit({ id: info.id, animationPlayer: info.closeAnimationPlayer, animationType: 'close' });
654
654
  info.event = event;
655
- this.removeModalClasses(info);
656
655
  info.closeAnimationPlayer.play();
657
656
  }
658
657
  // TODO: check if applyAnimationParams will work with complex animations
@@ -847,4 +846,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
847
846
  type: Inject,
848
847
  args: [DOCUMENT]
849
848
  }] }, { type: i0.NgZone }, { type: i2.PlatformUtil }]; } });
850
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFLSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBSWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUNILE1BQU0sRUFDTixPQUFPLEVBRVAsY0FBYyxFQUNkLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsVUFBVSxFQUNWLGNBQWMsRUFDZCxXQUFXLEVBQ2QsTUFBTSx1QkFBdUIsQ0FBQztBQUcvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQVNuQixnQkFBZ0IsRUFDaEIsd0JBQXdCLEVB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Q0FBQztZQUNqQyx5R0FBeUc7WUFDeEcsSUFBSSxDQUFDLG1CQUEyQixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdEQ7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFpQjtRQUN0QyxvREFBb0Q7UUFDcEQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ25FLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQyx5R0FBeUc7WUFDeEcsSUFBSSxDQUFDLG1CQUEyQixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDckUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xDLHlHQUF5RztZQUN4RyxJQUFJLENBQUMsb0JBQTRCLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2RDtJQUNMLENBQUM7OzhHQXo2QlEsaUJBQWlCLGdKQW9GZCxRQUFRO2tIQXBGWCxpQkFBaUIsY0FESixNQUFNOzJGQUNuQixpQkFBaUI7a0JBRDdCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFxRnpCLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuaW1hdGlvbkJ1aWxkZXIsIEFuaW1hdGlvblJlZmVyZW5jZU1ldGFkYXRhIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIENvbXBvbmVudEZhY3RvcnksXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3QsXG4gICAgSW5qZWN0YWJsZSxcbiAgICBJbmplY3RvcixcbiAgICBOZ01vZHVsZVJlZixcbiAgICBOZ1pvbmUsIE9uRGVzdHJveSwgVHlwZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgZmFkZUluLFxuICAgIGZhZGVPdXQsXG4gICAgSUFuaW1hdGlvblBhcmFtcyxcbiAgICBzY2FsZUluSG9yTGVmdCxcbiAgICBzY2FsZUluSG9yUmlnaHQsXG4gICAgc2NhbGVJblZlckJvdHRvbSxcbiAgICBzY2FsZUluVmVyVG9wLFxuICAgIHNjYWxlT3V0SG9yTGVmdCxcbiAgICBzY2FsZU91dEhvclJpZ2h0LFxuICAgIHNjYWxlT3V0VmVyQm90dG9tLFxuICAgIHNjYWxlT3V0VmVyVG9wLFxuICAgIHNsaWRlSW5Cb3R0b20sXG4gICAgc2xpZGVJblRvcCxcbiAgICBzbGlkZU91dEJvdHRvbSxcbiAgICBzbGlkZU91dFRvcFxufSBmcm9tICcuLi8uLi9hbmltYXRpb25zL21haW4nO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBdXRvUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vcG9zaXRpb24vYXV0by1wb3NpdGlvbi1zdHJhdGVneSc7XG5pbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5IH0gZnJvbSAnLi9wb3NpdGlvbi9jb25uZWN0ZWQtcG9zaXRpb25pbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgQ29udGFpbmVyUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vcG9zaXRpb24vY29udGFpbmVyLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IEVsYXN0aWNQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9wb3NpdGlvbi9lbGFzdGljLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL3Bvc2l0aW9uL2dsb2JhbC1wb3NpdGlvbi1zdHJhdGVneSc7XG5pbXBvcnQgeyBJUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vcG9zaXRpb24vSVBvc2l0aW9uU3RyYXRlZ3knO1xuaW1wb3J0IHsgTm9PcFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi9zY3JvbGwvTm9PcFNjcm9sbFN0cmF0ZWd5JztcbmltcG9ydCB7XG4gICAgQWJzb2x1dGVQb3NpdGlvbixcbiAgICBIb3Jpem9udGFsQWxpZ25tZW50LFxuICAgIE92ZXJsYXlBbmltYXRpb25FdmVudEFyZ3MsXG4gICAgT3ZlcmxheUNhbmNlbGFibGVFdmVudEFyZ3MsXG4gICAgT3ZlcmxheUNsb3NpbmdFdmVudEFyZ3MsXG4gICAgT3ZlcmxheUV2ZW50QXJncyxcbiAgICBPdmVybGF5SW5mbyxcbiAgICBPdmVybGF5U2V0dGluZ3MsXG4gICAgUG9pbnQsXG4gICAgUG9zaXRpb25TZXR0aW5ncyxcbiAgICBSZWxhdGl2ZVBvc2l0aW9uLFxuICAgIFJlbGF0aXZlUG9zaXRpb25TdHJhdGVneSxcbiAgICBWZXJ0aWNhbEFsaWdubWVudFxufSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbi8qKlxuICogW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LmluZnJhZ2lzdGljcy5jb20vcHJvZHVjdHMvaWduaXRlLXVpLWFuZ3VsYXIvYW5ndWxhci9jb21wb25lbnRzL292ZXJsYXktbWFpbilcbiAqIFRoZSBvdmVybGF5IHNlcnZpY2UgYWxsb3dzIHVzZXJzIHRvIHNob3cgY29tcG9uZW50cyBvbiBvdmVybGF5IGRpdiBhYm92ZSBhbGwgb3RoZXIgZWxlbWVudHMgaW4gdGhlIHBhZ2UuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgSWd4T3ZlcmxheVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQganVzdCBiZWZvcmUgdGhlIG92ZXJsYXkgY29udGVudCBzdGFydHMgdG8gb3Blbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogb3BlbmluZyhldmVudDogT3ZlcmxheUNhbmNlbGFibGVFdmVudEFyZ3Mpe1xuICAgICAqICAgICBjb25zdCBvcGVuaW5nID0gZXZlbnQ7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIG92ZXJsYXkgY29udGVudCBpcyBvcGVuZWQgYW5kIGFsbCBhbmltYXRpb25zIGFyZSBmaW5pc2hlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogb3BlbmVkKGV2ZW50OiBPdmVybGF5RXZlbnRBcmdzKXtcbiAgICAgKiAgICAgY29uc3Qgb3BlbmVkID0gZXZlbnQ7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE92ZXJsYXlFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGp1c3QgYmVmb3JlIHRoZSBvdmVybGF5IGNvbnRlbnQgc3RhcnRzIHRvIGNsb3NlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjbG9zaW5nKGV2ZW50OiBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncyl7XG4gICAgICogICAgIGNvbnN0IGNsb3NpbmcgPSBldmVudDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsb3NpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPE92ZXJsYXlDbG9zaW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgb3ZlcmxheSBjb250ZW50IGlzIGNsb3NlZCBhbmQgYWxsIGFuaW1hdGlvbnMgYXJlIGZpbmlzaGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjbG9zZWQoZXZlbnQ6IE92ZXJsYXlFdmVudEFyZ3Mpe1xuICAgICAqICAgICBjb25zdCBjbG9zZWQgPSBldmVudDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8T3ZlcmxheUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGNvbnRlbnQgaXMgYXBwZW5kZWQgdG8gdGhlIG92ZXJsYXksIGFuZCBiZWZvcmUgYW5pbWF0aW9ucyBhcmUgc3RhcnRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29udGVudEFwcGVuZGVkKGV2ZW50OiBPdmVybGF5RXZlbnRBcmdzKXtcbiAgICAgKiAgICAgY29uc3QgY29udGVudEFwcGVuZGVkID0gZXZlbnQ7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjb250ZW50QXBwZW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE92ZXJsYXlFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGp1c3QgYmVmb3JlIHRoZSBvdmVybGF5IGFuaW1hdGlvbiBzdGFydC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogYW5pbWF0aW9uU3RhcnRpbmcoZXZlbnQ6IE92ZXJsYXlBbmltYXRpb25FdmVudEFyZ3Mpe1xuICAgICAqICAgICBjb25zdCBhbmltYXRpb25TdGFydGluZyA9IGV2ZW50O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYW5pbWF0aW9uU3RhcnRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPE92ZXJsYXlBbmltYXRpb25FdmVudEFyZ3M+KCk7XG5cbiAgICBwcml2YXRlIF9jb21wb25lbnRJZCA9IDA7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheUluZm9zOiBPdmVybGF5SW5mb1tdID0gW107XG4gICAgcHJpdmF0ZSBfb3ZlcmxheUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudDtcbiAgICBwcml2YXRlIF9rZXlQcmVzc0V2ZW50TGlzdGVuZXI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICBwcml2YXRlIF9jdXJzb3JTdHlsZUlzU2V0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY3Vyc29yT3JpZ2luYWxWYWx1ZTogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrOiBbXSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBOb09wU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgbW9kYWw6IHRydWUsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIGNsb3NlT25Fc2NhcGU6IGZhbHNlXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9mYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJpdmF0ZSBfYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIGJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsOiBQbGF0Zm9ybVV0aWwpIHtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb3ZlcmxheSBzZXR0aW5ncyB3aXRoIGdsb2JhbCBvciBjb250YWluZXIgcG9zaXRpb24gc3RyYXRlZ3kgYW5kIHByZXNldCBwb3NpdGlvbiBzZXR0aW5nc1xuICAgICAqXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFByZXNldCBwb3NpdGlvbiBzZXR0aW5ncy4gRGVmYXVsdCBwb3NpdGlvbiBpcyAnY2VudGVyJ1xuICAgICAqIEBwYXJhbSBvdXRsZXQgVGhlIG91dGxldCBjb250YWluZXIgdG8gYXR0YWNoIHRoZSBvdmVybGF5IHRvXG4gICAgICogQHJldHVybnMgTm9uLW1vZGFsIG92ZXJsYXkgc2V0dGluZ3MgYmFzZWQgb24gR2xvYmFsIG9yIENvbnRhaW5lciBwb3NpdGlvbiBzdHJhdGVneSBhbmQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlQWJzb2x1dGVPdmVybGF5U2V0dGluZ3MoXG4gICAgICAgIHBvc2l0aW9uPzogQWJzb2x1dGVQb3NpdGlvbiwgb3V0bGV0PzogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWYpOiBPdmVybGF5U2V0dGluZ3Mge1xuICAgICAgICBjb25zdCBwb3NpdGlvblNldHRpbmdzID0gdGhpcy5jcmVhdGVBYnNvbHV0ZVBvc2l0aW9uU2V0dGluZ3MocG9zaXRpb24pO1xuICAgICAgICBjb25zdCBzdHJhdGVneSA9IG91dGxldCA/IG5ldyBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5KHBvc2l0aW9uU2V0dGluZ3MpIDogbmV3IEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3kocG9zaXRpb25TZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IE5vT3BTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgICAgIG91dGxldFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3ZlcmxheVNldHRpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb3ZlcmxheSBzZXR0aW5ncyB3aXRoIGF1dG8sIGNvbm5lY3RlZCBvciBlbGFzdGljIHBvc2l0aW9uIHN0cmF0ZWd5IGFuZCBwcmVzZXQgcG9zaXRpb24gc2V0dGluZ3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXQgQXR0YWNoaW5nIHRhcmdldCBmb3IgdGhlIGNvbXBvbmVudCB0byBzaG93XG4gICAgICogQHBhcmFtIHN0cmF0ZWd5IFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBzdHJhdGVneSB0byBiZSBhcHBsaWVkIHRvIHRoZSBvdmVybGF5IHNldHRpbmdzLiBEZWZhdWx0IGlzIEF1dG8gcG9zaXRpb25pbmcgc3RyYXRlZ3kuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFByZXNldCBwb3NpdGlvbiBzZXR0aW5ncy4gQnkgZGVmYXVsdCB0aGUgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGJlbG93IHRoZSB0YXJnZXQsIGxlZnQgYWxpZ25lZC5cbiAgICAgKiBAcmV0dXJucyBOb24tbW9kYWwgb3ZlcmxheSBzZXR0aW5ncyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdGFyZ2V0LCBzdHJhdGVneSBhbmQgcG9zaXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSZWxhdGl2ZU92ZXJsYXlTZXR0aW5ncyhcbiAgICAgICAgdGFyZ2V0OiBQb2ludCB8IEhUTUxFbGVtZW50LFxuICAgICAgICBwb3NpdGlvbj86IFJlbGF0aXZlUG9zaXRpb24sXG4gICAgICAgIHN0cmF0ZWd5PzogUmVsYXRpdmVQb3NpdGlvblN0cmF0ZWd5KTpcbiAgICAgICAgT3ZlcmxheVNldHRpbmdzIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25TZXR0aW5ncyA9IHRoaXMuY3JlYXRlUmVsYXRpdmVQb3NpdGlvblNldHRpbmdzKHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3Qgb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koc3RyYXRlZ3ksIHBvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBOb09wU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG92ZXJsYXlTZXR0aW5ncztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGVBYnNvbHV0ZVBvc2l0aW9uU2V0dGluZ3MocG9zaXRpb246IEFic29sdXRlUG9zaXRpb24pOiBQb3NpdGlvblNldHRpbmdzIHtcbiAgICAgICAgbGV0IHBvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3M7XG4gICAgICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgQWJzb2x1dGVQb3NpdGlvbi5Cb3R0b206XG4gICAgICAgICAgICAgICAgcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHNsaWRlSW5Cb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBzbGlkZU91dEJvdHRvbVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFic29sdXRlUG9zaXRpb24uVG9wOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuVG9wLFxuICAgICAgICAgICAgICAgICAgICBvcGVuQW5pbWF0aW9uOiBzbGlkZUluVG9wLFxuICAgICAgICAgICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogc2xpZGVPdXRUb3BcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBYnNvbHV0ZVBvc2l0aW9uLkNlbnRlcjpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgICAgICAgICAgICAgIG9wZW5BbmltYXRpb246IGZhZGVJbixcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IGZhZGVPdXRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvblNldHRpbmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlbGF0aXZlUG9zaXRpb25TZXR0aW5ncyhwb3NpdGlvbjogUmVsYXRpdmVQb3NpdGlvbik6IFBvc2l0aW9uU2V0dGluZ3Mge1xuICAgICAgICBsZXQgcG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncztcbiAgICAgICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgICAgICAgY2FzZSBSZWxhdGl2ZVBvc2l0aW9uLkFib3ZlOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Ub3AsXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuVG9wLFxuICAgICAgICAgICAgICAgICAgICBvcGVuQW5pbWF0aW9uOiBzY2FsZUluVmVyQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogc2NhbGVPdXRWZXJCb3R0b20sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVsYXRpdmVQb3NpdGlvbi5CZWxvdzpcbiAgICAgICAgICAgICAgICBwb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogc2NhbGVJblZlclRvcCxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IHNjYWxlT3V0VmVyVG9wXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVsYXRpdmVQb3NpdGlvbi5BZnRlcjpcbiAgICAgICAgICAgICAgICBwb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgICAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHNjYWxlSW5Ib3JMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogc2NhbGVPdXRIb3JMZWZ0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVsYXRpdmVQb3NpdGlvbi5CZWZvcmU6XG4gICAgICAgICAgICAgICAgcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZSxcbiAgICAgICAgICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogc2NhbGVJbkhvclJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogc2NhbGVPdXRIb3JSaWdodFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlbGF0aXZlUG9zaXRpb24uRGVmYXVsdDpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHNjYWxlSW5WZXJUb3AsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBzY2FsZU91dFZlclRvcCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvblNldHRpbmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koc3RyYXRlZ3k6IFJlbGF0aXZlUG9zaXRpb25TdHJhdGVneSwgcG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncyk6IElQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICAgICAgc3dpdGNoIChzdHJhdGVneSkge1xuICAgICAgICAgICAgY2FzZSBSZWxhdGl2ZVBvc2l0aW9uU3RyYXRlZ3kuQ29ubmVjdGVkOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneShwb3NpdGlvblNldHRpbmdzKTtcbiAgICAgICAgICAgIGNhc2UgUmVsYXRpdmVQb3NpdGlvblN0cmF0ZWd5LkVsYXN0aWM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGFzdGljUG9zaXRpb25TdHJhdGVneShwb3NpdGlvblNldHRpbmdzKTtcbiAgICAgICAgICAgIGNhc2UgUmVsYXRpdmVQb3NpdGlvblN0cmF0ZWd5LkF1dG86XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3kocG9zaXRpb25TZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgSWQuIFByb3ZpZGUgdGhpcyBJZCB3aGVuIGNhbGwgYHNob3coaWQpYCBtZXRob2RcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgRWxlbWVudFJlZiB0byBzaG93IGluIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgRGlzcGxheSBzZXR0aW5ncyBmb3IgdGhlIG92ZXJsYXksIHN1Y2ggYXMgcG9zaXRpb25pbmcgYW5kIHNjcm9sbC9jbG9zZSBiZWhhdmlvci5cbiAgICAgKiBAcmV0dXJucyBJZCBvZiB0aGUgY3JlYXRlZCBvdmVybGF5LiBWYWxpZCB1bnRpbCBgZGV0YWNoYCBpcyBjYWxsZWQuXG4gICAgICovXG4gICAgcHVibGljIGF0dGFjaChlbGVtZW50OiBFbGVtZW50UmVmLCBzZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncyk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgSWQuIFByb3ZpZGUgdGhpcyBJZCB3aGVuIGNhbGwgYHNob3coaWQpYCBtZXRob2RcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IFR5cGUgdG8gc2hvdyBpbiBvdmVybGF5XG4gICAgICogQHBhcmFtIHNldHRpbmdzIERpc3BsYXkgc2V0dGluZ3MgZm9yIHRoZSBvdmVybGF5LCBzdWNoIGFzIHBvc2l0aW9uaW5nIGFuZCBzY3JvbGwvY2xvc2UgYmVoYXZpb3IuXG4gICAgICogQHBhcmFtIG1vZHVsZVJlZiBPcHRpb25hbCByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgSW5qZWN0b3IgYW5kIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxuICAgICAqIHRoYXQgY2FuIHJlc29sdmUgdGhlIGNvbXBvbmVudCdzIGZhY3RvcnlcbiAgICAgKiBAcmV0dXJucyBJZCBvZiB0aGUgY3JlYXRlZCBvdmVybGF5LiBWYWxpZCB1bnRpbCBgZGV0YWNoYCBpcyBjYWxsZWQuXG4gICAgICovXG4gICAgcHVibGljIGF0dGFjaChjb21wb25lbnQ6IFR5cGU8YW55Piwgc2V0dGluZ3M/OiBPdmVybGF5U2V0dGluZ3MsXG4gICAgICAgIG1vZHVsZVJlZj86IFBpY2s8TmdNb2R1bGVSZWY8YW55PiwgJ2luamVjdG9yJyB8ICdjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXInPik6IHN0cmluZztcbiAgICBwdWJsaWMgYXR0YWNoKGNvbXBvbmVudDogRWxlbWVudFJlZiB8IFR5cGU8YW55Piwgc2V0dGluZ3M/OiBPdmVybGF5U2V0dGluZ3MsXG4gICAgICAgIG1vZHVsZVJlZj86IFBpY2s8TmdNb2R1bGVSZWY8YW55PiwgJ2luamVjdG9yJyB8ICdjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXInPik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGluZm86IE92ZXJsYXlJbmZvID0gdGhpcy5nZXRPdmVybGF5SW5mbyhjb21wb25lbnQsIG1vZHVsZVJlZik7XG5cbiAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ092ZXJsYXkgd2FzIG5vdCBhYmxlIHRvIGF0dGFjaCBwcm92aWRlZCBjb21wb25lbnQhJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZm8uaWQgPSAodGhpcy5fY29tcG9uZW50SWQrKykudG9TdHJpbmcoKTtcbiAgICAgICAgaW5mby52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZGVmYXVsdFNldHRpbmdzLCBzZXR0aW5ncyk7XG4gICAgICAgIGluZm8uc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zLnB1c2goaW5mbyk7XG4gICAgICAgIGluZm8uaG9vayA9IHRoaXMucGxhY2VFbGVtZW50SG9vayhpbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGluZm8uaW5pdGlhbFNpemUgPSB7IHdpZHRoOiBlbGVtZW50UmVjdC53aWR0aCwgaGVpZ2h0OiBlbGVtZW50UmVjdC5oZWlnaHQgfTtcbiAgICAgICAgdGhpcy5tb3ZlRWxlbWVudFRvT3ZlcmxheShpbmZvKTtcbiAgICAgICAgdGhpcy5jb250ZW50QXBwZW5kZWQuZW1pdCh7IGlkOiBpbmZvLmlkLCBjb21wb25lbnRSZWY6IGluZm8uY29tcG9uZW50UmVmIH0pO1xuICAgICAgICAvLyBUT0RPOiB3aHkgd2UgaGFkIHRoaXMgY2hlY2s/XG4gICAgICAgIC8vIGlmICh0aGlzLl9vdmVybGF5SW5mb3MuaW5kZXhPZihpbmZvKSA9PT0gLTEpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuX292ZXJsYXlJbmZvcy5wdXNoKGluZm8pO1xuICAgICAgICAvLyB9XG4gICAgICAgIGluZm8uc2V0dGluZ3Muc2Nyb2xsU3RyYXRlZ3kuaW5pdGlhbGl6ZSh0aGlzLl9kb2N1bWVudCwgdGhpcywgaW5mby5pZCk7XG4gICAgICAgIGluZm8uc2V0dGluZ3Muc2Nyb2xsU3RyYXRlZ3kuYXR0YWNoKCk7XG4gICAgICAgIHRoaXMuYWRkT3V0c2lkZUNsaWNrTGlzdGVuZXIoaW5mbyk7XG4gICAgICAgIHRoaXMuYWRkUmVzaXplSGFuZGxlcigpO1xuICAgICAgICB0aGlzLmFkZENsb3NlT25Fc2NhcGVMaXN0ZW5lcihpbmZvKTtcbiAgICAgICAgdGhpcy5idWlsZEFuaW1hdGlvblBsYXllcnMoaW5mbyk7XG4gICAgICAgIHJldHVybiBpbmZvLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBvdmVybGF5IHdpdGggdGhlIHByb3ZpZGVkIGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIElkIG9mIHRoZSBvdmVybGF5IHRvIHJlbW92ZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLm92ZXJsYXkuZGV0YWNoKGlkKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGV0YWNoKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgaW5mbzogT3ZlcmxheUluZm8gPSB0aGlzLmdldE92ZXJsYXlCeUlkKGlkKTtcblxuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignaWd4T3ZlcmxheS5kZXRhY2ggd2FzIGNhbGxlZCB3aXRoIHdyb25nIGlkOiAnLCBpZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5kZXRhY2hlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZmluaXNoQW5pbWF0aW9ucyhpbmZvKTtcbiAgICAgICAgaW5mby5zZXR0aW5ncy5zY3JvbGxTdHJhdGVneS5kZXRhY2goKTtcbiAgICAgICAgdGhpcy5yZW1vdmVPdXRzaWRlQ2xpY2tMaXN0ZW5lcihpbmZvKTtcbiAgICAgICAgdGhpcy5yZW1vdmVSZXNpemVIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuY2xlYW5VcChpbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIHRoZSBvdmVybGF5cy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5vdmVybGF5LmRldGFjaEFsbCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRhY2hBbGwoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9vdmVybGF5SW5mb3MubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaCh0aGlzLl9vdmVybGF5SW5mb3NbaV0uaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIG92ZXJsYXkgZm9yIHByb3ZpZGVkIGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIElkIHRvIHNob3cgb3ZlcmxheSBmb3JcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgRGlzcGxheSBzZXR0aW5ncyBmb3IgdGhlIG92ZXJsYXksIHN1Y2ggYXMgcG9zaXRpb25pbmcgYW5kIHNjcm9sbC9jbG9zZSBiZWhhdmlvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvdyhpZDogc3RyaW5nLCBzZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmZvOiBPdmVybGF5SW5mbyA9IHRoaXMuZ2V0T3ZlcmxheUJ5SWQoaWQpO1xuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignaWd4T3ZlcmxheS5zaG93IHdhcyBjYWxsZWQgd2l0aCB3cm9uZyBpZDogJywgaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncyA9IHsgaWQsIGNvbXBvbmVudFJlZjogaW5mby5jb21wb25lbnRSZWYsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5vcGVuaW5nLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBhdHRhY2hcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoaW5mbyk7XG4gICAgICAgIGluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbihcbiAgICAgICAgICAgIGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQsXG4gICAgICAgICAgICB7IHdpZHRoOiBpbmZvLmluaXRpYWxTaXplLndpZHRoLCBoZWlnaHQ6IGluZm8uaW5pdGlhbFNpemUuaGVpZ2h0IH0sXG4gICAgICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBpbmZvLnNldHRpbmdzLnRhcmdldCk7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3Mub3BlbkFuaW1hdGlvbikge1xuICAgICAgICAgICAgdGhpcy5idWlsZEFuaW1hdGlvblBsYXllcnMoaW5mbyk7XG4gICAgICAgICAgICB0aGlzLnBsYXlPcGVuQW5pbWF0aW9uKGluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gIHRvIGVsaW1pbmF0ZSBmbGlja2VyaW5nIHNob3cgdGhlIGVsZW1lbnQganVzdCBiZWZvcmUgb3BlbmVkIGZpcmVzXG4gICAgICAgICAgICBpbmZvLndyYXBwZXJFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgICAgIGluZm8udmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9wZW5lZC5lbWl0KHsgaWQ6IGluZm8uaWQsIGNvbXBvbmVudFJlZjogaW5mby5jb21wb25lbnRSZWYgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlcyB0aGUgY29tcG9uZW50IHdpdGggdGhlIElEIHByb3ZpZGVkIGFzIGEgcGFyYW1ldGVyLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLm92ZXJsYXkuaGlkZShpZCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGhpZGUoaWQ6IHN0cmluZywgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICB0aGlzLl9oaWRlKGlkLCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgYWxsIHRoZSBjb21wb25lbnRzIGFuZCB0aGUgb3ZlcmxheS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5vdmVybGF5LmhpZGVBbGwoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZUFsbCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX292ZXJsYXlJbmZvcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSh0aGlzLl9vdmVybGF5SW5mb3NbaV0uaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwb3NpdGlvbnMgdGhlIGNvbXBvbmVudCB3aXRoIElEIHByb3ZpZGVkIGFzIGEgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIElkIHRvIHJlcG9zaXRpb24gb3ZlcmxheSBmb3JcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5vdmVybGF5LnJlcG9zaXRpb24oaWQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyByZXBvc2l0aW9uKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheUluZm8gPSB0aGlzLmdldE92ZXJsYXlCeUlkKGlkKTtcbiAgICAgICAgaWYgKCFvdmVybGF5SW5mbyB8fCAhb3ZlcmxheUluZm8uc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dyb25nIGlkIHByb3ZpZGVkIGluIG92ZXJsYXkucmVwb3NpdGlvbiBtZXRob2QuIElkOiAnICsgaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3ZlcmxheUluZm8udmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gb3ZlcmxheUluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50UmVjdCA9IGNvbnRlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBvdmVybGF5SW5mby5zZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uKFxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGNvbnRlbnRFbGVtZW50UmVjdC53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRFbGVtZW50UmVjdC5oZWlnaHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudCxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgb3ZlcmxheUluZm8uc2V0dGluZ3MudGFyZ2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPZmZzZXRzIHRoZSBjb250ZW50IGFsb25nIHRoZSBjb3JyZXNwb25kaW5nIGF4aXMgYnkgdGhlIHByb3ZpZGVkIGFtb3VudFxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIElkIHRvIG9mZnNldCBvdmVybGF5IGZvclxuICAgICAqIEBwYXJhbSBkZWx0YVggQW1vdW50IG9mIG9mZnNldCBpbiBob3Jpem9udGFsIGRpcmVjdGlvblxuICAgICAqIEBwYXJhbSBkZWx0YVkgQW1vdW50IG9mIG9mZnNldCBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb25cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5vdmVybGF5LnNldE9mZnNldChpZCwgZGVsdGFYLCBkZWx0YVkpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRPZmZzZXQoaWQ6IHN0cmluZywgZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGluZm86IE92ZXJsYXlJbmZvID0gdGhpcy5nZXRPdmVybGF5QnlJZChpZCk7XG5cbiAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpbmZvLnRyYW5zZm9ybVggKz0gZGVsdGFYO1xuICAgICAgICBpbmZvLnRyYW5zZm9ybVkgKz0gZGVsdGFZO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybVggPSBpbmZvLnRyYW5zZm9ybVg7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybVkgPSBpbmZvLnRyYW5zZm9ybVk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlID0gYHRyYW5zbGF0ZSgke3RyYW5zZm9ybVh9cHgsICR7dHJhbnNmb3JtWX1weClgO1xuICAgICAgICBpbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyByZXBvc2l0aW9uQWxsID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fb3ZlcmxheUluZm9zLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgdGhpcy5yZXBvc2l0aW9uKHRoaXMuX292ZXJsYXlJbmZvc1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXRPdmVybGF5QnlJZChpZDogc3RyaW5nKTogT3ZlcmxheUluZm8ge1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLl9vdmVybGF5SW5mb3MuZmluZChlID0+IGUuaWQgPT09IGlkKTtcbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGlkZShpZDogc3RyaW5nLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGluZm86IE92ZXJsYXlJbmZvID0gdGhpcy5nZXRPdmVybGF5QnlJZChpZCk7XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdpZ3hPdmVybGF5LmhpZGUgd2FzIGNhbGxlZCB3aXRoIHdyb25nIGlkOiAnLCBpZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBPdmVybGF5Q2xvc2luZ0V2ZW50QXJncyA9IHsgaWQsIGNvbXBvbmVudFJlZjogaW5mby5jb21wb25lbnRSZWYsIGNhbmNlbDogZmFsc2UsIGV2ZW50IH07XG4gICAgICAgIHRoaXMuY2xvc2luZy5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy5jbG9zZUFuaW1hdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wbGF5Q2xvc2VBbmltYXRpb24oaW5mbywgZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZURvbmUoaW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE92ZXJsYXlJbmZvKGNvbXBvbmVudDogYW55LCBtb2R1bGVSZWY/OiBQaWNrPE5nTW9kdWxlUmVmPGFueT4sICdpbmplY3RvcicgfCAnY29tcG9uZW50RmFjdG9yeVJlc29sdmVyJz4pOiBPdmVybGF5SW5mbyB7XG4gICAgICAgIGNvbnN0IGluZm86IE92ZXJsYXlJbmZvID0geyBuZ1pvbmU6IHRoaXMuX3pvbmUsIHRyYW5zZm9ybVg6IDAsIHRyYW5zZm9ybVk6IDAgfTtcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgICAgICAgIGluZm8uZWxlbWVudFJlZiA9IGNvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkeW5hbWljRmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxhbnk+O1xuICAgICAgICAgICAgY29uc3QgZmFjdG9yeVJlc29sdmVyID0gbW9kdWxlUmVmID8gbW9kdWxlUmVmLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA6IHRoaXMuX2ZhY3RvcnlSZXNvbHZlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY0ZhY3RvcnkgPSBmYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gbW9kdWxlUmVmID8gbW9kdWxlUmVmLmluamVjdG9yIDogdGhpcy5faW5qZWN0b3I7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50OiBDb21wb25lbnRSZWY8YW55PiA9IGR5bmFtaWNGYWN0b3J5LmNyZWF0ZShpbmplY3Rvcik7XG4gICAgICAgICAgICBpZiAoZHluYW1pY0NvbXBvbmVudC5vbkRlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljQ29tcG9uZW50Lm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5mby5kZXRhY2hlZCAmJiB0aGlzLl9vdmVybGF5SW5mb3MuaW5kZXhPZihpbmZvKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoKGluZm8uaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FwcFJlZi5hdHRhY2hWaWV3KGR5bmFtaWNDb21wb25lbnQuaG9zdFZpZXcpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBuZXdseSBjcmVhdGVkIGZyb20gYSBDb21wb25lbnQsIGl0IGlzIHdyYXBwZWQgaW4gJ25nLWNvbXBvbmVudCcgdGFnIC0gd2UgZG8gbm90IHdhbnQgdGhhdC5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkeW5hbWljQ29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBpbmZvLmVsZW1lbnRSZWYgPSB7IG5hdGl2ZUVsZW1lbnQ6IGVsZW1lbnQgfTtcbiAgICAgICAgICAgIGluZm8uY29tcG9uZW50UmVmID0gZHluYW1pY0NvbXBvbmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxhY2VFbGVtZW50SG9vayhlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgaWYgKCFlbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaG9vayA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBob29rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaG9vaywgZWxlbWVudCk7XG4gICAgICAgIHJldHVybiBob29rO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZUVsZW1lbnRUb092ZXJsYXkoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaW5mby53cmFwcGVyRWxlbWVudCA9IHRoaXMuZ2V0V3JhcHBlckVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSB0aGlzLmdldENvbnRlbnRFbGVtZW50KGluZm8ud3JhcHBlckVsZW1lbnQsIGluZm8uc2V0dGluZ3MubW9kYWwpO1xuICAgICAgICB0aGlzLmdldE92ZXJsYXlFbGVtZW50KGluZm8pLmFwcGVuZENoaWxkKGluZm8ud3JhcHBlckVsZW1lbnQpO1xuICAgICAgICBjb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChpbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXcmFwcGVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXI6IEhUTUxFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnaWd4LW92ZXJsYXlfX3dyYXBwZXInKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb250ZW50RWxlbWVudCh3cmFwcGVyRWxlbWVudDogSFRNTEVsZW1lbnQsIG1vZGFsOiBib29sZWFuKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjb250ZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpZiAobW9kYWwpIHtcbiAgICAgICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnaWd4LW92ZXJsYXlfX2NvbnRlbnQtLW1vZGFsJyk7XG4gICAgICAgICAgICBjb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2lneC1vdmVybGF5X19jb250ZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIChldjogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyAgaGlkZSBlbGVtZW50IHRvIGVsaW1pbmF0ZSBmbGlja2VyaW5nLiBTaG93IHRoZSBlbGVtZW50IGV4YWN0bHkgYmVmb3JlIGFuaW1hdGlvbiBzdGFydHNcbiAgICAgICAgd3JhcHBlckVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuXG4gICAgICAgIHdyYXBwZXJFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE92ZXJsYXlFbGVtZW50KGluZm86IE92ZXJsYXlJbmZvKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBpZiAoaW5mby5zZXR0aW5ncy5vdXRsZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmZvLnNldHRpbmdzLm91dGxldC5uYXRpdmVFbGVtZW50IHx8IGluZm8uc2V0dGluZ3Mub3V0bGV0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fb3ZlcmxheUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpZ3gtb3ZlcmxheScpO1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9vdmVybGF5RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTaXplKGluZm86IE92ZXJsYXlJbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLmNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgLy8gIGlmIHdlIGFyZSBwb3NpdGlvbmluZyBjb21wb25lbnQgdGhpcyBpcyBmaXJzdCB0aW1lIGl0IGdldHMgdmlzaWJsZVxuICAgICAgICAgICAgLy8gIGFuZCB3ZSBjYW4gZmluYWxseSBnZXQgaXRzIHNpemVcbiAgICAgICAgICAgIGluZm8uY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGluZm8uaW5pdGlhbFNpemUgPSBpbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBjb250ZW50IGRpdiB3aWR0aCBvbmx5IGlmIGVsZW1lbnQgdG8gc2hvdyBoYXMgd2lkdGhcbiAgICAgICAgaWYgKGluZm8uaW5pdGlhbFNpemUud2lkdGggIT09IDApIHtcbiAgICAgICAgICAgIGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuc3R5bGUud2lkdGggPSBpbmZvLmluaXRpYWxTaXplLndpZHRoICsgJ3B4JztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VEb25lKGluZm86IE92ZXJsYXlJbmZvKSB7XG4gICAgICAgIGluZm8udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5mby53cmFwcGVyRWxlbWVudCkge1xuICAgICAgICAgICAgLy8gdG8gZWxpbWluYXRlIGZsaWNrZXJpbmcgc2hvdyB0aGUgZWxlbWVudCBqdXN0IGJlZm9yZSBhbmltYXRpb24gc3RhcnRcbiAgICAgICAgICAgIGluZm8ud3JhcHBlckVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW5mby5jbG9zZUFuaW1hdGlvbkRldGFjaGluZykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCh7IGlkOiBpbmZvLmlkLCBjb21wb25lbnRSZWY6IGluZm8uY29tcG9uZW50UmVmLCBldmVudDogaW5mby5ldmVudCB9KTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgaW5mby5ldmVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFuVXAoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgY29uc3QgY2hpbGQ6IEhUTUxFbGVtZW50ID0gaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG91dGxldCA9IHRoaXMuZ2V0T3ZlcmxheUVsZW1lbnQoaW5mbyk7XG4gICAgICAgIC8vIGlmIHNhbWUgZWxlbWVudCBpcyBzaG93biBpbiBvdGhlciBvdmVybGF5IG91dGxldCB3aWxsIG5vdCBjb250YWluXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IGFuZCB3ZSBzaG91bGQgbm90IHJlbW92ZSBpdCBmb3JtIG91dGxldFxuICAgICAgICBpZiAob3V0bGV0LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgICAgICAgICAgb3V0bGV0LnJlbW92ZUNoaWxkKGNoaWxkLnBhcmVudE5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZm8uY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICB0aGlzLl9hcHBSZWYuZGV0YWNoVmlldyhpbmZvLmNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgICAgICAgICBpbmZvLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgaW5mby5jb21wb25lbnRSZWY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZm8uaG9vaykge1xuICAgICAgICAgICAgaW5mby5ob29rLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBpbmZvLmhvb2spO1xuICAgICAgICAgICAgaW5mby5ob29rLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaW5mby5ob29rKTtcbiAgICAgICAgICAgIGRlbGV0ZSBpbmZvLmhvb2s7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX292ZXJsYXlJbmZvcy5pbmRleE9mKGluZm8pO1xuICAgICAgICB0aGlzLl9vdmVybGF5SW5mb3Muc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAvLyB0aGlzLl9vdmVybGF5RWxlbWVudC5wYXJlbnRFbGVtZW50IGNoZWNrIGp1c3QgZm9yIHRlc3RzIHRoYXQgbWFudWFsbHkgZGVsZXRlIHRoZSBlbGVtZW50XG4gICAgICAgIGlmICh0aGlzLl9vdmVybGF5SW5mb3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxheUVsZW1lbnQgJiYgdGhpcy5fb3ZlcmxheUVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fb3ZlcmxheUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2xvc2VPbkVzY2FwZUxpc3RlbmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhbiBhbGwgdGhlIHJlc291cmNlcyBhdHRhY2hlZCB0byBpbmZvXG4gICAgICAgIGRlbGV0ZSBpbmZvLmVsZW1lbnRSZWY7XG4gICAgICAgIGRlbGV0ZSBpbmZvLnNldHRpbmdzO1xuICAgICAgICBkZWxldGUgaW5mby5pbml0aWFsU2l6ZTtcbiAgICAgICAgaW5mby5vcGVuQW5pbWF0aW9uRGV0YWNoaW5nID0gdHJ1ZTtcbiAgICAgICAgaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyPy5kZXN0cm95KCk7XG4gICAgICAgIGRlbGV0ZSBpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXI7XG4gICAgICAgIGRlbGV0ZSBpbmZvLm9wZW5BbmltYXRpb25Jbm5lclBsYXllcjtcbiAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvbkRldGFjaGluZyA9IHRydWU7XG4gICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXI/LmRlc3Ryb3koKTtcbiAgICAgICAgZGVsZXRlIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXI7XG4gICAgICAgIGRlbGV0ZSBpbmZvLmNsb3NlQW5pbWF0aW9uSW5uZXJQbGF5ZXI7XG4gICAgICAgIGRlbGV0ZSBpbmZvLm5nWm9uZTtcbiAgICAgICAgZGVsZXRlIGluZm8ud3JhcHBlckVsZW1lbnQ7XG4gICAgICAgIGluZm8gPSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxheU9wZW5BbmltYXRpb24oaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgLy8gIGlmIHRoZXJlIGlzIG9wZW5pbmcgYW5pbWF0aW9uIGFscmVhZHkgc3RhcnRlZCBkbyBub3RoaW5nXG4gICAgICAgIGlmIChpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIgPT0gbnVsbCB8fCBpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIuaGFzU3RhcnRlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgY2xvc2luZyBhbmltYXRpb24gYWxyZWFkeSBzdGFydGVkIHN0YXJ0IG9wZW4gYW5pbWF0aW9uIGZyb20gd2hlcmUgY2xvc2Ugb25lIGhhcyByZWFjaGVkXG4gICAgICAgIC8vICBhbmQgcmVzZXQgY2xvc2UgYW5pbWF0aW9uXG4gICAgICAgIGlmIChpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyPy5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIC8vICBnZXRQb3NpdGlvbigpIHJldHVybnMgd2hhdCBwYXJ0IG9mIHRoZSBhbmltYXRpb24gaXMgcGFzc2VkLCBlLmcuIDAuNSBpZiBoYWxmIHRoZSBhbmltYXRpb25cbiAgICAgICAgICAgIC8vICBpcyBkb25lLCAwLjc1IGlmIDMvNCBvZiB0aGUgYW5pbWF0aW9uIGlzIGRvbmUuIEFzIHdlIG5lZWQgdG8gc3RhcnQgbmV4dCBhbmltYXRpb24gZnJvbSB3aGVyZVxuICAgICAgICAgICAgLy8gIHRoZSBwcmV2aW91cyBoYXMgZmluaXNoZWQgd2UgbmVlZCB0aGUgYW1vdW50IHVwIHRvIDEsIHRoZXJlZm9yZSB3ZSBhcmUgc3VidHJhY3Rpbmcgd2hhdFxuICAgICAgICAgICAgLy8gIGdldFBvc2l0aW9uKCkgcmV0dXJucyBmcm9tIG9uZVxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSAxIC0gaW5mby5jbG9zZUFuaW1hdGlvbklubmVyUGxheWVyLmdldFBvc2l0aW9uKCk7XG4gICAgICAgICAgICBpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyLnJlc2V0KCk7XG4gICAgICAgICAgICAvLyBjYWxsaW5nIHJlc2V0IGRvZXMgbm90IGNoYW5nZSBoYXNTdGFydGVkIHRvIGZhbHNlLiBUaGlzIGlzIHdoeSB3ZSBhcmUgZG9pbmcgaXQgaGVyIHZpYSBpbnRlcm5hbCBmaWVsZFxuICAgICAgICAgICAgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgYXMgYW55KS5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyLmluaXQoKTtcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5zZXRQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFuaW1hdGlvblN0YXJ0aW5nLmVtaXQoeyBpZDogaW5mby5pZCwgYW5pbWF0aW9uUGxheWVyOiBpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIsIGFuaW1hdGlvblR5cGU6ICdvcGVuJyB9KTtcblxuICAgICAgICAvLyAgdG8gZWxpbWluYXRlIGZsaWNrZXJpbmcgc2hvdyB0aGUgZWxlbWVudCBqdXN0IGJlZm9yZSBhbmltYXRpb24gc3RhcnRcbiAgICAgICAgaW5mby53cmFwcGVyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgIGluZm8udmlzaWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuYWRkTW9kYWxDbGFzc2VzKGluZm8pO1xuICAgICAgICBpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIucGxheSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxheUNsb3NlQW5pbWF0aW9uKGluZm86IE92ZXJsYXlJbmZvLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIC8vICBpZiB0aGVyZSBpcyBjbG9zaW5nIGFuaW1hdGlvbiBhbHJlYWR5IHN0YXJ0ZWQgZG8gbm90aGluZ1xuICAgICAgICBpZiAoaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciA9PSBudWxsIHx8IGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIuaGFzU3RhcnRlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgb3BlbmluZyBhbmltYXRpb24gYWxyZWFkeSBzdGFydGVkIHN0YXJ0IGNsb3NlIGFuaW1hdGlvbiBmcm9tIHdoZXJlIG9wZW4gb25lIGhhcyByZWFjaGVkXG4gICAgICAgIC8vICBhbmQgcmVtb3ZlIG9wZW4gYW5pbWF0aW9uXG4gICAgICAgIGlmIChpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXI/Lmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgLy8gIGdldFBvc2l0aW9uKCkgcmV0dXJucyB3aGF0IHBhcnQgb2YgdGhlIGFuaW1hdGlvbiBpcyBwYXNzZWQsIGUuZy4gMC41IGlmIGhhbGYgdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gIGlzIGRvbmUsIDAuNzUgaWYgMy80IG9mIHRoZSBhbmltYXRpb24gaXMgZG9uZS4gQXMgd2UgbmVlZCB0byBzdGFydCBuZXh0IGFuaW1hdGlvbiBmcm9tIHdoZXJlXG4gICAgICAgICAgICAvLyAgdGhlIHByZXZpb3VzIGhhcyBmaW5pc2hlZCB3ZSBuZWVkIHRoZSBhbW91bnQgdXAgdG8gMSwgdGhlcmVmb3JlIHdlIGFyZSBzdWJ0cmFjdGluZyB3aGF0XG4gICAgICAgICAgICAvLyAgZ2V0UG9zaXRpb24oKSByZXR1cm5zIGZyb20gb25lXG4gICAgICAgICAgICAvLyAgVE9ETzogVGhpcyBhc3N1bWVzIG9wZW5pbmcgYW5kIGNsb3NpbmcgYW5pbWF0aW9ucyBhcmUgbWlycm9yZWQuXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IDEgLSBpbmZvLm9wZW5BbmltYXRpb25Jbm5lclBsYXllci5nZXRQb3NpdGlvbigpO1xuICAgICAgICAgICAgaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyLnJlc2V0KCk7XG4gICAgICAgICAgICAvLyBjYWxsaW5nIHJlc2V0IGRvZXMgbm90IGNoYW5nZSBoYXNTdGFydGVkIHRvIGZhbHNlLiBUaGlzIGlzIHdoeSB3ZSBhcmUgZG9pbmcgaXQgaGVyIHZpYSBpbnRlcm5hbCBmaWVsZFxuICAgICAgICAgICAgKGluZm8ub3BlbkFuaW1hdGlvblBsYXllciBhcyBhbnkpLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyLmluaXQoKTtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIuc2V0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbmltYXRpb25TdGFydGluZy5lbWl0KHsgaWQ6IGluZm8uaWQsIGFuaW1hdGlvblBsYXllcjogaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciwgYW5pbWF0aW9uVHlwZTogJ2Nsb3NlJyB9KTtcbiAgICAgICAgaW5mby5ldmVudCA9IGV2ZW50O1xuICAgICAgICB0aGlzLnJlbW92ZU1vZGFsQ2xhc3NlcyhpbmZvKTtcbiAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5wbGF5KCk7XG4gICAgfVxuXG4gICAgLy8gIFRPRE86IGNoZWNrIGlmIGFwcGx5QW5pbWF0aW9uUGFyYW1zIHdpbGwgd29yayB3aXRoIGNvbXBsZXggYW5pbWF0aW9uc1xuICAgIHByaXZhdGUgYXBwbHlBbmltYXRpb25QYXJhbXMod3JhcHBlckVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhbmltYXRpb25PcHRpb25zOiBBbmltYXRpb25SZWZlcmVuY2VNZXRhZGF0YSkge1xuICAgICAgICBpZiAoIWFuaW1hdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9ICcwbXMnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYW5pbWF0aW9uT3B0aW9ucy5vcHRpb25zIHx8ICFhbmltYXRpb25PcHRpb25zLm9wdGlvbnMucGFyYW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0gYW5pbWF0aW9uT3B0aW9ucy5vcHRpb25zLnBhcmFtcyBhcyBJQW5pbWF0aW9uUGFyYW1zO1xuICAgICAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICB3cmFwcGVyRWxlbWVudC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5lYXNpbmcpIHtcbiAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50LnN0eWxlLnRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiA9IHBhcmFtcy5lYXNpbmc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRvY3VtZW50Q2xpY2tlZCA9IChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyAgaWYgd2UgZ2V0IHRvIG1vZGFsIG92ZXJsYXkganVzdCByZXR1cm4gLSB3ZSBzaG91bGQgbm90IGNsb3NlIGFueXRoaW5nIHVuZGVyIGl0XG4gICAgICAgIC8vICBpZiB3ZSBnZXQgdG8gbm9uLW1vZGFsIG92ZXJsYXkgZG8gdGhlIG5leHQ6XG4gICAgICAgIC8vICAgMS4gQ2hlY2sgaXQgaGFzIGNsb3NlIG9uIG91dHNpZGUgY2xpY2suIElmIG5vdCBnbyBvbiB0byBuZXh0IG92ZXJsYXk7XG4gICAgICAgIC8vICAgMi4gSWYgdHJ1ZSBjaGVjayBpZiBjbGljayBpcyBvbiB0aGUgZWxlbWVudC4gSWYgaXQgaXMgb24gdGhlIGVsZW1lbnQgd2UgaGF2ZSBjbG9zZWRcbiAgICAgICAgLy8gIGFscmVhZHkgYWxsIHByZXZpb3VzIG5vbi1tb2RhbCB3aXRoIGNsb3NlIG9uIG91dHNpZGUgY2xpY2sgZWxlbWVudHMsIHNvIHdlIHJldHVybi4gSWZcbiAgICAgICAgLy8gIG5vdCBjbG9zZSB0aGUgb3ZlcmxheSBhbmQgY2hlY2sgbmV4dFxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fb3ZlcmxheUluZm9zLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgY29uc3QgaW5mbyA9IHRoaXMuX292ZXJsYXlJbmZvc1tpXTtcbiAgICAgICAgICAgIGlmIChpbmZvLnNldHRpbmdzLm1vZGFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZm8uc2V0dGluZ3MuY2xvc2VPbk91dHNpZGVDbGljaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2LmNvbXBvc2VkID8gZXYuY29tcG9zZWRQYXRoKClbMF0gOiBldi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUVsZW1lbnQgPSBpbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY2xpY2sgaXMgb24gdGhlIG92ZXJsYXkgZWxlbWVudCBvciBvbiBhbiBlbGVtZW50IGZyb20gdGhlIGV4Y2x1c2lvbiBsaXN0LCBhbmQgaWYgc28gZG8gbm90IGNsb3NlIHRoZSBvdmVybGF5XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjbHVkZUVsZW1lbnRzID0gaW5mby5zZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA/XG4gICAgICAgICAgICAgICAgICAgIFsuLi5pbmZvLnNldHRpbmdzLmV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrLCBvdmVybGF5RWxlbWVudF0gOiBbb3ZlcmxheUVsZW1lbnRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5zaWRlQ2xpY2s6IGJvb2xlYW4gPSBleGNsdWRlRWxlbWVudHMuc29tZShlID0+IGUuY29udGFpbnModGFyZ2V0IGFzIE5vZGUpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJbnNpZGVDbGljaykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIC8vICBpZiB0aGUgY2xpY2sgaXMgb3V0c2lkZSBjbGljaywgYnV0IGNsb3NlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCBkbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgJiYgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hpZGUoaW5mby5pZCwgZXYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGFkZE91dHNpZGVDbGlja0xpc3RlbmVyKGluZm86IE92ZXJsYXlJbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLmNsb3NlT25PdXRzaWRlQ2xpY2spIHtcbiAgICAgICAgICAgIGlmIChpbmZvLnNldHRpbmdzLm1vZGFsKSB7XG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50KGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCwgJ2NsaWNrJylcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChlOiBFdmVudCkgPT4gdGhpcy5faGlkZShpbmZvLmlkLCBlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIC8vICBpZiBhbGwgb3ZlcmxheXMgbWludXMgY2xvc2luZyBvdmVybGF5cyBlcXVhbHMgb25lIGFkZCB0aGUgaGFuZGxlclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlJbmZvcy5maWx0ZXIoeCA9PiB4LnNldHRpbmdzLmNsb3NlT25PdXRzaWRlQ2xpY2sgJiYgIXguc2V0dGluZ3MubW9kYWwpLmxlbmd0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zLmZpbHRlcih4ID0+IHguc2V0dGluZ3MuY2xvc2VPbk91dHNpZGVDbGljayAmJiAheC5zZXR0aW5ncy5tb2RhbCAmJlxuICAgICAgICAgICAgICAgICAgICB4LmNsb3NlQW5pbWF0aW9uUGxheWVyICYmXG4gICAgICAgICAgICAgICAgICAgIHguY2xvc2VBbmltYXRpb25QbGF5ZXIuaGFzU3RhcnRlZCgpKS5sZW5ndGggPT09IDEpIHtcblxuICAgICAgICAgICAgICAgIC8vIGNsaWNrIGV2ZW50IGlzIG5vdCBmaXJlZCBvbiBpT1MuIFRvIG1ha2UgZWxlbWVudCBcImNsaWNrYWJsZVwiIHdlIGFyZVxuICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgdGhlIGN1cnNvciB0byBwb2ludGVyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxhdGZvcm1VdGlsLmlzSU9TICYmICF0aGlzLl9jdXJzb3JTdHlsZUlzU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWUgPSB0aGlzLl9kb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvclN0eWxlSXNTZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kb2N1bWVudENsaWNrZWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVPdXRzaWRlQ2xpY2tMaXN0ZW5lcihpbmZvOiBPdmVybGF5SW5mbykge1xuICAgICAgICBpZiAoaW5mby5zZXR0aW5ncy5tb2RhbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGxldCBzaG91bGRSZW1vdmVDbGlja0V2ZW50TGlzdGVuZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG8uc2V0dGluZ3MubW9kYWwgPT09IGZhbHNlICYmIG8uaWQgIT09IGluZm8uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVtb3ZlQ2xpY2tFdmVudExpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVDbGlja0V2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3Vyc29yU3R5bGVJc1NldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IHRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yU3R5bGVJc1NldCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja2VkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkUmVzaXplSGFuZGxlcigpIHtcbiAgICAgICAgY29uc3QgY2xvc2luZ092ZXJsYXlzQ291bnQgPVxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihvID0+IG8uY2xvc2VBbmltYXRpb25QbGF5ZXIgJiYgby5jbG9zZUFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpXG4gICAgICAgICAgICAgICAgLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlJbmZvcy5sZW5ndGggLSBjbG9zaW5nT3ZlcmxheXNDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXBvc2l0aW9uQWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlUmVzaXplSGFuZGxlcigpIHtcbiAgICAgICAgY29uc3QgY2xvc2luZ092ZXJsYXlzQ291bnQgPVxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihvID0+IG8uY2xvc2VBbmltYXRpb25QbGF5ZXIgJiYgby5jbG9zZUFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpXG4gICAgICAgICAgICAgICAgLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlJbmZvcy5sZW5ndGggLSBjbG9zaW5nT3ZlcmxheXNDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXBvc2l0aW9uQWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQ2xvc2VPbkVzY2FwZUxpc3RlbmVyKGluZm86IE92ZXJsYXlJbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLmNsb3NlT25Fc2NhcGUgJiYgIXRoaXMuX2tleVByZXNzRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5fa2V5UHJlc3NFdmVudExpc3RlbmVyID0gZnJvbUV2ZW50KHRoaXMuX2RvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChldjogS2V5Ym9hcmRFdmVudCkgPT4gZXYua2V5ID09PSAnRXNjYXBlJyB8fCBldi5rZXkgPT09ICdFc2MnKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gdGhpcy5fb3ZlcmxheUluZm9zLmZpbHRlcihvID0+IG8udmlzaWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZpc2libGVPdmVybGF5cy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0T3ZlcmxheUluZm8gPSB2aXNpYmxlT3ZlcmxheXNbdmlzaWJsZU92ZXJsYXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRPdmVybGF5SW5mby52aXNpYmxlICYmIHRhcmdldE92ZXJsYXlJbmZvLnNldHRpbmdzLmNsb3NlT25Fc2NhcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKHRhcmdldE92ZXJsYXlJbmZvLmlkLCBldik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUNsb3NlT25Fc2NhcGVMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2tleVByZXNzRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5fa2V5UHJlc3NFdmVudExpc3RlbmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9rZXlQcmVzc0V2ZW50TGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRNb2RhbENsYXNzZXMoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaWYgKGluZm8uc2V0dGluZ3MubW9kYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgd3JhcHBlckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaWd4LW92ZXJsYXlfX3dyYXBwZXInKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlBbmltYXRpb25QYXJhbXMod3JhcHBlckVsZW1lbnQsIGluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy5vcGVuQW5pbWF0aW9uKTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd3JhcHBlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaWd4LW92ZXJsYXlfX3dyYXBwZXItLW1vZGFsJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTW9kYWxDbGFzc2VzKGluZm86IE92ZXJsYXlJbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLm1vZGFsKSB7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlBbmltYXRpb25QYXJhbXMod3JhcHBlckVsZW1lbnQsIGluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy5jbG9zZUFuaW1hdGlvbik7XG4gICAgICAgICAgICB3cmFwcGVyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpZ3gtb3ZlcmxheV9fd3JhcHBlci0tbW9kYWwnKTtcbiAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lneC1vdmVybGF5X193cmFwcGVyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQW5pbWF0aW9uUGxheWVycyhpbmZvOiBPdmVybGF5SW5mbykge1xuICAgICAgICBpZiAoaW5mby5zZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLm9wZW5BbmltYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbkJ1aWxkZXIgPSB0aGlzLmJ1aWxkZXIuYnVpbGQoaW5mby5zZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLm9wZW5BbmltYXRpb24pO1xuICAgICAgICAgICAgaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyID0gYW5pbWF0aW9uQnVpbGRlci5jcmVhdGUoaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyAgQW5pbWF0aW9uUGxheWVyLmdldFBvc2l0aW9uIHJldHVybnMgYWx3YXlzIDAuIFRvIHdvcmthcm91bmQgdGhpcyB3ZSBhcmUgZ2V0dGluZyBpbm5lciBXZWJBbmltYXRpb25QbGF5ZXJcbiAgICAgICAgICAgIC8vICBhbmQgdGhlbiBnZXR0aW5nIHRoZSBwb3NpdGlvbnMgZnJvbSBpdC5cbiAgICAgICAgICAgIC8vICBUaGlzIGlzIGxvZ2dlZCBpbiBBbmd1bGFyIGhlcmUgLSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xODg5MVxuICAgICAgICAgICAgLy8gIEFzIHNvb24gYXMgdGhpcyBpcyByZXNvbHZlZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgaGFja1xuICAgICAgICAgICAgY29uc3QgaW5uZXJSZW5kZXJlciA9IChpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIgYXMgYW55KS5fcmVuZGVyZXI7XG4gICAgICAgICAgICBpbmZvLm9wZW5BbmltYXRpb25Jbm5lclBsYXllciA9IGlubmVyUmVuZGVyZXIuZW5naW5lLnBsYXllcnNbaW5uZXJSZW5kZXJlci5lbmdpbmUucGxheWVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5vbkRvbmUoKCkgPT4gdGhpcy5vcGVuQW5pbWF0aW9uRG9uZShpbmZvKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy5jbG9zZUFuaW1hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgYW5pbWF0aW9uQnVpbGRlciA9IHRoaXMuYnVpbGRlci5idWlsZChpbmZvLnNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3MuY2xvc2VBbmltYXRpb24pO1xuICAgICAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciA9IGFuaW1hdGlvbkJ1aWxkZXIuY3JlYXRlKGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gIEFuaW1hdGlvblBsYXllci5nZXRQb3NpdGlvbiByZXR1cm5zIGFsd2F5cyAwLiBUbyB3b3JrYXJvdW5kIHRoaXMgd2UgYXJlIGdldHRpbmcgaW5uZXIgV2ViQW5pbWF0aW9uUGxheWVyXG4gICAgICAgICAgICAvLyAgYW5kIHRoZW4gZ2V0dGluZyB0aGUgcG9zaXRpb25zIGZyb20gaXQuXG4gICAgICAgICAgICAvLyAgVGhpcyBpcyBsb2dnZWQgaW4gQW5ndWxhciBoZXJlIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTg4OTFcbiAgICAgICAgICAgIC8vICBBcyBzb29uIGFzIHRoaXMgaXMgcmVzb2x2ZWQgd2UgY2FuIHJlbW92ZSB0aGlzIGhhY2tcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVuZGVyZXIgPSAoaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciBhcyBhbnkpLl9yZW5kZXJlcjtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25Jbm5lclBsYXllciA9IGlubmVyUmVuZGVyZXIuZW5naW5lLnBsYXllcnNbaW5uZXJSZW5kZXJlci5lbmdpbmUucGxheWVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIub25Eb25lKCgpID0+IHRoaXMuY2xvc2VBbmltYXRpb25Eb25lKGluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb3BlbkFuaW1hdGlvbkRvbmUoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaWYgKCFpbmZvLm9wZW5BbmltYXRpb25EZXRhY2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbmVkLmVtaXQoeyBpZDogaW5mby5pZCwgY29tcG9uZW50UmVmOiBpbmZvLmNvbXBvbmVudFJlZiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyKSB7XG4gICAgICAgICAgICBpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVzZXQgZG9lcyBub3QgY2hhbmdlIGhhc1N0YXJ0ZWQgdG8gZmFsc2UuIFRoaXMgaXMgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXJlIHZpYSBpbnRlcm5hbCBmaWVsZFxuICAgICAgICAgICAgKGluZm8ub3BlbkFuaW1hdGlvblBsYXllciBhcyBhbnkpLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyB3aGVuIGFuaW1hdGlvbiBmaW5pc2ggYW5ndWxhciBkZWxldGVzIGFsbCBvbkRvbmUgaGFuZGxlcnMgc28gd2UgbmVlZCB0byBhZGQgaXQgYWdhaW4gOihcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5vbkRvbmUoKCkgPT4gdGhpcy5vcGVuQW5pbWF0aW9uRG9uZShpbmZvKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgJiYgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVzZXQgZG9lcyBub3QgY2hhbmdlIGhhc1N0YXJ0ZWQgdG8gZmFsc2UuIFRoaXMgaXMgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXJlIHZpYSBpbnRlcm5hbCBmaWVsZFxuICAgICAgICAgICAgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgYXMgYW55KS5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbG9zZUFuaW1hdGlvbkRvbmUoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaWYgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIpIHtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVzZXQgZG9lcyBub3QgY2hhbmdlIGhhc1N0YXJ0ZWQgdG8gZmFsc2UuIFRoaXMgaXMgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXJlIHZpYSBpbnRlcm5hbCBmaWVsZFxuICAgICAgICAgICAgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgYXMgYW55KS5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gd2hlbiBhbmltYXRpb24gZmluaXNoIGFuZ3VsYXIgZGVsZXRlcyBhbGwgb25Eb25lIGhhbmRsZXJzIHNvIHdlIG5lZWQgdG8gYWRkIGl0IGFnYWluIDooXG4gICAgICAgICAgICBpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyLm9uRG9uZSgoKSA9PiB0aGlzLmNsb3NlQW5pbWF0aW9uRG9uZShpbmZvKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyICYmIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5yZXNldCgpO1xuICAgICAgICAgICAgLy8gY2FsbGluZyByZXNldCBkb2VzIG5vdCBjaGFuZ2UgaGFzU3RhcnRlZCB0byBmYWxzZS4gVGhpcyBpcyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlcmUgdmlhIGludGVybmFsIGZpZWxkXG4gICAgICAgICAgICAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyIGFzIGFueSkuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlRG9uZShpbmZvKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmlzaEFuaW1hdGlvbnMoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGVtaXQgaGVyZSBvcGVuZWQgb3IgY2xvc2VkIGV2ZW50c1xuICAgICAgICBpZiAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyICYmIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5yZXNldCgpO1xuICAgICAgICAgICAgLy8gY2FsbGluZyByZXNldCBkb2VzIG5vdCBjaGFuZ2UgaGFzU3RhcnRlZCB0byBmYWxzZS4gVGhpcyBpcyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlcmUgdmlhIGludGVybmFsIGZpZWxkXG4gICAgICAgICAgICAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyIGFzIGFueSkuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciAmJiBpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyLmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5yZXNldCgpO1xuICAgICAgICAgICAgLy8gY2FsbGluZyByZXNldCBkb2VzIG5vdCBjaGFuZ2UgaGFzU3RhcnRlZCB0byBmYWxzZS4gVGhpcyBpcyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlcmUgdmlhIGludGVybmFsIGZpZWxkXG4gICAgICAgICAgICAoaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciBhcyBhbnkpLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
849
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFLSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBSWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUNILE1BQU0sRUFDTixPQUFPLEVBRVAsY0FBYyxFQUNkLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsVUFBVSxFQUNWLGNBQWMsRUFDZCxXQUFXLEVBQ2QsTUFBTSx1QkFBdUIsQ0FBQztBQUcvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQVNuQixnQkFBZ0IsRUFDaEIsd0JBQXdCLEVB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QUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN0RDtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQWlCO1FBQ3RDLG9EQUFvRDtRQUNwRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDbkUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLHlHQUF5RztZQUN4RyxJQUFJLENBQUMsbUJBQTJCLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN0RDtRQUNELElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMseUdBQXlHO1lBQ3hHLElBQUksQ0FBQyxvQkFBNEIsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQzs7OEdBeDZCUSxpQkFBaUIsZ0pBb0ZkLFFBQVE7a0hBcEZYLGlCQUFpQixjQURKLE1BQU07MkZBQ25CLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQXFGekIsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5pbWF0aW9uQnVpbGRlciwgQW5pbWF0aW9uUmVmZXJlbmNlTWV0YWRhdGEgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgQ29tcG9uZW50RmFjdG9yeSxcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RhYmxlLFxuICAgIEluamVjdG9yLFxuICAgIE5nTW9kdWxlUmVmLFxuICAgIE5nWm9uZSwgT25EZXN0cm95LCBUeXBlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBmYWRlSW4sXG4gICAgZmFkZU91dCxcbiAgICBJQW5pbWF0aW9uUGFyYW1zLFxuICAgIHNjYWxlSW5Ib3JMZWZ0LFxuICAgIHNjYWxlSW5Ib3JSaWdodCxcbiAgICBzY2FsZUluVmVyQm90dG9tLFxuICAgIHNjYWxlSW5WZXJUb3AsXG4gICAgc2NhbGVPdXRIb3JMZWZ0LFxuICAgIHNjYWxlT3V0SG9yUmlnaHQsXG4gICAgc2NhbGVPdXRWZXJCb3R0b20sXG4gICAgc2NhbGVPdXRWZXJUb3AsXG4gICAgc2xpZGVJbkJvdHRvbSxcbiAgICBzbGlkZUluVG9wLFxuICAgIHNsaWRlT3V0Qm90dG9tLFxuICAgIHNsaWRlT3V0VG9wXG59IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvbWFpbic7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEF1dG9Qb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9wb3NpdGlvbi9hdXRvLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kgfSBmcm9tICcuL3Bvc2l0aW9uL2Nvbm5lY3RlZC1wb3NpdGlvbmluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9wb3NpdGlvbi9jb250YWluZXItcG9zaXRpb24tc3RyYXRlZ3knO1xuaW1wb3J0IHsgRWxhc3RpY1Bvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL3Bvc2l0aW9uL2VsYXN0aWMtcG9zaXRpb24tc3RyYXRlZ3knO1xuaW1wb3J0IHsgR2xvYmFsUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vcG9zaXRpb24vZ2xvYmFsLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IElQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9wb3NpdGlvbi9JUG9zaXRpb25TdHJhdGVneSc7XG5pbXBvcnQgeyBOb09wU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuL3Njcm9sbC9Ob09wU2Nyb2xsU3RyYXRlZ3knO1xuaW1wb3J0IHtcbiAgICBBYnNvbHV0ZVBvc2l0aW9uLFxuICAgIEhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgT3ZlcmxheUFuaW1hdGlvbkV2ZW50QXJncyxcbiAgICBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncyxcbiAgICBPdmVybGF5Q2xvc2luZ0V2ZW50QXJncyxcbiAgICBPdmVybGF5RXZlbnRBcmdzLFxuICAgIE92ZXJsYXlJbmZvLFxuICAgIE92ZXJsYXlTZXR0aW5ncyxcbiAgICBQb2ludCxcbiAgICBQb3NpdGlvblNldHRpbmdzLFxuICAgIFJlbGF0aXZlUG9zaXRpb24sXG4gICAgUmVsYXRpdmVQb3NpdGlvblN0cmF0ZWd5LFxuICAgIFZlcnRpY2FsQWxpZ25tZW50XG59IGZyb20gJy4vdXRpbGl0aWVzJztcblxuLyoqXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvb3ZlcmxheS1tYWluKVxuICogVGhlIG92ZXJsYXkgc2VydmljZSBhbGxvd3MgdXNlcnMgdG8gc2hvdyBjb21wb25lbnRzIG9uIG92ZXJsYXkgZGl2IGFib3ZlIGFsbCBvdGhlciBlbGVtZW50cyBpbiB0aGUgcGFnZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBJZ3hPdmVybGF5U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBqdXN0IGJlZm9yZSB0aGUgb3ZlcmxheSBjb250ZW50IHN0YXJ0cyB0byBvcGVuLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBvcGVuaW5nKGV2ZW50OiBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncyl7XG4gICAgICogICAgIGNvbnN0IG9wZW5pbmcgPSBldmVudDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG9wZW5pbmcgPSBuZXcgRXZlbnRFbWl0dGVyPE92ZXJsYXlDYW5jZWxhYmxlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgb3ZlcmxheSBjb250ZW50IGlzIG9wZW5lZCBhbmQgYWxsIGFuaW1hdGlvbnMgYXJlIGZpbmlzaGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBvcGVuZWQoZXZlbnQ6IE92ZXJsYXlFdmVudEFyZ3Mpe1xuICAgICAqICAgICBjb25zdCBvcGVuZWQgPSBldmVudDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8T3ZlcmxheUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQganVzdCBiZWZvcmUgdGhlIG92ZXJsYXkgY29udGVudCBzdGFydHMgdG8gY2xvc2UuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNsb3NpbmcoZXZlbnQ6IE92ZXJsYXlDYW5jZWxhYmxlRXZlbnRBcmdzKXtcbiAgICAgKiAgICAgY29uc3QgY2xvc2luZyA9IGV2ZW50O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8T3ZlcmxheUNsb3NpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHRoZSBvdmVybGF5IGNvbnRlbnQgaXMgY2xvc2VkIGFuZCBhbGwgYW5pbWF0aW9ucyBhcmUgZmluaXNoZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNsb3NlZChldmVudDogT3ZlcmxheUV2ZW50QXJncyl7XG4gICAgICogICAgIGNvbnN0IGNsb3NlZCA9IGV2ZW50O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxPdmVybGF5RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgY29udGVudCBpcyBhcHBlbmRlZCB0byB0aGUgb3ZlcmxheSwgYW5kIGJlZm9yZSBhbmltYXRpb25zIGFyZSBzdGFydGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb250ZW50QXBwZW5kZWQoZXZlbnQ6IE92ZXJsYXlFdmVudEFyZ3Mpe1xuICAgICAqICAgICBjb25zdCBjb250ZW50QXBwZW5kZWQgPSBldmVudDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbnRlbnRBcHBlbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8T3ZlcmxheUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQganVzdCBiZWZvcmUgdGhlIG92ZXJsYXkgYW5pbWF0aW9uIHN0YXJ0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBhbmltYXRpb25TdGFydGluZyhldmVudDogT3ZlcmxheUFuaW1hdGlvbkV2ZW50QXJncyl7XG4gICAgICogICAgIGNvbnN0IGFuaW1hdGlvblN0YXJ0aW5nID0gZXZlbnQ7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhbmltYXRpb25TdGFydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8T3ZlcmxheUFuaW1hdGlvbkV2ZW50QXJncz4oKTtcblxuICAgIHByaXZhdGUgX2NvbXBvbmVudElkID0gMDtcbiAgICBwcml2YXRlIF9vdmVybGF5SW5mb3M6IE92ZXJsYXlJbmZvW10gPSBbXTtcbiAgICBwcml2YXRlIF9vdmVybGF5RWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50O1xuICAgIHByaXZhdGUgX2tleVByZXNzRXZlbnRMaXN0ZW5lcjogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIHByaXZhdGUgX2N1cnNvclN0eWxlSXNTZXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jdXJzb3JPcmlnaW5hbFZhbHVlOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2s6IFtdLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgR2xvYmFsUG9zaXRpb25TdHJhdGVneSgpLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IE5vT3BTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbkVzY2FwZTogZmFsc2VcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2ZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBwcml2YXRlIF9hcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55LFxuICAgICAgICBwcml2YXRlIF96b25lOiBOZ1pvbmUsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybVV0aWw6IFBsYXRmb3JtVXRpbCkge1xuICAgICAgICB0aGlzLl9kb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvdmVybGF5IHNldHRpbmdzIHdpdGggZ2xvYmFsIG9yIGNvbnRhaW5lciBwb3NpdGlvbiBzdHJhdGVneSBhbmQgcHJlc2V0IHBvc2l0aW9uIHNldHRpbmdzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gUHJlc2V0IHBvc2l0aW9uIHNldHRpbmdzLiBEZWZhdWx0IHBvc2l0aW9uIGlzICdjZW50ZXInXG4gICAgICogQHBhcmFtIG91dGxldCBUaGUgb3V0bGV0IGNvbnRhaW5lciB0byBhdHRhY2ggdGhlIG92ZXJsYXkgdG9cbiAgICAgKiBAcmV0dXJucyBOb24tbW9kYWwgb3ZlcmxheSBzZXR0aW5ncyBiYXNlZCBvbiBHbG9iYWwgb3IgQ29udGFpbmVyIHBvc2l0aW9uIHN0cmF0ZWd5IGFuZCB0aGUgcHJvdmlkZWQgcG9zaXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBYnNvbHV0ZU92ZXJsYXlTZXR0aW5ncyhcbiAgICAgICAgcG9zaXRpb24/OiBBYnNvbHV0ZVBvc2l0aW9uLCBvdXRsZXQ/OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZik6IE92ZXJsYXlTZXR0aW5ncyB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uU2V0dGluZ3MgPSB0aGlzLmNyZWF0ZUFic29sdXRlUG9zaXRpb25TZXR0aW5ncyhwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gb3V0bGV0ID8gbmV3IENvbnRhaW5lclBvc2l0aW9uU3RyYXRlZ3kocG9zaXRpb25TZXR0aW5ncykgOiBuZXcgR2xvYmFsUG9zaXRpb25TdHJhdGVneShwb3NpdGlvblNldHRpbmdzKTtcbiAgICAgICAgY29uc3Qgb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgTm9PcFNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICAgICAgb3V0bGV0XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvdmVybGF5U2V0dGluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvdmVybGF5IHNldHRpbmdzIHdpdGggYXV0bywgY29ubmVjdGVkIG9yIGVsYXN0aWMgcG9zaXRpb24gc3RyYXRlZ3kgYW5kIHByZXNldCBwb3NpdGlvbiBzZXR0aW5nc1xuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCBBdHRhY2hpbmcgdGFyZ2V0IGZvciB0aGUgY29tcG9uZW50IHRvIHNob3dcbiAgICAgKiBAcGFyYW0gc3RyYXRlZ3kgVGhlIHJlbGF0aXZlIHBvc2l0aW9uIHN0cmF0ZWd5IHRvIGJlIGFwcGxpZWQgdG8gdGhlIG92ZXJsYXkgc2V0dGluZ3MuIERlZmF1bHQgaXMgQXV0byBwb3NpdGlvbmluZyBzdHJhdGVneS5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gUHJlc2V0IHBvc2l0aW9uIHNldHRpbmdzLiBCeSBkZWZhdWx0IHRoZSBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYmVsb3cgdGhlIHRhcmdldCwgbGVmdCBhbGlnbmVkLlxuICAgICAqIEByZXR1cm5zIE5vbi1tb2RhbCBvdmVybGF5IHNldHRpbmdzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB0YXJnZXQsIHN0cmF0ZWd5IGFuZCBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlbGF0aXZlT3ZlcmxheVNldHRpbmdzKFxuICAgICAgICB0YXJnZXQ6IFBvaW50IHwgSFRNTEVsZW1lbnQsXG4gICAgICAgIHBvc2l0aW9uPzogUmVsYXRpdmVQb3NpdGlvbixcbiAgICAgICAgc3RyYXRlZ3k/OiBSZWxhdGl2ZVBvc2l0aW9uU3RyYXRlZ3kpOlxuICAgICAgICBPdmVybGF5U2V0dGluZ3Mge1xuICAgICAgICBjb25zdCBwb3NpdGlvblNldHRpbmdzID0gdGhpcy5jcmVhdGVSZWxhdGl2ZVBvc2l0aW9uU2V0dGluZ3MocG9zaXRpb24pO1xuICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMuY3JlYXRlUG9zaXRpb25TdHJhdGVneShzdHJhdGVneSwgcG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IE5vT3BTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3ZlcmxheVNldHRpbmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUFic29sdXRlUG9zaXRpb25TZXR0aW5ncyhwb3NpdGlvbjogQWJzb2x1dGVQb3NpdGlvbik6IFBvc2l0aW9uU2V0dGluZ3Mge1xuICAgICAgICBsZXQgcG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncztcbiAgICAgICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgICAgICAgY2FzZSBBYnNvbHV0ZVBvc2l0aW9uLkJvdHRvbTpcbiAgICAgICAgICAgICAgICBwb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogc2xpZGVJbkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IHNsaWRlT3V0Qm90dG9tXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQWJzb2x1dGVQb3NpdGlvbi5Ub3A6XG4gICAgICAgICAgICAgICAgcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Ub3AsXG4gICAgICAgICAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHNsaWRlSW5Ub3AsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBzbGlkZU91dFRvcFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFic29sdXRlUG9zaXRpb24uQ2VudGVyOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBwb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZSxcbiAgICAgICAgICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogZmFkZUluLFxuICAgICAgICAgICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogZmFkZU91dFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uU2V0dGluZ3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUmVsYXRpdmVQb3NpdGlvblNldHRpbmdzKHBvc2l0aW9uOiBSZWxhdGl2ZVBvc2l0aW9uKTogUG9zaXRpb25TZXR0aW5ncyB7XG4gICAgICAgIGxldCBwb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzO1xuICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIFJlbGF0aXZlUG9zaXRpb24uQWJvdmU6XG4gICAgICAgICAgICAgICAgcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LlRvcCxcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Ub3AsXG4gICAgICAgICAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHNjYWxlSW5WZXJCb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBzY2FsZU91dFZlckJvdHRvbSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBSZWxhdGl2ZVBvc2l0aW9uLkJlbG93OlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBvcGVuQW5pbWF0aW9uOiBzY2FsZUluVmVyVG9wLFxuICAgICAgICAgICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogc2NhbGVPdXRWZXJUb3BcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBSZWxhdGl2ZVBvc2l0aW9uLkFmdGVyOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZSxcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZSxcbiAgICAgICAgICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogc2NhbGVJbkhvckxlZnQsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBzY2FsZU91dEhvckxlZnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBSZWxhdGl2ZVBvc2l0aW9uLkJlZm9yZTpcbiAgICAgICAgICAgICAgICBwb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5MZWZ0LFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZSxcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5MZWZ0LFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuTWlkZGxlLFxuICAgICAgICAgICAgICAgICAgICBvcGVuQW5pbWF0aW9uOiBzY2FsZUluSG9yUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBzY2FsZU91dEhvclJpZ2h0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVsYXRpdmVQb3NpdGlvbi5EZWZhdWx0OlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBwb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5MZWZ0LFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogc2NhbGVJblZlclRvcCxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IHNjYWxlT3V0VmVyVG9wLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uU2V0dGluZ3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUG9zaXRpb25TdHJhdGVneShzdHJhdGVneTogUmVsYXRpdmVQb3NpdGlvblN0cmF0ZWd5LCBwb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzKTogSVBvc2l0aW9uU3RyYXRlZ3kge1xuICAgICAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7XG4gICAgICAgICAgICBjYXNlIFJlbGF0aXZlUG9zaXRpb25TdHJhdGVneS5Db25uZWN0ZWQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHBvc2l0aW9uU2V0dGluZ3MpO1xuICAgICAgICAgICAgY2FzZSBSZWxhdGl2ZVBvc2l0aW9uU3RyYXRlZ3kuRWxhc3RpYzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVsYXN0aWNQb3NpdGlvblN0cmF0ZWd5KHBvc2l0aW9uU2V0dGluZ3MpO1xuICAgICAgICAgICAgY2FzZSBSZWxhdGl2ZVBvc2l0aW9uU3RyYXRlZ3kuQXV0bzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneShwb3NpdGlvblNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBJZC4gUHJvdmlkZSB0aGlzIElkIHdoZW4gY2FsbCBgc2hvdyhpZClgIG1ldGhvZFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbXBvbmVudCBFbGVtZW50UmVmIHRvIHNob3cgaW4gb3ZlcmxheVxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBEaXNwbGF5IHNldHRpbmdzIGZvciB0aGUgb3ZlcmxheSwgc3VjaCBhcyBwb3NpdGlvbmluZyBhbmQgc2Nyb2xsL2Nsb3NlIGJlaGF2aW9yLlxuICAgICAqIEByZXR1cm5zIElkIG9mIHRoZSBjcmVhdGVkIG92ZXJsYXkuIFZhbGlkIHVudGlsIGBkZXRhY2hgIGlzIGNhbGxlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXR0YWNoKGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBJZC4gUHJvdmlkZSB0aGlzIElkIHdoZW4gY2FsbCBgc2hvdyhpZClgIG1ldGhvZFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbXBvbmVudCBDb21wb25lbnQgVHlwZSB0byBzaG93IGluIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgRGlzcGxheSBzZXR0aW5ncyBmb3IgdGhlIG92ZXJsYXksIHN1Y2ggYXMgcG9zaXRpb25pbmcgYW5kIHNjcm9sbC9jbG9zZSBiZWhhdmlvci5cbiAgICAgKiBAcGFyYW0gbW9kdWxlUmVmIE9wdGlvbmFsIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgY29udGFpbmluZyBJbmplY3RvciBhbmQgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAgICogdGhhdCBjYW4gcmVzb2x2ZSB0aGUgY29tcG9uZW50J3MgZmFjdG9yeVxuICAgICAqIEByZXR1cm5zIElkIG9mIHRoZSBjcmVhdGVkIG92ZXJsYXkuIFZhbGlkIHVudGlsIGBkZXRhY2hgIGlzIGNhbGxlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXR0YWNoKGNvbXBvbmVudDogVHlwZTxhbnk+LCBzZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncyxcbiAgICAgICAgbW9kdWxlUmVmPzogUGljazxOZ01vZHVsZVJlZjxhbnk+LCAnaW5qZWN0b3InIHwgJ2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcic+KTogc3RyaW5nO1xuICAgIHB1YmxpYyBhdHRhY2goY29tcG9uZW50OiBFbGVtZW50UmVmIHwgVHlwZTxhbnk+LCBzZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncyxcbiAgICAgICAgbW9kdWxlUmVmPzogUGljazxOZ01vZHVsZVJlZjxhbnk+LCAnaW5qZWN0b3InIHwgJ2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcic+KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaW5mbzogT3ZlcmxheUluZm8gPSB0aGlzLmdldE92ZXJsYXlJbmZvKGNvbXBvbmVudCwgbW9kdWxlUmVmKTtcblxuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignT3ZlcmxheSB3YXMgbm90IGFibGUgdG8gYXR0YWNoIHByb3ZpZGVkIGNvbXBvbmVudCEnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5mby5pZCA9ICh0aGlzLl9jb21wb25lbnRJZCsrKS50b1N0cmluZygpO1xuICAgICAgICBpbmZvLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9kZWZhdWx0U2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICAgICAgaW5mby5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLl9vdmVybGF5SW5mb3MucHVzaChpbmZvKTtcbiAgICAgICAgaW5mby5ob29rID0gdGhpcy5wbGFjZUVsZW1lbnRIb29rKGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSBpbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaW5mby5pbml0aWFsU2l6ZSA9IHsgd2lkdGg6IGVsZW1lbnRSZWN0LndpZHRoLCBoZWlnaHQ6IGVsZW1lbnRSZWN0LmhlaWdodCB9O1xuICAgICAgICB0aGlzLm1vdmVFbGVtZW50VG9PdmVybGF5KGluZm8pO1xuICAgICAgICB0aGlzLmNvbnRlbnRBcHBlbmRlZC5lbWl0KHsgaWQ6IGluZm8uaWQsIGNvbXBvbmVudFJlZjogaW5mby5jb21wb25lbnRSZWYgfSk7XG4gICAgICAgIC8vIFRPRE86IHdoeSB3ZSBoYWQgdGhpcyBjaGVjaz9cbiAgICAgICAgLy8gaWYgKHRoaXMuX292ZXJsYXlJbmZvcy5pbmRleE9mKGluZm8pID09PSAtMSkge1xuICAgICAgICAvLyAgICAgdGhpcy5fb3ZlcmxheUluZm9zLnB1c2goaW5mbyk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgaW5mby5zZXR0aW5ncy5zY3JvbGxTdHJhdGVneS5pbml0aWFsaXplKHRoaXMuX2RvY3VtZW50LCB0aGlzLCBpbmZvLmlkKTtcbiAgICAgICAgaW5mby5zZXR0aW5ncy5zY3JvbGxTdHJhdGVneS5hdHRhY2goKTtcbiAgICAgICAgdGhpcy5hZGRPdXRzaWRlQ2xpY2tMaXN0ZW5lcihpbmZvKTtcbiAgICAgICAgdGhpcy5hZGRSZXNpemVIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuYWRkQ2xvc2VPbkVzY2FwZUxpc3RlbmVyKGluZm8pO1xuICAgICAgICB0aGlzLmJ1aWxkQW5pbWF0aW9uUGxheWVycyhpbmZvKTtcbiAgICAgICAgcmV0dXJuIGluZm8uaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIG92ZXJsYXkgd2l0aCB0aGUgcHJvdmlkZWQgaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgSWQgb2YgdGhlIG92ZXJsYXkgdG8gcmVtb3ZlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMub3ZlcmxheS5kZXRhY2goaWQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRhY2goaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBpbmZvOiBPdmVybGF5SW5mbyA9IHRoaXMuZ2V0T3ZlcmxheUJ5SWQoaWQpO1xuXG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdpZ3hPdmVybGF5LmRldGFjaCB3YXMgY2FsbGVkIHdpdGggd3JvbmcgaWQ6ICcsIGlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLmRldGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5maW5pc2hBbmltYXRpb25zKGluZm8pO1xuICAgICAgICBpbmZvLnNldHRpbmdzLnNjcm9sbFN0cmF0ZWd5LmRldGFjaCgpO1xuICAgICAgICB0aGlzLnJlbW92ZU91dHNpZGVDbGlja0xpc3RlbmVyKGluZm8pO1xuICAgICAgICB0aGlzLnJlbW92ZVJlc2l6ZUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5jbGVhblVwKGluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgdGhlIG92ZXJsYXlzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLm92ZXJsYXkuZGV0YWNoQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGRldGFjaEFsbCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX292ZXJsYXlJbmZvcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoKHRoaXMuX292ZXJsYXlJbmZvc1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgb3ZlcmxheSBmb3IgcHJvdmlkZWQgaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgSWQgdG8gc2hvdyBvdmVybGF5IGZvclxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBEaXNwbGF5IHNldHRpbmdzIGZvciB0aGUgb3ZlcmxheSwgc3VjaCBhcyBwb3NpdGlvbmluZyBhbmQgc2Nyb2xsL2Nsb3NlIGJlaGF2aW9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93KGlkOiBzdHJpbmcsIHNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZm86IE92ZXJsYXlJbmZvID0gdGhpcy5nZXRPdmVybGF5QnlJZChpZCk7XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdpZ3hPdmVybGF5LnNob3cgd2FzIGNhbGxlZCB3aXRoIHdyb25nIGlkOiAnLCBpZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IE92ZXJsYXlDYW5jZWxhYmxlRXZlbnRBcmdzID0geyBpZCwgY29tcG9uZW50UmVmOiBpbmZvLmNvbXBvbmVudFJlZiwgY2FuY2VsOiBmYWxzZSB9O1xuICAgICAgICB0aGlzLm9wZW5pbmcuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICAgICAgLy8gVE9ETzogdXBkYXRlIGF0dGFjaFxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShpbmZvKTtcbiAgICAgICAgaW5mby5zZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uKFxuICAgICAgICAgICAgaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIHsgd2lkdGg6IGluZm8uaW5pdGlhbFNpemUud2lkdGgsIGhlaWdodDogaW5mby5pbml0aWFsU2l6ZS5oZWlnaHQgfSxcbiAgICAgICAgICAgIGRvY3VtZW50LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIGluZm8uc2V0dGluZ3MudGFyZ2V0KTtcbiAgICAgICAgdGhpcy5hZGRNb2RhbENsYXNzZXMoaW5mbyk7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3Mub3BlbkFuaW1hdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wbGF5T3BlbkFuaW1hdGlvbihpbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICB0byBlbGltaW5hdGUgZmxpY2tlcmluZyBzaG93IHRoZSBlbGVtZW50IGp1c3QgYmVmb3JlIG9wZW5lZCBmaXJlc1xuICAgICAgICAgICAgaW5mby53cmFwcGVyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgICAgICBpbmZvLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vcGVuZWQuZW1pdCh7IGlkOiBpbmZvLmlkLCBjb21wb25lbnRSZWY6IGluZm8uY29tcG9uZW50UmVmIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSBJRCBwcm92aWRlZCBhcyBhIHBhcmFtZXRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5vdmVybGF5LmhpZGUoaWQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBoaWRlKGlkOiBzdHJpbmcsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5faGlkZShpZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGVzIGFsbCB0aGUgY29tcG9uZW50cyBhbmQgdGhlIG92ZXJsYXkuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMub3ZlcmxheS5oaWRlQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGhpZGVBbGwoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9vdmVybGF5SW5mb3MubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUodGhpcy5fb3ZlcmxheUluZm9zW2ldLmlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcG9zaXRpb25zIHRoZSBjb21wb25lbnQgd2l0aCBJRCBwcm92aWRlZCBhcyBhIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBJZCB0byByZXBvc2l0aW9uIG92ZXJsYXkgZm9yXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMub3ZlcmxheS5yZXBvc2l0aW9uKGlkKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwb3NpdGlvbihpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlJbmZvID0gdGhpcy5nZXRPdmVybGF5QnlJZChpZCk7XG4gICAgICAgIGlmICghb3ZlcmxheUluZm8gfHwgIW92ZXJsYXlJbmZvLnNldHRpbmdzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXcm9uZyBpZCBwcm92aWRlZCBpbiBvdmVybGF5LnJlcG9zaXRpb24gbWV0aG9kLiBJZDogJyArIGlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW92ZXJsYXlJbmZvLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IG92ZXJsYXlJbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudFJlY3QgPSBjb250ZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgb3ZlcmxheUluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbihcbiAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBjb250ZW50RWxlbWVudFJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjb250ZW50RWxlbWVudFJlY3QuaGVpZ2h0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIG92ZXJsYXlJbmZvLnNldHRpbmdzLnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2Zmc2V0cyB0aGUgY29udGVudCBhbG9uZyB0aGUgY29ycmVzcG9uZGluZyBheGlzIGJ5IHRoZSBwcm92aWRlZCBhbW91bnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBJZCB0byBvZmZzZXQgb3ZlcmxheSBmb3JcbiAgICAgKiBAcGFyYW0gZGVsdGFYIEFtb3VudCBvZiBvZmZzZXQgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb25cbiAgICAgKiBAcGFyYW0gZGVsdGFZIEFtb3VudCBvZiBvZmZzZXQgaW4gdmVydGljYWwgZGlyZWN0aW9uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMub3ZlcmxheS5zZXRPZmZzZXQoaWQsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0T2Zmc2V0KGlkOiBzdHJpbmcsIGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpbmZvOiBPdmVybGF5SW5mbyA9IHRoaXMuZ2V0T3ZlcmxheUJ5SWQoaWQpO1xuXG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5mby50cmFuc2Zvcm1YICs9IGRlbHRhWDtcbiAgICAgICAgaW5mby50cmFuc2Zvcm1ZICs9IGRlbHRhWTtcblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1YID0gaW5mby50cmFuc2Zvcm1YO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1ZID0gaW5mby50cmFuc2Zvcm1ZO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZSA9IGB0cmFuc2xhdGUoJHt0cmFuc2Zvcm1YfXB4LCAke3RyYW5zZm9ybVl9cHgpYDtcbiAgICAgICAgaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2xhdGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgcmVwb3NpdGlvbkFsbCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX292ZXJsYXlJbmZvcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdGlvbih0aGlzLl9vdmVybGF5SW5mb3NbaV0uaWQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0T3ZlcmxheUJ5SWQoaWQ6IHN0cmluZyk6IE92ZXJsYXlJbmZvIHtcbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fb3ZlcmxheUluZm9zLmZpbmQoZSA9PiBlLmlkID09PSBpZCk7XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hpZGUoaWQ6IHN0cmluZywgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBjb25zdCBpbmZvOiBPdmVybGF5SW5mbyA9IHRoaXMuZ2V0T3ZlcmxheUJ5SWQoaWQpO1xuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignaWd4T3ZlcmxheS5oaWRlIHdhcyBjYWxsZWQgd2l0aCB3cm9uZyBpZDogJywgaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogT3ZlcmxheUNsb3NpbmdFdmVudEFyZ3MgPSB7IGlkLCBjb21wb25lbnRSZWY6IGluZm8uY29tcG9uZW50UmVmLCBjYW5jZWw6IGZhbHNlLCBldmVudCB9O1xuICAgICAgICB0aGlzLmNsb3NpbmcuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlTW9kYWxDbGFzc2VzKGluZm8pO1xuICAgICAgICBpZiAoaW5mby5zZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLmNsb3NlQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlDbG9zZUFuaW1hdGlvbihpbmZvLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRG9uZShpbmZvKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3ZlcmxheUluZm8oY29tcG9uZW50OiBhbnksIG1vZHVsZVJlZj86IFBpY2s8TmdNb2R1bGVSZWY8YW55PiwgJ2luamVjdG9yJyB8ICdjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXInPik6IE92ZXJsYXlJbmZvIHtcbiAgICAgICAgY29uc3QgaW5mbzogT3ZlcmxheUluZm8gPSB7IG5nWm9uZTogdGhpcy5fem9uZSwgdHJhbnNmb3JtWDogMCwgdHJhbnNmb3JtWTogMCB9O1xuICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuICAgICAgICAgICAgaW5mby5lbGVtZW50UmVmID0gY29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGR5bmFtaWNGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PGFueT47XG4gICAgICAgICAgICBjb25zdCBmYWN0b3J5UmVzb2x2ZXIgPSBtb2R1bGVSZWYgPyBtb2R1bGVSZWYuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyIDogdGhpcy5fZmFjdG9yeVJlc29sdmVyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkeW5hbWljRmFjdG9yeSA9IGZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBtb2R1bGVSZWYgPyBtb2R1bGVSZWYuaW5qZWN0b3IgOiB0aGlzLl9pbmplY3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQ6IENvbXBvbmVudFJlZjxhbnk+ID0gZHluYW1pY0ZhY3RvcnkuY3JlYXRlKGluamVjdG9yKTtcbiAgICAgICAgICAgIGlmIChkeW5hbWljQ29tcG9uZW50Lm9uRGVzdHJveSkge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNDb21wb25lbnQub25EZXN0cm95KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmZvLmRldGFjaGVkICYmIHRoaXMuX292ZXJsYXlJbmZvcy5pbmRleE9mKGluZm8pICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhY2goaW5mby5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXBwUmVmLmF0dGFjaFZpZXcoZHluYW1pY0NvbXBvbmVudC5ob3N0Vmlldyk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG5ld2x5IGNyZWF0ZWQgZnJvbSBhIENvbXBvbmVudCwgaXQgaXMgd3JhcHBlZCBpbiAnbmctY29tcG9uZW50JyB0YWcgLSB3ZSBkbyBub3Qgd2FudCB0aGF0LlxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGR5bmFtaWNDb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGluZm8uZWxlbWVudFJlZiA9IHsgbmF0aXZlRWxlbWVudDogZWxlbWVudCB9O1xuICAgICAgICAgICAgaW5mby5jb21wb25lbnRSZWYgPSBkeW5hbWljQ29tcG9uZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwbGFjZUVsZW1lbnRIb29rKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgICAgICBpZiAoIWVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob29rID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGhvb2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShob29rLCBlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIGhvb2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtb3ZlRWxlbWVudFRvT3ZlcmxheShpbmZvOiBPdmVybGF5SW5mbykge1xuICAgICAgICBpbmZvLndyYXBwZXJFbGVtZW50ID0gdGhpcy5nZXRXcmFwcGVyRWxlbWVudCgpO1xuICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoaW5mby53cmFwcGVyRWxlbWVudCwgaW5mby5zZXR0aW5ncy5tb2RhbCk7XG4gICAgICAgIHRoaXMuZ2V0T3ZlcmxheUVsZW1lbnQoaW5mbykuYXBwZW5kQ2hpbGQoaW5mby53cmFwcGVyRWxlbWVudCk7XG4gICAgICAgIGNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdyYXBwZXJFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgd3JhcHBlcjogSFRNTEVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdpZ3gtb3ZlcmxheV9fd3JhcHBlcicpO1xuICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRlbnRFbGVtZW50KHdyYXBwZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgbW9kYWw6IGJvb2xlYW4pOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGlmIChtb2RhbCkge1xuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKCdpZ3gtb3ZlcmxheV9fY29udGVudC0tbW9kYWwnKTtcbiAgICAgICAgICAgIGNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXY6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnaWd4LW92ZXJsYXlfX2NvbnRlbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKGV2OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vICBoaWRlIGVsZW1lbnQgdG8gZWxpbWluYXRlIGZsaWNrZXJpbmcuIFNob3cgdGhlIGVsZW1lbnQgZXhhY3RseSBiZWZvcmUgYW5pbWF0aW9uIHN0YXJ0c1xuICAgICAgICB3cmFwcGVyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cbiAgICAgICAgd3JhcHBlckVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3ZlcmxheUVsZW1lbnQoaW5mbzogT3ZlcmxheUluZm8pOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLm91dGxldCkge1xuICAgICAgICAgICAgcmV0dXJuIGluZm8uc2V0dGluZ3Mub3V0bGV0Lm5hdGl2ZUVsZW1lbnQgfHwgaW5mby5zZXR0aW5ncy5vdXRsZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lneC1vdmVybGF5Jyk7XG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX292ZXJsYXlFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5RWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNpemUoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaWYgKGluZm8uY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICAvLyAgaWYgd2UgYXJlIHBvc2l0aW9uaW5nIGNvbXBvbmVudCB0aGlzIGlzIGZpcnN0IHRpbWUgaXQgZ2V0cyB2aXNpYmxlXG4gICAgICAgICAgICAvLyAgYW5kIHdlIGNhbiBmaW5hbGx5IGdldCBpdHMgc2l6ZVxuICAgICAgICAgICAgaW5mby5jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaW5mby5pbml0aWFsU2l6ZSA9IGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IGNvbnRlbnQgZGl2IHdpZHRoIG9ubHkgaWYgZWxlbWVudCB0byBzaG93IGhhcyB3aWR0aFxuICAgICAgICBpZiAoaW5mby5pbml0aWFsU2l6ZS53aWR0aCAhPT0gMCkge1xuICAgICAgICAgICAgaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS53aWR0aCA9IGluZm8uaW5pdGlhbFNpemUud2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbG9zZURvbmUoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaW5mby52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmIChpbmZvLndyYXBwZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyB0byBlbGltaW5hdGUgZmxpY2tlcmluZyBzaG93IHRoZSBlbGVtZW50IGp1c3QgYmVmb3JlIGFuaW1hdGlvbiBzdGFydFxuICAgICAgICAgICAgaW5mby53cmFwcGVyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbmZvLmNsb3NlQW5pbWF0aW9uRGV0YWNoaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHsgaWQ6IGluZm8uaWQsIGNvbXBvbmVudFJlZjogaW5mby5jb21wb25lbnRSZWYsIGV2ZW50OiBpbmZvLmV2ZW50IH0pO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBpbmZvLmV2ZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW5VcChpbmZvOiBPdmVybGF5SW5mbykge1xuICAgICAgICBjb25zdCBjaGlsZDogSFRNTEVsZW1lbnQgPSBpbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgb3V0bGV0ID0gdGhpcy5nZXRPdmVybGF5RWxlbWVudChpbmZvKTtcbiAgICAgICAgLy8gaWYgc2FtZSBlbGVtZW50IGlzIHNob3duIGluIG90aGVyIG92ZXJsYXkgb3V0bGV0IHdpbGwgbm90IGNvbnRhaW5cbiAgICAgICAgLy8gdGhlIGVsZW1lbnQgYW5kIHdlIHNob3VsZCBub3QgcmVtb3ZlIGl0IGZvcm0gb3V0bGV0XG4gICAgICAgIGlmIChvdXRsZXQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgICAgICAgICBvdXRsZXQucmVtb3ZlQ2hpbGQoY2hpbGQucGFyZW50Tm9kZS5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5mby5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX2FwcFJlZi5kZXRhY2hWaWV3KGluZm8uY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcbiAgICAgICAgICAgIGluZm8uY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSBpbmZvLmNvbXBvbmVudFJlZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5mby5ob29rKSB7XG4gICAgICAgICAgICBpbmZvLmhvb2sucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGluZm8uaG9vayk7XG4gICAgICAgICAgICBpbmZvLmhvb2sucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChpbmZvLmhvb2spO1xuICAgICAgICAgICAgZGVsZXRlIGluZm8uaG9vaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3ZlcmxheUluZm9zLmluZGV4T2YoaW5mbyk7XG4gICAgICAgIHRoaXMuX292ZXJsYXlJbmZvcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgIC8vIHRoaXMuX292ZXJsYXlFbGVtZW50LnBhcmVudEVsZW1lbnQgY2hlY2sganVzdCBmb3IgdGVzdHMgdGhhdCBtYW51YWxseSBkZWxldGUgdGhlIGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlJbmZvcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5RWxlbWVudCAmJiB0aGlzLl9vdmVybGF5RWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLl9vdmVybGF5RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVDbG9zZU9uRXNjYXBlTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFuIGFsbCB0aGUgcmVzb3VyY2VzIGF0dGFjaGVkIHRvIGluZm9cbiAgICAgICAgZGVsZXRlIGluZm8uZWxlbWVudFJlZjtcbiAgICAgICAgZGVsZXRlIGluZm8uc2V0dGluZ3M7XG4gICAgICAgIGRlbGV0ZSBpbmZvLmluaXRpYWxTaXplO1xuICAgICAgICBpbmZvLm9wZW5BbmltYXRpb25EZXRhY2hpbmcgPSB0cnVlO1xuICAgICAgICBpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXI/LmRlc3Ryb3koKTtcbiAgICAgICAgZGVsZXRlIGluZm8ub3BlbkFuaW1hdGlvblBsYXllcjtcbiAgICAgICAgZGVsZXRlIGluZm8ub3BlbkFuaW1hdGlvbklubmVyUGxheWVyO1xuICAgICAgICBpbmZvLmNsb3NlQW5pbWF0aW9uRGV0YWNoaW5nID0gdHJ1ZTtcbiAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllcj8uZGVzdHJveSgpO1xuICAgICAgICBkZWxldGUgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllcjtcbiAgICAgICAgZGVsZXRlIGluZm8uY2xvc2VBbmltYXRpb25Jbm5lclBsYXllcjtcbiAgICAgICAgZGVsZXRlIGluZm8ubmdab25lO1xuICAgICAgICBkZWxldGUgaW5mby53cmFwcGVyRWxlbWVudDtcbiAgICAgICAgaW5mbyA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwbGF5T3BlbkFuaW1hdGlvbihpbmZvOiBPdmVybGF5SW5mbykge1xuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgb3BlbmluZyBhbmltYXRpb24gYWxyZWFkeSBzdGFydGVkIGRvIG5vdGhpbmdcbiAgICAgICAgaWYgKGluZm8ub3BlbkFuaW1hdGlvblBsYXllciA9PSBudWxsIHx8IGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICBpZiB0aGVyZSBpcyBjbG9zaW5nIGFuaW1hdGlvbiBhbHJlYWR5IHN0YXJ0ZWQgc3RhcnQgb3BlbiBhbmltYXRpb24gZnJvbSB3aGVyZSBjbG9zZSBvbmUgaGFzIHJlYWNoZWRcbiAgICAgICAgLy8gIGFuZCByZXNldCBjbG9zZSBhbmltYXRpb25cbiAgICAgICAgaWYgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXI/Lmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgLy8gIGdldFBvc2l0aW9uKCkgcmV0dXJucyB3aGF0IHBhcnQgb2YgdGhlIGFuaW1hdGlvbiBpcyBwYXNzZWQsIGUuZy4gMC41IGlmIGhhbGYgdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gIGlzIGRvbmUsIDAuNzUgaWYgMy80IG9mIHRoZSBhbmltYXRpb24gaXMgZG9uZS4gQXMgd2UgbmVlZCB0byBzdGFydCBuZXh0IGFuaW1hdGlvbiBmcm9tIHdoZXJlXG4gICAgICAgICAgICAvLyAgdGhlIHByZXZpb3VzIGhhcyBmaW5pc2hlZCB3ZSBuZWVkIHRoZSBhbW91bnQgdXAgdG8gMSwgdGhlcmVmb3JlIHdlIGFyZSBzdWJ0cmFjdGluZyB3aGF0XG4gICAgICAgICAgICAvLyAgZ2V0UG9zaXRpb24oKSByZXR1cm5zIGZyb20gb25lXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IDEgLSBpbmZvLmNsb3NlQW5pbWF0aW9uSW5uZXJQbGF5ZXIuZ2V0UG9zaXRpb24oKTtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVzZXQgZG9lcyBub3QgY2hhbmdlIGhhc1N0YXJ0ZWQgdG8gZmFsc2UuIFRoaXMgaXMgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXIgdmlhIGludGVybmFsIGZpZWxkXG4gICAgICAgICAgICAoaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciBhcyBhbnkpLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIuaW5pdCgpO1xuICAgICAgICAgICAgaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyLnNldFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uU3RhcnRpbmcuZW1pdCh7IGlkOiBpbmZvLmlkLCBhbmltYXRpb25QbGF5ZXI6IGluZm8ub3BlbkFuaW1hdGlvblBsYXllciwgYW5pbWF0aW9uVHlwZTogJ29wZW4nIH0pO1xuXG4gICAgICAgIC8vICB0byBlbGltaW5hdGUgZmxpY2tlcmluZyBzaG93IHRoZSBlbGVtZW50IGp1c3QgYmVmb3JlIGFuaW1hdGlvbiBzdGFydFxuICAgICAgICBpbmZvLndyYXBwZXJFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgaW5mby52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyLnBsYXkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYXlDbG9zZUFuaW1hdGlvbihpbmZvOiBPdmVybGF5SW5mbywgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgY2xvc2luZyBhbmltYXRpb24gYWxyZWFkeSBzdGFydGVkIGRvIG5vdGhpbmdcbiAgICAgICAgaWYgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgPT0gbnVsbCB8fCBpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyLmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gIGlmIHRoZXJlIGlzIG9wZW5pbmcgYW5pbWF0aW9uIGFscmVhZHkgc3RhcnRlZCBzdGFydCBjbG9zZSBhbmltYXRpb24gZnJvbSB3aGVyZSBvcGVuIG9uZSBoYXMgcmVhY2hlZFxuICAgICAgICAvLyAgYW5kIHJlbW92ZSBvcGVuIGFuaW1hdGlvblxuICAgICAgICBpZiAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyPy5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIC8vICBnZXRQb3NpdGlvbigpIHJldHVybnMgd2hhdCBwYXJ0IG9mIHRoZSBhbmltYXRpb24gaXMgcGFzc2VkLCBlLmcuIDAuNSBpZiBoYWxmIHRoZSBhbmltYXRpb25cbiAgICAgICAgICAgIC8vICBpcyBkb25lLCAwLjc1IGlmIDMvNCBvZiB0aGUgYW5pbWF0aW9uIGlzIGRvbmUuIEFzIHdlIG5lZWQgdG8gc3RhcnQgbmV4dCBhbmltYXRpb24gZnJvbSB3aGVyZVxuICAgICAgICAgICAgLy8gIHRoZSBwcmV2aW91cyBoYXMgZmluaXNoZWQgd2UgbmVlZCB0aGUgYW1vdW50IHVwIHRvIDEsIHRoZXJlZm9yZSB3ZSBhcmUgc3VidHJhY3Rpbmcgd2hhdFxuICAgICAgICAgICAgLy8gIGdldFBvc2l0aW9uKCkgcmV0dXJucyBmcm9tIG9uZVxuICAgICAgICAgICAgLy8gIFRPRE86IFRoaXMgYXNzdW1lcyBvcGVuaW5nIGFuZCBjbG9zaW5nIGFuaW1hdGlvbnMgYXJlIG1pcnJvcmVkLlxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSAxIC0gaW5mby5vcGVuQW5pbWF0aW9uSW5uZXJQbGF5ZXIuZ2V0UG9zaXRpb24oKTtcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5yZXNldCgpO1xuICAgICAgICAgICAgLy8gY2FsbGluZyByZXNldCBkb2VzIG5vdCBjaGFuZ2UgaGFzU3RhcnRlZCB0byBmYWxzZS4gVGhpcyBpcyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlciB2aWEgaW50ZXJuYWwgZmllbGRcbiAgICAgICAgICAgIChpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIgYXMgYW55KS5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5pbml0KCk7XG4gICAgICAgICAgICBpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyLnNldFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uU3RhcnRpbmcuZW1pdCh7IGlkOiBpbmZvLmlkLCBhbmltYXRpb25QbGF5ZXI6IGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIsIGFuaW1hdGlvblR5cGU6ICdjbG9zZScgfSk7XG4gICAgICAgIGluZm8uZXZlbnQgPSBldmVudDtcbiAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5wbGF5KCk7XG4gICAgfVxuXG4gICAgLy8gIFRPRE86IGNoZWNrIGlmIGFwcGx5QW5pbWF0aW9uUGFyYW1zIHdpbGwgd29yayB3aXRoIGNvbXBsZXggYW5pbWF0aW9uc1xuICAgIHByaXZhdGUgYXBwbHlBbmltYXRpb25QYXJhbXMod3JhcHBlckVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhbmltYXRpb25PcHRpb25zOiBBbmltYXRpb25SZWZlcmVuY2VNZXRhZGF0YSkge1xuICAgICAgICBpZiAoIWFuaW1hdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9ICcwbXMnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYW5pbWF0aW9uT3B0aW9ucy5vcHRpb25zIHx8ICFhbmltYXRpb25PcHRpb25zLm9wdGlvbnMucGFyYW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0gYW5pbWF0aW9uT3B0aW9ucy5vcHRpb25zLnBhcmFtcyBhcyBJQW5pbWF0aW9uUGFyYW1zO1xuICAgICAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICB3cmFwcGVyRWxlbWVudC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5lYXNpbmcpIHtcbiAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50LnN0eWxlLnRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiA9IHBhcmFtcy5lYXNpbmc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRvY3VtZW50Q2xpY2tlZCA9IChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyAgaWYgd2UgZ2V0IHRvIG1vZGFsIG92ZXJsYXkganVzdCByZXR1cm4gLSB3ZSBzaG91bGQgbm90IGNsb3NlIGFueXRoaW5nIHVuZGVyIGl0XG4gICAgICAgIC8vICBpZiB3ZSBnZXQgdG8gbm9uLW1vZGFsIG92ZXJsYXkgZG8gdGhlIG5leHQ6XG4gICAgICAgIC8vICAgMS4gQ2hlY2sgaXQgaGFzIGNsb3NlIG9uIG91dHNpZGUgY2xpY2suIElmIG5vdCBnbyBvbiB0byBuZXh0IG92ZXJsYXk7XG4gICAgICAgIC8vICAgMi4gSWYgdHJ1ZSBjaGVjayBpZiBjbGljayBpcyBvbiB0aGUgZWxlbWVudC4gSWYgaXQgaXMgb24gdGhlIGVsZW1lbnQgd2UgaGF2ZSBjbG9zZWRcbiAgICAgICAgLy8gIGFscmVhZHkgYWxsIHByZXZpb3VzIG5vbi1tb2RhbCB3aXRoIGNsb3NlIG9uIG91dHNpZGUgY2xpY2sgZWxlbWVudHMsIHNvIHdlIHJldHVybi4gSWZcbiAgICAgICAgLy8gIG5vdCBjbG9zZSB0aGUgb3ZlcmxheSBhbmQgY2hlY2sgbmV4dFxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fb3ZlcmxheUluZm9zLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgY29uc3QgaW5mbyA9IHRoaXMuX292ZXJsYXlJbmZvc1tpXTtcbiAgICAgICAgICAgIGlmIChpbmZvLnNldHRpbmdzLm1vZGFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZm8uc2V0dGluZ3MuY2xvc2VPbk91dHNpZGVDbGljaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2LmNvbXBvc2VkID8gZXYuY29tcG9zZWRQYXRoKClbMF0gOiBldi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUVsZW1lbnQgPSBpbmZvLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY2xpY2sgaXMgb24gdGhlIG92ZXJsYXkgZWxlbWVudCBvciBvbiBhbiBlbGVtZW50IGZyb20gdGhlIGV4Y2x1c2lvbiBsaXN0LCBhbmQgaWYgc28gZG8gbm90IGNsb3NlIHRoZSBvdmVybGF5XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjbHVkZUVsZW1lbnRzID0gaW5mby5zZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA/XG4gICAgICAgICAgICAgICAgICAgIFsuLi5pbmZvLnNldHRpbmdzLmV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrLCBvdmVybGF5RWxlbWVudF0gOiBbb3ZlcmxheUVsZW1lbnRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5zaWRlQ2xpY2s6IGJvb2xlYW4gPSBleGNsdWRlRWxlbWVudHMuc29tZShlID0+IGUuY29udGFpbnModGFyZ2V0IGFzIE5vZGUpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJbnNpZGVDbGljaykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIC8vICBpZiB0aGUgY2xpY2sgaXMgb3V0c2lkZSBjbGljaywgYnV0IGNsb3NlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCBkbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgJiYgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hpZGUoaW5mby5pZCwgZXYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGFkZE91dHNpZGVDbGlja0xpc3RlbmVyKGluZm86IE92ZXJsYXlJbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLmNsb3NlT25PdXRzaWRlQ2xpY2spIHtcbiAgICAgICAgICAgIGlmIChpbmZvLnNldHRpbmdzLm1vZGFsKSB7XG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50KGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCwgJ2NsaWNrJylcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChlOiBFdmVudCkgPT4gdGhpcy5faGlkZShpbmZvLmlkLCBlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIC8vICBpZiBhbGwgb3ZlcmxheXMgbWludXMgY2xvc2luZyBvdmVybGF5cyBlcXVhbHMgb25lIGFkZCB0aGUgaGFuZGxlclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlJbmZvcy5maWx0ZXIoeCA9PiB4LnNldHRpbmdzLmNsb3NlT25PdXRzaWRlQ2xpY2sgJiYgIXguc2V0dGluZ3MubW9kYWwpLmxlbmd0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zLmZpbHRlcih4ID0+IHguc2V0dGluZ3MuY2xvc2VPbk91dHNpZGVDbGljayAmJiAheC5zZXR0aW5ncy5tb2RhbCAmJlxuICAgICAgICAgICAgICAgICAgICB4LmNsb3NlQW5pbWF0aW9uUGxheWVyICYmXG4gICAgICAgICAgICAgICAgICAgIHguY2xvc2VBbmltYXRpb25QbGF5ZXIuaGFzU3RhcnRlZCgpKS5sZW5ndGggPT09IDEpIHtcblxuICAgICAgICAgICAgICAgIC8vIGNsaWNrIGV2ZW50IGlzIG5vdCBmaXJlZCBvbiBpT1MuIFRvIG1ha2UgZWxlbWVudCBcImNsaWNrYWJsZVwiIHdlIGFyZVxuICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgdGhlIGN1cnNvciB0byBwb2ludGVyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxhdGZvcm1VdGlsLmlzSU9TICYmICF0aGlzLl9jdXJzb3JTdHlsZUlzU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWUgPSB0aGlzLl9kb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvclN0eWxlSXNTZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kb2N1bWVudENsaWNrZWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVPdXRzaWRlQ2xpY2tMaXN0ZW5lcihpbmZvOiBPdmVybGF5SW5mbykge1xuICAgICAgICBpZiAoaW5mby5zZXR0aW5ncy5tb2RhbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGxldCBzaG91bGRSZW1vdmVDbGlja0V2ZW50TGlzdGVuZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG8uc2V0dGluZ3MubW9kYWwgPT09IGZhbHNlICYmIG8uaWQgIT09IGluZm8uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVtb3ZlQ2xpY2tFdmVudExpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVDbGlja0V2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3Vyc29yU3R5bGVJc1NldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IHRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yU3R5bGVJc1NldCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja2VkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkUmVzaXplSGFuZGxlcigpIHtcbiAgICAgICAgY29uc3QgY2xvc2luZ092ZXJsYXlzQ291bnQgPVxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihvID0+IG8uY2xvc2VBbmltYXRpb25QbGF5ZXIgJiYgby5jbG9zZUFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpXG4gICAgICAgICAgICAgICAgLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlJbmZvcy5sZW5ndGggLSBjbG9zaW5nT3ZlcmxheXNDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXBvc2l0aW9uQWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlUmVzaXplSGFuZGxlcigpIHtcbiAgICAgICAgY29uc3QgY2xvc2luZ092ZXJsYXlzQ291bnQgPVxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUluZm9zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihvID0+IG8uY2xvc2VBbmltYXRpb25QbGF5ZXIgJiYgby5jbG9zZUFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpXG4gICAgICAgICAgICAgICAgLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlJbmZvcy5sZW5ndGggLSBjbG9zaW5nT3ZlcmxheXNDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXBvc2l0aW9uQWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQ2xvc2VPbkVzY2FwZUxpc3RlbmVyKGluZm86IE92ZXJsYXlJbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLmNsb3NlT25Fc2NhcGUgJiYgIXRoaXMuX2tleVByZXNzRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5fa2V5UHJlc3NFdmVudExpc3RlbmVyID0gZnJvbUV2ZW50KHRoaXMuX2RvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChldjogS2V5Ym9hcmRFdmVudCkgPT4gZXYua2V5ID09PSAnRXNjYXBlJyB8fCBldi5rZXkgPT09ICdFc2MnKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gdGhpcy5fb3ZlcmxheUluZm9zLmZpbHRlcihvID0+IG8udmlzaWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZpc2libGVPdmVybGF5cy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0T3ZlcmxheUluZm8gPSB2aXNpYmxlT3ZlcmxheXNbdmlzaWJsZU92ZXJsYXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRPdmVybGF5SW5mby52aXNpYmxlICYmIHRhcmdldE92ZXJsYXlJbmZvLnNldHRpbmdzLmNsb3NlT25Fc2NhcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKHRhcmdldE92ZXJsYXlJbmZvLmlkLCBldik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUNsb3NlT25Fc2NhcGVMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2tleVByZXNzRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5fa2V5UHJlc3NFdmVudExpc3RlbmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9rZXlQcmVzc0V2ZW50TGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRNb2RhbENsYXNzZXMoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaWYgKGluZm8uc2V0dGluZ3MubW9kYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgd3JhcHBlckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaWd4LW92ZXJsYXlfX3dyYXBwZXInKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlBbmltYXRpb25QYXJhbXMod3JhcHBlckVsZW1lbnQsIGluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy5vcGVuQW5pbWF0aW9uKTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd3JhcHBlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaWd4LW92ZXJsYXlfX3dyYXBwZXItLW1vZGFsJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTW9kYWxDbGFzc2VzKGluZm86IE92ZXJsYXlJbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLnNldHRpbmdzLm1vZGFsKSB7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlBbmltYXRpb25QYXJhbXMod3JhcHBlckVsZW1lbnQsIGluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy5jbG9zZUFuaW1hdGlvbik7XG4gICAgICAgICAgICB3cmFwcGVyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpZ3gtb3ZlcmxheV9fd3JhcHBlci0tbW9kYWwnKTtcbiAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lneC1vdmVybGF5X193cmFwcGVyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQW5pbWF0aW9uUGxheWVycyhpbmZvOiBPdmVybGF5SW5mbykge1xuICAgICAgICBpZiAoaW5mby5zZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLm9wZW5BbmltYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbkJ1aWxkZXIgPSB0aGlzLmJ1aWxkZXIuYnVpbGQoaW5mby5zZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLm9wZW5BbmltYXRpb24pO1xuICAgICAgICAgICAgaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyID0gYW5pbWF0aW9uQnVpbGRlci5jcmVhdGUoaW5mby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyAgQW5pbWF0aW9uUGxheWVyLmdldFBvc2l0aW9uIHJldHVybnMgYWx3YXlzIDAuIFRvIHdvcmthcm91bmQgdGhpcyB3ZSBhcmUgZ2V0dGluZyBpbm5lciBXZWJBbmltYXRpb25QbGF5ZXJcbiAgICAgICAgICAgIC8vICBhbmQgdGhlbiBnZXR0aW5nIHRoZSBwb3NpdGlvbnMgZnJvbSBpdC5cbiAgICAgICAgICAgIC8vICBUaGlzIGlzIGxvZ2dlZCBpbiBBbmd1bGFyIGhlcmUgLSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xODg5MVxuICAgICAgICAgICAgLy8gIEFzIHNvb24gYXMgdGhpcyBpcyByZXNvbHZlZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgaGFja1xuICAgICAgICAgICAgY29uc3QgaW5uZXJSZW5kZXJlciA9IChpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIgYXMgYW55KS5fcmVuZGVyZXI7XG4gICAgICAgICAgICBpbmZvLm9wZW5BbmltYXRpb25Jbm5lclBsYXllciA9IGlubmVyUmVuZGVyZXIuZW5naW5lLnBsYXllcnNbaW5uZXJSZW5kZXJlci5lbmdpbmUucGxheWVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5vbkRvbmUoKCkgPT4gdGhpcy5vcGVuQW5pbWF0aW9uRG9uZShpbmZvKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZm8uc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy5jbG9zZUFuaW1hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgYW5pbWF0aW9uQnVpbGRlciA9IHRoaXMuYnVpbGRlci5idWlsZChpbmZvLnNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3MuY2xvc2VBbmltYXRpb24pO1xuICAgICAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciA9IGFuaW1hdGlvbkJ1aWxkZXIuY3JlYXRlKGluZm8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gIEFuaW1hdGlvblBsYXllci5nZXRQb3NpdGlvbiByZXR1cm5zIGFsd2F5cyAwLiBUbyB3b3JrYXJvdW5kIHRoaXMgd2UgYXJlIGdldHRpbmcgaW5uZXIgV2ViQW5pbWF0aW9uUGxheWVyXG4gICAgICAgICAgICAvLyAgYW5kIHRoZW4gZ2V0dGluZyB0aGUgcG9zaXRpb25zIGZyb20gaXQuXG4gICAgICAgICAgICAvLyAgVGhpcyBpcyBsb2dnZWQgaW4gQW5ndWxhciBoZXJlIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTg4OTFcbiAgICAgICAgICAgIC8vICBBcyBzb29uIGFzIHRoaXMgaXMgcmVzb2x2ZWQgd2UgY2FuIHJlbW92ZSB0aGlzIGhhY2tcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVuZGVyZXIgPSAoaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciBhcyBhbnkpLl9yZW5kZXJlcjtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25Jbm5lclBsYXllciA9IGlubmVyUmVuZGVyZXIuZW5naW5lLnBsYXllcnNbaW5uZXJSZW5kZXJlci5lbmdpbmUucGxheWVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIub25Eb25lKCgpID0+IHRoaXMuY2xvc2VBbmltYXRpb25Eb25lKGluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb3BlbkFuaW1hdGlvbkRvbmUoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaWYgKCFpbmZvLm9wZW5BbmltYXRpb25EZXRhY2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbmVkLmVtaXQoeyBpZDogaW5mby5pZCwgY29tcG9uZW50UmVmOiBpbmZvLmNvbXBvbmVudFJlZiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyKSB7XG4gICAgICAgICAgICBpbmZvLm9wZW5BbmltYXRpb25QbGF5ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVzZXQgZG9lcyBub3QgY2hhbmdlIGhhc1N0YXJ0ZWQgdG8gZmFsc2UuIFRoaXMgaXMgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXJlIHZpYSBpbnRlcm5hbCBmaWVsZFxuICAgICAgICAgICAgKGluZm8ub3BlbkFuaW1hdGlvblBsYXllciBhcyBhbnkpLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyB3aGVuIGFuaW1hdGlvbiBmaW5pc2ggYW5ndWxhciBkZWxldGVzIGFsbCBvbkRvbmUgaGFuZGxlcnMgc28gd2UgbmVlZCB0byBhZGQgaXQgYWdhaW4gOihcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5vbkRvbmUoKCkgPT4gdGhpcy5vcGVuQW5pbWF0aW9uRG9uZShpbmZvKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgJiYgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVzZXQgZG9lcyBub3QgY2hhbmdlIGhhc1N0YXJ0ZWQgdG8gZmFsc2UuIFRoaXMgaXMgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXJlIHZpYSBpbnRlcm5hbCBmaWVsZFxuICAgICAgICAgICAgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgYXMgYW55KS5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbG9zZUFuaW1hdGlvbkRvbmUoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgaWYgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIpIHtcbiAgICAgICAgICAgIGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVzZXQgZG9lcyBub3QgY2hhbmdlIGhhc1N0YXJ0ZWQgdG8gZmFsc2UuIFRoaXMgaXMgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXJlIHZpYSBpbnRlcm5hbCBmaWVsZFxuICAgICAgICAgICAgKGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgYXMgYW55KS5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gd2hlbiBhbmltYXRpb24gZmluaXNoIGFuZ3VsYXIgZGVsZXRlcyBhbGwgb25Eb25lIGhhbmRsZXJzIHNvIHdlIG5lZWQgdG8gYWRkIGl0IGFnYWluIDooXG4gICAgICAgICAgICBpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyLm9uRG9uZSgoKSA9PiB0aGlzLmNsb3NlQW5pbWF0aW9uRG9uZShpbmZvKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyICYmIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5yZXNldCgpO1xuICAgICAgICAgICAgLy8gY2FsbGluZyByZXNldCBkb2VzIG5vdCBjaGFuZ2UgaGFzU3RhcnRlZCB0byBmYWxzZS4gVGhpcyBpcyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlcmUgdmlhIGludGVybmFsIGZpZWxkXG4gICAgICAgICAgICAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyIGFzIGFueSkuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlRG9uZShpbmZvKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmlzaEFuaW1hdGlvbnMoaW5mbzogT3ZlcmxheUluZm8pIHtcbiAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGVtaXQgaGVyZSBvcGVuZWQgb3IgY2xvc2VkIGV2ZW50c1xuICAgICAgICBpZiAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyICYmIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgIGluZm8ub3BlbkFuaW1hdGlvblBsYXllci5yZXNldCgpO1xuICAgICAgICAgICAgLy8gY2FsbGluZyByZXNldCBkb2VzIG5vdCBjaGFuZ2UgaGFzU3RhcnRlZCB0byBmYWxzZS4gVGhpcyBpcyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlcmUgdmlhIGludGVybmFsIGZpZWxkXG4gICAgICAgICAgICAoaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyIGFzIGFueSkuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciAmJiBpbmZvLmNsb3NlQW5pbWF0aW9uUGxheWVyLmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgaW5mby5jbG9zZUFuaW1hdGlvblBsYXllci5yZXNldCgpO1xuICAgICAgICAgICAgLy8gY2FsbGluZyByZXNldCBkb2VzIG5vdCBjaGFuZ2UgaGFzU3RhcnRlZCB0byBmYWxzZS4gVGhpcyBpcyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlcmUgdmlhIGludGVybmFsIGZpZWxkXG4gICAgICAgICAgICAoaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciBhcyBhbnkpLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -5585,8 +5585,8 @@ class IgxOverlayService {
5585
5585
  }
5586
5586
  this.updateSize(info);
5587
5587
  info.settings.positionStrategy.position(info.elementRef.nativeElement.parentElement, { width: info.initialSize.width, height: info.initialSize.height }, document, true, info.settings.target);
5588
+ this.addModalClasses(info);
5588
5589
  if (info.settings.positionStrategy.settings.openAnimation) {
5589
- this.buildAnimationPlayers(info);
5590
5590
  this.playOpenAnimation(info);
5591
5591
  }
5592
5592
  else {
@@ -5686,6 +5686,7 @@ class IgxOverlayService {
5686
5686
  if (eventArgs.cancel) {
5687
5687
  return;
5688
5688
  }
5689
+ this.removeModalClasses(info);
5689
5690
  if (info.settings.positionStrategy.settings.closeAnimation) {
5690
5691
  this.playCloseAnimation(info, event);
5691
5692
  }
@@ -5867,7 +5868,6 @@ class IgxOverlayService {
5867
5868
  // to eliminate flickering show the element just before animation start
5868
5869
  info.wrapperElement.style.visibility = '';
5869
5870
  info.visible = true;
5870
- this.addModalClasses(info);
5871
5871
  info.openAnimationPlayer.play();
5872
5872
  }
5873
5873
  playCloseAnimation(info, event) {
@@ -5893,7 +5893,6 @@ class IgxOverlayService {
5893
5893
  }
5894
5894
  this.animationStarting.emit({ id: info.id, animationPlayer: info.closeAnimationPlayer, animationType: 'close' });
5895
5895
  info.event = event;
5896
- this.removeModalClasses(info);
5897
5896
  info.closeAnimationPlayer.play();
5898
5897
  }
5899
5898
  // TODO: check if applyAnimationParams will work with complex animations