@smarterplan/ngx-smarterplan-core 1.4.20 → 1.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
  3. package/esm2022/lib/components/loader/loader.component.mjs +3 -3
  4. package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
  5. package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
  6. package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
  7. package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
  8. package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
  9. package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
  10. package/esm2022/lib/config.mjs +1 -1
  11. package/esm2022/lib/helpers.service.mjs +1 -1
  12. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
  13. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
  14. package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
  15. package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
  16. package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
  17. package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +49 -28
  18. package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
  19. package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
  20. package/esm2022/lib/mattertagData.mjs +1 -1
  21. package/esm2022/lib/ngx-smarterplan-core.module.mjs +1 -1
  22. package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
  23. package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
  24. package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
  25. package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
  26. package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
  27. package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
  28. package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
  29. package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
  30. package/esm2022/lib/services/base-tab.service.mjs +1 -1
  31. package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
  32. package/esm2022/lib/services/content.service.mjs +1 -1
  33. package/esm2022/lib/services/filter.service.mjs +1 -1
  34. package/esm2022/lib/services/intervention.service.mjs +1 -1
  35. package/esm2022/lib/services/locale.service.mjs +1 -1
  36. package/esm2022/lib/services/matterport-import.service.mjs +1 -1
  37. package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
  38. package/esm2022/lib/services/matterport-navigation.service.mjs +1 -1
  39. package/esm2022/lib/services/matterport-object3d.service.mjs +657 -133
  40. package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
  41. package/esm2022/lib/services/matterport-tag-copy.service.mjs +1 -1
  42. package/esm2022/lib/services/matterport-tag.service.mjs +1 -1
  43. package/esm2022/lib/services/matterport.service.mjs +346 -25
  44. package/esm2022/lib/services/models/affectation.service.mjs +1 -1
  45. package/esm2022/lib/services/models/base-object.service.mjs +1 -1
  46. package/esm2022/lib/services/models/capture.service.mjs +1 -1
  47. package/esm2022/lib/services/models/comment.service.mjs +1 -1
  48. package/esm2022/lib/services/models/domain.service.mjs +1 -1
  49. package/esm2022/lib/services/models/equipment.service.mjs +1 -1
  50. package/esm2022/lib/services/models/event.service.mjs +1 -1
  51. package/esm2022/lib/services/models/feature.service.mjs +1 -1
  52. package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
  53. package/esm2022/lib/services/models/layer.service.mjs +1 -1
  54. package/esm2022/lib/services/models/measurement.service.mjs +1 -1
  55. package/esm2022/lib/services/models/mission.service.mjs +1 -1
  56. package/esm2022/lib/services/models/navigation.service.mjs +1 -1
  57. package/esm2022/lib/services/models/node.service.mjs +1 -1
  58. package/esm2022/lib/services/models/object3D.service.mjs +1 -1
  59. package/esm2022/lib/services/models/operation.service.mjs +1 -1
  60. package/esm2022/lib/services/models/organisation.service.mjs +1 -1
  61. package/esm2022/lib/services/models/plan.service.mjs +1 -1
  62. package/esm2022/lib/services/models/poi.service.mjs +27 -27
  63. package/esm2022/lib/services/models/profile.service.mjs +1 -1
  64. package/esm2022/lib/services/models/property.service.mjs +1 -1
  65. package/esm2022/lib/services/models/space.service.mjs +1 -1
  66. package/esm2022/lib/services/models/template.service.mjs +1 -1
  67. package/esm2022/lib/services/models/ticket.service.mjs +1 -1
  68. package/esm2022/lib/services/models/visit.service.mjs +1 -1
  69. package/esm2022/lib/services/models/zone.service.mjs +1 -1
  70. package/esm2022/lib/services/navigator.service.mjs +1 -1
  71. package/esm2022/lib/services/s3.service.mjs +1 -1
  72. package/esm2022/lib/services/search.service.mjs +1 -1
  73. package/esm2022/lib/services/support.service.mjs +1 -1
  74. package/esm2022/lib/services/sweep-locator.service.mjs +1 -1
  75. package/esm2022/lib/services/tag.service.mjs +16 -16
  76. package/esm2022/lib/services/threejs-import.service.mjs +1 -1
  77. package/esm2022/lib/services/threejs.service.mjs +1 -1
  78. package/esm2022/lib/services/user.service.mjs +1 -1
  79. package/esm2022/lib/services/utils/matterport-framing.util.mjs +63 -0
  80. package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
  81. package/esm2022/lib/services/validators.service.mjs +1 -1
  82. package/esm2022/lib/services/viewer.service.mjs +1 -1
  83. package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
  84. package/esm2022/lib/services/zoneChange.service.mjs +1 -1
  85. package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
  86. package/esm2022/lib/types.service.mjs +3 -1
  87. package/esm2022/lib/validators/email.directive.mjs +1 -1
  88. package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
  89. package/esm2022/lib/validators/number.directive.mjs +1 -1
  90. package/esm2022/lib/validators/text.directive.mjs +1 -1
  91. package/esm2022/public-api.mjs +1 -1
  92. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +1192 -263
  93. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  94. package/lib/services/matterport-object3d.service.d.ts +125 -5
  95. package/lib/services/matterport.service.d.ts +106 -7
  96. package/lib/services/utils/matterport-framing.util.d.ts +40 -0
  97. package/lib/types.service.d.ts +42 -1
  98. package/package.json +1 -1
  99. package/src/assets/vs-app.json +67 -67
@@ -2389,4 +2389,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2389
2389
  providedIn: 'root'
2390
2390
  }]
2391
2391
  }], ctorParameters: () => [{ type: i0.NgZone }] });
2392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVqcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90aHJlZWpzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQW1GL0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLENBQWdCO0lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lB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QUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDN0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7WUFDdEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzVELE1BQU0sTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3RyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdB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SyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7d0dBNStFVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgT3JiaXRDb250cm9scyB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9jb250cm9scy9PcmJpdENvbnRyb2xzJztcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XG5pbXBvcnQgeyBNVExMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9NVExMb2FkZXInO1xuaW1wb3J0IHsgR0xURkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0dMVEZMb2FkZXInO1xuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xuaW1wb3J0IHsgTWVzaG9wdERlY29kZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbGlicy9tZXNob3B0X2RlY29kZXIubW9kdWxlLmpzJztcbmltcG9ydCB7IExpbmUyIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xpbmVzL0xpbmUyJztcbmltcG9ydCB7IExpbmVHZW9tZXRyeSB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lR2VvbWV0cnknO1xuaW1wb3J0IHsgTGluZU1hdGVyaWFsIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xpbmVzL0xpbmVNYXRlcmlhbCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUaHJlZUpzQWxpZ25tZW50LCBUaHJlZUpzTW9kZWxVcCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2lUeXBlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5cbi8qKlxuICogQSB0YWcgdG8gZHJhdyBpbiB0aGUgVGhyZWUuanMgc2NlbmUsIG1pcnJvcmluZyBhIE1hdHRlcnRhZy5cbiAqXG4gKiBQb3NpdGlvbnMgYXJlIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlIHNwYWNlIC0gdGhlIHNhbWUgbnVtYmVycyBzdG9yZWQgaW4gUE9JLmNvb3JkaW5hdGUgLVxuICogbm90IHNjZW5lIHNwYWNlLiBUaGUgc2VydmljZSByZXBhcmVudHMgdGFncyB1bmRlciB0aGUgbW9kZWwgc28gdGhleSBpbmhlcml0IHRoZSBjZW50ZXJpbmcgYW5kXG4gKiBzY2FsaW5nIGFwcGxpZWQgYXQgbG9hZCwgd2hpY2ggbWVhbnMgY2FsbGVycyBuZXZlciBkZWFsIHdpdGggdGhhdCB0cmFuc2Zvcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZyB7XG4gIC8qKiBUaGUgdGFnZ2VkIGVsZW1lbnQncyBpZCAoUE9JLmVsZW1lbnRJRCksIHVzZWQgdG8gdXBkYXRlIG9yIHJlbW92ZSB0aGUgdGFnIGxhdGVyLiAqL1xuICBpZDogc3RyaW5nO1xuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIC8qKiBEcml2ZXMgYm90aCB0aGUgY2xpY2sgcm91dGUgYW5kIHR5cGUgZmlsdGVyaW5nLCBzbyBpdCB0cmF2ZWxzIHdpdGggdGhlIHRhZy4gKi9cbiAgcG9pVHlwZT86IFBvaVR5cGUgfCBudWxsO1xuICAvKiogU2hvd24gb24gaG92ZXIuIEEgbWFya2VyIHdpdGggbm8gaWRlbnRpdHkgaXMganVzdCBhIGRvdCBvbiBhIHdhbGwuICovXG4gIGxhYmVsPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBUaHJlZS5qcyBjYXB0dXJlIHRoaXMgdGFnIHdhcyBwbGFjZWQgaW4sIHdoZW4gaXQgd2FzIHBsYWNlZCBpbiBvbmUuICovXG4gIG9yaWdpbkNhcHR1cmVJRD86IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiAnbW9kZWwnIHdoZW4gdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGFncyBzaGFyZTpcbiAgICogYSB0YWcgcGxhY2VkIGluIGEgbW9kZWwgYmVmb3JlIGl0IHdhcyBjYWxpYnJhdGVkLiBPbmx5IG1lYW5pbmdmdWwgaW4gdGhlIG1vZGVsIGl0IHdhcyBwbGFjZWQgaW4uXG4gICAqL1xuICBmcmFtZT86ICdtb2RlbCcgfCBudWxsO1xuICAvKiogSWNvbiBkcmF3biBvbiB0aGUgdGFnLiBGYWxscyBiYWNrIHRvIGEgcGxhaW4gZGlzYyB3aGVuIGFic2VudCBvciBpdCBmYWlscyB0byBsb2FkLiAqL1xuICBpY29uVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRpbnQgZm9yIHRoZSBmYWxsYmFjayBkaXNjLCBhcyBhIENTUyBjb2xvdXIuICovXG4gIGNvbG9yPzogc3RyaW5nO1xufVxuXG4vKiogV2hhdCBhIGNsaWNrIG9uIGEgdGFnIHJlcG9ydHM6IGVub3VnaCB0byByb3V0ZSB0byB0aGUgZWxlbWVudCdzIGRldGFpbCBwYWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzVGFnQ2xpY2sge1xuICBlbGVtZW50SWQ6IHN0cmluZztcbiAgcG9pVHlwZTogUG9pVHlwZSB8IG51bGw7XG59XG5cbi8qKlxuICogQSBzcG90IHBpY2tlZCBvbiB0aGUgbW9kZWwgZm9yIGEgbmV3IHRhZy5cbiAqXG4gKiBCb3RoIHZlY3RvcnMgYXJlIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlIHNwYWNlLCB3aGljaCBpcyB3aGF0IFBPSS5jb29yZGluYXRlIHN0b3Jlcy4gU2NlbmVcbiAqIGNvb3JkaW5hdGVzIGRlbGliZXJhdGVseSBuZXZlciBsZWF2ZSB0aGlzIHNlcnZpY2U6IHRoZSBtb2RlbCBpcyBzY2FsZWQgdG8gYSBmaXhlZCBzaXplIG9uIGxvYWQsIHNvXG4gKiBhIHNjZW5lLXNwYWNlIHBvc2l0aW9uIHdvdWxkIHNpbGVudGx5IG1lYW4gc29tZXdoZXJlIGVsc2UgdGhlIG1vbWVudCB0aGUgLmdsYiBpcyByZS1leHBvcnRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzVGFnUGxhY2VtZW50IHtcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICAvKiogU3VyZmFjZSBub3JtYWwgYXQgdGhlIHBpY2tlZCBwb2ludCAtIE1hdHRlcnBvcnQgc3RvcmVzIHRoZSBzYW1lIHRoaW5nIGluIFBPSS5tZXRhZGF0YS4gKi9cbiAgbm9ybWFsOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgLyoqIFdoYXQgdGhlIHBsYWNlbWVudCB3YXMgYXJtZWQgZm9yLCBzbyB0aGUgY2FsbGVyIGtub3dzIHdoaWNoIGNyZWF0aW9uIGZvcm0gdG8gb3Blbi4gKi9cbiAgcG9pVHlwZT86IFBvaVR5cGUgfCBudWxsO1xufVxuXG4vKiogT25lIHRhZyBzZWVuIGluIGJvdGggc3BhY2VzOiB3aGVyZSBpdCBpcyBzdG9yZWQsIGFuZCB3aGVyZSBpdCByZWFsbHkgc2l0cyBvbiB0aGUgbW9kZWwuICovXG4vKiogQSBkaXN0YW5jZSBtZWFzdXJlZCBvbiB0aGUgbW9kZWw6IGl0cyBwb2ludHMsIGVhY2ggc2VnbWVudCdzIGxlbmd0aCwgYW5kIGEgcGljdHVyZSBvZiBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc01lYXN1cmVtZW50IHtcbiAgLyoqIEluIHRoZSBmcmFtZSB0YWcgY29vcmRpbmF0ZXMgYXJlIHN0b3JlZCBpbiwgc28gdGhlIGxhc3Qgb25lIGNhbiBiZSBzYXZlZCBhcyB0aGUgUE9JLiAqL1xuICBwb2ludHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9W107XG4gIC8qKiBNZXRyZXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBwb2ludHMsIHJvdW5kZWQgbGlrZSBNYXR0ZXJwb3J0J3MgbWVhc3VyZW1lbnRzIGFyZS4gKi9cbiAgZGlzdGFuY2VzOiBudW1iZXJbXTtcbiAgLyoqIEpQRUcgZGF0YSBVUkkgb2YgdGhlIHNjZW5lIHdpdGggdGhlIG1lYXN1cmVtZW50IGRyYXduIG9uIGl0LiAqL1xuICBzY3JlZW5zaG90OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSB0YWcgcGxhY2VkIGluIHRoaXMgbW9kZWwgd2hvc2Ugc3RvcmVkIGNvb3JkaW5hdGVzIGhhZCB0byBjaGFuZ2UgZm9yIGl0IHRvIHN0YXkgd2hlcmUgaXQgaXMsXG4gKiBiZWNhdXNlIHRoZSBjYWxpYnJhdGlvbiBpdCBpcyBkcmF3biB1bmRlciBjaGFuZ2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVlSnNSZWJhc2VkVGFnIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIEl0cyBjb29yZGluYXRlcyBpbiB0aGUgc3BhY2UgdGFncyBzaGFyZSwgdW5kZXIgdGhlIG5ldyBjYWxpYnJhdGlvbi4gKi9cbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICAvKiogVHVybnMgYSBkaXJlY3Rpb24gc3RvcmVkIHdpdGggdGhlIHRhZyAtIGl0cyBzdXJmYWNlIG5vcm1hbCAtIHRoZSBzYW1lIHdheS4gKi9cbiAgcm90YXRlRGlyZWN0aW9uOiAoZGlyZWN0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSkgPT4geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc0FsaWdubWVudFBhaXIge1xuICAvKiogVGhlIHRhZyB0aGUgcGFpciB3YXMgbWFkZSBmcm9tLCB3aGVuIGl0IGNhbWUgZnJvbSBvbmUuICovXG4gIHRhZ0lkPzogc3RyaW5nO1xuICBzb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICB0YXJnZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhbiBvcnRob25vcm1hbCBmcmFtZSBmcm9tIHRocmVlIHBvaW50cywgb3IgbnVsbCB3aGVuIHRoZXkgYXJlIChuZWFybHkpIGNvbGxpbmVhci5cbiAqXG4gKiBUaHJlZSBwb2ludHMgZGVmaW5lIGEgcGxhbmUsIGFuZCBhIHBsYW5lIHBsdXMgYW4gb3JpZ2luIGRlZmluZXMgYW4gb3JpZW50YXRpb24uIENvbGxpbmVhciBwb2ludHNcbiAqIGRvIG5vdDogdGhleSBsZWF2ZSB0aGUgcm90YXRpb24gYWJvdXQgdGhlaXIgY29tbW9uIGxpbmUgdW5kZXRlcm1pbmVkLCB3aGljaCBpcyB3aHkgdGhlIGNhbGxlciBoYXNcbiAqIHRvIHJlamVjdCB0aGVtIHJhdGhlciB0aGFuIHByb2R1Y2UgYSBjb25maWRlbnQgd3JvbmcgYW5zd2VyLlxuICovXG5mdW5jdGlvbiBmcmFtZUZyb21Qb2ludHMoYTogVEhSRUUuVmVjdG9yMywgYjogVEhSRUUuVmVjdG9yMywgYzogVEhSRUUuVmVjdG9yMyk6IFRIUkVFLk1hdHJpeDQgfCBudWxsIHtcbiAgY29uc3QgZTEgPSBiLmNsb25lKCkuc3ViKGEpO1xuICBpZiAoZTEubGVuZ3RoU3EoKSA8IDFlLTEyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZTEubm9ybWFsaXplKCk7XG5cbiAgY29uc3QgdG9DID0gYy5jbG9uZSgpLnN1YihhKTtcbiAgY29uc3QgZTIgPSB0b0MuY2xvbmUoKS5zdWIoZTEuY2xvbmUoKS5tdWx0aXBseVNjYWxhcih0b0MuZG90KGUxKSkpO1xuICBpZiAoZTIubGVuZ3RoU3EoKSA8IDFlLTEyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZTIubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZUJhc2lzKGUxLCBlMiwgZTEuY2xvbmUoKS5jcm9zcyhlMikpO1xufVxuXG4vKipcbiAqIFNvbHZlcyB0aGUgdHJhbnNmb3JtIHRoYXQgbWFwcyBzdG9yZWQgdGFnIGNvb3JkaW5hdGVzIG9udG8gdGhlIGxvYWRlZCBtb2RlbCwgZnJvbSBhcyBtYW55IG1hdGNoZWRcbiAqIHRhZ3MgYXMgdGhlcmUgYXJlIC0gdXAgdG8gdGhyZWUuXG4gKlxuICogVGhyZWUgcGFpcnMgcGluIGRvd24gZXZlcnl0aGluZzogcG9zaXRpb24sIG9yaWVudGF0aW9uIGFuZCBzY2FsZS4gQSBtb2RlbCB0aGF0IHNoYXJlcyBvbmx5IGFcbiAqIGNvcm5lciB3aXRoIHRoZSB0YWdzJyBzcGFjZSBtYXkgbm90IGhhdmUgdGhyZWUgdGFncyB0byBvZmZlciwgc28gZmV3ZXIgYXJlIGFjY2VwdGVkLCBlYWNoXG4gKiBzZXR0bGluZyB3aGF0IGl0IGNhbiBhbmQgYXNzdW1pbmcgdGhlIHJlc3Q6XG4gKlxuICogIC0gVHdvIHBhaXJzOiBwb3NpdGlvbiwgaGVhZGluZyBhbmQgc2NhbGUuIFRoZSBvbmUgdGhpbmcgdHdvIHBvaW50cyBjYW5ub3Qgc2F5IGlzIGhvdyB0aGUgbW9kZWxcbiAqICAgIGlzIHRpbHRlZCwgc28gYm90aCBzcGFjZXMgYXJlIHRha2VuIHRvIGFncmVlIG9uIHdoaWNoIHdheSBpcyB1cC5cbiAqICAtIE9uZSBwYWlyOiBwb3NpdGlvbiBvbmx5LiBIZWFkaW5nIGFuZCBzY2FsZSBhcmUgdGFrZW4gdG8gbWF0Y2ggYWxyZWFkeS5cbiAqXG4gKiBgdGFyZ2V0VXBgIGlzIHRoZSBtb2RlbCdzIHZlcnRpY2FsIGF4aXMsIHdoaWNoIHRoZSB0YWdzJyBvd24gdmVydGljYWwgKCtZKSBpcyBtYXRjaGVkIHRvIGluIHRob3NlXG4gKiB0d28gY2FzZXMuIFJldHVybnMgbnVsbCB3aGVuIHRoZSBwb2ludHMgY2Fubm90IGFuc3dlciB0aGUgcXVlc3Rpb24gYXNrZWQgb2YgdGhlbSAtIGNvbGxpbmVhciBmb3JcbiAqIHRocmVlLCBvbmUgYWJvdmUgdGhlIG90aGVyIGZvciB0d28gLSBiZWNhdXNlIGEgd3JvbmcgY2FsaWJyYXRpb24gYXBwbGllZCBzaWxlbnRseSBpcyB3b3JzZSB0aGFuXG4gKiBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29sdmVUaHJlZUpzQWxpZ25tZW50KFxuICBwYWlyczogVGhyZWVKc0FsaWdubWVudFBhaXJbXSxcbiAgdGFyZ2V0VXA6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9ID0geyB4OiAwLCB5OiAxLCB6OiAwIH0sXG4pOiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCB7XG4gIGlmICghcGFpcnMgfHwgcGFpcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHBhaXJzLmxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4gc29sdmVSZWR1Y2VkQWxpZ25tZW50KHBhaXJzLCBuZXcgVEhSRUUuVmVjdG9yMyh0YXJnZXRVcC54LCB0YXJnZXRVcC55LCB0YXJnZXRVcC56KS5ub3JtYWxpemUoKSk7XG4gIH1cblxuICBjb25zdCBzb3VyY2VzID0gcGFpcnMuc2xpY2UoMCwgMykubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnNvdXJjZS54LCBwYWlyLnNvdXJjZS55LCBwYWlyLnNvdXJjZS56KSk7XG4gIGNvbnN0IHRhcmdldHMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIudGFyZ2V0LngsIHBhaXIudGFyZ2V0LnksIHBhaXIudGFyZ2V0LnopKTtcblxuICBjb25zdCBzb3VyY2VGcmFtZSA9IGZyYW1lRnJvbVBvaW50cyhzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBzb3VyY2VzWzJdKTtcbiAgY29uc3QgdGFyZ2V0RnJhbWUgPSBmcmFtZUZyb21Qb2ludHModGFyZ2V0c1swXSwgdGFyZ2V0c1sxXSwgdGFyZ2V0c1syXSk7XG4gIGlmICghc291cmNlRnJhbWUgfHwgIXRhcmdldEZyYW1lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBIHJvdGF0aW9uJ3MgaW52ZXJzZSBpcyBpdHMgdHJhbnNwb3NlLCBzbyB0aGlzIGlzIHRoZSByb3RhdGlvbiBjYXJyeWluZyBvbmUgZnJhbWUgb250byB0aGUgb3RoZXIuXG4gIGNvbnN0IHJvdGF0aW9uID0gdGFyZ2V0RnJhbWUubXVsdGlwbHkoc291cmNlRnJhbWUuY2xvbmUoKS50cmFuc3Bvc2UoKSk7XG5cbiAgLy8gU2NhbGUgZnJvbSBob3cgZmFyIGFwYXJ0IHRoZSBwb2ludHMgYXJlIGluIGVhY2ggc3BhY2UsIGF2ZXJhZ2VkIG92ZXIgdGhlIHRocmVlIGVkZ2VzIHNvIGEgc2luZ2xlXG4gIC8vIHNsb3BweSBjbGljayBkb2VzIG5vdCBzZXQgaXQgb24gaXRzIG93bi5cbiAgY29uc3QgZWRnZXMgPSBbWzAsIDFdLCBbMSwgMl0sIFswLCAyXV07XG4gIGxldCByYXRpb1N1bSA9IDA7XG4gIGxldCByYXRpb0NvdW50ID0gMDtcbiAgZm9yIChjb25zdCBbaSwgal0gb2YgZWRnZXMpIHtcbiAgICBjb25zdCBzb3VyY2VMZW5ndGggPSBzb3VyY2VzW2ldLmRpc3RhbmNlVG8oc291cmNlc1tqXSk7XG4gICAgY29uc3QgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0c1tpXS5kaXN0YW5jZVRvKHRhcmdldHNbal0pO1xuICAgIGlmIChzb3VyY2VMZW5ndGggPiAxZS05KSB7XG4gICAgICByYXRpb1N1bSArPSB0YXJnZXRMZW5ndGggLyBzb3VyY2VMZW5ndGg7XG4gICAgICByYXRpb0NvdW50ICs9IDE7XG4gICAgfVxuICB9XG4gIGlmIChyYXRpb0NvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc2NhbGUgPSByYXRpb1N1bSAvIHJhdGlvQ291bnQ7XG5cbiAgLy8gVGhlIGdyb3VwIGFwcGxpZXMgcG9zaXRpb24sIHRoZW4gcm90YXRpb24sIHRoZW4gc2NhbGUsIHNvIGEgcG9pbnQgbGFuZHMgYXQgdCArIHMqUipwLiBTb2x2aW5nXG4gIC8vIHRoYXQgZm9yIHQgYXQgdGhlIGNlbnRyb2lkcyBnaXZlcyB0aGUgdHJhbnNsYXRpb24uXG4gIGNvbnN0IHNvdXJjZUNlbnRyb2lkID0gc291cmNlcy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIDMpO1xuICBjb25zdCB0YXJnZXRDZW50cm9pZCA9IHRhcmdldHMucmVkdWNlKChzdW0sIHYpID0+IHN1bS5hZGQodiksIG5ldyBUSFJFRS5WZWN0b3IzKCkpLm11bHRpcGx5U2NhbGFyKDEgLyAzKTtcbiAgY29uc3QgdHJhbnNsYXRpb24gPSB0YXJnZXRDZW50cm9pZFxuICAgIC5jbG9uZSgpXG4gICAgLnN1Yihzb3VyY2VDZW50cm9pZC5jbG9uZSgpLmFwcGx5TWF0cml4NChyb3RhdGlvbikubXVsdGlwbHlTY2FsYXIoc2NhbGUpKTtcblxuICBjb25zdCBldWxlciA9IG5ldyBUSFJFRS5FdWxlcigpLnNldEZyb21Sb3RhdGlvbk1hdHJpeChyb3RhdGlvbik7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXG4gICAgcm90YXRpb246IHsgeDogZXVsZXIueCwgeTogZXVsZXIueSwgejogZXVsZXIueiB9LFxuICAgIHNjYWxlLFxuICB9O1xufVxuXG4vKiogVGhlIG9uZS0gYW5kIHR3by1wYWlyIGNhc2VzIG9mIHNvbHZlVGhyZWVKc0FsaWdubWVudCwgd2hpY2ggc2hhcmUgdGhlIFwic2FtZSB2ZXJ0aWNhbFwiIGFzc3VtcHRpb24uICovXG5mdW5jdGlvbiBzb2x2ZVJlZHVjZWRBbGlnbm1lbnQocGFpcnM6IFRocmVlSnNBbGlnbm1lbnRQYWlyW10sIHVwOiBUSFJFRS5WZWN0b3IzKTogVGhyZWVKc0FsaWdubWVudCB8IG51bGwge1xuICBjb25zdCBzb3VyY2VzID0gcGFpcnMubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnNvdXJjZS54LCBwYWlyLnNvdXJjZS55LCBwYWlyLnNvdXJjZS56KSk7XG4gIGNvbnN0IHRhcmdldHMgPSBwYWlycy5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIudGFyZ2V0LngsIHBhaXIudGFyZ2V0LnksIHBhaXIudGFyZ2V0LnopKTtcblxuICAvLyBTdGFydHMgZnJvbSB0aGUgcm90YXRpb24gdGhhdCBvbmx5IHN0YW5kcyB0aGUgdGFncycgdmVydGljYWwgb24gdGhlIG1vZGVsJ3MuXG4gIGNvbnN0IHJvdGF0aW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMobmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCksIHVwKTtcbiAgbGV0IHNjYWxlID0gMTtcblxuICBpZiAocGFpcnMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3Qgc291cmNlU3BhbiA9IHNvdXJjZXNbMV0uY2xvbmUoKS5zdWIoc291cmNlc1swXSk7XG4gICAgY29uc3QgdGFyZ2V0U3BhbiA9IHRhcmdldHNbMV0uY2xvbmUoKS5zdWIodGFyZ2V0c1swXSk7XG4gICAgaWYgKHNvdXJjZVNwYW4ubGVuZ3RoKCkgPCAxZS05IHx8IHRhcmdldFNwYW4ubGVuZ3RoKCkgPCAxZS05KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2NhbGUgPSB0YXJnZXRTcGFuLmxlbmd0aCgpIC8gc291cmNlU3Bhbi5sZW5ndGgoKTtcblxuICAgIC8vIEhlYWRpbmcgaXMgdGhlIHR1cm4gYWJvdXQgdGhlIHZlcnRpY2FsIHRoYXQgbGluZXMgdGhlIHR3byBzcGFucyB1cCwgc28gb25seSB0aGVpciBob3Jpem9udGFsXG4gICAgLy8gcGFydHMgY291bnQuIFR3byBwb2ludHMgb25lIGFib3ZlIHRoZSBvdGhlciBoYXZlIG5vbmUsIGFuZCBzYXkgbm90aGluZyBhYm91dCBoZWFkaW5nLlxuICAgIGNvbnN0IGZsYXR0ZW4gPSAodjogVEhSRUUuVmVjdG9yMykgPT4gdi5jbG9uZSgpLnN1Yih1cC5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKHYuZG90KHVwKSkpO1xuICAgIGNvbnN0IGZyb20gPSBmbGF0dGVuKHNvdXJjZVNwYW4uY2xvbmUoKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pKTtcbiAgICBjb25zdCB0byA9IGZsYXR0ZW4odGFyZ2V0U3Bhbik7XG4gICAgaWYgKGZyb20ubGVuZ3RoKCkgPCAxZS02ICogc291cmNlU3Bhbi5sZW5ndGgoKSB8fCB0by5sZW5ndGgoKSA8IDFlLTYgKiB0YXJnZXRTcGFuLmxlbmd0aCgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgaGVhZGluZyA9IE1hdGguYXRhbjIobmV3IFRIUkVFLlZlY3RvcjMoKS5jcm9zc1ZlY3RvcnMoZnJvbSwgdG8pLmRvdCh1cCksIGZyb20uZG90KHRvKSk7XG4gICAgcm90YXRpb24ucHJlbXVsdGlwbHkobmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tQXhpc0FuZ2xlKHVwLCBoZWFkaW5nKSk7XG4gIH1cblxuICAvLyBBIHBvaW50IGxhbmRzIGF0IHQgKyBzKlIqcDsgc29sdmVkIGZvciB0IGF0IHRoZSBjZW50cm9pZHMsIGFzIGluIHRoZSB0aHJlZS1wYWlyIGNhc2UuXG4gIGNvbnN0IGNlbnRyb2lkID0gKHBvaW50czogVEhSRUUuVmVjdG9yM1tdKSA9PlxuICAgIHBvaW50cy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIHBvaW50cy5sZW5ndGgpO1xuICBjb25zdCB0cmFuc2xhdGlvbiA9IGNlbnRyb2lkKHRhcmdldHMpLnN1YihjZW50cm9pZChzb3VyY2VzKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pLm11bHRpcGx5U2NhbGFyKHNjYWxlKSk7XG4gIGNvbnN0IGV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKCkuc2V0RnJvbVF1YXRlcm5pb24ocm90YXRpb24pO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNsYXRpb246IHsgeDogdHJhbnNsYXRpb24ueCwgeTogdHJhbnNsYXRpb24ueSwgejogdHJhbnNsYXRpb24ueiB9LFxuICAgIHJvdGF0aW9uOiB7IHg6IGV1bGVyLngsIHk6IGV1bGVyLnksIHo6IGV1bGVyLnogfSxcbiAgICBzY2FsZSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmpBZGRlZCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nOyAvLyBUaGUgVVJMIHRvIHRoZSAub2JqIGZpbGVcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIHNjYWxlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZE1lc2hHcm91cCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGNvdW50OiBudW1iZXI7XG4gIG1hdGVyaWFsSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqIFJhdyBnZW9tZXRyeSBkYXRhIGV4dHJhY3RlZCBmcm9tIGEgcGFyc2VkIE9CSiBtZXNoLCBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXG5pbnRlcmZhY2UgUGFyc2VkTWVzaERhdGEge1xuICBuYW1lOiBzdHJpbmc7XG4gIC8vIE9uZSBuYW1lIHBlciBtYXRlcmlhbCB1c2VkIGJ5IHRoaXMgbWVzaC4gQSBzaW5nbGUtbWF0ZXJpYWwgbWVzaCBoYXMgb25lIGVudHJ5O1xuICAvLyBhIG1lc2ggd2l0aCBtdWx0aXBsZSB1c2VtdGwgc3dpdGNoZXMgKGdlb21ldHJ5Lmdyb3VwcykgaGFzIG9uZSBwZXIgZ3JvdXAuXG4gIG1hdGVyaWFsTmFtZXM6IHN0cmluZ1tdO1xuICBncm91cHM6IFBhcnNlZE1lc2hHcm91cFtdIHwgbnVsbDtcbiAgcG9zaXRpb246IEZsb2F0MzJBcnJheTtcbiAgbm9ybWFsOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xuICB1djogRmxvYXQzMkFycmF5IHwgbnVsbDtcbiAgaW5kZXg6IFVpbnQzMkFycmF5IHwgbnVsbDtcbiAgYm91bmRpbmdCb3g/OiB7IG1pbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtYXg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9O1xufVxuXG5pbnRlcmZhY2UgT2JqUGFyc2VyV29ya2VyUmVzcG9uc2Uge1xuICByZXF1ZXN0SWQ6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzaGVzPzogUGFyc2VkTWVzaERhdGFbXTtcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRocmVlSnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzY2VuZSE6IFRIUkVFLlNjZW5lO1xuICBwcml2YXRlIGNhbWVyYSE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xuICBwcml2YXRlIHJlbmRlcmVyITogVEhSRUUuV2ViR0xSZW5kZXJlcjtcbiAgcHJpdmF0ZSBjb250cm9scyE6IE9yYml0Q29udHJvbHM7XG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZCE6IG51bWJlcjtcblxuICAvLyBSYXljYXN0aW5nIGFuZCBpbnRlcmFjdGlvblxuICBwcml2YXRlIHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcbiAgcHJpdmF0ZSBtb3VzZSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XG4gIHByaXZhdGUgaXNEcmFnZ2luZ0NhbWVyYTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGlzRHJhZ2dpbmdUaW1lcjogYW55O1xuICBwcml2YXRlIGNsaWNrYWJsZU9iamVjdHM6IFRIUkVFLk9iamVjdDNEW10gPSBbXTtcblxuICAvLyBPYnNlcnZhYmxlcyBmb3IgdGhlIHZpZXdlciBjb21wb25lbnRcbiAgcHVibGljIG9iamVjdEhvdmVyZWQkID0gbmV3IFN1YmplY3Q8eyBpZDogc3RyaW5nOyBldmVudDogTW91c2VFdmVudCB9IHwgbnVsbD4oKTtcbiAgcHVibGljIG9iamVjdENsaWNrZWQkID0gbmV3IFN1YmplY3Q8c3RyaW5nIHwgbnVsbD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgdXNlciBjbGlja3MgYSB0YWcsIG1pcnJvcmluZyBNYXR0ZXJwb3J0J3MgdGFnIGNsaWNrLiAqL1xuICBwdWJsaWMgdGFnQ2xpY2tlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnQ2xpY2s+KCk7XG5cbiAgLyoqIEVtaXRzIGEgdGFnJ3MgbGFiZWwgd2hpbGUgdGhlIHBvaW50ZXIgaXMgb3ZlciBpdCwgYW5kIG51bGwgd2hlbiBpdCBsZWF2ZXMuICovXG4gIHB1YmxpYyB0YWdIb3ZlcmVkJCA9IG5ldyBTdWJqZWN0PHsgbGFiZWw6IHN0cmluZzsgZXZlbnQ6IE1vdXNlRXZlbnQgfSB8IG51bGw+KCk7XG5cbiAgLy8gVGFncyBsaXZlIHVuZGVyIHRoZSBtb2RlbCByYXRoZXIgdGhhbiB0aGUgc2NlbmUsIHNvIHRoZSBjZW50ZXJpbmcgYW5kIHNjYWxpbmcgYXBwbGllZCB3aGVuIHRoZVxuICAvLyBtb2RlbCBpcyBwbGFjZWQgY2FycmllcyBvdmVyIGFuZCBQT0kgY29vcmRpbmF0ZXMgY2FuIHN0YXkgaW4gdGhlIG1vZGVsJ3Mgb3duIHNwYWNlLlxuICBwcml2YXRlIHRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XG4gIHByaXZhdGUgdGFnU3ByaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBUSFJFRS5TcHJpdGU+KCk7XG5cbiAgcHJpdmF0ZSBjYW52YXNSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIC8qKiBBYm9ydHMgdGhlIGluLWZsaWdodCBtb2RlbCBkb3dubG9hZC4gUGFyc2luZyBjYW5ub3QgYmUgaW50ZXJydXB0ZWQsIG9ubHkgbm90IHN0YXJ0ZWQuICovXG4gIHByaXZhdGUgbG9hZEFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcblxuICAvLyBUaGUgbG9hZGVkIGJhc2UgbW9kZWwsIGtlcHQgc28gdGFnIHBsYWNlbWVudCBjYW4gcmF5Y2FzdCBhZ2FpbnN0IGl0cyBnZW9tZXRyeS5cbiAgcHJpdmF0ZSBtb2RlbFJvb3Q/OiBUSFJFRS5PYmplY3QzRDtcblxuICAvKiogVHJ1ZSB3aGlsZSB0aGUgbmV4dCBjbGljayBvbiB0aGUgbW9kZWwgcGxhY2VzIGEgdGFnIGluc3RlYWQgb2Ygb3JiaXRpbmcuICovXG4gIHByaXZhdGUgcGxhY2luZ1RhZyA9IGZhbHNlO1xuXG4gIC8qKiBXaGF0IHRoZSBhcm1lZCBwbGFjZW1lbnQgaXMgZm9yLCBlY2hvZWQgYmFjayB3aGVuIHRoZSBzcG90IGlzIHBpY2tlZC4gKi9cbiAgcHJpdmF0ZSBwbGFjZW1lbnRQb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFBvc2l0aW9uIGFuZCBub3JtYWwgb2YgdGhlIGxhc3QgcGxhY2VkIHRhZywgaW4gbW9kZWwgc3BhY2UsIGF3YWl0aW5nIGNvbW1pdCB0byBhIFBPSS4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nVGFnUGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFBvaW50ZXIgcG9zaXRpb24gd2FpdGluZyBmb3IgYSBwcmV2aWV3IHBpY2ssIGNvYWxlc2NlZCB0byBvbmUgcGVyIGZyYW1lLiAqL1xuICBwcml2YXRlIHBlbmRpbmdQcmV2aWV3RXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGFncyB3aG9zZSBwb3NpdGlvbiBpcyBpbiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLiBBIHNpYmxpbmcgb2YgdGhlIHRhZyBncm91cCB0aGF0IGRvZXMgbm90XG4gICAqIGNhcnJ5IHRoZSBjYWxpYnJhdGlvbjogY2FsaWJyYXRpbmcgYSBtb2RlbCBmb3IgdGhlIHRhZ3MgaXQgaW1wb3J0cyBtdXN0IG5vdCBtb3ZlIHRoZSBvbmVzIHRoYXRcbiAgICogd2VyZSBwbGFjZWQgc3RyYWlnaHQgb250byBpdC5cbiAgICovXG4gIHByaXZhdGUgbW9kZWxUYWdHcm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZSBvbiBzY3JlZW4uIEEgdGFnIHBsYWNlZCBpbiBhIDNEIG1vZGVsIGlzIHJlY29yZGVkIHdpdGggaXQsIHdoaWNoIGlzIGhvdyB0aGUgdGFnc1xuICAgKiBwbGFjZWQgaW4gdGhpcyBvbmUgYXJlIHRvbGQgZnJvbSB0aG9zZSB0aGF0IGNhbWUgZnJvbSBlbHNld2hlcmUuXG4gICAqL1xuICBwcml2YXRlIGN1cnJlbnRDYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwncyBzdXJmYWNlIGFzIGEgZ3JpZDogZXZlcnkgY2VsbCBzb21lIHBhcnQgb2YgdGhlIHN1cmZhY2UgcGFzc2VzIHRocm91Z2guXG4gICAqXG4gICAqIEl0IGFuc3dlcnMgXCJpcyB0aGlzIHBvaW50IG5lYXIgdGhlIG1vZGVsP1wiIHdpdGhvdXQgdmlzaXRpbmcgdGhlIHRyaWFuZ2xlcywgb2Ygd2hpY2ggYSBjYXB0dXJlZFxuICAgKiBtb2RlbCBoYXMgbWlsbGlvbnMgLSB0aGUgcXVlc3Rpb24gaXMgYXNrZWQgZm9yIGV2ZXJ5IHRhZywgZXZlcnkgdGltZSB0aGUgY2FsaWJyYXRpb24gY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgc3VyZmFjZUNlbGxzOiBTZXQ8bnVtYmVyPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc3VyZmFjZU9yaWdpbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cbiAgcHJpdmF0ZSBzdXJmYWNlQ2VsbFNpemUgPSAxO1xuXG4gIC8qKlxuICAgKiBIb3cgZmFyIGZyb20gdGhlIG1vZGVsJ3Mgc3VyZmFjZSBhIHRhZyBtYXkgYmUgYW5kIHN0aWxsIGNvdW50IGFzIG9uIGl0LCBpbiBtZXRyZXMuXG4gICAqXG4gICAqIEV2ZXJ5IHRhZyBvZiB0aGUgc3BhY2UgaXMgb2ZmZXJlZCB0byBldmVyeSBtb2RlbDsgdGhpcyBpcyB3aGF0IGRlY2lkZXMgd2hpY2ggb25lcyBhIG1vZGVsXG4gICAqIHNob3dzLiBBIHRhZyBtYXJrcyBzb21ldGhpbmcgb24gYSBzdXJmYWNlLCBzbyBvbmUgdGhhdCBiZWxvbmdzIGhlcmUgc2l0cyBvbiB0aGUgc3VyZmFjZSBvclxuICAgKiBjbG9zZSB0byBpdC4gT25lIHRoYXQgbGFuZHMgZGVlcCBpbnNpZGUgdGhlIG1vZGVsLCBvciB3ZWxsIGF3YXkgZnJvbSBpdCwgbWFya3Mgc29tZXRoaW5nIHRoYXRcbiAgICogaXMgbm90IHBhcnQgb2YgdGhpcyBtb2RlbC4gVGhlIGFsbG93YW5jZSBjb3ZlcnMgYSBjYWxpYnJhdGlvbiBkb25lIGJ5IGhhbmQgYW5kIHRoZSBtb2RlbCBub3RcbiAgICogbWF0Y2hpbmcgdGhlIHNjYW4gZXhhY3RseSwgd2hpY2ggdG9nZXRoZXIgcnVuIHRvIGEgZmV3IHRlbnMgb2YgY2VudGltZXRyZXMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPTl9NT0RFTF9NRVRSRVMgPSAwLjc1O1xuXG4gIC8qKiBDZWxscyBwZXIgYXhpcyB0aGUgZ3JpZCdzIGtleXMgY2FuIGFkZHJlc3MsIHdpdGggcm9vbSBlaXRoZXIgc2lkZSBmb3IgcG9pbnRzIG9mZiB0aGUgbW9kZWwuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVUkZBQ0VfR1JJRF9TUEFOID0gMTAyNDtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVVJGQUNFX0dSSURfUEFEID0gMTI4O1xuXG4gIC8qKiBPd24gdGFncyBtb3ZlZCB0byBrZWVwIHRoZWlyIHBsYWNlIHVuZGVyIHRoZSBsYXN0IGNhbGlicmF0aW9uLCB3YWl0aW5nIHRvIGJlIHN0b3JlZC4gKi9cbiAgcHJpdmF0ZSByZWJhc2VkVGFnczogVGhyZWVKc1JlYmFzZWRUYWdbXSA9IFtdO1xuXG4gIC8qKiBUaGUgdHlwZSBmaWx0ZXIgaW4gZm9yY2UuIE51bGwgc2hvd3MgZXZlcnkgdHlwZS4gKi9cbiAgcHJpdmF0ZSB2aXNpYmxlVGFnVHlwZXM6IFBvaVR5cGVbXSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbWVhc3VyaW5nID0gZmFsc2U7XG5cbiAgLyoqIFBvaW50cyBjbGlja2VkIHNvIGZhciwgaW4gdGFnIHNwYWNlLiAqL1xuICBwcml2YXRlIG1lYXN1cmVQb2ludHM6IFRIUkVFLlZlY3RvcjNbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBFdmVyeXRoaW5nIGRyYXduIGZvciB0aGUgbWVhc3VyZW1lbnQuIEEgY2hpbGQgb2YgdGhlIHRhZyBncm91cCwgc28gaXRzIHBvaW50cyBzaGFyZSB0aGUgZnJhbWVcbiAgICogdGFnIGNvb3JkaW5hdGVzIGFyZSBzdG9yZWQgaW4gLSB3aGljaCBpcyBtZXRyZXMsIGFuZCB3aGF0IHRoZSBzYXZlZCBQT0kgaGFzIHRvIGJlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBtZWFzdXJlR3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcblxuICAvKiogVGhlIHNlZ21lbnQgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyIGZyb20gdGhlIGxhc3QgcG9pbnQgY2xpY2tlZC4gKi9cbiAgcHJpdmF0ZSBtZWFzdXJlUnViYmVyQmFuZD86IGFueTtcblxuICBwcml2YXRlIGxhc3RNZWFzdXJlbWVudDogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEhhbGYgdGhlIG1vZGVsJ3MgZGlhZ29uYWwgYXMgcGxhY2VkIGluIHRoZSBzY2VuZSwgd2hlcmUgaXQgaXMgY2VudHJlZCBvbiB0aGUgb3JpZ2luLiAqL1xuICBwcml2YXRlIG1vZGVsV29ybGRSYWRpdXMgPSAwO1xuXG4gIC8qKiBUaGUgb3V0ZXJtb3N0IGdyb3VwIHRoZSBtb2RlbCBhbmQgaXRzIHRhZ3MgaGFuZyBmcm9tOiB3aGVyZSBcIndoaWNoIHdheSBpcyB1cFwiIGlzIGFwcGxpZWQuICovXG4gIHByaXZhdGUgbW9kZWxHcm91cD86IFRIUkVFLkdyb3VwO1xuXG4gIHByaXZhdGUgbW9kZWxVcDogVGhyZWVKc01vZGVsVXAgPSAneSc7XG5cbiAgLyoqIFdoaWxlIG1lYXN1cmluZzogaG93IG1hbnkgcG9pbnRzIGFuZCBlYWNoIHNlZ21lbnQncyBsZW5ndGguIE51bGwgd2hlbiBpdCBpcyBhYmFuZG9uZWQuICovXG4gIHB1YmxpYyBtZWFzdXJlbWVudFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PHsgcG9pbnRzOiBudW1iZXI7IGRpc3RhbmNlczogbnVtYmVyW10gfSB8IG51bGw+KCk7XG5cbiAgLyoqXG4gICAqIExheWVyIGNhcnJ5aW5nIHRoZSBtb2RlbCBhbG9uZSwgc28gdGhlIGRlcHRoIHBpY2sgY2FuIHJlbmRlciBpdCB3aXRob3V0IHRoZSB0YWdzLlxuICAgKlxuICAgKiBMYXllcnMgYXJlIHRlc3RlZCBwZXIgb2JqZWN0IGF0IHJlbmRlciB0aW1lIGFuZCBjaGlsZHJlbiBhcmUgdHJhdmVyc2VkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlclxuICAgKiB0aGVpciBwYXJlbnQgcGFzc2VkLCBzbyBtYXJraW5nIHRoZSBtb2RlbCdzIG93biBtZXNoZXMgaXMgZW5vdWdoIC0gbm8gcmUtcGFyZW50aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUElDS19MQVlFUiA9IDE7XG5cbiAgLyoqIFRoZSBhcHAncyBoaWdobGlnaHQgY29sb3VyLCBzbyBhIG1lYXN1cmVtZW50IHJlYWRzIGFzIHRoZSBhY3RpdmUgdGhpbmcgb24gc2NyZWVuLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNRUFTVVJFX0NPTE9SID0gJyNGRkIxMDMnO1xuXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGJ1Y2tldCBob2xkaW5nIGRvd25sb2FkZWQgbW9kZWxzLCBhbmQgaG93IG1hbnkgdG8ga2VlcC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9ERUxfQ0FDSEUgPSAnc21hcnRlcnBsYW4tM2QtbW9kZWxzJztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRV9TSVpFID0gMztcblxuICBwcml2YXRlIHBpY2tUYXJnZXQ/OiBUSFJFRS5XZWJHTFJlbmRlclRhcmdldDtcblxuICBwcml2YXRlIHBpY2tDYW1lcmE/OiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYTtcblxuICBwcml2YXRlIHBpY2tEZXB0aE1hdGVyaWFsPzogVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwaWNrUGl4ZWwgPSBuZXcgVWludDhBcnJheSg0KTtcblxuICAvKiogRW1pdHMgb25jZSBhIHRhZyBpcyBkcm9wcGVkIG9uIHRoZSBtb2RlbCwgc28gdGhlIFVJIGNhbiBjb25maXJtIGFuZCBwZXJzaXN0IGl0LiAqL1xuICBwdWJsaWMgdGFnUGxhY2VkJCA9IG5ldyBTdWJqZWN0PFRocmVlSnNUYWdQbGFjZW1lbnQ+KCk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGlzIGFiYW5kb25lZCwgc28gdGhlIHBhbmVsIGRyaXZpbmcgaXQgY2FuIGNsb3NlLiAqL1xuICBwdWJsaWMgYWxpZ25tZW50Q2FuY2VsbGVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIFRyYW5zbHVjZW50IG1hcmtlciBzaG93biB1bmRlciB0aGUgY3Vyc29yIHdoaWxlIHBsYWNpbmcuICovXG4gIHByaXZhdGUgcGxhY2VtZW50UHJldmlldz86IFRIUkVFLlNwcml0ZTtcblxuICBwcml2YXRlIGFsaWduaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgYWxpZ25tZW50UGFpcnM6IFRocmVlSnNBbGlnbm1lbnRQYWlyW10gPSBbXTtcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSB0YWcgYGFsaWdubWVudFNvdXJjZWAgd2FzIHJlYWQgZnJvbSwga2VwdCBzbyB0aGUgc2FtZSB0YWcgaXMgbm90IG1hdGNoZWQgdHdpY2UuICovXG4gIHByaXZhdGUgYWxpZ25tZW50U291cmNlVGFnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRHJpdmVzIHRoZSBhbGlnbm1lbnQgd2Fsa3Rocm91Z2gncyBVSTogaG93IG1hbnkgcGFpcnMgYXJlIGRvbmUgYW5kIHdoYXQgaXQgd2FudHMgbmV4dC4gKi9cbiAgcHVibGljIGFsaWdubWVudFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PHtcbiAgICBwYWlyczogbnVtYmVyO1xuICAgIGF3YWl0aW5nOiAndGFnJyB8ICdwb2ludCcgfCBudWxsO1xuICAgIHRhZ0lkPzogc3RyaW5nO1xuICB9PigpO1xuXG4gIC8qKiBJbi1mbGlnaHQgY2FtZXJhIG1vdmUgc3RhcnRlZCBieSBnb1RvVGFnLCBhZHZhbmNlZCBieSB0aGUgcmVuZGVyIGxvb3AuICovXG4gIHByaXZhdGUgY2FtZXJhVHdlZW46IHtcbiAgICBmcm9tUG9zaXRpb246IFRIUkVFLlZlY3RvcjM7XG4gICAgdG9Qb3NpdGlvbjogVEhSRUUuVmVjdG9yMztcbiAgICBmcm9tVGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xuICAgIHRvVGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xuICAgIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBFbWl0cyB0cnVlIHdoaWxlIGEgaGVhdnkgT0JKIGZpbGUgaXMgYmVpbmcgcGFyc2VkIChpbiBhIHdvcmtlciwgd2hlbiBhdmFpbGFibGUpLCBmYWxzZSBvbmNlIGRvbmUuICovXG4gIHB1YmxpYyBtb2RlbExvYWRpbmckID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogRG93bmxvYWQgcHJvZ3Jlc3MgZm9yIEdMQiBtb2RlbHMsIGFzIGEgMC0xIGZyYWN0aW9uLCBvciBudWxsIHdoZW4gdGhlIHRvdGFsIHNpemUgaXMgdW5rbm93bi5cbiAgICpcbiAgICogQSBudWxsIG1lYW5zIHRoZSBzZXJ2ZXIgZGlkIG5vdCBzZW5kIENvbnRlbnQtTGVuZ3RoIChjaHVua2VkIHJlc3BvbnNlcywgc29tZSBwcm94aWVzKSBhbmQgbm9cbiAgICogcGVyY2VudGFnZSBjYW4gYmUgZGVyaXZlZDsgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvciByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBvbmUuXG4gICAqL1xuICBwdWJsaWMgbW9kZWxMb2FkUHJvZ3Jlc3MkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIGxvYWQgYWN0dWFsbHkgc3RvcHBlZCBzaG9ydCwgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIGFza2luZyBpdCB0by5cbiAgICpcbiAgICogY2FuY2VsTW9kZWxMb2FkKCkgY2FuIGFycml2ZSBhZnRlciBwYXJzZSgpIGhhcyB0YWtlbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCBwYXJzZSBjYW5ub3QgYmVcbiAgICogaW50ZXJydXB0ZWQgLSB0aGUgbW9kZWwgZmluaXNoZXMgbG9hZGluZyByZWdhcmRsZXNzLiBPbmx5IHRoaXMgdGVsbHMgdGhlIFVJIHdoaWNoIG9mIHRoZSB0d29cbiAgICogaGFwcGVuZWQsIHNvIGl0IGRvZXMgbm90IG9mZmVyIHRvIHJlbG9hZCBzb21ldGhpbmcgdGhhdCBpcyBhbHJlYWR5IG9uIHNjcmVlbi5cbiAgICovXG4gIHB1YmxpYyBtb2RlbExvYWRDYW5jZWxsZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBCYWNrZ3JvdW5kIHBhcnNpbmcgb2YgaGVhdnkgLm9iaiBmaWxlcywgcHJvdmlkZWQgYnkgdGhlIGhvc3RpbmcgYXBwIChzZWUgc2V0T2JqUGFyc2VyV29ya2VyKS5cbiAgLy8gQW5ndWxhciBsaWJyYXJpZXMgYnVpbHQgd2l0aCBuZy1wYWNrYWdyIGNhbid0IGJ1bmRsZSBgbmV3IFdvcmtlcihuZXcgVVJMKC4uLikpYCB0aGVtc2VsdmVzLFxuICAvLyBzbyB0aGUgYXBwIGluc3RhbnRpYXRlcyB0aGUgd29ya2VyIChpdHMgYnVpbGQgcGlwZWxpbmUgc3VwcG9ydHMgaXQpIGFuZCBoYW5kcyBpdCBvdmVyIGhlcmUuXG4gIHByaXZhdGUgb2JqUGFyc2VyV29ya2VyPzogV29ya2VyO1xuICBwcml2YXRlIG9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlc29sdmU6IChtZXNoZXM6IFBhcnNlZE1lc2hEYXRhW10pID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZCB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxuICAgKiBNdXN0IGJlIGluc3RhbnRpYXRlZCBieSB0aGUgY29uc3VtaW5nIGFwcCAoZS5nLiBgbmV3IFdvcmtlcihuZXcgVVJMKCcuL29iai1wYXJzZXIud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSlgKSxcbiAgICogc2luY2UgYSBsaWJyYXJ5IHBhY2thZ2VkIHdpdGggbmctcGFja2FnciBjYW5ub3QgYnVuZGxlIHdvcmtlciBmaWxlcyBpdHNlbGYuXG4gICAqIFdoZW4gbm8gd29ya2VyIGlzIHByb3ZpZGVkLCBsb2FkT2JqTW9kZWwgZmFsbHMgYmFjayB0byBwYXJzaW5nIG9uIHRoZSBtYWluIHRocmVhZC5cbiAgICovXG4gIHNldE9ialBhcnNlcldvcmtlcih3b3JrZXI6IFdvcmtlcik6IHZvaWQge1xuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyID0gd29ya2VyO1xuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfTogTWVzc2FnZUV2ZW50PE9ialBhcnNlcldvcmtlclJlc3BvbnNlPikgPT4ge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmdldChkYXRhLnJlcXVlc3RJZCk7XG4gICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5tZXNoZXMpIHtcbiAgICAgICAgcGVuZGluZy5yZXNvbHZlKGRhdGEubWVzaGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yIHdoaWxlIHBhcnNpbmcgT0JKIGZpbGUgaW4gd29ya2VyJykpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3RPYmpQYXJzZUluV29ya2VyKG9ialVybDogc3RyaW5nKTogUHJvbWlzZTxQYXJzZWRNZXNoRGF0YVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YDtcbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdGhpcy5vYmpQYXJzZXJXb3JrZXIhLnBvc3RNZXNzYWdlKHsgcmVxdWVzdElkLCBvYmpVcmwgfSk7XG4gICAgICAvLyBEaWFnbm9zdGljIG9ubHk6IGxhcmdlIG1vZGVscyBsZWdpdGltYXRlbHkgdGFrZSBhIHdoaWxlLCB0aGlzIGlzbid0IGEgdGltZW91dC9hYm9ydCxcbiAgICAgIC8vIGp1c3QgYSBzaWduYWwgaW4gY2FzZSB0aGUgd29ya2VyIHdlbnQgc2lsZW50IChlLmcuIGl0IHJhbiBvdXQgb2YgbWVtb3J5IG1pZC1wYXJzZSkuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogb2JqLXBhcnNlciB3b3JrZXIgaGFzIG5vdCByZXBsaWVkIGFmdGVyIDYwcyBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKG9ialVybD0ke29ialVybH0pLiBTdGlsbCB3YWl0aW5nIC0gbGFyZ2UgZmlsZXMgY2FuIHRha2UgYSB3aGlsZSwgYnV0IHRoaXMgbWF5IGFsc28gbWVhbiB0aGUgd29ya2VyIGh1bmcgb3IgcmFuIG91dCBvZiBtZW1vcnkuYCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDYwMDAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkcyBhIFRIUkVFLk1lc2ggZnJvbSB0aGUgcmF3IHR5cGVkIGFycmF5cyBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXG4gIHByaXZhdGUgbWVzaEZyb21QYXJzZWREYXRhKGRhdGE6IFBhcnNlZE1lc2hEYXRhLCBtYXRlcmlhbHM/OiBhbnkpOiBUSFJFRS5NZXNoIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpO1xuICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEucG9zaXRpb24sIDMpKTtcbiAgICBpZiAoZGF0YS51dikge1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoZGF0YS51diwgMikpO1xuICAgIH1cbiAgICAvLyBJbmRleCBoYXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgbm9ybWFsIGNvbXB1dGF0aW9uLCB3aGljaCByZWFkcyBpdCB0byBhdmVyYWdlIHNoYXJlZCBmYWNlcy5cbiAgICBpZiAoZGF0YS5pbmRleCkge1xuICAgICAgZ2VvbWV0cnkuc2V0SW5kZXgobmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLmluZGV4LCAxKSk7XG4gICAgfVxuICAgIGlmIChkYXRhLm5vcm1hbCkge1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdub3JtYWwnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEubm9ybWFsLCAzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG4gICAgfVxuICAgIC8vIEJveDMuc2V0RnJvbU9iamVjdCgpIHJldXNlcyBhbiBhbHJlYWR5LXNldCBib3VuZGluZ0JveCBpbnN0ZWFkIG9mIHdhbGtpbmcgZXZlcnkgdmVydGV4LFxuICAgIC8vIHNvIGFkb3B0aW5nIHRoZSB3b3JrZXIncyBtYWtlcyBmcmFtaW5nIHRoZSBjYW1lcmEgY2hlYXAgbm8gbWF0dGVyIGhvdyBkZW5zZSB0aGUgbWVzaCBpcy5cbiAgICBpZiAoZGF0YS5ib3VuZGluZ0JveCkge1xuICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MyhcbiAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoLi4uZGF0YS5ib3VuZGluZ0JveC5taW4pLFxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5kYXRhLmJvdW5kaW5nQm94Lm1heCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkTWF0ZXJpYWxzID0gZGF0YS5tYXRlcmlhbE5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSBtYXRlcmlhbHMgJiYgbmFtZSA/IG1hdGVyaWFscy5jcmVhdGUobmFtZSkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIW1hdGVyaWFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IG5vIE1UTCBtYXRlcmlhbCBuYW1lZCBcIiR7bmFtZX1cIiBmb3IgbWVzaCBcIiR7ZGF0YS5uYW1lfVwiLCB1c2luZyBhIHBsYWluIGZhbGxiYWNrIChubyB0ZXh0dXJlKS5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRlcmlhbCB8fCBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoKTtcbiAgICB9KTtcblxuICAgIGxldCBtZXNoOiBUSFJFRS5NZXNoO1xuICAgIGlmIChkYXRhLmdyb3VwcyAmJiBkYXRhLmdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICBkYXRhLmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gZ2VvbWV0cnkuYWRkR3JvdXAoZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4KSk7XG4gICAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHJlc29sdmVkTWF0ZXJpYWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCByZXNvbHZlZE1hdGVyaWFsc1swXSk7XG4gICAgfVxuICAgIG1lc2gubmFtZSA9IGRhdGEubmFtZTtcbiAgICByZXR1cm4gbWVzaDtcbiAgfVxuXG4gIGluaXQoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIFRoaXMgc2VydmljZSBpcyBhIHNpbmdsZXRvbiBidXQgdGhlIHZpZXdlciBjb21wb25lbnQgaXMgcmVidWlsdCBvbiBldmVyeSBuYXZpZ2F0aW9uLCBzbyBzdGF0ZVxuICAgIC8vIGZyb20gdGhlIHByZXZpb3VzIHNjZW5lIGlzIHN0aWxsIGhlcmUuIFR3byB0aGluZ3Mgb3V0bGl2ZSBpdCBhbmQgaGF2ZSB0byBnbyBmaXJzdDpcbiAgICAvL1xuICAgIC8vICAtIEEgZG93bmxvYWQgc3RpbGwgaW4gZmxpZ2h0LiBJdHMgb25Mb2FkZWQgcmVzb2x2ZXMgYWdhaW5zdCB3aGF0ZXZlciBgdGhpcy5zY2VuZWAgcG9pbnRzIGF0XG4gICAgLy8gICAgYnkgdGhlbiwgc28gdGhlIG1vZGVsIGJlaW5nIGFiYW5kb25lZCB3b3VsZCBiZSBoYW5kZWQgdG8gdGhlIHNjZW5lIGJ1aWx0IGJlbG93LlxuICAgIC8vICAtIFRoZSB0YWcgZ3JvdXAsIHdoaWNoIGlzIGEgZmllbGQgYW5kIGtlZXBzIGl0cyBzcHJpdGVzLiBUaGV5IHdvdWxkIGJlIHJlLXBhcmVudGVkIHVuZGVyIHRoZVxuICAgIC8vICAgIG5ldyBtb2RlbCBhbmQgc2hvdyB0aGUgcHJldmlvdXMgdmlzaXQncyB0YWdzIG9uIGl0LlxuICAgIHRoaXMuZGlzY2FyZEN1cnJlbnRMb2FkKCk7XG4gICAgdGhpcy5jbGVhclRhZ3MoKTtcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJNZWFzdXJlbWVudCgpO1xuICAgIHRoaXMuY2FtZXJhVHdlZW4gPSBudWxsO1xuICAgIHRoaXMubW9kZWxSb290ID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gMS4gU2V0dXAgU2NlbmVcbiAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbmV3IFRIUkVFLkNvbG9yKDB4ZTBmN2ZmKTsgLy8gZnJvbSBQT0NcblxuICAgIC8vIDIuIFNldHVwIENhbWVyYVxuICAgIHRoaXMuY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKDc1LCBjYW52YXMuY2xpZW50V2lkdGggLyBjYW52YXMuY2xpZW50SGVpZ2h0LCAwLjEsIDEwMDAwKTtcbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgNSwgMTApOyAvLyB3aWxsIGJlIG92ZXJyaWRkZW4gbGF0ZXIgaWYgcGFzc2VkXG5cbiAgICAvLyAzLiBTZXR1cCBXZWJHTCBSZW5kZXJlclxuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGNhbnZhcywgYW50aWFsaWFzOiB0cnVlIH0pO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZShjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhNYXRoLm1pbih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMS41KSk7XG4gICAgdGhpcy5vYnNlcnZlQ2FudmFzUmVzaXplKGNhbnZhcyk7XG4gICAgXG4gICAgLy8gRml4IGZvciBUaHJlZS5qcyByMTQ3IHZzIHIxNTIrIGNvbG9yIG1hbmFnZW1lbnRcbiAgICBpZiAoJ291dHB1dENvbG9yU3BhY2UnIGluIHRoaXMucmVuZGVyZXIpIHtcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0Q29sb3JTcGFjZSA9ICdzcmdiJzsgLy8gVEhSRUUuU1JHQkNvbG9yU3BhY2VcbiAgICB9IGVsc2Uge1xuICAgICAgKHRoaXMucmVuZGVyZXIgYXMgYW55KS5vdXRwdXRFbmNvZGluZyA9IDMwMDE7IC8vIFRIUkVFLnNSR0JFbmNvZGluZ1xuICAgIH1cblxuICAgIC8vIFdpdGhvdXQgdG9uZSBtYXBwaW5nIGFueXRoaW5nIGJyaWdodGVyIHRoYW4gMS4wIGlzIHNpbXBseSBjdXQgb2ZmIHRvIHB1cmUgd2hpdGUuIENhcHR1cmVkXG4gICAgLy8gdGV4dHVyZXMgY2FycnkgYSBzbWFsbCBmcmFjdGlvbiBvZiB2ZXJ5IGJyaWdodCBwaXhlbHMgLSBza3kgcmVmbGVjdGVkIGluIHdpbmRvd3MsIHN1bmxpdFxuICAgIC8vIHJlbmRlciAtIGFuZCBvbmNlIGxpZ2h0aW5nIHB1c2hlcyB0aG9zZSBwYXN0IHRoZSBsaW1pdCB0aGV5IGZsYXR0ZW4gaW50byB3aGl0ZSBzcGVja3Mgd2l0aFxuICAgIC8vIG5vIGRldGFpbCBsZWZ0LiBSb2xsaW5nIHRoZSBoaWdobGlnaHRzIG9mZiBpbnN0ZWFkIGtlZXBzIHRoYXQgZGV0YWlsIGFuZCBrZWVwcyBicmlnaHQgYXJlYXNcbiAgICAvLyByZWFkaW5nIGFzIGJyaWdodCByYXRoZXIgdGhhbiBibG93bi5cbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nID0gVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nO1xuICAgIHRoaXMucmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDEuMDtcblxuICAgIC8vIDQuIExpZ2h0aW5nLCBrZXB0IGRlbGliZXJhdGVseSByZXN0cmFpbmVkIGFuZCBuZXV0cmFsLlxuICAgIC8vXG4gICAgLy8gQ2FwdHVyZWQvcGhvdG9ncmFtbWV0cnkgbW9kZWxzIGFscmVhZHkgaGF2ZSBsaWdodGluZyBiYWtlZCBpbnRvIHRoZWlyIHRleHR1cmVzICh0aGUgc3VuIGFuZFxuICAgIC8vIHNoYWRvd3MgY2FtZSB3aXRoIHRoZSBwaG90b3MpLCBzbyBsaWdodGluZyB0aGVtIGFnYWluIGRpc3RvcnRzIHdoYXQgdGhleSBhY3R1YWxseSBsb29rIGxpa2UuXG4gICAgLy8gVGhlIGludGVuc2l0aWVzIGJlbG93IGFkZCB1cCB0byByb3VnaGx5IDEuMCBvbiBhIHN1cmZhY2UgZmFjaW5nIHRoZSB2aWV3ZXIsIHdoaWNoIHJlbmRlcnMgdGhlXG4gICAgLy8gdGV4dHVyZSBhdCBpdHMgdHJ1ZSB2YWx1ZS4gQW55dGhpbmcgYWJvdmUgMS4wIGlzIGNsaXBwZWQgdG8gcHVyZSB3aGl0ZSBieSB0aGUgcmVuZGVyZXIsIHdoaWNoXG4gICAgLy8gaXMgd2hhdCB0dXJucyBicmlnaHQgYXJlYXMgaW50byBmbGF0IHdoaXRlIHBhdGNoZXMgd2l0aCBubyBkZXRhaWwgbGVmdCBpbiB0aGVtLlxuICAgIC8vXG4gICAgLy8gTmV1dHJhbCB3aGl0ZSBpcyB1c2VkIHJhdGhlciB0aGFuIGEgd2FybSB0aW50IGZvciB0aGUgc2FtZSByZWFzb246IGEgdGludGVkIGxpZ2h0IHNoaWZ0cyBldmVyeVxuICAgIC8vIGNvbG91ciBpbiB0aGUgbW9kZWwgYXdheSBmcm9tIHdoYXQgd2FzIGNhcHR1cmVkLlxuICAgIGNvbnN0IGFtYmllbnRMaWdodCA9IG5ldyBUSFJFRS5BbWJpZW50TGlnaHQoMHhmZmZmZmYsIDAuNyk7XG4gICAgdGhpcy5zY2VuZS5hZGQoYW1iaWVudExpZ2h0KTtcblxuICAgIC8vIEhlYWRsaWdodCByYXRoZXIgdGhhbiBhIGZpeGVkIHN1bjogcGFyZW50ZWQgdG8gdGhlIGNhbWVyYSBzbyBpdCBhbHdheXMgcG9pbnRzIGF0IHdoYXRldmVyIGlzXG4gICAgLy8gYmVpbmcgbG9va2VkIGF0LCBnaXZpbmcgc2hhcGUgdG8gc3VyZmFjZXMgd2l0aG91dCBldmVyIGxlYXZpbmcgYSBmYWNlIHVubGl0LiBObyBzaGFkb3cgY2FzdGluZ1xuICAgIC8vIC0gc2hhZG93cyB3b3VsZCBkb3VibGUgdXAgd2l0aCB0aGUgb25lcyBhbHJlYWR5IGJha2VkIGludG8gdGhlIHRleHR1cmVzLCBhbmQgdGhlIHNoYWRvdyBtYXBcbiAgICAvLyB3YXMgYSByZWFsIGNvc3QgcGVyIGZyYW1lLlxuICAgIGNvbnN0IGhlYWRMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAwLjM1KTtcbiAgICBoZWFkTGlnaHQucG9zaXRpb24uc2V0KDAsIDAsIDEpO1xuICAgIHRoaXMuY2FtZXJhLmFkZChoZWFkTGlnaHQpO1xuICAgIC8vIEEgbGlnaHQgb25seSBjb250cmlidXRlcyB3aGlsZSBpdCBpcyBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCwgYW5kIHRoaXMgb25lIGhhbmdzIG9mZiB0aGUgY2FtZXJhLlxuICAgIHRoaXMuc2NlbmUuYWRkKHRoaXMuY2FtZXJhKTtcblxuICAgIC8vIDUuIFNldHVwIENvbnRyb2xzIChmcm9tIFBPQylcbiAgICB0aGlzLmNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHModGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgdGhpcy5jb250cm9scy5yb3RhdGVTcGVlZCA9IDEuMDtcbiAgICB0aGlzLmNvbnRyb2xzLmRhbXBpbmdGYWN0b3IgPSAwLjE7XG4gICAgdGhpcy5jb250cm9scy5lbmFibGVEYW1waW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnRyb2xzLm1vdXNlQnV0dG9ucyA9IHtcbiAgICAgIExFRlQ6IFRIUkVFLk1PVVNFLlJPVEFURSxcbiAgICAgIE1JRERMRTogVEhSRUUuTU9VU0UuRE9MTFksXG4gICAgICBSSUdIVDogVEhSRUUuTU9VU0UuUEFOLFxuICAgIH07XG4gICAgdGhpcy5jb250cm9scy50YXJnZXQuc2V0KDAsIDAsIDApO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG9uIGNvbnRyb2xzIHRvIGRpZmZlcmVudGlhdGUgZHJhZ2dpbmcgdnMgY2xpY2tpbmdcbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgKCkgPT4ge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gdHJ1ZTtcbiAgICAgIH0sIDE1MCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlzRHJhZ2dpbmdUaW1lcik7XG4gICAgICBpZiAodGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZ0NhbWVyYSA9IGZhbHNlO1xuICAgICAgICB9LCAyNTApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSW50ZXJhY3Rpb24gRXZlbnQgTGlzdGVuZXJzIG9uIGNhbnZhc1xuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Nb3VzZUNsaWNrLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cbiAgICAvLyBFc2NhcGUgYmFja3Mgb3V0IG9mIHBsYWNlbWVudCBhbmQgY2FsaWJyYXRpb24uIE9uIHRoZSB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIGNhbnZhcywgd2hpY2hcbiAgICAvLyB3b3VsZCBuZWVkIGZvY3VzIHRoZSB1c2VyIGhhcyBubyByZWFzb24gdG8gaGF2ZSBnaXZlbiBpdCAtIHRoZXkgYXJlIGFpbWluZyB3aXRoIHRoZSBtb3VzZS5cbiAgICAvLyBSZW1vdmVkIGZpcnN0IGJlY2F1c2UgdGhpcyBzZXJ2aWNlIGlzIGEgc2luZ2xldG9uOiBpbml0KCkgcnVucyBhZ2FpbiBmb3IgZXZlcnkgY2FudmFzLCBhbmRcbiAgICAvLyB0aGUgcHJldmlvdXMgcmVnaXN0cmF0aW9uIHdvdWxkIG90aGVyd2lzZSBzdGlsbCBiZSBhdHRhY2hlZC5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcbiAgICB0aGlzLnBpY2tUYXJnZXQ/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBpY2tUYXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbD8uZGlzcG9zZSgpO1xuICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5waWNrQ2FtZXJhID0gdW5kZWZpbmVkO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuXG4gICAgLy8gNi4gU3RhcnQgdGhlIHJlbmRlciBsb29wXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5hbmltYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0aCAoc2VydmVkIGJ5IHRoZSBhcHApIGhvbGRpbmcgYmFzaXNfdHJhbnNjb2Rlci5qcy8ud2FzbSwgd2hpY2ggS1RYMkxvYWRlciBuZWVkcyB0byB0dXJuXG4gICAqIEJhc2lzIFVuaXZlcnNhbCB0ZXh0dXJlcyBpbnRvIHdoYXRldmVyIGNvbXByZXNzZWQgZm9ybWF0IHRoZSBsb2NhbCBHUFUgYWN0dWFsbHkgc3VwcG9ydHMuXG4gICAqL1xuICBwcml2YXRlIGt0eDJUcmFuc2NvZGVyUGF0aCA9ICdhc3NldHMvYmFzaXMvJztcblxuICAvKiogT3ZlcnJpZGVzIHdoZXJlIHRoZSBCYXNpcyB0cmFuc2NvZGVyIGZpbGVzIGFyZSBzZXJ2ZWQgZnJvbS4gKi9cbiAgc2V0S3R4MlRyYW5zY29kZXJQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMua3R4MlRyYW5zY29kZXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIGJhc2UgM0QgbW9kZWwgaW4gR0xURi9HTEIgZm9ybWF0IC0gdGhlIHByZWZlcnJlZCBmb3JtYXQgZm9yIGxhcmdlIG1vZGVscy5cbiAgICogVW5saWtlIC5vYmosIGdlb21ldHJ5IGFycml2ZXMgYXMgYmluYXJ5IHR5cGVkIGFycmF5cyAobm8gdGV4dCBwYXJzaW5nIHRvIG9mZmxvYWQgdG8gYSB3b3JrZXIpXG4gICAqIGFuZCBzdGF5cyBpbmRleGVkLCBzbyBmYXIgbGVzcyBkYXRhIHJlYWNoZXMgdGhlIEdQVS4gS1RYMiB0ZXh0dXJlcyBhcmUgc3VwcG9ydGVkIHRvbzogdGhleVxuICAgKiBzdGF5IGNvbXByZXNzZWQgaW4gVlJBTSBpbnN0ZWFkIG9mIGJlaW5nIGRlY29kZWQgdG8gcmF3IHBpeGVscyBsaWtlIEpQRUcvUE5HLlxuICAgKi9cbiAgbG9hZEdMVEZNb2RlbCh1cmw6IHN0cmluZywgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCBjYWNoZUtleT86IHN0cmluZywgdXA/OiBUaHJlZUpzTW9kZWxVcCk6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XG5cbiAgICAvLyBLVFgyIG5lZWRzIHRoZSByZW5kZXJlciB0byByZXBvcnQgd2hpY2ggY29tcHJlc3NlZCBmb3JtYXRzIHRoaXMgR1BVIGFjY2VwdHMsIHNvIHRoaXMgaGFzIHRvXG4gICAgLy8gaGFwcGVuIGFmdGVyIGluaXQoKS4gR3VhcmRlZCBzbyBhIG1vZGVsIHdpdGhvdXQgS1RYMiB0ZXh0dXJlcyBzdGlsbCBsb2FkcyBpZiBpdCdzIG1pc3NpbmcuXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGt0eDJMb2FkZXIgPSBuZXcgS1RYMkxvYWRlcigpXG4gICAgICAgICAgLnNldFRyYW5zY29kZXJQYXRoKHRoaXMua3R4MlRyYW5zY29kZXJQYXRoKVxuICAgICAgICAgIC5kZXRlY3RTdXBwb3J0KHRoaXMucmVuZGVyZXIpO1xuICAgICAgICBsb2FkZXIuc2V0S1RYMkxvYWRlcihrdHgyTG9hZGVyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBzZXQgdXAgS1RYMiB0ZXh0dXJlIHN1cHBvcnQsIGZhbGxpbmcgYmFjayB0byB1bmNvbXByZXNzZWQgdGV4dHVyZXMuJywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBMZXRzIGdsdGZwYWNrL2dsdGYtdHJhbnNmb3JtIG91dHB1dCB1c2luZyBFWFRfbWVzaG9wdF9jb21wcmVzc2lvbiBsb2FkIHdpdGhvdXQgZXh0cmEgc2V0dXAuXG4gICAgbG9hZGVyLnNldE1lc2hvcHREZWNvZGVyKE1lc2hvcHREZWNvZGVyKTtcblxuICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMCk7XG5cbiAgICAvLyBPcmRlciBtYXR0ZXJzOiBub3JtYWxzIG11c3QgZXhpc3QgYmVmb3JlIGFuaXNvdHJvcHksIGFuZCB0aGUgUGhvbmcgY29udmVyc2lvbiBoYXMgdG8gcnVuXG4gICAgLy8gYmVmb3JlIHNpZGUvZmxhdFNoYWRpbmcgYXJlIHRvdWNoZWQgc28gdGhvc2Ugc2V0dGluZ3MgbGFuZCBvbiB0aGUgbWF0ZXJpYWxzIHdlIGtlZXAuXG4gICAgY29uc3Qgb25Mb2FkZWQgPSAoZ2x0ZjogYW55KSA9PiB7XG4gICAgICB0aGlzLmNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5mb3JjZURvdWJsZVNpZGVkTWF0ZXJpYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5lbnN1cmVWZXJ0ZXhOb3JtYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy50dW5lVGV4dHVyZVNhbXBsaW5nKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ2x0Zi5zY2VuZSwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uLCB1cCk7XG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIC8vIENhbmNlbGxpbmcgaXMgYSBkZWNpc2lvbiwgbm90IGEgZmFpbHVyZTogY2xlYXIgdGhlIG92ZXJsYXkgd2l0aG91dCBhbiBlcnJvciBpbiB0aGUgY29uc29sZS5cbiAgICAgIGlmIChlcnJvcj8ubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIC8vIE9ubHkgYSBjYW5jZWwgb2YgdGhlIGxvYWQgdGhhdCBpcyBzdGlsbCBjdXJyZW50IGNhbWUgZnJvbSB0aGUgdXNlcjsgYW55dGhpbmcgZWxzZSBpcyB0aGlzXG4gICAgICAgIC8vIGxvYWQgaGF2aW5nIGJlZW4gc3VwZXJzZWRlZCBvciBkaXNjYXJkZWQuXG4gICAgICAgIGlmICh0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI/LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbExvYWRDYW5jZWxsZWQkLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBHTFRGIG1vZGVsOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XG4gICAgfTtcblxuICAgIC8vIEdMVEZMb2FkZXIgZGVjb2RlcyBlbWJlZGRlZCBpbWFnZXMgd2l0aCBjcmVhdGVJbWFnZUJpdG1hcCB3aGVuIHRoZSBicm93c2VyIG9mZmVycyBpdCwgYW5kIG9uXG4gICAgLy8gbGFyZ2UgdGV4dHVyZSBhdGxhc2VzIHRoYXQgcGF0aCByZXR1cm5zIHZpc2libHkgY29ycnVwdCBkYXRhIC0gc2NhdHRlcmVkIHdoaXRlIGJsb2NrcyBhY3Jvc3NcbiAgICAvLyB0aGUgbW9kZWwuIFRoZSBleGFjdCBzYW1lIGJ5dGVzIGRlY29kZWQgdGhyb3VnaCBhbiBIVE1MSW1hZ2VFbGVtZW50LCB3aGljaCBpcyB3aGF0IHRoZSAub2JqXG4gICAgLy8gcGF0aCB1c2VzIHZpYSBNVExMb2FkZXIsIGNvbWUgb3V0IGNsZWFuLiBHTFRGTG9hZGVyIGFscmVhZHkgZmFsbHMgYmFjayB0byB0aGF0IGRlY29kZXIgZm9yXG4gICAgLy8gU2FmYXJpIGFuZCBvbGRlciBGaXJlZm94OyB0aGlzIHNpbXBseSBleHRlbmRzIHRoZSBmYWxsYmFjayB0byBjb3ZlciB0aGlzIGNhc2UgdG9vLlxuICAgIC8vXG4gICAgLy8gVGhlIGRlY29kZXIgaXMgY2hvc2VuIHdoaWxlIEdMVEZQYXJzZXIgaXMgYmVpbmcgY29uc3RydWN0ZWQsIHdoaWNoIGhhcHBlbnMgc3luY2hyb25vdXNseVxuICAgIC8vIGluc2lkZSBwYXJzZSgpLCBzbyBoaWRpbmcgY3JlYXRlSW1hZ2VCaXRtYXAgb25seSBoYXMgdG8gaG9sZCBhY3Jvc3MgdGhhdCBjYWxsIHJhdGhlciB0aGFuXG4gICAgLy8gZm9yIHRoZSB3aG9sZSBkb3dubG9hZC5cbiAgICB0aGlzLmZldGNoV2l0aFByb2dyZXNzKHVybCwgY2FjaGVLZXkpXG4gICAgICAvLyBwYXJzZSgpIGhvbGRzIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyBvbiBhIGxhcmdlIG1vZGVsLiBZaWVsZCB1bnRpbCB0aGUgYnJvd3NlciBoYXNcbiAgICAgIC8vIGFjdHVhbGx5IHBhaW50ZWQgZmlyc3QsIG90aGVyd2lzZSB0aGUgZmluYWwgcHJvZ3Jlc3MgdXBkYXRlIG5ldmVyIHJlYWNoZXMgdGhlIHNjcmVlbiBhbmRcbiAgICAgIC8vIHRoZSBiYXIgYXBwZWFycyB0byBzdGFsbCBzaG9ydCBvZiB0aGUgZW5kLlxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4gdGhpcy5hZnRlck5leHRQYWludCgpLnRoZW4oKCkgPT4gYnVmZmVyKSlcbiAgICAgIC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgLy8gcGFyc2UoKSBjYW5ub3QgYmUgaW50ZXJydXB0ZWQsIHNvIGEgY2FuY2VsIHRoYXQgbGFuZHMgZHVyaW5nIHRoZSBwYWludCB5aWVsZCBoYXMgdG8gYmVcbiAgICAgICAgLy8gY2F1Z2h0IGhlcmUgLSB0aGUgbGFzdCBtb21lbnQgYmVmb3JlIHRoZSBtYWluIHRocmVhZCBpcyBjb21taXR0ZWQgZm9yIHNldmVyYWwgc2Vjb25kcy5cbiAgICAgICAgaWYgKHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2xvYmFsU2NvcGUgPSBnbG9iYWxUaGlzIGFzIGFueTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDcmVhdGVJbWFnZUJpdG1hcCA9IGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwO1xuICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2FkZXIucGFyc2UoYnVmZmVyLCB1cmwuc3Vic3RyaW5nKDAsIHVybC5sYXN0SW5kZXhPZignLycpICsgMSksIG9uTG9hZGVkLCBvbkVycm9yKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IG9yaWdpbmFsQ3JlYXRlSW1hZ2VCaXRtYXA7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2gob25FcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIG1vZGVsIGRvd25sb2FkIGluIHByb2dyZXNzLCBpZiBhbnkuXG4gICAqXG4gICAqIE9ubHkgdGhlIGRvd25sb2FkIGNhbiBiZSBpbnRlcnJ1cHRlZDogcGFyc2UoKSBydW5zIHN5bmNocm9ub3VzbHkgYW5kIGhvbGRzIHRoZSBtYWluIHRocmVhZCB1bnRpbFxuICAgKiBpdCBmaW5pc2hlcywgc28gb25jZSBpdCBoYXMgYmVndW4gdGhlcmUgaXMgbm90aGluZyB0byBjYW5jZWwuIEluIHByYWN0aWNlIHRoZSBkb3dubG9hZCBpcyB0aGVcbiAgICogbG9uZyBwYXJ0LCB3aGljaCBpcyB3aGVyZSBzb21lb25lIHJlYWNoZXMgZm9yIHRoaXMuXG4gICAqL1xuICBjYW5jZWxNb2RlbExvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFiYW5kb25zIHRoZSBsb2FkIGluIHByb2dyZXNzIHdpdGhvdXQgcmVwb3J0aW5nIGl0IGFzIGNhbmNlbGxlZC5cbiAgICpcbiAgICogRHJvcHBpbmcgdGhlIGNvbnRyb2xsZXIgaXMgd2hhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZTogb25FcnJvciB0cmVhdHMgYW4gYWJvcnQgYXMgdXNlci1pbml0aWF0ZWRcbiAgICogb25seSB3aGlsZSB0aGUgY29udHJvbGxlciB0aGF0IGFib3J0ZWQgaXMgc3RpbGwgdGhlIGN1cnJlbnQgb25lLiBUZWFyaW5nIGRvd24gb3IgcmVidWlsZGluZyB0aGVcbiAgICogc2NlbmUgaXMgbm90IHNvbWV0aGluZyB0aGUgcGVyc29uIGFza2VkIGZvciwgc28gaXQgbXVzdCBub3Qgc3VyZmFjZSBhcyBcImxvYWRpbmcgY2FuY2VsbGVkXCIuXG4gICAqL1xuICBwcml2YXRlIGRpc2NhcmRDdXJyZW50TG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uY2UgdGhlIGJyb3dzZXIgaGFzIHBhaW50ZWQgYXQgbGVhc3Qgb25lIGZyYW1lLlxuICAgKlxuICAgKiBBIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBydW5zICpiZWZvcmUqIHRoYXQgZnJhbWUgaXMgcGFpbnRlZCwgc28gYSBzaW5nbGUgb25lIGlzIG5vdFxuICAgKiBlbm91Z2ggdG8gZ3VhcmFudGVlIHBlbmRpbmcgRE9NIGNoYW5nZXMgYXJlIG9uIHNjcmVlbjsgdGhlIHNlY29uZCBmaXJlcyBhZnRlciB0aGUgZmlyc3QgZnJhbWVcbiAgICogaGFzIGdvbmUgb3V0LiBGYWxscyBiYWNrIHRvIGEgdGltZW91dCB3aGVyZSByQUYgaXNuJ3QgYXZhaWxhYmxlIChTU1IsIHRlc3RzKS5cbiAgICovXG4gIHByaXZhdGUgYWZ0ZXJOZXh0UGFpbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgYSBmaWxlLCByZXBvcnRpbmcgcHJvZ3Jlc3Mgb24gbW9kZWxMb2FkUHJvZ3Jlc3MkIGFzIGl0IGFycml2ZXMuXG4gICAqXG4gICAqIEdMVEZMb2FkZXIubG9hZCgpIHdvdWxkIHJlcG9ydCBwcm9ncmVzcyB0aHJvdWdoIFhIUiwgYnV0IHRoaXMgcGF0aCBkZWxpYmVyYXRlbHkgdXNlcyBmZXRjaCgpICtcbiAgICogcGFyc2UoKSBpbnN0ZWFkIChzZWUgbG9hZEdMVEZNb2RlbCBmb3Igd2h5KSwgc28gcHJvZ3Jlc3MgaXMgcmVhZCBvZmYgdGhlIHJlc3BvbnNlIHN0cmVhbSBoZXJlLlxuICAgKiBUaGF0IGlzIGFsc28gdGhlIG1vcmUgdXNlZnVsIG51bWJlcjogb24gYSBtb2RlbCBvZiB0aGlzIHNpemUgdGhlIGRvd25sb2FkIGRvbWluYXRlcywgYW5kIHRoZVxuICAgKiBzdHJlYW0gcmVwb3J0cyBpdCBhcyBpdCBoYXBwZW5zIHJhdGhlciB0aGFuIGluIG9uZSBqdW1wIGF0IHRoZSBlbmQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBjYWNoZUtleT86IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAvLyBBIGxvYWQgYWxyZWFkeSBydW5uaW5nIGlzIHJlcGxhY2VkLCBub3QgcmFjZWQ6IHdoaWNoZXZlciBmaW5pc2hlZCBsYXN0IHdvdWxkIG90aGVyd2lzZSB3aW4uXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB7IHNpZ25hbCB9ID0gdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5yZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMSk7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1MZW5ndGgnKSk7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoY29udGVudExlbmd0aCkgJiYgY29udGVudExlbmd0aCA+IDAgPyBjb250ZW50TGVuZ3RoIDogMDtcblxuICAgIC8vIFdpdGhvdXQgYSByZWFkYWJsZSBzdHJlYW0gKG9sZGVyIGJyb3dzZXJzLCBzb21lIHBvbHlmaWxscykgdGhlcmUgaXMgbm90aGluZyB0byBtZWFzdXJlLCBzb1xuICAgIC8vIGZhbGwgYmFjayB0byBhIHBsYWluIGJ1ZmZlcmVkIHJlYWQgYW5kIGxldCB0aGUgVUkgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvci5cbiAgICBpZiAoIXJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcikge1xuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG5cbiAgICAvLyBXaXRoIGEga25vd24gc2l6ZSwgd3JpdGUgY2h1bmtzIHN0cmFpZ2h0IGludG8gb25lIHByZS1hbGxvY2F0ZWQgYnVmZmVyLiBDb2xsZWN0aW5nIHRoZW0gaW4gYW5cbiAgICAvLyBhcnJheSBhbmQgY29uY2F0ZW5hdGluZyBhZnRlcndhcmRzIHdvdWxkIGhvbGQgYm90aCBjb3BpZXMgYXQgb25jZSAtIG9uIGEgMTY0IE1CIG1vZGVsIHRoYXQgaXNcbiAgICAvLyBhbiBhdm9pZGFibGUgMzAwKyBNQiBwZWFrLlxuICAgIGNvbnN0IGJ1ZmZlciA9IHRvdGFsID4gMCA/IG5ldyBVaW50OEFycmF5KHRvdGFsKSA6IG51bGw7XG4gICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICBsZXQgdXNpbmdCdWZmZXIgPSBidWZmZXIgIT09IG51bGw7XG4gICAgbGV0IHJlY2VpdmVkID0gMDtcbiAgICAvLyBDaHVua3MgYXJyaXZlIGluIHRlbnMgb2Yga2lsb2J5dGVzLCBzbyBhIDE2NCBNQiBtb2RlbCBwcm9kdWNlcyB0aG91c2FuZHMgb2YgdGhlbS4gRW1pdHRpbmcgb25cbiAgICAvLyBldmVyeSBvbmUgd291bGQgcnVuIGNoYW5nZSBkZXRlY3Rpb24ganVzdCBhcyBvZnRlbiB0byBtb3ZlIGEgYmFyIHRoYXQgaXMgbWVhc3VyZWQgaW4gd2hvbGVcbiAgICAvLyBwZXJjZW50LCBzbyBvbmx5IHJlcG9ydCB3aGVuIHRoZSBkaXNwbGF5ZWQgdmFsdWUgd291bGQgYWN0dWFsbHkgY2hhbmdlLlxuICAgIGxldCBsYXN0UmVwb3J0ZWQgPSAtMTtcblxuICAgIGlmICh0b3RhbCA9PT0gMCkge1xuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgLy8gRnJlZSB0aGUgY29ubmVjdGlvbiByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IGRyYWluaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCk7XG4gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ01vZGVsIGxvYWQgY2FuY2VsbGVkJywgJ0Fib3J0RXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCArIHZhbHVlLmxlbmd0aCA+IHRvdGFsKSB7XG4gICAgICAgIC8vIENvbnRlbnQtTGVuZ3RoIHVuZGVyc3RhdGVkIHRoZSByZWFsIHNpemUuIE1vdmUgd2hhdCB3ZSBoYXZlIGludG8gdGhlIGNodW5rIGxpc3QgYW5kIHN0YXlcbiAgICAgICAgLy8gdGhlcmUgZm9yIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgdGFpbC5cbiAgICAgICAgY2h1bmtzLnB1c2goYnVmZmVyLnNsaWNlKDAsIHJlY2VpdmVkKSk7XG4gICAgICAgIHVzaW5nQnVmZmVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodXNpbmdCdWZmZXIpIHtcbiAgICAgICAgYnVmZmVyLnNldCh2YWx1ZSwgcmVjZWl2ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5taW4oTWF0aC5yb3VuZCgocmVjZWl2ZWQgLyB0b3RhbCkgKiAxMDApLCAxMDApO1xuICAgICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFJlcG9ydGVkKSB7XG4gICAgICAgICAgbGFzdFJlcG9ydGVkID0gcGVyY2VudDtcbiAgICAgICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KHBlcmNlbnQgLyAxMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHN0cmVhbSBjYW4gZW5kIGJlbG93IHRoZSBhZHZlcnRpc2VkIHNpemUgKG9yIHdpdGggbm8gc2l6ZSBhdCBhbGwpLiBMYW5kIG9uIGEgZnVsbCBiYXJcbiAgICAvLyByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IHN0dWNrIGF0IHdoYXRldmVyIHRoZSBsYXN0IGNodW5rIGhhcHBlbmVkIHRvIHJlYWNoLlxuICAgIGlmICh0b3RhbCA+IDAgJiYgbGFzdFJlcG9ydGVkICE9PSAxMDApIHtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMSk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogQXJyYXlCdWZmZXI7XG4gICAgaWYgKHVzaW5nQnVmZmVyICYmIHJlY2VpdmVkID09PSB0b3RhbCkge1xuICAgICAgcmVzdWx0ID0gYnVmZmVyLmJ1ZmZlcjtcbiAgICB9IGVsc2UgaWYgKHVzaW5nQnVmZmVyKSB7XG4gICAgICAvLyBGZXdlciBieXRlcyB0aGFuIGFkdmVydGlzZWQ6IGhhbmQgYmFjayBleGFjdGx5IHdoYXQgYXJyaXZlZC5cbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXJnZWQgPSBuZXcgVWludDhBcnJheShyZWNlaXZlZCk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIGNodW5rcy5mb3JFYWNoKChjaHVuaykgPT4ge1xuICAgICAgICBtZXJnZWQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgfSk7XG4gICAgICByZXN1bHQgPSBtZXJnZWQuYnVmZmVyO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXksIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgc3RvcmUsIG9yIG51bGwgd2hlcmUgdGhlIGJyb3dzZXIgd2lsbCBub3QgZ2l2ZSB1cyBvbmUuXG4gICAqXG4gICAqIENhY2hlIFN0b3JhZ2UgbmVlZHMgYSBzZWN1cmUgY29udGV4dCwgc28gaXQgaXMgYWJzZW50IG92ZXIgcGxhaW4gaHR0cCBhbmQgaW4gc29tZSBlbWJlZGRlZFxuICAgKiB3ZWJ2aWV3cy4gRXZlcnkgY2FsbGVyIHRyZWF0cyB0aGF0IGFzIGEgbWlzcyAtIGNhY2hpbmcgaXMgYW4gb3B0aW1pc2F0aW9uLCBuZXZlciBhIHJlcXVpcmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kZWxDYWNoZSgpOiBQcm9taXNlPENhY2hlIHwgbnVsbD4ge1xuICAgIGlmICh0eXBlb2YgY2FjaGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FjaGVzLm9wZW4oVGhyZWVKc1NlcnZpY2UuTU9ERUxfQ0FDSEUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FjaGVkIGNvcHkgb2YgdGhpcyBtb2RlbCwgaWYgb25lIHdhcyBzdG9yZWQuXG4gICAqXG4gICAqIEtleWVkIGJ5IHRoZSBTMyBrZXkgcmF0aGVyIHRoYW4gdGhlIFVSTCBpdCBpcyBmZXRjaGVkIGZyb206IHRoYXQgVVJMIGlzIHNpZ25lZCwgc28gaXQgY2FycmllcyBhXG4gICAqIGZyZXNoIHNpZ25hdHVyZSBhbmQgZXhwaXJ5IGV2ZXJ5IHRpbWUgYW5kIHdvdWxkIG5ldmVyIG1hdGNoIHR3aWNlLiBUaGUgYnJvd3NlcidzIG93biBIVFRQIGNhY2hlXG4gICAqIG1pc3NlcyBmb3IgdGhlIHNhbWUgcmVhc29uLCB3aGljaCBpcyB3aHkgdGhpcyBleGlzdHMgYXQgYWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgbnVsbD4ge1xuICAgIGlmICghY2FjaGVLZXkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCB0aGlzLm9wZW5Nb2RlbENhY2hlKCk7XG4gICAgICBjb25zdCBoaXQgPSBhd2FpdCBjYWNoZT8ubWF0Y2godGhpcy5tb2RlbENhY2hlVXJsKGNhY2hlS2V5KSk7XG4gICAgICByZXR1cm4gaGl0ID8gYXdhaXQgaGl0LmFycmF5QnVmZmVyKCkgOiBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0b3JlcyBhIG1vZGVsIGZvciBuZXh0IHRpbWUsIGV2aWN0aW5nIHRoZSBvbGRlc3Qgb25jZSBhIGZldyBhcmUgaGVsZC4gKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZU1vZGVsVG9DYWNoZShjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2RlbDogQXJyYXlCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNhY2hlS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHRoaXMub3Blbk1vZGVsQ2FjaGUoKTtcbiAgICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgY2FjaGUucHV0KHRoaXMubW9kZWxDYWNoZVVybChjYWNoZUtleSksIG5ldyBSZXNwb25zZShtb2RlbCkpO1xuXG4gICAgICAvLyBNb2RlbHMgcnVuIHRvIGh1bmRyZWRzIG9mIG1lZ2FieXRlcywgc28gdGhpcyBjYW5ub3QgZ3JvdyB3aXRob3V0IGxpbWl0LiBDYWNoZSBTdG9yYWdlIGtlZXBzXG4gICAgICAvLyBpbnNlcnRpb24gb3JkZXIsIHdoaWNoIG1ha2VzIHRoZSBmcm9udCBvZiB0aGUgbGlzdCB0aGUgbGVhc3QgcmVjZW50bHkgc3RvcmVkLlxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IGNhY2hlLmtleXMoKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBrZXlzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGtleXMubGVuZ3RoIC0gVGhyZWVKc1NlcnZpY2UuTU9ERUxfQ0FDSEVfU0laRSkpXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBjYWNoZS5kZWxldGUoa2V5KSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBPdXQgb2YgcXVvdGEsIHByaXZhdGUgYnJvd3NpbmcsIHN0b3JhZ2UgZGlzYWJsZWQ6IHRoZSBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCBlaXRoZXIgd2F5LlxuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGtleXMgb24gYSBVUkwsIHNvIHRoZSBTMyBrZXkgaXMgZXhwcmVzc2VkIGFzIG9uZS4gSXQgaXMgbmV2ZXIgcmVxdWVzdGVkLiAqL1xuICBwcml2YXRlIG1vZGVsQ2FjaGVVcmwoY2FjaGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBodHRwczovLzNkLW1vZGVsLWNhY2hlLnNtYXJ0ZXJwbGFuLmxvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlS2V5KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdHMgdGhlIGNhbWVyYSdzIGNsaXBwaW5nIHBsYW5lcyB0byBob3cgYmlnIHRoZSBtb2RlbCBhY3R1YWxseSBpcy5cbiAgICpcbiAgICogRGVwdGggcHJlY2lzaW9uIGRlcGVuZHMgb24gdGhlIGZhci9uZWFyIHJhdGlvLCBhbmQgdGhlIGZpeGVkIDAuMSAvIDEwMDAwIHRoZSBjYW1lcmEgc3RhcnRzIHdpdGhcbiAgICogaXMgYSByYXRpbyBvZiAxMDAwMDAgZm9yIGEgbW9kZWwgb25seSB+MTAgdW5pdHMgYWNyb3NzLiBUaGF0IHdhc3RlcyBtb3N0IG9mIHRoZSBkZXB0aCBidWZmZXIgb25cbiAgICogZW1wdHkgc3BhY2UgYW5kIGxldHMgbmVhcmx5IGNvaW5jaWRlbnQgc3VyZmFjZXMgLSB3aGljaCBjYXB0dXJlZCBtZXNoZXMgaGF2ZSBldmVyeXdoZXJlIC1cbiAgICogZmxpY2tlciBhZ2FpbnN0IGVhY2ggb3RoZXIuXG4gICAqL1xuICBwcml2YXRlIGFkanVzdENsaXBwaW5nUGxhbmVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHJhZGl1cyA8IDEwKSB7XG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMC4wMTtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDtcbiAgICB9IGVsc2UgaWYgKHJhZGl1cyA8IDEwMCkge1xuICAgICAgdGhpcy5jYW1lcmEubmVhciA9IDAuMTtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDA7XG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDAwKSB7XG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMTA7XG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW1lcmEubmVhciA9IDEwMDtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDAwMDA7XG4gICAgfVxuICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwcyB0aGUgUEJSIG1hdGVyaWFscyBHTFRGTG9hZGVyIGJ1aWxkcyBmb3IgdGhlIHBsYWluIFBob25nIG9uZXMgdGhlIC5vYmogcGF0aCBwcm9kdWNlcy5cbiAgICpcbiAgICogTWVzaFN0YW5kYXJkTWF0ZXJpYWwga2VlcHMgYSBzcGVjdWxhciByZWZsZWN0aW9uIGV2ZW4gYXQgbWV0YWxuZXNzIDAsIHNpbmNlIGV2ZXJ5IGRpZWxlY3RyaWNcbiAgICogcmVmbGVjdHMgc29tZSBsaWdodCwgYW5kIEZyZXNuZWwgZHJpdmVzIHRoYXQgcmVmbGVjdGlvbiB0b3dhcmRzIHdoaXRlIGFzIGEgc3VyZmFjZSB0dXJucyBhd2F5XG4gICAqIGZyb20gdGhlIHZpZXdlci4gT24gYW4gYWVyaWFsIHZpZXcgb2YgYSBmYWNhZGUgbW9zdCBzdXJmYWNlcyBzaXQgYXQgZXhhY3RseSB0aG9zZSBncmF6aW5nXG4gICAqIGFuZ2xlcywgd2hpY2ggcGFpbnRzIHdoaXRlIGhpZ2hsaWdodHMgb3ZlciB3aW5kb3cgZnJhbWVzIGFuZCByb29mIGVkZ2VzIC0gdGhlIHNhbWUgbW9kZWxcbiAgICogbG9hZGVkIGFzIC5vYmogbmV2ZXIgc2hvd3MgdGhlbSwgYmVjYXVzZSBNVExMb2FkZXIgYnVpbGRzIFBob25nIG1hdGVyaWFscyBhbmQgT0JKTG9hZGVyIHplcm9lc1xuICAgKiB0aGVpciBzcGVjdWxhciB3aGVuIHRoZSAubXRsIGRlY2xhcmVzIE5zIDAuXG4gICAqXG4gICAqIENhcHR1cmVkIG1vZGVscyBjYXJyeSB0aGVpciBsaWdodGluZyBpbiB0aGUgdGV4dHVyZSBhbmQgd2FudCBubyBzcGVjdWxhciByZXNwb25zZSBhdCBhbGwsIHNvXG4gICAqIG1hdGNoaW5nIHRoZSAub2JqIHBhdGggaGVyZSBpcyBib3RoIHRoZSBmaXggYW5kIHRoZSBtb3JlIGZhaXRoZnVsIGNob2ljZS5cbiAgICovXG4gIHByaXZhdGUgY29udmVydFRvUGhvbmdNYXRlcmlhbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBuZXcgTWFwPGFueSwgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw+KCk7XG5cbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udmVydCA9IChzb3VyY2U6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGlmICghc291cmNlIHx8ICEoc291cmNlIGFzIGFueSkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCkge1xuICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgICBjb25zdCBwaG9uZyA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7XG4gICAgICAgICAgICBtYXA6IHNvdXJjZS5tYXAsXG4gICAgICAgICAgICBjb2xvcjogc291cmNlLmNvbG9yLFxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHNvdXJjZS50cmFuc3BhcmVudCxcbiAgICAgICAgICAgIG9wYWNpdHk6IHNvdXJjZS5vcGFjaXR5LFxuICAgICAgICAgICAgYWxwaGFUZXN0OiBzb3VyY2UuYWxwaGFUZXN0LFxuICAgICAgICAgICAgc2lkZTogc291cmNlLnNpZGUsXG4gICAgICAgICAgICBzcGVjdWxhcjogbmV3IFRIUkVFLkNvbG9yKDB4MDAwMDAwKSxcbiAgICAgICAgICAgIHNoaW5pbmVzczogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwaG9uZy5uYW1lID0gc291cmNlLm5hbWU7XG4gICAgICAgICAgY29udmVydGVkLnNldChzb3VyY2UsIHBob25nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVkLmdldChzb3VyY2UpO1xuICAgICAgfTtcblxuICAgICAgbWVzaC5tYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbClcbiAgICAgICAgPyBtZXNoLm1hdGVyaWFsLm1hcChjb252ZXJ0KVxuICAgICAgICA6IGNvbnZlcnQobWVzaC5tYXRlcmlhbCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBldmVyeSBtYXRlcmlhbCBkb3VibGUtc2lkZWQuXG4gICAqXG4gICAqIFJlYWxpdHkgY2FwdHVyZSBtZXNoZXMgcm91dGluZWx5IGNvbnRhaW4gdHJpYW5nbGVzIHdpdGggcmV2ZXJzZWQgd2luZGluZyAtIGFuIGFydGVmYWN0IG9mIHRoZVxuICAgKiByZWNvbnN0cnVjdGlvbiwgbm90IG9mIHRoZSBmaWxlLiBXaXRoIHRoZSBkZWZhdWx0IEZyb250U2lkZSB0aG9zZSB0cmlhbmdsZXMgYXJlIGN1bGxlZCwgbGVhdmluZ1xuICAgKiBzY2F0dGVyZWQgaG9sZXMgdGhhdCBzaG93IHRoZSBzY2VuZSBiYWNrZ3JvdW5kIHRocm91Z2ggdGhlIG1vZGVsLiBBZ2FpbnN0IGEgbGlnaHQgYmFja2dyb3VuZFxuICAgKiB0aGV5IHJlYWQgYXMgd2hpdGUgc3BlY2tzIHdpdGggbm8gZGlzY2VybmlibGUgcGF0dGVybi5cbiAgICpcbiAgICogRHJhd2luZyBib3RoIHNpZGVzIGNvc3RzIGEgbGl0dGxlIGZpbGwgcmF0ZSBidXQgaXMgd2hhdCBtYWtlcyBjYXB0dXJlZCBnZW9tZXRyeSByZW5kZXIgYXNcbiAgICogc29saWQ7IG90aGVyIHZpZXdlcnMgb2YgdGhpcyBraW5kIG9mIGNvbnRlbnQgZG8gdGhlIHNhbWUgdW5jb25kaXRpb25hbGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JjZURvdWJsZVNpZGVkTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8YW55PigpO1xuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF0ZXJpYWxzID0gQXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKSA/IG1lc2gubWF0ZXJpYWwgOiBbbWVzaC5tYXRlcmlhbF07XG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgIXNlZW4uaGFzKG1hdGVyaWFsKSkge1xuICAgICAgICAgIHNlZW4uYWRkKG1hdGVyaWFsKTtcbiAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gVEhSRUUuRG91YmxlU2lkZTtcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHJlYWwgdmVydGV4IG5vcm1hbHMgZm9yIGFueSBnZW9tZXRyeSB0aGF0IGFycml2ZWQgd2l0aG91dCB0aGVtLlxuICAgKlxuICAgKiBBIGdsVEYgd2l0aG91dCBhIE5PUk1BTCBhdHRyaWJ1dGUgaXMgc3BlYy1jb21wbGlhbnQsIGFuZCBHTFRGTG9hZGVyIGhhbmRsZXMgaXQgYnkgc3dpdGNoaW5nIHRoZVxuICAgKiBtYXRlcmlhbCB0byBmbGF0U2hhZGluZywgd2hpY2ggbWFrZXMgdGhlIHNoYWRlciBkZXJpdmUgdGhlIG5vcm1hbCBwZXIgcGl4ZWwgZnJvbSBzY3JlZW4tc3BhY2VcbiAgICogZGVyaXZhdGl2ZXMuIFRoYXQgZGVyaXZhdGlvbiBjb2xsYXBzZXMgb24gdGhlIGRlZ2VuZXJhdGUsIG5lZWRsZS10aGluIHRyaWFuZ2xlcyB0aGF0IHJlYWxpdHlcbiAgICogY2FwdHVyZSBtZXNoZXMgYXJlIGZ1bGwgb2Y6IHRoZSBmYWNlIGhhcyBhbG1vc3Qgbm8gYXJlYSwgdGhlIGRlcml2ZWQgbm9ybWFsIGlzIG1lYW5pbmdsZXNzLCBhbmRcbiAgICogbGlnaHRpbmcgYmxvd3MgdGhvc2UgZnJhZ21lbnRzIG91dCB0byB3aGl0ZSBzcGVja3MgLSBkZW5zZXN0IGV4YWN0bHkgd2hlcmUgZmluZSBkZXRhaWwgaXMuXG4gICAqXG4gICAqIENvbXB1dGluZyBub3JtYWxzIGZyb20gdGhlIGdlb21ldHJ5IGluc3RlYWQgaXMgcm9idXN0IHRvIHRob3NlIHRyaWFuZ2xlcywgc2luY2UgYSBkZWdlbmVyYXRlXG4gICAqIGZhY2UgY29udHJpYnV0ZXMgYWxtb3N0IG5vdGhpbmcgdG8gdGhlIGF2ZXJhZ2UgYW5kIGl0cyBuZWlnaGJvdXJzIGRvbWluYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVWZXJ0ZXhOb3JtYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBnZW9tZXRyeSA9IG1lc2guZ2VvbWV0cnkgYXMgVEhSRUUuQnVmZmVyR2VvbWV0cnk7XG4gICAgICBpZiAoZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdub3JtYWwnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cbiAgICAgIC8vIEdMVEZMb2FkZXIgYWxyZWFkeSBzd2l0Y2hlZCB0aGVzZSBtYXRlcmlhbHMgdG8gZmxhdFNoYWRpbmcgYmVjYXVzZSBub3JtYWxzIHdlcmUgbWlzc2luZztcbiAgICAgIC8vIG5vdyB0aGF0IHJlYWwgb25lcyBleGlzdCwgbGV0IHRoZW0gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZXJpdmF0aXZlIGZhbGxiYWNrLlxuICAgICAgY29uc3QgbWF0ZXJpYWxzID0gQXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKSA/IG1lc2gubWF0ZXJpYWwgOiBbbWVzaC5tYXRlcmlhbF07XG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZmxhdFNoYWRpbmcpIHtcbiAgICAgICAgICBtYXRlcmlhbC5mbGF0U2hhZGluZyA9IGZhbHNlO1xuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyBob3cgZXZlcnkgdGV4dHVyZSBpbiBhIG1vZGVsIGlzIHNhbXBsZWQ6IG1heGltdW0gYW5pc290cm9weSwgYW5kIG5vIG1pcG1hcHBpbmcuXG4gICAqXG4gICAqIFBob3RvZ3JhbW1ldHJ5IGF0bGFzZXMgcGFjayB0aGVpciBVViBpc2xhbmRzIHdpdGggdW51c2VkIGd1dHRlciBwaXhlbHMgYmV0d2VlbiB0aGVtLiBNaXBtYXBwaW5nXG4gICAqIGF2ZXJhZ2VzIG5laWdoYm91cmluZyBwaXhlbHMgYXQgZWFjaCBsZXZlbCwgc28gdGhvc2UgZ3V0dGVycyBibGVlZCBmdXJ0aGVyIGludG8gdGhlIGlzbGFuZHMgdGhlXG4gICAqIHNtYWxsZXIgdGhlIGxldmVsIGdldHMgLSBhbmQgdmlld2luZyB0aGUgd2hvbGUgbW9kZWwgYXQgb25jZSB1c2VzIHRoZSBzbWFsbGVzdCBsZXZlbHMsIHBhaW50aW5nXG4gICAqIGJyaWdodCBndXR0ZXIgcGl4ZWxzIG92ZXIgdGhlIGVkZ2VzIG9mIGZpbmUgZGV0YWlsLiBTYW1wbGluZyB0aGUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIGF2b2lkc1xuICAgKiB0aGF0LCBhdCB0aGUgY29zdCBvZiBzb21lIHNoaW1tZXIgb24gbWluaWZpZWQgc3VyZmFjZXMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhbmlzb3Ryb3B5IG9ubHkgdGFrZXMgZWZmZWN0IHdoaWxlIG1pcG1hcHBpbmcgaXMgb24sIHNvIHdpdGggdGhlIHNldHRpbmdzIGJlbG93IGl0IGlzXG4gICAqIGluZXJ0OyBpdCBpcyBzZXQgYW55d2F5IHNvIHRoZSBzYW1wbGluZyBzdGF5cyBjb3JyZWN0IGZvciBhbnlvbmUgd2hvIHJlLWVuYWJsZXMgbWlwbWFwcyBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSB0dW5lVGV4dHVyZVNhbXBsaW5nKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSB0aGlzLnJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XG4gICAgaWYgKCFtYXhBbmlzb3Ryb3B5IHx8IG1heEFuaXNvdHJvcHkgPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFtYXRlcmlhbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTYW1lIHRleHR1cmUgaXMgcmV1c2VkIGFjcm9zcyB0aGUgbW9kZWwncyBtYXRlcmlhbHM7IG9ubHkgdG91Y2ggZWFjaCBvbmUgb25jZS5cbiAgICAgICAgWydtYXAnLCAnbm9ybWFsTWFwJywgJ3JvdWdobmVzc01hcCcsICdtZXRhbG5lc3NNYXAnLCAnZW1pc3NpdmVNYXAnLCAnYW9NYXAnXS5mb3JFYWNoKChzbG90KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG1hdGVyaWFsW3Nsb3RdO1xuICAgICAgICAgIGlmICh0ZXh0dXJlICYmICFzZWVuLmhhcyh0ZXh0dXJlKSkge1xuICAgICAgICAgICAgc2Vlbi5hZGQodGV4dHVyZSk7XG4gICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5O1xuICAgICAgICAgICAgdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRleHR1cmUubWluRmlsdGVyID0gVEhSRUUuTGluZWFyRmlsdGVyO1xuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuIE9CSiBtb2RlbCB3aXRoIE1UTC5cbiAgICogVGhlIGhlYXZ5IHRleHQtcGFyc2luZyBzdGVwIHJ1bnMgaW4gYSBXZWIgV29ya2VyIHdoZW4gb25lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhXG4gICAqIHNldE9ialBhcnNlcldvcmtlciAoc2VlIHRoZXJlIGZvciB3aHkgdGhlIGFwcCwgbm90IHRoaXMgbGlicmFyeSwgcHJvdmlkZXMgaXQpOyB0aGlzIGtlZXBzXG4gICAqIHRoZSBtYWluIHRocmVhZCBmcmVlIHdoaWxlIGxhcmdlIGFyY2hpdGVjdHVyZSBtb2RlbHMgKG1pbGxpb25zIG9mIHZlcnRpY2VzKSBhcmUgcGFyc2VkLlxuICAgKiBGYWxscyBiYWNrIHRvIHBhcnNpbmcgb24gdGhlIG1haW4gdGhyZWFkIG90aGVyd2lzZS5cbiAgICovXG4gIGxvYWRPYmpNb2RlbChtdGxVcmw6IHN0cmluZywgb2JqVXJsOiBzdHJpbmcsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSk6IHZvaWQge1xuICAgIGNvbnN0IG10bExvYWRlciA9IG5ldyBNVExMb2FkZXIoKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IG10bFVybC5zdWJzdHJpbmcoMCwgbXRsVXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICBtdGxMb2FkZXIuc2V0UGF0aChiYXNlUGF0aCk7XG4gICAgY29uc3QgbXRsRmlsZU5hbWUgPSBtdGxVcmwuc3Vic3RyaW5nKG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XG5cbiAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dCh0cnVlKTtcblxuICAgIG10bExvYWRlci5sb2FkKG10bEZpbGVOYW1lLCAobWF0ZXJpYWxzKSA9PiB7XG4gICAgICBtYXRlcmlhbHMucHJlbG9hZCgpO1xuXG4gICAgICBpZiAodGhpcy5vYmpQYXJzZXJXb3JrZXIpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0T2JqUGFyc2VJbldvcmtlcihvYmpVcmwpXG4gICAgICAgICAgLnRoZW4oKG1lc2hlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcbiAgICAgICAgICAgIG1lc2hlcy5mb3JFYWNoKChtZXNoRGF0YSkgPT4ge1xuICAgICAgICAgICAgICBncm91cC5hZGQodGhpcy5tZXNoRnJvbVBhcnNlZERhdGEobWVzaERhdGEsIG1hdGVyaWFscykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShncm91cCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgT0JKIG1vZGVsIGluIHdvcmtlcjonLCBlcnJvcik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9iakxvYWRlciA9IG5ldyBPQkpMb2FkZXIoKTtcbiAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcblxuICAgICAgb2JqTG9hZGVyLmxvYWQob2JqVXJsLCAob2JqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcbiAgICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgfSwgdW5kZWZpbmVkLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBPQkogbW9kZWw6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9LCB1bmRlZmluZWQsIChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBNVEwgZmlsZTonLCBlcnJvcik7XG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2VudGVycywgc2NhbGVzIGFuZCBhZGRzIGEgbG9hZGVkIG9iamVjdCB0byB0aGUgc2NlbmUsIHRoZW4gZnJhbWVzIHRoZSBjYW1lcmEgb24gaXQuICovXG4gIHByaXZhdGUgcGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdDogVEhSRUUuT2JqZWN0M0QsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgdXA/OiBUaHJlZUpzTW9kZWxVcCk6IHZvaWQge1xuICAgIGNvbnN0IGJveCA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpO1xuICAgIGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgY29uc3Qgc2l6ZSA9IGJveC5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICAgIGNvbnN0IG1heERpbSA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55LCBzaXplLnopO1xuICAgIGNvbnN0IHNjYWxlID0gbWF4RGltID4gMCA/IDEwIC8gbWF4RGltIDogMTtcblxuICAgIC8vIFR3byBuZXN0ZWQgZ3JvdXBzIHNvIHRhZ3MgY2FuIHNoYXJlIHRoZSBtb2RlbCdzIGZyYW1lOiBgY2VudGVyZWRgIGNhcnJpZXMgdGhlIG9mZnNldCB0aGF0XG4gICAgLy8gbW92ZXMgdGhlIG1vZGVsJ3Mgb3duIG9yaWdpbiB0byB0aGUgc2NlbmUgb3JpZ2luLCBgZ3JvdXBgIGNhcnJpZXMgdGhlIHNjYWxlLiBBIHRhZyBwb3NpdGlvbmVkXG4gICAgLy8gd2l0aCByYXcgUE9JIGNvb3JkaW5hdGVzIHRoZW4gbGFuZHMgaW4gdGhlIHNhbWUgcGxhY2UgdGhlIG1vZGVsJ3MgZ2VvbWV0cnkgZG9lcy5cbiAgICBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xuICAgIGNvbnN0IGNlbnRlcmVkID0gbmV3IFRIUkVFLkdyb3VwKCk7XG4gICAgY2VudGVyZWQucG9zaXRpb24uc3ViKGNlbnRlcik7XG5cbiAgICBpZiAocm90YXRpb24pIHtcbiAgICAgIG9iamVjdC5yb3RhdGlvbi5zZXQocm90YXRpb24ueCwgcm90YXRpb24ueSwgcm90YXRpb24ueik7XG4gICAgfVxuICAgIC8vIFdoaWNoIHdheSBpcyB1cC4gQSBjaG9pY2Ugc29tZW9uZSBtYWRlIGJ5IGhhbmQgYWx3YXlzIHdpbnM7IG90aGVyd2lzZSwgdW5sZXNzIHRoZSBtb2RlbCBjYW1lXG4gICAgLy8gd2l0aCBhbiBvcmllbnRhdGlvbiBvZiBpdHMgb3duLCBpdCBpcyB3b3JrZWQgb3V0IGZyb20gdGhlIGdlb21ldHJ5LiBBcHBsaWVkIHRvIHRoZSBvdXRlclxuICAgIC8vIGdyb3VwLCBhYm92ZSBib3RoIHRoZSBtb2RlbCBhbmQgdGhlIHRhZ3M6IHRoZXkgdHVybiB0b2dldGhlciwgYW5kIGV2ZXJ5IGNvb3JkaW5hdGUgYWxyZWFkeVxuICAgIC8vIHN0b3JlZCAtIHRhZyBwb3NpdGlvbnMsIHRoZSBjYWxpYnJhdGlvbiAtIGtlZXBzIG1lYW5pbmcgd2hhdCBpdCBtZWFudC5cbiAgICB0aGlzLm1vZGVsR3JvdXAgPSBncm91cDtcbiAgICB0aGlzLm1vZGVsVXAgPSB1cCA/PyAocm90YXRpb24gPyAneScgOiB0aGlzLmRldGVjdE1vZGVsVXAob2JqZWN0LCBzaXplKSk7XG4gICAgZ3JvdXAucXVhdGVybmlvbi5jb3B5KHRoaXMudXByaWdodFJvdGF0aW9uKHRoaXMubW9kZWxVcCkpO1xuXG4gICAgdGhpcy5tb2RlbFJvb3QgPSBvYmplY3Q7XG4gICAgdGhpcy5tb2RlbFdvcmxkUmFkaXVzID0gKHNpemUubGVuZ3RoKCkgLyAyKSAqIHNjYWxlO1xuICAgIC8vIFRoZSBib3ggYWJvdmUgd2FzIG1lYXN1cmVkIGJlZm9yZSBhbnkgcm90YXRpb24gZnJvbSB0aGUgbWV0YWRhdGEgd2FzIGFwcGxpZWQ7IHdpdGggb25lLCBpdFxuICAgIC8vIGhhcyB0byBiZSBtZWFzdXJlZCBhZ2FpbiB0byBiZSB0aGUgbW9kZWwgYXMgaXQgYWN0dWFsbHkgc2l0cy5cbiAgICB0aGlzLmJ1aWxkU3VyZmFjZUdyaWQob2JqZWN0LCByb3RhdGlvbiA/IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpIDogYm94KTtcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XG4gICAgLy8gTWFya3MgdGhlIG1vZGVsIGZvciB0aGUgZGVwdGggcGljaywgd2hpY2ggcmVuZGVycyB0aGlzIGxheWVyIGFsb25lIC0gc28gdGFncyBhbmQgdGhlIGdob3N0XG4gICAgLy8gaXRzZWxmIGNhbm5vdCBlbmQgdXAgYmVpbmcgd2hhdCB0aGUgY3Vyc29yIHJlcG9ydHMgYXMgdGhlIHN1cmZhY2UgdW5kZXIgaXQuXG4gICAgb2JqZWN0LnRyYXZlcnNlKChjaGlsZCkgPT4gY2hpbGQubGF5ZXJzLmVuYWJsZShUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKSk7XG4gICAgY2VudGVyZWQuYWRkKG9iamVjdCk7XG4gICAgY2VudGVyZWQuYWRkKHRoaXMudGFnR3JvdXApO1xuICAgIGNlbnRlcmVkLmFkZCh0aGlzLm1vZGVsVGFnR3JvdXApO1xuICAgIGdyb3VwLmFkZChjZW50ZXJlZCk7XG4gICAgZ3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlKTtcblxuICAgIHRoaXMuc2NlbmUuYWRkKGdyb3VwKTtcblxuICAgIC8vIFRhZ3MgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIG1vZGVsIGZpbmlzaGVkIGxvYWRpbmcgd2VyZSBzaXplZCBhZ2FpbnN0IHRoZSBvbGQgc2NhbGUuXG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSkpO1xuXG4gICAgdGhpcy5hZGp1c3RDbGlwcGluZ1BsYW5lcygoc2l6ZS5sZW5ndGgoKSAvIDIpICogc2NhbGUpO1xuXG4gICAgaWYgKGNhbWVyYVBvc2l0aW9uKSB7XG4gICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoY2FtZXJhUG9zaXRpb24ueCwgY2FtZXJhUG9zaXRpb24ueSwgY2FtZXJhUG9zaXRpb24ueik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCA1LCAxNSk7XG4gICAgfVxuICAgIHRoaXMuY29udHJvbHMudGFyZ2V0LnNldCgwLCAwLCAwKTtcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBtb2RlbCdzIGF4ZXMgaXMgaXRzIHZlcnRpY2FsOiAneScgd2hlbiBpdCBhbHJlYWR5IHN0YW5kcyB1cHJpZ2h0LCBvciB3aGVuIGl0IGlzXG4gICAqIG5vdCBjbGVhciBlbm91Z2ggdG8gYWN0IG9uLlxuICAgKlxuICAgKiBNb2RlbHMgYXJyaXZlIGluIHR3byBjb252ZW50aW9uczogWSB1cCAoZ2xURiwgYW5kIHdoYXQgdGhpcyB2aWV3ZXIgYXNzdW1lcykgYW5kIFogdXAgKG1vc3QgQ0FEXG4gICAqIGFuZCBzY2FubmluZyBleHBvcnRzKS4gQSBaLXVwIG1vZGVsIGxvYWRzIGx5aW5nIG9uIGl0cyBzaWRlLiBUd28gaW5kZXBlbmRlbnQgY3VlcyBzYXkgd2hpY2hcbiAgICogYXhpcyBpcyB0aGUgdmVydGljYWwgb25lLCBhbmQgYm90aCBoYXZlIHRvIGFncmVlIGJlZm9yZSBhbnl0aGluZyBpcyB0dXJuZWQ6XG4gICAqXG4gICAqICAtIFN1cmZhY2UgYXJlYS4gRmxvb3JzIGFuZCBjZWlsaW5ncyBhbGwgZmFjZSBhbG9uZyB0aGUgdmVydGljYWwsIHdoaWxlIHdhbGxzIGFyZSBzaGFyZWQgb3V0XG4gICAqICAgIGJldHdlZW4gdGhlIHR3byBob3Jpem9udGFsIGF4ZXMsIHNvIHRoZSB2ZXJ0aWNhbCB1c3VhbGx5IGNvbGxlY3RzIHRoZSBtb3N0IGFyZWEuXG4gICAqICAtIEV4dGVudC4gQSBidWlsZGluZyBpcyBub3JtYWxseSB3aWRlciB0aGFuIGl0IGlzIHRhbGwsIHNvIHRoZSB2ZXJ0aWNhbCBpcyBpdHMgc2hvcnRlc3Qgc2lkZS5cbiAgICpcbiAgICogRWl0aGVyIGFsb25lIGlzIHdyb25nIG9mdGVuIGVub3VnaCB0byBtYXR0ZXIgLSBhIGxvbmcgY29ycmlkb3IgaGFzIG1vcmUgd2FsbCB0aGFuIGZsb29yLCBhXG4gICAqIHRvd2VyIGlzIHRhbGxlciB0aGFuIGl0IGlzIHdpZGUgLSBhbmQgdHVybmluZyBhIG1vZGVsIHRoYXQgd2FzIGZpbmUgaXMgd29yc2UgdGhhbiBsZWF2aW5nIG9uZVxuICAgKiB0aGF0IHdhcyBub3QuIEEgbW9kZWwgdGhhdCBhbHJlYWR5IGhhcyBZIGFzIGl0cyB2ZXJ0aWNhbCBpcyBuZXZlciB0b3VjaGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RNb2RlbFVwKG9iamVjdDogVEhSRUUuT2JqZWN0M0QsIHNpemU6IFRIUkVFLlZlY3RvcjMpOiBUaHJlZUpzTW9kZWxVcCB7XG4gICAgY29uc3QgYXhlcyA9IFsneCcsICd5JywgJ3onXSBhcyBjb25zdDtcbiAgICAvLyBQcm9qZWN0ZWQgYXJlYSBmYWNpbmcgZWFjaCB3YXkgYWxvbmcgZWFjaCBheGlzOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXS5cbiAgICBjb25zdCBhcmVhID0geyB4OiBbMCwgMF0sIHk6IFswLCAwXSwgejogWzAsIDBdIH07XG5cbiAgICBsZXQgdHJpYW5nbGVDb3VudCA9IDA7XG4gICAgb2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xuICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgIHRyaWFuZ2xlQ291bnQgKz0gKGNoaWxkLmdlb21ldHJ5LmluZGV4ID8gY2hpbGQuZ2VvbWV0cnkuaW5kZXguY291bnQgOiBwb3NpdGlvbi5jb3VudCkgLyAzO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0cmlhbmdsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gJ3knO1xuICAgIH1cbiAgICAvLyBBIHNhbXBsZSBpcyBwbGVudHkgdG8gc2VlIHdoZXJlIHRoZSBhcmVhIGxpZXMsIGFuZCBrZWVwcyB0aGlzIGNoZWFwIG9uIG1vZGVscyB3aXRoIG1pbGxpb25zXG4gICAgLy8gb2YgdHJpYW5nbGVzLlxuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0cmlhbmdsZUNvdW50IC8gMjAwMDAwKSk7XG5cbiAgICBjb25zdCBhID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBjb25zdCBiID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBjb25zdCBjID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBjb25zdCBub3JtYWwgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xuICAgICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IGNoaWxkLmdlb21ldHJ5LmluZGV4O1xuICAgICAgY29uc3QgY291bnQgPSAoaW5kZXggPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50KSAvIDM7XG4gICAgICBmb3IgKGxldCB0cmlhbmdsZSA9IDA7IHRyaWFuZ2xlIDwgY291bnQ7IHRyaWFuZ2xlICs9IHN0cmlkZSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0cmlhbmdsZSAqIDM7XG4gICAgICAgIGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCkgOiBvZmZzZXQpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XG4gICAgICAgIGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCArIDEpIDogb2Zmc2V0ICsgMSkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcbiAgICAgICAgYy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMikgOiBvZmZzZXQgKyAyKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xuICAgICAgICAvLyBUaGUgY3Jvc3MgcHJvZHVjdCdzIGxlbmd0aCBpcyB0d2ljZSB0aGUgdHJpYW5nbGUncyBhcmVhLCBzbyBpdHMgY29tcG9uZW50cyBhcmUgdGhlXG4gICAgICAgIC8vIGFyZWEgdGhlIHRyaWFuZ2xlIHNob3dzIGFsb25nIGVhY2ggYXhpcy5cbiAgICAgICAgbm9ybWFsLmNyb3NzVmVjdG9ycyhiLnN1YihhKSwgYy5zdWIoYSkpO1xuICAgICAgICBheGVzLmZvckVhY2goKGF4aXMpID0+IHtcbiAgICAgICAgICBhcmVhW2F4aXNdW25vcm1hbFtheGlzXSA+PSAwID8gMCA6IDFdICs9IE1hdGguYWJzKG5vcm1hbFtheGlzXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdG90YWwgPSB7IHg6IGFyZWEueFswXSArIGFyZWEueFsxXSwgeTogYXJlYS55WzBdICsgYXJlYS55WzFdLCB6OiBhcmVhLnpbMF0gKyBhcmVhLnpbMV0gfTtcbiAgICBjb25zdCBieUFyZWEgPSBheGVzLnJlZHVjZSgoYmVzdCwgYXhpcykgPT4gKHRvdGFsW2F4aXNdID4gdG90YWxbYmVzdF0gPyBheGlzIDogYmVzdCksICd5JyBhcyB0eXBlb2YgYXhlc1tudW1iZXJdKTtcbiAgICBjb25zdCBieUV4dGVudCA9IGF4ZXMucmVkdWNlKChiZXN0LCBheGlzKSA9PiAoc2l6ZVtheGlzXSA8IHNpemVbYmVzdF0gPyBheGlzIDogYmVzdCksICd5JyBhcyB0eXBlb2YgYXhlc1tudW1iZXJdKTtcbiAgICBpZiAoYnlBcmVhID09PSAneScgfHwgYnlBcmVhICE9PSBieUV4dGVudCB8fCB0b3RhbFtieUFyZWFdIDwgMS4yNSAqIHRvdGFsLnkpIHtcbiAgICAgIHJldHVybiAneSc7XG4gICAgfVxuXG4gICAgLy8gV2hpY2ggd2F5IGFsb25nIHRoYXQgYXhpcyBpcyB1cC4gUm9vZnMgYW5kIGdyb3VuZCBtYWtlIGFuIG91dGRvb3IgbW9kZWwgZmFjZSBtb3N0bHkgdXB3YXJkLFxuICAgIC8vIHdoaWNoIHNldHRsZXMgaXQ7IGluZG9vcnMgZmxvb3JzIGFuZCBjZWlsaW5ncyBiYWxhbmNlIG91dCwgYW5kIHRoZSBjb252ZW50aW9uIC0gcG9zaXRpdmUgaXNcbiAgICAvLyB1cCAtIGlzIHRoZSBiZXR0ZXIgZ3Vlc3MuXG4gICAgY29uc3QgW3Bvc2l0aXZlLCBuZWdhdGl2ZV0gPSBhcmVhW2J5QXJlYV07XG4gICAgY29uc3QgdXAgPSBgJHtuZWdhdGl2ZSA+IDAuNjUgKiAocG9zaXRpdmUgKyBuZWdhdGl2ZSkgPyAnLScgOiAnJ30ke2J5QXJlYX1gIGFzIFRocmVlSnNNb2RlbFVwO1xuICAgIGNvbnNvbGUuaW5mbyhgVGhyZWVKc1NlcnZpY2U6IHRoaXMgbW9kZWwncyB2ZXJ0aWNhbCBheGlzIGxvb2tzIGxpa2UgJHt1cH0sIG5vdCB5IC0gc3RhbmRpbmcgaXQgdXByaWdodC5gKTtcbiAgICByZXR1cm4gdXA7XG4gIH1cblxuICAvKiogVGhlIHJvdGF0aW9uIHRoYXQgYnJpbmdzIHRoZSBnaXZlbiBtb2RlbCBheGlzIHRvIHBvaW50IHVwLiAqL1xuICBwcml2YXRlIHVwcmlnaHRSb3RhdGlvbih1cDogVGhyZWVKc01vZGVsVXApOiBUSFJFRS5RdWF0ZXJuaW9uIHtcbiAgICBjb25zdCBheGlzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBheGlzW3VwLnJlcGxhY2UoJy0nLCAnJykgYXMgJ3gnIHwgJ3knIHwgJ3onXSA9IHVwLnN0YXJ0c1dpdGgoJy0nKSA/IC0xIDogMTtcbiAgICByZXR1cm4gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMoYXhpcywgbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCkpO1xuICB9XG5cbiAgLyoqIFdoaWNoIG9mIHRoZSBtb2RlbCdzIGF4ZXMgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgdXAsIHdoZXRoZXIgY2hvc2VuIG9yIHdvcmtlZCBvdXQuICovXG4gIGdldE1vZGVsVXAoKTogVGhyZWVKc01vZGVsVXAge1xuICAgIHJldHVybiB0aGlzLm1vZGVsVXA7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgdGhlIG1vZGVsIHNvIHRoZSBnaXZlbiBheGlzIHBvaW50cyB1cCwgYXQgb25jZS5cbiAgICpcbiAgICogVGhlIG1vZGVsIGFuZCBpdHMgdGFncyB0dXJuIGFzIG9uZSwgc28gbm90aGluZyBzdG9yZWQgaGFzIHRvIGJlIHJlY29tcHV0ZWQuIFRoZSBjYWxsZXIgaXNcbiAgICogZXhwZWN0ZWQgdG8gc3RvcmUgdGhlIGNob2ljZSwgb3IgdGhlIG5leHQgbG9hZCBnb2VzIGJhY2sgdG8gd29ya2luZyBpdCBvdXQuXG4gICAqL1xuICBzZXRNb2RlbFVwKHVwOiBUaHJlZUpzTW9kZWxVcCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWxVcCA9IHVwO1xuICAgIHRoaXMubW9kZWxHcm91cD8ucXVhdGVybmlvbi5jb3B5KHRoaXMudXByaWdodFJvdGF0aW9uKHVwKSk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcHMgdGhlIGRyYXdpbmcgYnVmZmVyIGFuZCBjYW1lcmEgbWF0Y2hlZCB0byB0aGUgY2FudmFzIGFzIGl0IGlzIHJlc2l6ZWQuXG4gICAqXG4gICAqIHJlbmRlcmVyLnNldFNpemUoKSB3cml0ZXMgZXhwbGljaXQgcGl4ZWwgd2lkdGgvaGVpZ2h0IGludG8gdGhlIGNhbnZhcydzIHN0eWxlLCBvdmVycmlkaW5nIHRoZVxuICAgKiAxMDAlLzEwMCUgaXQgc3RhcnRzIHdpdGguIFdpdGhvdXQgdGhpcywgdGhlIGNhbnZhcyBrZWVwcyB3aGF0ZXZlciBzaXplIGl0IGhhZCBhdCBzdGFydHVwOiBoaWRpbmdcbiAgICogdGhlIHRvcCBtZW51IGdyb3dzIHRoZSBjb250YWluZXIsIHRoZSBjYW52YXMgZG9lcyBub3QgZm9sbG93LCBhbmQgdGhlIHN0cmlwIHRoYXQgb3BlbnMgdXAgc2hvd3NcbiAgICogdGhlIHBhZ2UgYmVoaW5kIGl0IGluc3RlYWQgb2YgdGhlIHNjZW5lLlxuICAgKlxuICAgKiBUaGUgcGFyZW50IGlzIG9ic2VydmVkIHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIGJlY2F1c2UgcmVzaXppbmcgdGhlIGNhbnZhcyBpcyB3aGF0IHRoaXMgcmVhY3RzXG4gICAqIHRvIC0gd2F0Y2hpbmcgdGhlIGVsZW1lbnQgd2UgcmVzaXplIHdvdWxkIHJldHJpZ2dlciB0aGUgb2JzZXJ2ZXIuXG4gICAqL1xuICBwcml2YXRlIG9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNhbnZhcy5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuY2FudmFzUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBpcywgdGhyZWUgdGltZXMuXG4gICAqXG4gICAqIEV4aXN0aW5nIHRhZ3MgYXJlIHRoZSBjb3JyZXNwb25kZW5jZXMgLSB0aGV5IGFscmVhZHkgY2FycnkgdGhlIHN0b3JlZCBjb29yZGluYXRlLCBzbyB0aGUgcGVyc29uXG4gICAqIG9ubHkgaGFzIHRvIHN1cHBseSB0aGUgbWF0Y2hpbmcgc3BvdCBvbiB0aGUgbW9kZWwuIE5vIG5ldyByZWNvcmRzIGFyZSB3cml0dGVuOyBub3RoaW5nIGlzXG4gICAqIGFwcGxpZWQgdW50aWwgc29sdmVBbGlnbm1lbnRGcm9tUGFpcnMoKSBzdWNjZWVkcy5cbiAgICovXG4gIHN0YXJ0VGFnQWxpZ25tZW50KCk6IHZvaWQge1xuICAgIC8vIE9uZSBwb2ludGVyIG1vZGUgYXQgYSB0aW1lLCB0aGUgc2FtZSBydWxlIHN0YXJ0TWVhc3VyaW5nKCkgYXBwbGllcyB0aGUgb3RoZXIgd2F5IHJvdW5kLlxuICAgIGlmICh0aGlzLm1lYXN1cmluZykge1xuICAgICAgdGhpcy5jYW5jZWxNZWFzdXJpbmcoKTtcbiAgICB9XG4gICAgdGhpcy5hbGlnbmluZyA9IHRydWU7XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycyA9IFtdO1xuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcbiAgICAvLyBXaGlsZSBjYWxpYnJhdGluZywgdGhlIHRhZ3MgZnJvbSBlbHNld2hlcmUgYXJlIGFsbCBzaG93biAtIGluY2x1ZGluZyB0aGUgb25lcyBvZmYgdGhlIG1vZGVsLFxuICAgIC8vIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBvbmVzIGEgY2FsaWJyYXRpb24gaXMgZm9yLlxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xuICAgIH1cbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IDAsIGF3YWl0aW5nOiAndGFnJyB9KTtcbiAgfVxuXG4gIGNhbmNlbFRhZ0FsaWdubWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNBbGlnbmluZyA9IHRoaXMuYWxpZ25pbmc7XG4gICAgdGhpcy5hbGlnbmluZyA9IGZhbHNlO1xuICAgIHRoaXMuYWxpZ25tZW50UGFpcnMgPSBbXTtcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgfVxuICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoeyBwYWlyczogMCwgYXdhaXRpbmc6IG51bGwgfSk7XG4gICAgaWYgKHdhc0FsaWduaW5nKSB7XG4gICAgICB0aGlzLmFsaWdubWVudENhbmNlbGxlZCQubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGlzQWxpZ25pbmdUYWdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsaWduaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvaW50ZXIgc2hvdWxkIGJlIHNob3dpbmcgdGhlIHBsYWNlbWVudCBnaG9zdC5cbiAgICpcbiAgICogVHJ1ZSB3aGlsZSBwbGFjaW5nIGEgdGFnLCBhbmQgd2hpbGUgY2FsaWJyYXRpbmcgb25jZSBhIHRhZyBoYXMgYmVlbiBwaWNrZWQgLSB0aGF0IHNlY29uZCBjbGlja1xuICAgKiBpcyB0aGUgc2FtZSBxdWVzdGlvbiAoXCJ3aGVyZSBvbiB0aGUgbW9kZWw/XCIpIGFuZCBkZXNlcnZlcyB0aGUgc2FtZSBhaW1pbmcgYWlkLiBOb3QgdHJ1ZSBmb3IgdGhlXG4gICAqIGZpcnN0IGhhbGYgb2YgYSBwYWlyLCB3aGljaCBpcyBhIGNsaWNrIG9uIGEgdGFnLCBub3Qgb24gdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1ByZXZpZXdpbmdQbGFjZW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2luZ1RhZyB8fCB0aGlzLm1lYXN1cmluZyB8fCAodGhpcy5hbGlnbmluZyAmJiAhIXRoaXMuYWxpZ25tZW50U291cmNlKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgdGFnIGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGlzIGVsZW1lbnQuICovXG4gIGhhc1RhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhZ1Nwcml0ZXMuaGFzKGVsZW1lbnRJZCk7XG4gIH1cblxuICAvKiogSG93IG1hbnkgdGFncyBhcmUgb24gc2hvdyAtIHRoZSBvbmVzIGEgcGVyc29uIGNvdWxkIGFjdHVhbGx5IGNsaWNrLiAqL1xuICBnZXRUYWdDb3VudCgpOiBudW1iZXIge1xuICAgIGxldCB2aXNpYmxlID0gMDtcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB7XG4gICAgICBpZiAoc3ByaXRlLnZpc2libGUpIHtcbiAgICAgICAgdmlzaWJsZSArPSAxO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2aXNpYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvbHZlcyBhbmQgYXBwbGllcyB0aGUgYWxpZ25tZW50IGNvbGxlY3RlZCBzbyBmYXIsIHJldHVybmluZyBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwZXJzaXN0IGl0LlxuICAgKlxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgdGhyZWUgdGFncyB0dXJuIG91dCB0byBiZSBjb2xsaW5lYXIsIGluIHdoaWNoIGNhc2Ugbm90aGluZyBpcyBhcHBsaWVkIGFuZFxuICAgKiB0aGUgd2Fsa3Rocm91Z2ggc3RheXMgb3BlbiBmb3IgdGhlIHBlcnNvbiB0byBwaWNrIGEgYmV0dGVyIHRoaXJkIHBvaW50LlxuICAgKi9cbiAgc29sdmVBbGlnbm1lbnRGcm9tUGFpcnMoKTogVGhyZWVKc0FsaWdubWVudCB8IG51bGwge1xuICAgIGNvbnN0IHVwID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICB1cFt0aGlzLm1vZGVsVXAucmVwbGFjZSgnLScsICcnKSBhcyAneCcgfCAneScgfCAneiddID0gdGhpcy5tb2RlbFVwLnN0YXJ0c1dpdGgoJy0nKSA/IC0xIDogMTtcbiAgICBjb25zdCBhbGlnbm1lbnQgPSBzb2x2ZVRocmVlSnNBbGlnbm1lbnQodGhpcy5hbGlnbm1lbnRQYWlycywgdXApO1xuICAgIGlmICghYWxpZ25tZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gT3V0IG9mIGNhbGlicmF0aW5nIG1vZGUgZmlyc3Q6IGFwcGx5aW5nIHRoZSByZXN1bHQgcmUtZGVjaWRlcyB3aGljaCB0YWdzIHNob3csIGFuZCBmcm9tIGhlcmVcbiAgICAvLyBvbiB0aGF0IGlzIHRoZSBvbmVzIG9uIHRoZSBtb2RlbCBhZ2Fpbiwgbm90IGFsbCBvZiB0aGVtLlxuICAgIHRoaXMuYWxpZ25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLmFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MoYWxpZ25tZW50KTtcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7IHBhaXJzOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCwgYXdhaXRpbmc6IG51bGwgfSk7XG4gICAgcmV0dXJuIGFsaWdubWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgbmV3IGNhbGlicmF0aW9uIHdoaWxlIGtlZXBpbmcgZXZlcnkgdGFnIHBsYWNlZCBpbiB0aGlzIG1vZGVsIGV4YWN0bHkgd2hlcmUgaXQgaXMuXG4gICAqXG4gICAqIEEgY2FsaWJyYXRpb24gaXMgd29ya2VkIG91dCBmb3IgdGhlIHRhZ3MgdGhhdCBjYW1lIGZyb20gZWxzZXdoZXJlLiBUaGUgbW9kZWwncyBvd24gdGFncyB3ZXJlIHB1dFxuICAgKiB3aGVyZSB0aGV5IGFyZSBieSBzb21lb25lIGNsaWNraW5nIHRoZSBtb2RlbCwgc28gdGhleSBtdXN0IG5vdCBmb2xsb3cgaXQuIFRoZWlyIHN0b3JlZFxuICAgKiBjb29yZGluYXRlcyBhcmUgcmV3cml0dGVuIGluc3RlYWQ6IGludG8gdGhlIHNoYXJlZCBzcGFjZSBhcyB0aGUgbmV3IGNhbGlicmF0aW9uIGRlZmluZXMgaXQuXG4gICAqIFRoYXQgaXMgYWxzbyB3aGF0IG1ha2VzIHRoZW0gY29tcGFyYWJsZSB3aXRoIG90aGVyIHZpc2l0cyBmcm9tIGhlcmUgb24gLSBhIHRhZyBwbGFjZWQgYmVmb3JlXG4gICAqIHRoZSBtb2RlbCB3YXMgY2FsaWJyYXRlZCB3YXMgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB2aXNpYmxlIG5vd2hlcmUgZWxzZS5cbiAgICpcbiAgICogVGhlIHJld3JpdHRlbiB0YWdzIGFyZSBrZXB0IGZvciB0aGUgY2FsbGVyIHRvIHN0b3JlOyBzZWUgdGFrZVJlYmFzZWRUYWdzKCkuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MoYWxpZ25tZW50OiBUaHJlZUpzQWxpZ25tZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3duID0gWy4uLnRoaXMudGFnU3ByaXRlcy52YWx1ZXMoKV0uZmlsdGVyKChzcHJpdGUpID0+IHRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKSk7XG4gICAgLy8gV2hlcmUgZWFjaCBvbmUgaXMgbm93LCBpbiB0aGUgc3BhY2UgdGhlIG1vZGVsIHNpdHMgaW4sIGFuZCBob3cgaXRzIHBhcmVudCB3YXMgdHVybmVkLlxuICAgIGNvbnN0IHBsYWNlZCA9IG93bi5tYXAoKHNwcml0ZSkgPT4ge1xuICAgICAgc3ByaXRlLnBhcmVudD8udXBkYXRlTWF0cml4KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzcHJpdGUsXG4gICAgICAgIHBvc2l0aW9uOiBzcHJpdGUucG9zaXRpb24uY2xvbmUoKS5hcHBseU1hdHJpeDQoc3ByaXRlLnBhcmVudD8ubWF0cml4ID8/IG5ldyBUSFJFRS5NYXRyaXg0KCkpLFxuICAgICAgICB0dXJuOiBzcHJpdGUucGFyZW50Py5xdWF0ZXJuaW9uLmNsb25lKCkgPz8gbmV3IFRIUkVFLlF1YXRlcm5pb24oKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFRhZ0FsaWdubWVudChhbGlnbm1lbnQpO1xuXG4gICAgY29uc3QgaW52ZXJzZSA9IHRoaXMudGFnR3JvdXAubWF0cml4LmNsb25lKCkuaW52ZXJ0KCk7XG4gICAgY29uc3QgdW50dXJuID0gdGhpcy50YWdHcm91cC5xdWF0ZXJuaW9uLmNsb25lKCkuaW52ZXJ0KCk7XG4gICAgdGhpcy5yZWJhc2VkVGFncyA9IHBsYWNlZC5tYXAoKHsgc3ByaXRlLCBwb3NpdGlvbiwgdHVybiB9KSA9PiB7XG4gICAgICBzcHJpdGUucG9zaXRpb24uY29weShwb3NpdGlvbi5hcHBseU1hdHJpeDQoaW52ZXJzZSkpO1xuICAgICAgc3ByaXRlLnVzZXJEYXRhLmZyYW1lID0gbnVsbDtcbiAgICAgIHRoaXMucGFyZW50VGFnKHNwcml0ZSk7XG4gICAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcbiAgICAgIGNvbnN0IHJvdGF0aW9uID0gdW50dXJuLmNsb25lKCkubXVsdGlwbHkodHVybik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogc3ByaXRlLm5hbWUsXG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IHNwcml0ZS5wb3NpdGlvbi54LCB5OiBzcHJpdGUucG9zaXRpb24ueSwgejogc3ByaXRlLnBvc2l0aW9uLnogfSxcbiAgICAgICAgcm90YXRlRGlyZWN0aW9uOiAoeyB4LCB5LCB6IH0pID0+IHtcbiAgICAgICAgICBjb25zdCB0dXJuZWQgPSBuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pO1xuICAgICAgICAgIHJldHVybiB7IHg6IHR1cm5lZC54LCB5OiB0dXJuZWQueSwgejogdHVybmVkLnogfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoVGFnVmlzaWJpbGl0eSgpO1xuICB9XG5cbiAgLyoqIEhhbmRzIG92ZXIgdGhlIHRhZ3MgdGhlIGxhc3QgY2FsaWJyYXRpb24gcmV3cm90ZSwgb25jZSwgZm9yIHRoZW0gdG8gYmUgc3RvcmVkLiAqL1xuICB0YWtlUmViYXNlZFRhZ3MoKTogVGhyZWVKc1JlYmFzZWRUYWdbXSB7XG4gICAgY29uc3QgcmViYXNlZCA9IHRoaXMucmViYXNlZFRhZ3M7XG4gICAgdGhpcy5yZWJhc2VkVGFncyA9IFtdO1xuICAgIHJldHVybiByZWJhc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIENob29zZXMgdGhlIHRhZyBmb3IgdGhlIHBhaXIgYmVpbmcgbWF0Y2hlZCBieSBpZCwgaW5zdGVhZCBvZiBieSBjbGlja2luZyBpdC5cbiAgICpcbiAgICogQ2xpY2tpbmcgYSB0YWcgc3VwcG9zZXMgaXQgY2FuIGJlIGZvdW5kLiBPbiBhIG1vZGVsIHRoYXQgaGFzIG5ldmVyIGJlZW4gY2FsaWJyYXRlZCB0aGUgdGFncyBtYXlcbiAgICogc2l0IGZhciBmcm9tIGl0LCBvciBhbGwgb24gdG9wIG9mIG9uZSBhbm90aGVyOyBhIGxpc3QgaGFzIG5laXRoZXIgcHJvYmxlbS5cbiAgICovXG4gIHNlbGVjdEFsaWdubWVudFRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcbiAgICBpZiAoIXRoaXMuYWxpZ25pbmcgfHwgdGhpcy5hbGlnbm1lbnRTb3VyY2UgfHwgIXNwcml0ZSB8fCAhdGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKS5pbmNsdWRlcyhzcHJpdGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuc2V0QWxpZ25tZW50U291cmNlKHNwcml0ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNldEFsaWdubWVudFNvdXJjZShzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgLy8gVGhlIHNwcml0ZSdzIG93biBwb3NpdGlvbiBpcyB0aGUgc3RvcmVkIGNvb3JkaW5hdGUsIHVudG91Y2hlZCBieSBhbnkgYWxpZ25tZW50IGFscmVhZHlcbiAgICAvLyBhcHBsaWVkIC0gdGhhdCB0cmFuc2Zvcm0gbGl2ZXMgb24gdGhlIGdyb3VwLCBub3Qgb24gdGhlIHNwcml0ZS5cbiAgICBjb25zdCBzdG9yZWQgPSBzcHJpdGUucG9zaXRpb247XG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSB7IHg6IHN0b3JlZC54LCB5OiBzdG9yZWQueSwgejogc3RvcmVkLnogfTtcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZVRhZ0lkID0gc3ByaXRlLm5hbWU7XG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXG4gICAgICBhd2FpdGluZzogJ3BvaW50JyxcbiAgICAgIHRhZ0lkOiBzcHJpdGUubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGEgY2xpY2sgd2hpbGUgdGhlIGFsaWdubWVudCB3YWxrdGhyb3VnaCBpcyBydW5uaW5nLiAqL1xuICBwcml2YXRlIGhhbmRsZUFsaWdubWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsaWdubWVudFNvdXJjZSkge1xuICAgICAgLy8gRmlyc3QgaGFsZiBvZiBhIHBhaXI6IHdoaWNoIHRhZyBhcmUgd2UgdGFsa2luZyBhYm91dD9cbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKSwgZmFsc2UpWzBdO1xuICAgICAgaWYgKCFoaXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRBbGlnbm1lbnRTb3VyY2UoaGl0Lm9iamVjdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kIGhhbGY6IHdoZXJlIHRoYXQgdGFnIGFjdHVhbGx5IGJlbG9uZ3Mgb24gdGhlIG1vZGVsLlxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucGlja0FsaWdubWVudFRhcmdldChldmVudCk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycy5wdXNoKHsgdGFnSWQ6IHRoaXMuYWxpZ25tZW50U291cmNlVGFnSWQsIHNvdXJjZTogdGhpcy5hbGlnbm1lbnRTb3VyY2UsIHRhcmdldCB9KTtcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XG4gICAgLy8gVGhlIGdob3N0IGJlbG9uZ3MgdG8gdGhlIGNsaWNrIHRoYXQganVzdCBoYXBwZW5lZDsgdGhlIG5leHQgaGFsZiBpcyBhIGNsaWNrIG9uIGEgdGFnLlxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXG4gICAgICAvLyBEb25lIGF0IHRocmVlLCBvciBzb29uZXIgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0YWdzIHRvIG1hdGNoOiBmZXdlciBwYWlycyBzdGlsbCBjYWxpYnJhdGUsXG4gICAgICAvLyBvbmx5IGxlc3MgY29tcGxldGVseS5cbiAgICAgIGF3YWl0aW5nOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+PSAzIHx8IHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkubGVuZ3RoID09PSAwID8gbnVsbCA6ICd0YWcnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIG1lYXN1cmVtZW50OiBldmVyeSBjbGljayBvbiB0aGUgbW9kZWwgYWRkcyBhIHBvaW50LCBhbmQgZWFjaCBwYWlyIG9mIGNvbnNlY3V0aXZlXG4gICAqIHBvaW50cyBpcyBhIG1lYXN1cmVkIHNlZ21lbnQuXG4gICAqXG4gICAqIEl0IGVuZHMgdGhyb3VnaCBmaW5pc2hNZWFzdXJpbmcoKSBvciBjYW5jZWxNZWFzdXJpbmcoKSByYXRoZXIgdGhhbiBvbiBpdHMgb3duIGFmdGVyIHR3byBwb2ludHMsXG4gICAqIGJlY2F1c2UgYSBtZWFzdXJlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHNlZ21lbnRzIC0gdGhlIHNhbWUgYXMgTWF0dGVycG9ydCdzLCB3aG9zZSByZXN1bHRzIGFyZVxuICAgKiBzdG9yZWQgYXMgYSBsaXN0IG9mIGRpc3RhbmNlcy5cbiAgICovXG4gIHN0YXJ0TWVhc3VyaW5nKCk6IHZvaWQge1xuICAgIC8vIE9uZSBwb2ludGVyIG1vZGUgYXQgYSB0aW1lOiBhIGNsaWNrIGNhbm5vdCBiZSBib3RoIGEgdGFnIHBvc2l0aW9uIGFuZCBhIG1lYXN1cmVkIHBvaW50LlxuICAgIHRoaXMuY2FuY2VsVGFnUGxhY2VtZW50KCk7XG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcbiAgICAgIHRoaXMuY2FuY2VsVGFnQWxpZ25tZW50KCk7XG4gICAgfVxuICAgIHRoaXMuY2xlYXJNZWFzdXJlbWVudCgpO1xuICAgIGlmICh0aGlzLm1lYXN1cmVHcm91cC5wYXJlbnQgIT09IHRoaXMudGFnR3JvdXApIHtcbiAgICAgIHRoaXMudGFnR3JvdXAuYWRkKHRoaXMubWVhc3VyZUdyb3VwKTtcbiAgICB9XG4gICAgdGhpcy5tZWFzdXJpbmcgPSB0cnVlO1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dCh7IHBvaW50czogMCwgZGlzdGFuY2VzOiBbXSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYmFuZG9ucyB0aGUgbWVhc3VyZW1lbnQgYW5kIHJlbW92ZXMgd2hhdCB3YXMgZHJhd24uXG4gICAqXG4gICAqIEFsc28gd2hhdCBjbGVhcnMgYSBmaW5pc2hlZCBtZWFzdXJlbWVudCBvZmYgdGhlIG1vZGVsIG9uY2UgaXRzIGZvcm0gaXMgc2F2ZWQgb3IgY2xvc2VkLCB3aGljaFxuICAgKiBpcyB3aHkgaXQgb25seSByZXBvcnRzIGFuIGFiYW5kb25tZW50IHdoZW4gb25lIHdhcyBhY3R1YWxseSBpbiBwcm9ncmVzcy5cbiAgICovXG4gIGNhbmNlbE1lYXN1cmluZygpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNNZWFzdXJpbmcgPSB0aGlzLm1lYXN1cmluZztcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XG4gICAgLy8gRm9yZ290dGVuIGhlcmUgc28gdGhhdCBhIGZvcm0gb3BlbmVkIGxhdGVyIGNhbm5vdCBwaWNrIHVwIGEgbWVhc3VyZW1lbnQgYWxyZWFkeSBkZWFsdCB3aXRoLlxuICAgIHRoaXMubGFzdE1lYXN1cmVtZW50ID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB9XG4gICAgaWYgKHdhc01lYXN1cmluZykge1xuICAgICAgdGhpcy5tZWFzdXJlbWVudFByb2dyZXNzJC5uZXh0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmRzIHRoZSBtZWFzdXJlbWVudCBhbmQgcmV0dXJucyBpdCwgb3IgbnVsbCB3aGVuIHRoZXJlIGFyZSBub3QgeWV0IHR3byBwb2ludHMgdG8gbWVhc3VyZVxuICAgKiBiZXR3ZWVuIC0gaW4gd2hpY2ggY2FzZSBtZWFzdXJpbmcgc2ltcGx5IGNhcnJpZXMgb24uXG4gICAqXG4gICAqIFRoZSBkcmF3aW5nIHN0YXlzIG9uIHRoZSBtb2RlbCBzbyBpdCBpcyBzdGlsbCB2aXNpYmxlIHdoaWxlIHRoZSBwZXJzb24gbmFtZXMgdGhlIG1lYXN1cmVtZW50O1xuICAgKiBjYW5jZWxNZWFzdXJpbmcoKSB0YWtlcyBpdCBhd2F5IGFmdGVyd2FyZHMuXG4gICAqL1xuICBmaW5pc2hNZWFzdXJpbmcoKTogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1lYXN1cmluZyB8fCB0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyaW5nID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICB0aGlzLnVwZGF0ZU1lYXN1cmVSdWJiZXJCYW5kKG51bGwpO1xuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG5cbiAgICB0aGlzLmxhc3RNZWFzdXJlbWVudCA9IHtcbiAgICAgIHBvaW50czogdGhpcy5tZWFzdXJlUG9pbnRzLm1hcCgocG9pbnQpID0+ICh7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfSkpLFxuICAgICAgZGlzdGFuY2VzOiB0aGlzLm1lYXN1cmVEaXN0YW5jZXMoKSxcbiAgICAgIHNjcmVlbnNob3Q6IHRoaXMuY2FwdHVyZU1lYXN1cmVtZW50U2NyZWVuc2hvdCgpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGFzdE1lYXN1cmVtZW50O1xuICB9XG5cbiAgaXNNZWFzdXJpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyaW5nO1xuICB9XG5cbiAgLyoqIFRoZSBtZWFzdXJlbWVudCBmaW5pc2hNZWFzdXJpbmcoKSBsYXN0IHByb2R1Y2VkLCBmb3IgdGhlIGZvcm0gdGhhdCBzYXZlcyBpdC4gKi9cbiAgZ2V0TGFzdE1lYXN1cmVtZW50KCk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhc3RNZWFzdXJlbWVudDtcbiAgfVxuXG4gIC8qKiBNZXRyZXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBwb2ludHMuIFRhZyBzcGFjZSBpcyBpbiBtZXRyZXMsIHNvIG5vIGNvbnZlcnNpb24gaXMgaW52b2x2ZWQuICovXG4gIHByaXZhdGUgbWVhc3VyZURpc3RhbmNlcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCB0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMubWVhc3VyZVBvaW50c1tpbmRleCAtIDFdLmRpc3RhbmNlVG8odGhpcy5tZWFzdXJlUG9pbnRzW2luZGV4XSk7XG4gICAgICAvLyBUd28gZGVjaW1hbHMsIHRoZSBwcmVjaXNpb24gTWF0dGVycG9ydCdzIG93biBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCB3aXRoLlxuICAgICAgZGlzdGFuY2VzLnB1c2goTWF0aC5yb3VuZChkaXN0YW5jZSAqIDEwMCkgLyAxMDApO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGFuY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNZWFzdXJlUG9pbnQocG9pbnQ6IFRIUkVFLlZlY3RvcjMpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMubWVhc3VyZVBvaW50c1t0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5tZWFzdXJlUG9pbnRzLnB1c2gocG9pbnQpO1xuXG4gICAgY29uc3QgbWFya2VyID0gbmV3IFRIUkVFLlNwcml0ZShcbiAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XG4gICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLFxuICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgLy8gU2l6ZWQgYWdhaW5zdCB0aGUgdmlld3BvcnQsIG5vdCB0aGUgbW9kZWw6IG1lYXN1cmluZyBpcyBkb25lIHpvb21lZCByaWdodCBpbiwgd2hlcmVcbiAgICAgICAgLy8gYW55dGhpbmcgc2l6ZWQgaW4gbWV0cmVzIHdvdWxkIGNvdmVyIHRoZSB2ZXJ5IHRoaW5nIGJlaW5nIG1lYXN1cmVkLlxuICAgICAgICBzaXplQXR0ZW51YXRpb246IGZhbHNlLFxuICAgICAgfSlcbiAgICApO1xuICAgIG1hcmtlci5zY2FsZS5zZXQoMC4wMjIsIDAuMDIyLCAxKTtcbiAgICBtYXJrZXIucG9zaXRpb24uY29weShwb2ludCk7XG4gICAgbWFya2VyLnJlbmRlck9yZGVyID0gMTAwMTtcbiAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQobWFya2VyKTtcblxuICAgIGlmIChwcmV2aW91cykge1xuICAgICAgdGhpcy5tZWFzdXJlR3JvdXAuYWRkKHRoaXMuY3JlYXRlTWVhc3VyZUxpbmUocHJldmlvdXMsIHBvaW50KSk7XG5cbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5yb3VuZChwcmV2aW91cy5kaXN0YW5jZVRvKHBvaW50KSAqIDEwMCkgLyAxMDA7XG4gICAgICBjb25zdCBsYWJlbCA9IG5ldyBUSFJFRS5TcHJpdGUoXG4gICAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XG4gICAgICAgICAgbWFwOiB0aGlzLmNyZWF0ZU1lYXN1cmVMYWJlbFRleHR1cmUoYCR7ZGlzdGFuY2UudG9GaXhlZCgyKX0gbWApLFxuICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgICAgc2l6ZUF0dGVudWF0aW9uOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBsYWJlbC5zY2FsZS5zZXQoMC4xNSwgMC4wNSwgMSk7XG4gICAgICBsYWJlbC5wb3NpdGlvbi5jb3B5KHByZXZpb3VzKS5hZGQocG9pbnQpLm11bHRpcGx5U2NhbGFyKDAuNSk7XG4gICAgICBsYWJlbC5yZW5kZXJPcmRlciA9IDEwMDI7XG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQobGFiZWwpO1xuICAgIH1cblxuICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dCh7XG4gICAgICBwb2ludHM6IHRoaXMubWVhc3VyZVBvaW50cy5sZW5ndGgsXG4gICAgICBkaXN0YW5jZXM6IHRoaXMubWVhc3VyZURpc3RhbmNlcygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2VnbWVudCB3aXRoIGEgd2lkdGggaW4gcGl4ZWxzLlxuICAgKlxuICAgKiBXZWJHTCdzIG93biBsaW5lcyBhcmUgb25lIHBpeGVsIHdpZGUgd2hhdGV2ZXIgaXMgYXNrZWQgZm9yLCB3aGljaCBhbGwgYnV0IGRpc2FwcGVhcnMgb3ZlciBhXG4gICAqIHBob3RvZ3JhcGhpYyB0ZXh0dXJlLiBUaGlzIGtpbmQgaXMgZHJhd24gYXMgc2NyZWVuLWZhY2luZyBnZW9tZXRyeSwgc28gdGhlIHdpZHRoIGhvbGRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVNZWFzdXJlTGluZShmcm9tOiBUSFJFRS5WZWN0b3IzLCB0bzogVEhSRUUuVmVjdG9yMyk6IGFueSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgTGluZUdlb21ldHJ5KCk7XG4gICAgZ2VvbWV0cnkuc2V0UG9zaXRpb25zKFtmcm9tLngsIGZyb20ueSwgZnJvbS56LCB0by54LCB0by55LCB0by56XSk7XG4gICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZU1hdGVyaWFsKHtcbiAgICAgIGNvbG9yOiBuZXcgVEhSRUUuQ29sb3IoVGhyZWVKc1NlcnZpY2UuTUVBU1VSRV9DT0xPUikuZ2V0SGV4KCksXG4gICAgICBsaW5ld2lkdGg6IDMsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMucmVuZGVyZXIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMigpKTtcbiAgICBtYXRlcmlhbC5yZXNvbHV0aW9uLnNldChzaXplLngsIHNpemUueSk7XG4gICAgY29uc3QgbGluZSA9IG5ldyBMaW5lMihnZW9tZXRyeSwgbWF0ZXJpYWwpO1xuICAgIGxpbmUucmVuZGVyT3JkZXIgPSAxMDAwO1xuICAgIHJldHVybiBsaW5lO1xuICB9XG5cbiAgLyoqIExpbmUgd2lkdGhzIGFyZSBpbiBwaXhlbHMsIHdoaWNoIHRoZSBtYXRlcmlhbCBjYW4gb25seSBob25vdXIgaWYgaXQga25vd3MgdGhlIGNhbnZhcyBzaXplLiAqL1xuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMucmVuZGVyZXIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMigpKTtcbiAgICB0aGlzLm1lYXN1cmVHcm91cC5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICBpZiAoY2hpbGQubWF0ZXJpYWw/LnJlc29sdXRpb24pIHtcbiAgICAgICAgY2hpbGQubWF0ZXJpYWwucmVzb2x1dGlvbi5zZXQoc2l6ZS54LCBzaXplLnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFN0cmV0Y2hlcyBhIHNlZ21lbnQgZnJvbSB0aGUgbGFzdCBwb2ludCB0byB0aGUgcG9pbnRlciwgb3IgaGlkZXMgaXQgd2hlbiBnaXZlbiBudWxsLiAqL1xuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVSdWJiZXJCYW5kKHRhcmdldDogVEhSRUUuVmVjdG9yMyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5tZWFzdXJlUG9pbnRzW3RoaXMubWVhc3VyZVBvaW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoIXRoaXMubWVhc3VyaW5nIHx8ICFsYXN0IHx8ICF0YXJnZXQpIHtcbiAgICAgIGlmICh0aGlzLm1lYXN1cmVSdWJiZXJCYW5kKSB7XG4gICAgICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubWVhc3VyZVJ1YmJlckJhbmQpIHtcbiAgICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQgPSB0aGlzLmNyZWF0ZU1lYXN1cmVMaW5lKGxhc3QsIHRhcmdldCk7XG4gICAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjY7XG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQodGhpcy5tZWFzdXJlUnViYmVyQmFuZCk7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQuZ2VvbWV0cnkuc2V0UG9zaXRpb25zKFtcbiAgICAgIGxhc3QueCwgbGFzdC55LCBsYXN0LnosXG4gICAgICB0YXJnZXQueCwgdGFyZ2V0LnksIHRhcmdldC56LFxuICAgIF0pO1xuICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQudmlzaWJsZSA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMYWJlbFRleHR1cmUodGV4dDogc3RyaW5nKTogVEhSRUUuQ2FudmFzVGV4dHVyZSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gMzg0O1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxMjg7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgY29uc3QgcmFkaXVzID0gMjg7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgwLCAwLCAwLCAwLjc4KSc7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0Lm1vdmVUbyhyYWRpdXMsIDgpO1xuICAgIGNvbnRleHQuYXJjVG8oY2FudmFzLndpZHRoIC0gOCwgOCwgY2FudmFzLndpZHRoIC0gOCwgY2FudmFzLmhlaWdodCAtIDgsIHJhZGl1cyk7XG4gICAgY29udGV4dC5hcmNUbyhjYW52YXMud2lkdGggLSA4LCBjYW52YXMuaGVpZ2h0IC0gOCwgOCwgY2FudmFzLmhlaWdodCAtIDgsIHJhZGl1cyk7XG4gICAgY29udGV4dC5hcmNUbyg4LCBjYW52YXMuaGVpZ2h0IC0gOCwgOCwgOCwgcmFkaXVzKTtcbiAgICBjb250ZXh0LmFyY1RvKDgsIDgsIGNhbnZhcy53aWR0aCAtIDgsIDgsIHJhZGl1cyk7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcblxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJyNGRkZGRkYnO1xuICAgIGNvbnRleHQuZm9udCA9ICdib2xkIDYwcHggc2Fucy1zZXJpZic7XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgY2FudmFzLndpZHRoIC8gMiwgY2FudmFzLmhlaWdodCAvIDIgKyA0KTtcblxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgZXZlcnl0aGluZyBkcmF3biBmb3IgYSBtZWFzdXJlbWVudCBhbmQgZm9yZ2V0cyBpdHMgcG9pbnRzLiAqL1xuICBwcml2YXRlIGNsZWFyTWVhc3VyZW1lbnQoKTogdm9pZCB7XG4gICAgWy4uLnRoaXMubWVhc3VyZUdyb3VwLmNoaWxkcmVuXS5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5yZW1vdmUoY2hpbGQpO1xuICAgICAgY2hpbGQuZ2VvbWV0cnk/LmRpc3Bvc2U/LigpO1xuICAgICAgY2hpbGQubWF0ZXJpYWw/Lm1hcD8uZGlzcG9zZT8uKCk7XG4gICAgICBjaGlsZC5tYXRlcmlhbD8uZGlzcG9zZT8uKCk7XG4gICAgfSk7XG4gICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1lYXN1cmVQb2ludHMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHBpY3R1cmUgb2YgdGhlIHNjZW5lIHdpdGggdGhlIG1lYXN1cmVtZW50IG9uIGl0LCBhcyBNYXR0ZXJwb3J0IGF0dGFjaGVzIHRvIGl0cyBvd24uXG4gICAqXG4gICAqIFRhZ3MgYXJlIGxlZnQgb3V0LCBhcyB0aGV5IGFyZSB0aGVyZTogdGhlIHBpY3R1cmUgaXMgYWJvdXQgdGhlIG1lYXN1cmVtZW50LiBJdCBpcyB0YWtlbiBzdHJhaWdodFxuICAgKiBhZnRlciBhIHJlbmRlciBiZWNhdXNlIHRoZSBkcmF3aW5nIGJ1ZmZlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gaG9sZCB0aGUgZnJhbWUgdW50aWwgdGhlXG4gICAqIGJyb3dzZXIgcHJlc2VudHMgaXQsIGFuZCBzY2FsZWQgZG93biBzaW5jZSBpdCBpcyB1cGxvYWRlZCBhbmQgc2hvd24gYXMgYSB0aHVtYm5haWwuXG4gICAqL1xuICBwcml2YXRlIGNhcHR1cmVNZWFzdXJlbWVudFNjcmVlbnNob3QoKTogc3RyaW5nIHtcbiAgICBjb25zdCBoaWRkZW46IFRIUkVFLlNwcml0ZVtdID0gW107XG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4ge1xuICAgICAgaWYgKHNwcml0ZS52aXNpYmxlKSB7XG4gICAgICAgIHNwcml0ZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGhpZGRlbi5wdXNoKHNwcml0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50O1xuICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgODAwIC8gc291cmNlLndpZHRoLCA2MDAgLyBzb3VyY2UuaGVpZ2h0KTtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNvdXJjZS53aWR0aCAqIHNjYWxlKSk7XG4gICAgY2FudmFzLmhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc291cmNlLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHNvdXJjZSwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIGhpZGRlbi5mb3JFYWNoKChzcHJpdGUpID0+IHtcbiAgICAgIHNwcml0ZS52aXNpYmxlID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuODUpO1xuICB9XG5cbiAgLyoqIEFybXMgdGFnIHBsYWNlbWVudDogdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIGRyb3BzIGEgdGFnIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gKi9cbiAgc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZTogUG9pVHlwZSB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5wbGFjaW5nVGFnID0gdHJ1ZTtcbiAgICB0aGlzLnBsYWNlbWVudFBvaVR5cGUgPSBwb2lUeXBlO1xuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICB9XG4gIH1cblxuICAvKiogTGVhdmVzIHBsYWNlbWVudCBtb2RlIHdpdGhvdXQgcGxhY2luZyBhbnl0aGluZy4gKi9cbiAgY2FuY2VsVGFnUGxhY2VtZW50KCk6IHZvaWQge1xuICAgIHRoaXMucGxhY2luZ1RhZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSB0cmFuc2x1Y2VudCB0YWcgdW5kZXIgdGhlIGN1cnNvciB3aGlsZSBwbGFjaW5nLCBzbyB0aGUgc3BvdCBpcyB2aXNpYmxlIGJlZm9yZSBjb21taXRpbmcuXG4gICAqXG4gICAqIE1hdHRlcnBvcnQgZG9lcyB0aGlzIHdpdGggYSB0YWcgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyOyB0aGUgZXF1aXZhbGVudCBoZXJlIGlzIGEgcHJldmlld1xuICAgKiBzcHJpdGUgdGhhdCBnZXRzIHJlbW92ZWQgdGhlIG1vbWVudCB0aGUgcmVhbCB0YWcgdGFrZXMgaXRzIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVQbGFjZW1lbnRQcmV2aWV3KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBpY2tQb2ludE9uR3B1KGV2ZW50KTtcbiAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICAgIHRoaXMudXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQobnVsbCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcbiAgICAgIHRoaXMucGxhY2VtZW50UHJldmlldyA9IG5ldyBUSFJFRS5TcHJpdGUoXG4gICAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XG4gICAgICAgICAgbWFwOiB0aGlzLmNyZWF0ZVRhZ1RleHR1cmUoJyM5RTlFOUUnKSxcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgICAgIG9wYWNpdHk6IDAuNixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcucmVuZGVyT3JkZXIgPSA5OTk7XG4gICAgICB0aGlzLnRhZ0dyb3VwLmFkZCh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xuICAgICAgdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHRoaXMucGxhY2VtZW50UHJldmlldyk7XG4gICAgfVxuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZU1lYXN1cmVSdWJiZXJCYW5kKHBvc2l0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9pbnQgdW5kZXIgdGhlIGN1cnNvciwgcmVhZCBmcm9tIHRoZSBkZXB0aCBidWZmZXIgaW5zdGVhZCBvZiByYXljYXN0LCBpbiB0YWcgc3BhY2UuXG4gICAqXG4gICAqIEEgcmF5Y2FzdCB3YWxrcyBldmVyeSB0cmlhbmdsZSBvZiB0aGUgbWVzaCBpdCBoaXRzOiBvbiBhIGNhcHR1cmVkIG1vZGVsIHRoYXQgaXMgbWlsbGlvbnMgb2ZcbiAgICogdGhlbSwgdGVucyBvZiBtaWxsaXNlY29uZHMsIGV2ZXJ5IHRpbWUgdGhlIHBvaW50ZXIgbW92ZXMuIENvYWxlc2NpbmcgdG8gb25lIHBlciBmcmFtZSBkaWQgbm90XG4gICAqIGhlbHAsIGJlY2F1c2UgdGhlIGNvc3QgaXMgdGhlIHBpY2sgaXRzZWxmIC0gaXQgc2ltcGx5IGJlY2FtZSBvbmUgc2xvdyBmcmFtZSBpbnN0ZWFkIG9mIHNldmVyYWwuXG4gICAqXG4gICAqIFJlbmRlcmluZyB0aGUgbW9kZWwncyBkZXB0aCBpbnRvIGEgc2luZ2xlIHBpeGVsIHVuZGVyIHRoZSBjdXJzb3IgYW5zd2VycyB0aGUgc2FtZSBxdWVzdGlvbiBvblxuICAgKiB0aGUgR1BVIGluIGNvbnN0YW50IHRpbWUsIHdoYXRldmVyIHRoZSBtb2RlbCdzIHNpemUuIFRoZSBjYW1lcmEncyB2aWV3IG9mZnNldCBpcyB3aGF0IG5hcnJvd3NcbiAgICogdGhlIHdob2xlIGltYWdlIGRvd24gdG8gdGhhdCBvbmUgcGl4ZWwsIHNvIHRoZSB2YWx1ZSByZWFkIGJhY2sgaXMgdGhlIGRlcHRoIHRoZSBjdXJzb3IgaXMgb3Zlci5cbiAgICpcbiAgICogVXNlZCBmb3IgdGhlIGdob3N0IG9ubHkuIFRoZSBjbGljayB0aGF0IGFjdHVhbGx5IHBsYWNlcyBhIHRhZyBzdGlsbCByYXljYXN0czogaXQgaXMgb25lIHBpY2ssXG4gICAqIGl0cyBjb3N0IGRvZXMgbm90IG1hdHRlciwgYW5kIGl0IHlpZWxkcyB0aGUgc3VyZmFjZSBub3JtYWwsIHdoaWNoIGRlcHRoIGFsb25lIGNhbm5vdCBnaXZlLlxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrUG9pbnRPbkdwdShldmVudDogTW91c2VFdmVudCk6IFRIUkVFLlZlY3RvcjMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubW9kZWxSb290IHx8ICF0aGlzLnJlbmRlcmVyIHx8ICF0aGlzLmNhbWVyYSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBpY2tUYXJnZXQpIHtcbiAgICAgIHRoaXMucGlja1RhcmdldCA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlclRhcmdldCgxLCAxKTtcbiAgICAgIHRoaXMucGlja0NhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSgpO1xuICAgICAgdGhpcy5waWNrQ2FtZXJhLmxheWVycy5zZXQoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUik7XG4gICAgICB0aGlzLnBpY2tEZXB0aE1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hEZXB0aE1hdGVyaWFsKHtcbiAgICAgICAgZGVwdGhQYWNraW5nOiBUSFJFRS5SR0JBRGVwdGhQYWNraW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID4gcmVjdC53aWR0aCB8fCB5ID4gcmVjdC5oZWlnaHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucGlja0NhbWVyYS5jb3B5KHRoaXMuY2FtZXJhKTtcbiAgICB0aGlzLnBpY2tDYW1lcmEubGF5ZXJzLnNldChUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKTtcbiAgICAvLyBSZW5kZXJzIHRoZSBvbmUgcGl4ZWwgdGhlIGN1cnNvciBpcyBvdmVyIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGltYWdlIC0gb2Zmc2V0IGJ5IGhhbGYgYVxuICAgIC8vIHBpeGVsIHNvIHRoZSBjdXJzb3Igc2l0cyBhdCB0aGF0IHBpeGVsJ3MgY2VudHJlLCB3aGljaCBpcyB3aGVyZSBOREMgKDAsIDApIGxhbmRzLlxuICAgIHRoaXMucGlja0NhbWVyYS5zZXRWaWV3T2Zmc2V0KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCB4IC0gMC41LCB5IC0gMC41LCAxLCAxKTtcblxuICAgIC8vIFdoZXJlIHRoZSBtb2RlbCBpcyBub3QsIHRoZSBwaXhlbCBtdXN0IHJlYWQgYXMgXCJub3RoaW5nXCIsIHNvIGl0IGlzIGNsZWFyZWQgdG8gd2hpdGUgLSBhIHZhbHVlXG4gICAgLy8gbm8gcmVhbCBkZXB0aCBwYWNrcyB0by4gVHdvIHRoaW5ncyB3b3VsZCBvdGhlcndpc2UgcGFpbnQgb3ZlciB0aGF0OiB0aGUgZGVmYXVsdCBibGFjayBjbGVhcixcbiAgICAvLyB3aGljaCBkZWNvZGVzIGFzIGRlcHRoIDAgKGEgaGl0IGFnYWluc3QgdGhlIGxlbnMpLCBhbmQgdGhlIHNjZW5lIGJhY2tncm91bmQsIHdoaWNoIHRocmVlLmpzXG4gICAgLy8gZHJhd3MgaW4gcGxhY2Ugb2YgdGhlIGNsZWFyIGNvbG91ciB3aGVuZXZlciBvbmUgaXMgc2V0LlxuICAgIGNvbnN0IHByZXZpb3VzQ2xlYXJDb2xvciA9IHRoaXMucmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcihuZXcgVEhSRUUuQ29sb3IoKSk7XG4gICAgY29uc3QgcHJldmlvdXNDbGVhckFscGhhID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XG4gICAgY29uc3QgcHJldmlvdXNUYXJnZXQgPSB0aGlzLnJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuICAgIGNvbnN0IHByZXZpb3VzQmFja2dyb3VuZCA9IHRoaXMuc2NlbmUuYmFja2dyb3VuZDtcblxuICAgIHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XG4gICAgdGhpcy5zY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gdGhpcy5waWNrRGVwdGhNYXRlcmlhbDtcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHhmZmZmZmYsIDEpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHRoaXMucGlja1RhcmdldCk7XG4gICAgdGhpcy5yZW5kZXJlci5jbGVhcigpO1xuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMucGlja0NhbWVyYSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHModGhpcy5waWNrVGFyZ2V0LCAwLCAwLCAxLCAxLCB0aGlzLnBpY2tQaXhlbCk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlbmRlclRhcmdldChwcmV2aW91c1RhcmdldCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRDbGVhckNvbG9yKHByZXZpb3VzQ2xlYXJDb2xvciwgcHJldmlvdXNDbGVhckFscGhhKTtcbiAgICB0aGlzLnNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xuICAgIHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IHByZXZpb3VzQmFja2dyb3VuZDtcblxuICAgIGNvbnN0IFtyLCBnLCBiLCBhXSA9IHRoaXMucGlja1BpeGVsO1xuICAgIGlmIChyID09PSAyNTUgJiYgZyA9PT0gMjU1ICYmIGIgPT09IDI1NSAmJiBhID09PSAyNTUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSBpbnZlcnNlIG9mIHRocmVlJ3MgcGFja0RlcHRoVG9SR0JBLCB3aGljaCBzdG9yZXMgdGhlIHZhbHVlIGl0c2VsZiBpbiBhbHBoYSBhbmQgZXZlciBmaW5lclxuICAgIC8vIGZyYWN0aW9ucyBvZiBpdCBpbiBibHVlLCBncmVlbiBhbmQgcmVkIC0gYWxwaGEgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgbm90IHJlZC4gUmVhZCB0aGVcbiAgICAvLyBvdGhlciB3YXkgcm91bmQsIHRoZSByZXN1bHQgaXMgbW9zdGx5IHRoZSBsb3ctb3JkZXIgbm9pc2UsIG9mdGVuIG5lYXIgemVybywgd2hpY2ggdW5wcm9qZWN0c1xuICAgIC8vIG9udG8gdGhlIG5lYXIgcGxhbmU6IGEgZ2hvc3QgcHJlc3NlZCBhZ2FpbnN0IHRoZSBsZW5zLCBmaWxsaW5nIHRoZSB3aG9sZSBzY3JlZW4uXG4gICAgY29uc3QgZG93bnNjYWxlID0gMjU1IC8gMjU2O1xuICAgIGNvbnN0IGRlcHRoID1cbiAgICAgIChyIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYgKiAyNTYpICtcbiAgICAgIChnIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYpICtcbiAgICAgIChiIC8gMjU1KSAqIGRvd25zY2FsZSAvIDI1NiArXG4gICAgICAoYSAvIDI1NSkgKiBkb3duc2NhbGU7XG5cbiAgICAvLyBOREMgeCBhbmQgeSBhcmUgemVybyBiZWNhdXNlIHRoZSBwaXhlbCByZWFkIGlzIHRoZSBjZW50cmUgb2YgdGhhdCBvbmUtcGl4ZWwgaW1hZ2UgLSB3aGljaCBvbmx5XG4gICAgLy8gaG9sZHMgd2hpbGUgdGhlIHZpZXcgb2Zmc2V0IGlzIGluIGVmZmVjdC4gQ2xlYXJpbmcgaXQgZmlyc3Qgd291bGQgdW5wcm9qZWN0IHRocm91Z2ggdGhlIGZ1bGxcbiAgICAvLyB2aWV3IGluc3RlYWQsIGxhbmRpbmcgdGhlIHBvaW50IG9uIHRoZSByYXkgdGhyb3VnaCB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4uIFRoZSBvZmZzZXQgaXNcbiAgICAvLyBzaW1wbHkgcmVwbGFjZWQgYnkgdGhlIG5leHQgcGljaywgc28gaXQgaXMgbmV2ZXIgY2xlYXJlZC5cbiAgICBjb25zdCB3b3JsZCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIGRlcHRoICogMiAtIDEpLnVucHJvamVjdCh0aGlzLnBpY2tDYW1lcmEpO1xuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuICAgIHJldHVybiB0aGlzLnRhZ0dyb3VwLndvcmxkVG9Mb2NhbCh3b3JsZCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWdHcm91cC5yZW1vdmUodGhpcy5wbGFjZW1lbnRQcmV2aWV3KTtcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwubWFwPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3Lm1hdGVyaWFsLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogU2hvd3Mgb3IgaGlkZXMgb25lIHRhZywgbGVhdmluZyBpdCByZWdpc3RlcmVkIHNvIGl0IGNhbiBiZSBicm91Z2h0IGJhY2sgd2l0aG91dCByZWxvYWRpbmcuICovXG4gIHNldFRhZ1Zpc2liaWxpdHkoZWxlbWVudElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKHNwcml0ZSkge1xuICAgICAgc3ByaXRlLnZpc2libGUgPSB2aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBvbmx5IHRhZ3Mgb2YgdGhlIGdpdmVuIHR5cGVzLCBoaWRpbmcgdGhlIHJlc3QuXG4gICAqXG4gICAqIFBhc3NpbmcgbnVsbCBzaG93cyBldmVyeXRoaW5nIC0gdGhlIFwibm8gZmlsdGVyXCIgc3RhdGUsIGRpc3RpbmN0IGZyb20gYW4gZW1wdHkgYXJyYXksIHdoaWNoIGlzIGFcbiAgICogZmlsdGVyIHRoYXQgaGFwcGVucyB0byBtYXRjaCBub3RoaW5nLlxuICAgKi9cbiAgc2V0VmlzaWJsZVRhZ1R5cGVzKHR5cGVzOiBQb2lUeXBlW10gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlVGFnVHlwZXMgPSB0eXBlcztcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpKTtcbiAgfVxuXG4gIC8qKiBTYXlzIHdoaWNoIGNhcHR1cmUgaXMgb24gc2NyZWVuLCBzbyB0aGUgdGFncyBwbGFjZWQgaW4gaXQgY2FuIGJlIHRvbGQgZnJvbSB0aGUgcmVzdC4gKi9cbiAgc2V0Q3VycmVudENhcHR1cmUoY2FwdHVyZUlEOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50Q2FwdHVyZUlEID0gY2FwdHVyZUlEO1xuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcbiAgICAgIHRoaXMucGFyZW50VGFnKHNwcml0ZSk7XG4gICAgICB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IHRhZyByZWdpc3RlcmVkIGluIHRoZSBzY2VuZSwgc2hvd24gb3Igbm90LiAqL1xuICBnZXRUYWdzKCk6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgIHBvaVR5cGU6IFBvaVR5cGUgfCBudWxsO1xuICAgIHZpc2libGU6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGNhbiB1c2UgaXQuICovXG4gICAgY2FsaWJyYXRhYmxlOiBib29sZWFuO1xuICB9W10ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkpO1xuICAgIHJldHVybiBbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXS5tYXAoKHNwcml0ZSkgPT4gKHtcbiAgICAgIGlkOiBzcHJpdGUubmFtZSxcbiAgICAgIGxhYmVsOiBzcHJpdGUudXNlckRhdGEubGFiZWwgPz8gbnVsbCxcbiAgICAgIHBvaVR5cGU6IHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlID8/IG51bGwsXG4gICAgICB2aXNpYmxlOiBzcHJpdGUudmlzaWJsZSxcbiAgICAgIGNhbGlicmF0YWJsZTogY2FuZGlkYXRlcy5oYXMoc3ByaXRlKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogSG93IGZhciB0aGUgdGFncyBmcm9tIGVsc2V3aGVyZSBzaXQgZnJvbSB0aGUgbW9kZWwsIG1lYXN1cmVkIGluIG1vZGVsIHJhZGlpLiBOdWxsIHdpdGhvdXQgYm90aC5cbiAgICpcbiAgICogQmVmb3JlIGEgbW9kZWwgaXMgY2FsaWJyYXRlZCB0aG9zZSB0YWdzIGFyZSB3aGVyZXZlciB0aGVpciBvd24gY29vcmRpbmF0ZXMgcHV0IHRoZW0sIHdoaWNoIGZvclxuICAgKiBhIG1vZGVsIHdpdGggYSBkaWZmZXJlbnQgb3JpZ2luIGNhbiBiZSBhIGxvbmcgd2F5IG9mZiAtIHRvbyBmYXIgdG8gZmluZCwgbGV0IGFsb25lIGNsaWNrLlxuICAgKi9cbiAgZ2V0VGFnRGlzdGFuY2VGcm9tTW9kZWwoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1vZGVsUm9vdCB8fCAhdGhpcy5tb2RlbFdvcmxkUmFkaXVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpO1xuICAgIGNhbmRpZGF0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiBjZW50cm9pZC5hZGQoc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSkpKTtcbiAgICBjb25zdCBjb3VudCA9IGNhbmRpZGF0ZXMubGVuZ3RoO1xuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFRoZSBtb2RlbCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4gd2hlbiBpdCBpcyBwbGFjZWQuXG4gICAgcmV0dXJuIGNlbnRyb2lkLmRpdmlkZVNjYWxhcihjb3VudCkubGVuZ3RoKCkgLyB0aGlzLm1vZGVsV29ybGRSYWRpdXM7XG4gIH1cblxuICAvKipcbiAgICogSGFuZ3MgYSB0YWcgZnJvbSB0aGUgZ3JvdXAgaXRzIGNvb3JkaW5hdGVzIGJlbG9uZyB0bzogb3V0c2lkZSB0aGUgY2FsaWJyYXRpb24gd2hlbiB0aGV5IGFyZSBpblxuICAgKiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB1bmRlciBpdCBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIHBhcmVudFRhZyhzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50ID0gc3ByaXRlLnVzZXJEYXRhLmZyYW1lID09PSAnbW9kZWwnICYmIHRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKVxuICAgICAgPyB0aGlzLm1vZGVsVGFnR3JvdXBcbiAgICAgIDogdGhpcy50YWdHcm91cDtcbiAgICBpZiAoc3ByaXRlLnBhcmVudCAhPT0gcGFyZW50KSB7XG4gICAgICBwYXJlbnQuYWRkKHNwcml0ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIGEgY2FsaWJyYXRpb24gY2FuIGJlIHdvcmtlZCBvdXQgZnJvbTogdGhvc2UgdGhhdCBjYW1lIGZyb20gc29tZXdoZXJlIGVsc2UsIHdoZXRoZXIgb3JcbiAgICogbm90IHRoZXkgYXJlIG9uIHNob3cgLSBiZWZvcmUgY2FsaWJyYXRpbmcsIG1vc3Qgb2YgdGhlbSB3aWxsIG5vdCBiZS5cbiAgICpcbiAgICogVGFncyBwbGFjZWQgaW4gdGhpcyBtb2RlbCBhcmUgd2hlcmUgdGhleSBhcmUgYmVjYXVzZSBzb21lb25lIGNsaWNrZWQgdGhlcmU7IG1hdGNoaW5nIHRoZW0gdG9cbiAgICogXCJ3aGVyZSB0aGV5IHJlYWxseSBhcmVcIiB3b3VsZCBiZSBjaXJjdWxhci4gQSB0YWcgaW4gYW5vdGhlciBtb2RlbCdzIG93biBjb29yZGluYXRlcyBjYW5ub3QgYmVcbiAgICogcGxhY2VkIGhlcmUgYXQgYWxsLiBBbmQgYSB0YWcgYWxyZWFkeSB1c2VkIGluIHRoaXMgY2FsaWJyYXRpb24gY2Fubm90IGJlIHVzZWQgYWdhaW4gLSB0d29cbiAgICogcGFpcnMgZnJvbSBvbmUgdGFnIGNhcnJ5IG5vIG1vcmUgdGhhbiBvbmUuXG4gICAqL1xuICBwcml2YXRlIGNhbGlicmF0aW9uQ2FuZGlkYXRlcygpOiBUSFJFRS5PYmplY3QzRFtdIHtcbiAgICBjb25zdCB1c2VkID0gbmV3IFNldCh0aGlzLmFsaWdubWVudFBhaXJzLm1hcCgocGFpcikgPT4gcGFpci50YWdJZCkpO1xuICAgIHJldHVybiBbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXS5maWx0ZXIoKHNwcml0ZSkgPT5cbiAgICAgIHNwcml0ZS5wYXJlbnQgPT09IHRoaXMudGFnR3JvdXBcbiAgICAgICYmIHNwcml0ZS51c2VyRGF0YS5mcmFtZSAhPT0gJ21vZGVsJ1xuICAgICAgJiYgIXRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKVxuICAgICAgJiYgIXVzZWQuaGFzKHNwcml0ZS5uYW1lKSk7XG4gIH1cblxuICAvKiogSG93IG1hbnkgdGFncyB0aGVyZSBhcmUgdG8gY2FsaWJyYXRlIHdpdGgsIG5vdCBjb3VudGluZyB0aG9zZSBhbHJlYWR5IHVzZWQuICovXG4gIGdldENhbGlicmF0aW9uQ2FuZGlkYXRlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgdGFncyBmcm9tIGVsc2V3aGVyZSBhcmUgbm90IG9uIHRoaXMgbW9kZWwsIGFuZCBzbyBub3Qgc2hvd24gb24gaXQuXG4gICAqXG4gICAqIE9uIGEgbW9kZWwgdGhhdCBoYXMgbm90IGJlZW4gY2FsaWJyYXRlZCwgdGhpcyBpcyB3aGF0IHN1Z2dlc3RzIGl0IHNob3VsZCBiZTogdGhlIHRhZ3MgYXJlIG91dFxuICAgKiB0aGVyZSwganVzdCBub3Qgd2hlcmUgdGhlIG1vZGVsIGlzLlxuICAgKi9cbiAgZ2V0T2ZmTW9kZWxUYWdDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpLmZpbHRlcigoc3ByaXRlKSA9PiAhdGhpcy5pc09uTW9kZWwoc3ByaXRlKSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHRhZyB3YXMgcGxhY2VkIGluIHRoZSB2aXNpdCBvbiBzY3JlZW4uICovXG4gIHByaXZhdGUgaXNPd25lZEJ5VmlzaXQoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXNwcml0ZS51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSURcbiAgICAgICYmIHNwcml0ZS51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPT09IHRoaXMuY3VycmVudENhcHR1cmVJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRhZyBzaG93cyB3aGVuIGl0cyB0eXBlIGlzIG5vdCBmaWx0ZXJlZCBvdXQgYW5kIGl0IGJlbG9uZ3Mgb24gdGhpcyBtb2RlbC5cbiAgICpcbiAgICogT25lIHBsYWNlIGRlY2lkZXMsIGJlY2F1c2UgdGhlIHR3byB1c2VkIHRvIHNldCBgdmlzaWJsZWAgc2VwYXJhdGVseSBhbmQgd2hpY2hldmVyIHJhbiBsYXN0XG4gICAqIHVuZGlkIHRoZSBvdGhlci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlUYWdWaXNpYmlsaXR5KHNwcml0ZTogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCB0eXBlQWxsb3dlZCA9IHRoaXMudmlzaWJsZVRhZ1R5cGVzID09PSBudWxsXG4gICAgICB8fCB0aGlzLnZpc2libGVUYWdUeXBlcy5pbmNsdWRlcyhzcHJpdGUudXNlckRhdGEucG9pVHlwZSk7XG4gICAgc3ByaXRlLnZpc2libGUgPSB0eXBlQWxsb3dlZCAmJiB0aGlzLmJlbG9uZ3NPblRoaXNNb2RlbChzcHJpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB0YWcgaGFzIGEgcGxhY2Ugb24gdGhpcyBtb2RlbC5cbiAgICpcbiAgICogRXZlcnkgdGFnIG9mIHRoZSBzcGFjZSBpcyBvZmZlcmVkIHRvIGV2ZXJ5IG1vZGVsIC0gdGhlcmUgaXMgb25lIHNldCBvZiB0YWdzLCBub3Qgb25lIHBlciBtb2RlbC5cbiAgICogV2hhdCBhIG1vZGVsIHNob3dzIG9mIGl0IGlzIHRoZSBwYXJ0IHRoYXQgc2l0cyBvbiB0aGUgbW9kZWwuXG4gICAqL1xuICBwcml2YXRlIGJlbG9uZ3NPblRoaXNNb2RlbChzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogYm9vbGVhbiB7XG4gICAgLy8gUGxhY2VkIGhlcmUgYnkgYSBjbGljayBvbiB0aGlzIHZlcnkgc3VyZmFjZS5cbiAgICBpZiAodGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gUGxhY2VkIGluIGFub3RoZXIgbW9kZWwgYmVmb3JlIHRoYXQgb25lIHdhcyBjYWxpYnJhdGVkOiBpdHMgY29vcmRpbmF0ZXMgYXJlIHRoYXQgbW9kZWwncyBvd25cbiAgICAvLyBhbmQgc2F5IG5vdGhpbmcgYWJvdXQgd2hlcmUgaXQgd291bGQgYmUgaW4gdGhpcyBvbmUuXG4gICAgaWYgKHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9PT0gJ21vZGVsJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBDYWxpYnJhdGluZyBpcyBtYXRjaGluZyB0YWdzIHRvIHdoZXJlIHRoZXkgYmVsb25nLCBzbyB0aGV5IGFsbCBoYXZlIHRvIGJlIG9uIG9mZmVyLlxuICAgIGlmICh0aGlzLmFsaWduaW5nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNPbk1vZGVsKHNwcml0ZSk7XG4gIH1cblxuICAvKiogV2hldGhlciBhIHRhZywgZHJhd24gd2hlcmUgaXRzIGNvb3JkaW5hdGVzIGFuZCB0aGUgY2FsaWJyYXRpb24gcHV0IGl0LCBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cbiAgcHJpdmF0ZSBpc09uTW9kZWwoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zdXJmYWNlQ2VsbHMpIHtcbiAgICAgIC8vIE5vIG1vZGVsIHRvIGJlIG9uIHlldC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gc3ByaXRlLnBhcmVudCA/PyB0aGlzLnRhZ0dyb3VwO1xuICAgIHBhcmVudC51cGRhdGVNYXRyaXgoKTtcbiAgICAvLyBUaGUgZ3JpZCBpcyBpbiB0aGUgbW9kZWwncyBvd24gdW5pdHM7IHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIGlzIGhvdyBtYW55IG9mIHRob3NlIGEgbWV0cmUgaXMuXG4gICAgY29uc3QgcmVhY2ggPSBUaHJlZUpzU2VydmljZS5PTl9NT0RFTF9NRVRSRVMgKiAocGFyZW50LnNjYWxlLnggfHwgMSk7XG4gICAgcmV0dXJuIHRoaXMuaXNOZWFyU3VyZmFjZShzcHJpdGUucG9zaXRpb24uY2xvbmUoKS5hcHBseU1hdHJpeDQocGFyZW50Lm1hdHJpeCksIHJlYWNoKTtcbiAgfVxuXG4gIC8qKiBSZS1kZWNpZGVzIGV2ZXJ5IHRhZydzIHZpc2liaWxpdHk6IHRoZSBtb2RlbCwgdGhlIGNhbGlicmF0aW9uIG9yIHRoZSBtb2RlIGNoYW5nZWQuICovXG4gIHByaXZhdGUgcmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoc3ByaXRlKSk7XG4gIH1cblxuICBwcml2YXRlIHN1cmZhY2VLZXkoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3BhbiA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9TUEFOO1xuICAgIGNvbnN0IHBhZCA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9QQUQ7XG4gICAgY29uc3QgW2ksIGosIGtdID0gW3ggKyBwYWQsIHkgKyBwYWQsIHogKyBwYWRdO1xuICAgIGlmIChpIDwgMCB8fCBqIDwgMCB8fCBrIDwgMCB8fCBpID49IHNwYW4gfHwgaiA+PSBzcGFuIHx8IGsgPj0gc3Bhbikge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gaSArIHNwYW4gKiAoaiArIHNwYW4gKiBrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXlzIHRoZSBncmlkIG92ZXIgdGhlIG1vZGVsJ3Mgc3VyZmFjZS5cbiAgICpcbiAgICogUnVucyBvbmNlIHBlciBtb2RlbCwgaW4gb25lIHBhc3Mgb3ZlciBpdHMgdHJpYW5nbGVzLiBBIHRyaWFuZ2xlIHNtYWxsZXIgdGhhbiBhIGNlbGwgaXMgbWFya2VkXG4gICAqIGJ5IGl0cyBjZW50cmUsIHdoaWNoIGlzIGV2ZXJ5IHRyaWFuZ2xlIG9mIGEgc2Nhbm5lZCBtb2RlbDsgYSBsYXJnZXIgb25lIC0gdGhlIHR3byB0cmlhbmdsZXMgb2ZcbiAgICogYSBkcmF3biB3YWxsIC0gaXMgc2FtcGxlZCBhY3Jvc3MgaXRzIGZhY2UsIG9yIHRoZSBtaWRkbGUgb2YgdGhlIHdhbGwgd291bGQgcmVhZCBhcyBlbXB0eS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlR3JpZChvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBib3g6IFRIUkVFLkJveDMpOiB2b2lkIHtcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgY29uc3QgbG9uZ2VzdCA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55LCBzaXplLnopO1xuICAgIGlmICghKGxvbmdlc3QgPiAwKSkge1xuICAgICAgdGhpcy5zdXJmYWNlQ2VsbHMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIHF1YXJ0ZXIgb2YgYSBtZXRyZSB3aGVyZSB0aGUgbW9kZWwgaXMgaW4gbWV0cmVzOyBjb2Fyc2VyIG9uIGEgdmVyeSBsYXJnZSBvbmUsIHNvIHRoZSBncmlkXG4gICAgLy8gc3RheXMgYWRkcmVzc2FibGUgYW5kIGl0cyBtZW1vcnkgYm91bmRlZC5cbiAgICBjb25zdCBjZWxsID0gTWF0aC5tYXgoMC4yNSwgbG9uZ2VzdCAvIDM4NCk7XG4gICAgY29uc3Qgb3JpZ2luID0gYm94Lm1pbi5jbG9uZSgpO1xuICAgIGNvbnN0IGNlbGxzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgbWFyayA9IChwb2ludDogVEhSRUUuVmVjdG9yMykgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdXJmYWNlS2V5KFxuICAgICAgICBNYXRoLmZsb29yKChwb2ludC54IC0gb3JpZ2luLngpIC8gY2VsbCksXG4gICAgICAgIE1hdGguZmxvb3IoKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsKSxcbiAgICAgICAgTWF0aC5mbG9vcigocG9pbnQueiAtIG9yaWdpbi56KSAvIGNlbGwpLFxuICAgICAgKTtcbiAgICAgIGlmIChrZXkgPj0gMCkge1xuICAgICAgICBjZWxscy5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHRyaWFuZ2xlQ291bnQgPSAwO1xuICAgIG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2hpbGQuaXNNZXNoICYmIGNoaWxkLmdlb21ldHJ5Py5hdHRyaWJ1dGVzPy5wb3NpdGlvbjtcbiAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICB0cmlhbmdsZUNvdW50ICs9IChjaGlsZC5nZW9tZXRyeS5pbmRleCA/IGNoaWxkLmdlb21ldHJ5LmluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBQYXN0IGEgZmV3IG1pbGxpb24gdHJpYW5nbGVzIHRoZXkgYXJlIGZhciBzbWFsbGVyIHRoYW4gYSBjZWxsLCBhbmQgZXZlcnkgY2VsbCBpcyBoaXQgbWFueVxuICAgIC8vIHRpbWVzIG92ZXI7IGEgc2FtcGxlIG1hcmtzIHRoZSBzYW1lIGNlbGxzLlxuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0cmlhbmdsZUNvdW50IC8gMzAwMDAwMCkpO1xuXG4gICAgY29uc3QgYSA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgYyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgcG9pbnQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xuICAgICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IGNoaWxkLmdlb21ldHJ5LmluZGV4O1xuICAgICAgY29uc3QgY291bnQgPSAoaW5kZXggPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50KSAvIDM7XG4gICAgICBmb3IgKGxldCB0cmlhbmdsZSA9IDA7IHRyaWFuZ2xlIDwgY291bnQ7IHRyaWFuZ2xlICs9IHN0cmlkZSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0cmlhbmdsZSAqIDM7XG4gICAgICAgIGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCkgOiBvZmZzZXQpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XG4gICAgICAgIGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCArIDEpIDogb2Zmc2V0ICsgMSkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcbiAgICAgICAgYy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMikgOiBvZmZzZXQgKyAyKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xuICAgICAgICBjb25zdCBlZGdlID0gTWF0aC5tYXgoYS5kaXN0YW5jZVRvKGIpLCBiLmRpc3RhbmNlVG8oYyksIGMuZGlzdGFuY2VUbyhhKSk7XG4gICAgICAgIGlmIChlZGdlIDw9IGNlbGwpIHtcbiAgICAgICAgICBtYXJrKHBvaW50LmNvcHkoYSkuYWRkKGIpLmFkZChjKS5tdWx0aXBseVNjYWxhcigxIC8gMykpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbGYtY2VsbCBzdGVwcyBhY3Jvc3MgdGhlIGZhY2UuIENhcHBlZCwgc28gb25lIGVub3Jtb3VzIHRyaWFuZ2xlIGNhbm5vdCBzdGFsbCB0aGUgbG9hZDtcbiAgICAgICAgLy8gdGhlIHJlYWNoIGEgdGFnIGlzIHRlc3RlZCB3aXRoIHNwYW5zIHNldmVyYWwgY2VsbHMgYW5kIGJyaWRnZXMgd2hhdCB0aGUgY2FwIGxlYXZlcy5cbiAgICAgICAgY29uc3Qgc3RlcHMgPSBNYXRoLm1pbig5NiwgTWF0aC5jZWlsKCgyICogZWRnZSkgLyBjZWxsKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHN0ZXBzOyBpICs9IDEpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBzdGVwcyAtIGk7IGogKz0gMSkge1xuICAgICAgICAgICAgcG9pbnQuY29weShhKVxuICAgICAgICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKGIuY2xvbmUoKS5zdWIoYSksIGkgLyBzdGVwcylcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihjLmNsb25lKCkuc3ViKGEpLCBqIC8gc3RlcHMpO1xuICAgICAgICAgICAgbWFyayhwb2ludCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnN1cmZhY2VDZWxscyA9IGNlbGxzO1xuICAgIHRoaXMuc3VyZmFjZU9yaWdpbi5jb3B5KG9yaWdpbik7XG4gICAgdGhpcy5zdXJmYWNlQ2VsbFNpemUgPSBjZWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgc29tZSBwYXJ0IG9mIHRoZSBtb2RlbCdzIHN1cmZhY2UgbGllcyB3aXRoaW4gYHJlYWNoYCBvZiBhIHBvaW50LCBpbiBtb2RlbCB1bml0cy4gKi9cbiAgcHJpdmF0ZSBpc05lYXJTdXJmYWNlKHBvaW50OiBUSFJFRS5WZWN0b3IzLCByZWFjaDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2VsbCA9IHRoaXMuc3VyZmFjZUNlbGxTaXplO1xuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuc3VyZmFjZU9yaWdpbjtcbiAgICBjb25zdCB4ID0gKHBvaW50LnggLSBvcmlnaW4ueCkgLyBjZWxsO1xuICAgIGNvbnN0IHkgPSAocG9pbnQueSAtIG9yaWdpbi55KSAvIGNlbGw7XG4gICAgY29uc3QgeiA9IChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbDtcbiAgICAvLyBJbiBjZWxscy4gQ2FwcGVkOiBiZXlvbmQgdGhpcyB0aGUgY2FsaWJyYXRpb24ncyBzY2FsZSBtYWtlcyBhIG1ldHJlIHNvIG1hbnkgY2VsbHMgdGhhdCB0aGVcbiAgICAvLyBzZWFyY2ggd291bGQgZHdhcmYgdGhlIG1vZGVsLCBhbmQgYSB0YWcgdGhhdCBmYXIgb2ZmIGlzIG5vdCBvbiBpdCBieSBhbnkgcmVhZGluZy5cbiAgICBjb25zdCBzcGFuID0gTWF0aC5taW4oMTYsIE1hdGguY2VpbChyZWFjaCAvIGNlbGwpKTtcbiAgICAvLyBBIGNlbGwgaXMgXCJ3aXRoaW4gcmVhY2hcIiB3aGVuIGl0cyBjZW50cmUgaXMsIGdpdmUgb3IgdGFrZSB0aGUgaGFsZi1kaWFnb25hbCBvZiB0aGUgY2VsbC5cbiAgICBjb25zdCBsaW1pdCA9IChyZWFjaCAvIGNlbGwgKyAwLjg3KSAqKiAyO1xuICAgIGNvbnN0IFtjeCwgY3ksIGN6XSA9IFtNYXRoLmZsb29yKHgpLCBNYXRoLmZsb29yKHkpLCBNYXRoLmZsb29yKHopXTtcbiAgICBmb3IgKGxldCBrID0gY3ogLSBzcGFuOyBrIDw9IGN6ICsgc3BhbjsgayArPSAxKSB7XG4gICAgICBmb3IgKGxldCBqID0gY3kgLSBzcGFuOyBqIDw9IGN5ICsgc3BhbjsgaiArPSAxKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBjeCAtIHNwYW47IGkgPD0gY3ggKyBzcGFuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IChpICsgMC41IC0geCkgKiogMiArIChqICsgMC41IC0geSkgKiogMiArIChrICsgMC41IC0geikgKiogMjtcbiAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gbGltaXQgJiYgdGhpcy5zdXJmYWNlQ2VsbHMuaGFzKHRoaXMuc3VyZmFjZUtleShpLCBqLCBrKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIGNhbWVyYSB0byBsb29rIGF0IGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuXG4gICAqXG4gICAqIEFuaW1hdGVkIHJhdGhlciB0aGFuIHRlbGVwb3J0ZWQ6IGp1bXBpbmcgdGhlIGNhbWVyYSBsb3NlcyB0aGUgdmlld2VyJ3Mgc2Vuc2Ugb2Ygd2hlcmUgdGhleSB3ZXJlXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC4gVGhlIGFwcHJvYWNoIGRpc3RhbmNlIGZvbGxvd3MgdGhlIG1vZGVsJ3Mgc2l6ZSBzbyBpdCBmcmFtZXMgc2Vuc2libHlcbiAgICogd2hhdGV2ZXIgdGhlIHVuaXRzIGFyZS5cbiAgICovXG4gIGdvVG9UYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFzcHJpdGUgfHwgIXRoaXMuY2FtZXJhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLm1vZGVsUm9vdFxuICAgICAgPyBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3QodGhpcy5tb2RlbFJvb3QpLmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSkubGVuZ3RoKCkgKiAwLjE1XG4gICAgICA6IDU7XG5cbiAgICAvLyBBcHByb2FjaCBhbG9uZyB0aGUgY3VycmVudCB2aWV3aW5nIGRpcmVjdGlvbiwgc28gdGhlIGNhbWVyYSBjbG9zZXMgaW4gcmF0aGVyIHRoYW4gc3dpbmdpbmdcbiAgICAvLyBhcm91bmQgdG8gYW4gYXJiaXRyYXJ5IHNpZGUuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5jYW1lcmEucG9zaXRpb24uY2xvbmUoKS5zdWIodGhpcy5jb250cm9scy50YXJnZXQpLm5vcm1hbGl6ZSgpO1xuICAgIHRoaXMuY2FtZXJhVHdlZW4gPSB7XG4gICAgICBmcm9tUG9zaXRpb246IHRoaXMuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksXG4gICAgICB0b1Bvc2l0aW9uOiB0YXJnZXQuY2xvbmUoKS5hZGQoZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKSksXG4gICAgICBmcm9tVGFyZ2V0OiB0aGlzLmNvbnRyb2xzLnRhcmdldC5jbG9uZSgpLFxuICAgICAgdG9UYXJnZXQ6IHRhcmdldCxcbiAgICAgIHN0YXJ0ZWRBdDogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBkdXJhdGlvbk1zOiA2MDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlcyB0aGUgY2FtZXJhIGFuaW1hdGlvbiBzdGFydGVkIGJ5IGdvVG9UYWcsIGlmIG9uZSBpcyBydW5uaW5nLiAqL1xuICBwcml2YXRlIHN0ZXBDYW1lcmFUd2VlbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FtZXJhVHdlZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIGZyb21UYXJnZXQsIHRvVGFyZ2V0LCBzdGFydGVkQXQsIGR1cmF0aW9uTXMgfSA9IHRoaXMuY2FtZXJhVHdlZW47XG4gICAgY29uc3QgbGluZWFyID0gTWF0aC5taW4oKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uTXMsIDEpO1xuICAgIC8vIEVhc2Ugb3V0LCBzbyB0aGUgbW92ZSBzZXR0bGVzIGluc3RlYWQgb2Ygc3RvcHBpbmcgZGVhZC5cbiAgICBjb25zdCB0ID0gMSAtIE1hdGgucG93KDEgLSBsaW5lYXIsIDMpO1xuXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24ubGVycFZlY3RvcnMoZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCB0KTtcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5sZXJwVmVjdG9ycyhmcm9tVGFyZ2V0LCB0b1RhcmdldCwgdCk7XG5cbiAgICBpZiAobGluZWFyID49IDEpIHtcbiAgICAgIHRoaXMuY2FtZXJhVHdlZW4gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlzUGxhY2luZ1RhZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wbGFjaW5nVGFnO1xuICB9XG5cbiAgLyoqIFRoZSBzcG90IHBpY2tlZCBieSB0aGUgbGFzdCBwbGFjZW1lbnQsIGZvciB3aG9ldmVyIGNvbW1pdHMgaXQgdG8gYSBQT0kuICovXG4gIGdldFBlbmRpbmdUYWdQbGFjZW1lbnQoKTogVGhyZWVKc1RhZ1BsYWNlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmF5Y2FzdHMgYSBjbGljayBhZ2FpbnN0IHRoZSBtb2RlbCdzIGdlb21ldHJ5IGFuZCByZXR1cm5zIHRoZSBoaXQsIGluIHdvcmxkIHNwYWNlLlxuICAgKlxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgY2xpY2sgbWlzc2VkLCB3aGljaCBpcyBhIG5vcm1hbCBvdXRjb21lIC0gdGhlIHVzZXIgY2xpY2tlZCB0aGUgc2t5IC0gYW5kXG4gICAqIGxlYXZlcyB3aGF0ZXZlciBtb2RlIGlzIGFybWVkIHN0aWxsIGFybWVkLCBzbyB0aGV5IGNhbiBzaW1wbHkgdHJ5IGFnYWluLlxuICAgKi9cbiAgcHJpdmF0ZSByYXljYXN0TW9kZWwoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5JbnRlcnNlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubW9kZWxSb290KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xuICAgIHRoaXMubW91c2UueSA9IC0oKGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCkgLyByZWN0LmhlaWdodCkgKiAyICsgMTtcbiAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcblxuICAgIHJldHVybiB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3QodGhpcy5tb2RlbFJvb3QsIHRydWUpWzBdID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgYSBjbGljayBpbnRvIGEgcG9pbnQgb24gdGhlIG1vZGVsLCBpbiB0aGUgZnJhbWUgdGFnIGNvb3JkaW5hdGVzIGFyZSBwZXJzaXN0ZWQgaW4uXG4gICAqXG4gICAqIFRoYXQgZnJhbWUgaXMgdGhlIHRhZyBncm91cCdzLCBub3QgdGhlIG1vZGVsJ3MuIEEgc3RvcmVkIGNvb3JkaW5hdGUgaXMgcmVhZCBiYWNrIGFzIGEgc3ByaXRlXG4gICAqIHBvc2l0aW9uIGluc2lkZSB0aGF0IGdyb3VwLCBzbyBhIGNvb3JkaW5hdGUgY2FwdHVyZWQgaW4gYW55IG90aGVyIGZyYW1lIGNvbWVzIGJhY2sgZGlzcGxhY2VkIGJ5XG4gICAqIGV4YWN0bHkgaG93ZXZlciBmYXIgdGhlIGFsaWdubWVudCBtb3ZlcyB0aGUgZ3JvdXAuIFRoZSB0d28gZnJhbWVzIGFncmVlIG9ubHkgd2hpbGUgdGhlXG4gICAqIGFsaWdubWVudCBpcyBpZGVudGl0eSwgd2hpY2ggaXMgd2h5IHRoaXMgc3RheWVkIGludmlzaWJsZSB1bnRpbCBhIG1vZGVsIHdhcyBjYWxpYnJhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrUGxhY2VtZW50T25Nb2RlbChldmVudDogTW91c2VFdmVudCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XG4gICAgaWYgKCFoaXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy50YWdHcm91cC53b3JsZFRvTG9jYWwoaGl0LnBvaW50LmNsb25lKCkpO1xuXG4gICAgLy8gQSBmYWNlIG5vcm1hbCBpcyBpbiB0aGUgZ2VvbWV0cnkncyBsb2NhbCBzcGFjZSBhbHJlYWR5LCBidXQgdGhlIG1lc2ggaXQgYmVsb25ncyB0byBtYXkgc2l0XG4gICAgLy8gdW5kZXIgdHJhbnNmb3JtcyBvZiBpdHMgb3duLCBzbyB0YWtlIGl0IG91dCB0aHJvdWdoIHRob3NlIGFuZCBiYWNrIGludG8gdGhlIHRhZyBmcmFtZSwgc28gaXRcbiAgICAvLyBkZXNjcmliZXMgdGhlIHNhbWUgb3JpZW50YXRpb24gdGhlIHBvc2l0aW9uIGRvZXMuXG4gICAgbGV0IG5vcm1hbCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApO1xuICAgIGlmIChoaXQuZmFjZSkge1xuICAgICAgbm9ybWFsID0gaGl0LmZhY2Uubm9ybWFsXG4gICAgICAgIC5jbG9uZSgpXG4gICAgICAgIC50cmFuc2Zvcm1EaXJlY3Rpb24oaGl0Lm9iamVjdC5tYXRyaXhXb3JsZClcbiAgICAgICAgLnRyYW5zZm9ybURpcmVjdGlvbihuZXcgVEhSRUUuTWF0cml4NCgpLmNvcHkodGhpcy50YWdHcm91cC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpXG4gICAgICAgIC5ub3JtYWxpemUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHsgeDogcG9zaXRpb24ueCwgeTogcG9zaXRpb24ueSwgejogcG9zaXRpb24ueiB9LFxuICAgICAgbm9ybWFsOiB7IHg6IG5vcm1hbC54LCB5OiBub3JtYWwueSwgejogbm9ybWFsLnogfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSB1c2VyIHNheXMgYSB0YWcgcmVhbGx5IGJlbG9uZ3MsIGluIHRoZSBzcGFjZSB0aGUgc29sdmVkIGFsaWdubWVudCBtYXBzIG9udG8uXG4gICAqXG4gICAqIHNldFRhZ0FsaWdubWVudCB3cml0ZXMgdGhlIHNvbHV0aW9uIHRvIHRoZSB0YWcgZ3JvdXAncyBvd24gdHJhbnNmb3JtLCB3aGljaCBpcyBleHByZXNzZWRcbiAgICogcmVsYXRpdmUgdG8gaXRzIHBhcmVudCAtIHNvIHRoZSB0YXJnZXQgaGFzIHRvIGJlIGluIHRoZSBwYXJlbnQncyBmcmFtZS4gTWVhc3VyaW5nIGl0IGluIHRoZVxuICAgKiBncm91cCdzIG93biBmcmFtZSBpbnN0ZWFkIHdvdWxkIGZvbGQgdGhlIGN1cnJlbnQgYWxpZ25tZW50IGludG8gdGhlIGFuc3dlciwgbWFraW5nIGVhY2hcbiAgICogY2FsaWJyYXRpb24gZGVwZW5kIG9uIHRoZSBvbmUgYmVmb3JlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrQWxpZ25tZW50VGFyZ2V0KGV2ZW50OiBNb3VzZUV2ZW50KTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XG4gICAgaWYgKCFoaXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmcmFtZSA9IHRoaXMudGFnR3JvdXAucGFyZW50ID8/IHRoaXMuc2NlbmU7XG4gICAgZnJhbWUudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuICAgIGNvbnN0IHBvaW50ID0gZnJhbWUud29ybGRUb0xvY2FsKGhpdC5wb2ludC5jbG9uZSgpKTtcbiAgICByZXR1cm4geyB4OiBwb2ludC54LCB5OiBwb2ludC55LCB6OiBwb2ludC56IH07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdHJhbnNmb3JtIG1hcHBpbmcgY2FwdHVyZWQgdGFnIGNvb3JkaW5hdGVzIG9udG8gdGhpcyBtb2RlbCdzIHNwYWNlLlxuICAgKlxuICAgKiBFdmVyeSB0YWcgY29tZXMgZnJvbSB0aGUgc2FtZSBzb3VyY2Ugc3BhY2UsIHNvIHRoaXMgaXMgb25lIHRyYW5zZm9ybSBvbiB0aGUgZ3JvdXAgcmF0aGVyIHRoYW5cbiAgICogcGVyLXRhZyBtYXRocyAtIHdoaWNoIGFsc28gbWVhbnMgaXQgYXBwbGllcyByZXRyb2FjdGl2ZWx5IHRvIHRhZ3MgYWxyZWFkeSBwbGFjZWQsIGFuZCBjYW4gYmVcbiAgICogYWRqdXN0ZWQgbGl2ZSB3aGlsZSBzb21lb25lIGRpYWxzIHRoZSBudW1iZXJzIGluLlxuICAgKlxuICAgKiBQYXNzaW5nIG51bGwgcmVzZXRzIHRvIGlkZW50aXR5LCBpLmUuIHRhZyBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSBpbiBtb2RlbCBzcGFjZS5cbiAgICovXG4gIHNldFRhZ0FsaWdubWVudChhbGlnbm1lbnQ6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgeyB0cmFuc2xhdGlvbiwgcm90YXRpb24sIHNjYWxlIH0gPSBhbGlnbm1lbnQgPz8ge307XG4gICAgdGhpcy50YWdHcm91cC5wb3NpdGlvbi5zZXQodHJhbnNsYXRpb24/LnggPz8gMCwgdHJhbnNsYXRpb24/LnkgPz8gMCwgdHJhbnNsYXRpb24/LnogPz8gMCk7XG4gICAgdGhpcy50YWdHcm91cC5yb3RhdGlvbi5zZXQocm90YXRpb24/LnggPz8gMCwgcm90YXRpb24/LnkgPz8gMCwgcm90YXRpb24/LnogPz8gMCk7XG4gICAgdGhpcy50YWdHcm91cC5zY2FsZS5zZXRTY2FsYXIoc2NhbGUgPz8gMSk7XG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVNYXRyaXgoKTtcblxuICAgIC8vIFRhZyBzaXplIGlzIGRlcml2ZWQgZnJvbSB0aGUgd29ybGQgc2NhbGUgaXQgaW5oZXJpdHMsIHdoaWNoIHRoaXMgY2FsbCBqdXN0IGNoYW5nZWQgLSBhbmQgc29cbiAgICAvLyBpcyB3aGljaCB0YWdzIGxhbmQgb24gdGhlIG1vZGVsLlxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHRoaXMuc2NhbGVUYWdGb3JNb2RlbChzcHJpdGUpKTtcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRhZywgb3IgbW92ZXMvcmVzdHlsZXMgdGhlIG9uZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC5cbiAgICpcbiAgICogVXBzZXJ0IHJhdGhlciB0aGFuIGEgZGVjbGFyYXRpdmUgXCJoZXJlIGlzIHRoZSBmdWxsIGxpc3RcIiBjYWxsLCBiZWNhdXNlIHRhZ3MgYXJyaXZlIHBlciB0eXBlXG4gICAqIChlcXVpcG1lbnQsIHRoZW4gdGlja2V0cywgdGhlbiBtZWFzdXJlbWVudHMuLi4pIGZyb20gc2VwYXJhdGUgc3Vic2NyaXB0aW9ucyAtIHJlcGxhY2luZyB0aGUgc2V0XG4gICAqIG9uIGVhY2ggb2YgdGhvc2Ugd291bGQgd2lwZSB0aGUgdHlwZXMgdGhhdCBjYW1lIGJlZm9yZS5cbiAgICovXG4gIHVwc2VydFRhZyh0YWc6IFRocmVlSnNUYWcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMudGFnU3ByaXRlcy5nZXQodGFnLmlkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGV4aXN0aW5nLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBleGlzdGluZy51c2VyRGF0YS5wb2lUeXBlO1xuICAgICAgZXhpc3RpbmcudXNlckRhdGEubGFiZWwgPSB0YWcubGFiZWwgPz8gZXhpc3RpbmcudXNlckRhdGEubGFiZWw7XG4gICAgICBleGlzdGluZy51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IGV4aXN0aW5nLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRDtcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLmZyYW1lID0gdGFnLmZyYW1lID8/IGV4aXN0aW5nLnVzZXJEYXRhLmZyYW1lO1xuICAgICAgdGhpcy5wYXJlbnRUYWcoZXhpc3RpbmcpO1xuICAgICAgdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoZXhpc3RpbmcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNwcml0ZSA9IG5ldyBUSFJFRS5TcHJpdGUoXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xuICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSh0YWcuY29sb3IpLFxuICAgICAgICAvLyBUYWdzIHJlYWQgYXMgVUkgcmF0aGVyIHRoYW4gZ2VvbWV0cnksIHNvIHRoZXkgc3RheSB2aXNpYmxlIHRocm91Z2ggdGhlIG1vZGVsIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gYmVpbmcgb2NjbHVkZWQgYnkgd2hhdGV2ZXIgd2FsbCBoYXBwZW5zIHRvIGJlIGJldHdlZW4gdGhlbSBhbmQgdGhlIGNhbWVyYS5cbiAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICB9KVxuICAgICk7XG4gICAgc3ByaXRlLm5hbWUgPSB0YWcuaWQ7XG4gICAgc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBudWxsO1xuICAgIHNwcml0ZS51c2VyRGF0YS5sYWJlbCA9IHRhZy5sYWJlbCA/PyBudWxsO1xuICAgIHNwcml0ZS51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IG51bGw7XG4gICAgc3ByaXRlLnVzZXJEYXRhLmZyYW1lID0gdGFnLmZyYW1lID8/IG51bGw7XG4gICAgc3ByaXRlLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcbiAgICBzcHJpdGUucmVuZGVyT3JkZXIgPSA5OTk7XG4gICAgdGhpcy5wYXJlbnRUYWcoc3ByaXRlKTtcbiAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcbiAgICB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpO1xuXG4gICAgdGhpcy50YWdTcHJpdGVzLnNldCh0YWcuaWQsIHNwcml0ZSk7XG5cbiAgICBpZiAodGFnLmljb25VcmwpIHtcbiAgICAgIHRoaXMuYXBwbHlUYWdJY29uKHNwcml0ZSwgdGFnLmljb25VcmwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZW1vdmVzIHRoZSB0YWcgcmVnaXN0ZXJlZCBmb3IgYW4gZWxlbWVudCwgaWYgdGhlcmUgaXMgb25lLiAqL1xuICByZW1vdmVUYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFzcHJpdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3ByaXRlLnBhcmVudD8ucmVtb3ZlKHNwcml0ZSk7XG4gICAgc3ByaXRlLm1hdGVyaWFsLm1hcD8uZGlzcG9zZSgpO1xuICAgIHNwcml0ZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG4gICAgdGhpcy50YWdTcHJpdGVzLmRlbGV0ZShlbGVtZW50SWQpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgZXZlcnkgdGFnIGZyb20gdGhlIHNjZW5lLiAqL1xuICBjbGVhclRhZ3MoKTogdm9pZCB7XG4gICAgWy4uLnRoaXMudGFnU3ByaXRlcy5rZXlzKCldLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlbW92ZVRhZyhpZCkpO1xuICB9XG5cbiAgLyoqIExvYWRzIGFuIGljb24gaW50byBhbiBleGlzdGluZyB0YWcsIGxlYXZpbmcgdGhlIGZhbGxiYWNrIGRpc2MgaW4gcGxhY2UgaWYgaXQgZmFpbHMuICovXG4gIHByaXZhdGUgYXBwbHlUYWdJY29uKHNwcml0ZTogVEhSRUUuU3ByaXRlLCBpY29uVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpLmxvYWQoXG4gICAgICBpY29uVXJsLFxuICAgICAgKHRleHR1cmUpID0+IHtcbiAgICAgICAgc3ByaXRlLm1hdGVyaWFsLm1hcD8uZGlzcG9zZSgpO1xuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubWFwID0gdGV4dHVyZTtcbiAgICAgICAgc3ByaXRlLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAoKSA9PiBjb25zb2xlLndhcm4oYFRocmVlSnNTZXJ2aWNlOiBjb3VsZCBub3QgbG9hZCB0YWcgaWNvbiBcIiR7aWNvblVybH1cIiwga2VlcGluZyB0aGUgZGVmYXVsdCBtYXJrZXIuYClcbiAgICApO1xuICB9XG5cbiAgLyoqIERyYXdzIHRoZSBkZWZhdWx0IHRhZyBtYXJrZXI6IGEgZmlsbGVkIGRpc2Mgd2l0aCBhIHdoaXRlIHJpbmcsIHNvIGl0IHJlYWRzIG9uIGFueSBiYWNrZ3JvdW5kLiAqL1xuICBwcml2YXRlIGNyZWF0ZVRhZ1RleHR1cmUoY29sb3IgPSAnIzFFODhFNScpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcbiAgICBjb25zdCBzaXplID0gMTI4O1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XG4gICAgY2FudmFzLmhlaWdodCA9IHNpemU7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhzaXplIC8gMiwgc2l6ZSAvIDIsIHNpemUgLyAyIC0gOCwgMCwgTWF0aC5QSSAqIDIpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSA4O1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XG4gICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpemVzIGEgdGFnIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQSBzcHJpdGUgaW5oZXJpdHMgdGhlIG1vZGVsJ3Mgc2NhbGUgYW5kIHRoZSBhbGlnbm1lbnQncywgc28gYSBmaXhlZCBzaXplIHdvdWxkIGNvbWUgb3V0IHRpbnkgb25cbiAgICogYSBsYXJnZSBtb2RlbCBhbmQgaHVnZSBvbiBhIHNtYWxsIG9uZS4gRGl2aWRpbmcgYnkgdGhlIGdyb3VwJ3Mgd29ybGQgc2NhbGUga2VlcHMgdGFncyB0aGUgc2FtZVxuICAgKiBzaXplIG9uIHNjcmVlbiB3aGF0ZXZlciB0aGUgbW9kZWwncyB1bml0cyBhcmUuXG4gICAqL1xuICBwcml2YXRlIHNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlOiBUSFJFRS5TcHJpdGUpOiB2b2lkIHtcbiAgICAvLyBJdHMgb3duIHBhcmVudCdzIHNjYWxlOiB0YWdzIGluIHRoZSBtb2RlbCdzIGNvb3JkaW5hdGVzIGRvIG5vdCBpbmhlcml0IHRoZSBjYWxpYnJhdGlvbidzLlxuICAgIGNvbnN0IHdvcmxkU2NhbGUgPSAoc3ByaXRlLnBhcmVudCA/PyB0aGlzLnRhZ0dyb3VwKS5nZXRXb3JsZFNjYWxlKG5ldyBUSFJFRS5WZWN0b3IzKCkpLnggfHwgMTtcbiAgICBjb25zdCBzaXplID0gMC40IC8gd29ybGRTY2FsZTtcbiAgICBzcHJpdGUuc2NhbGUuc2V0KHNpemUsIHNpemUsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgc2Vjb25kYXJ5IGludGVyYWN0aXZlIG9iamVjdHMgKGUuZy4sIFBPSXMsIHNlbnNvcnMpIHRvIHRoZSBzY2VuZS5cbiAgICovXG4gIHVwZGF0ZU9ianNUb1NjZW5lKG9ianNBZGRlZDogT2JqQWRkZWRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gdGhpcy5jbGlja2FibGVPYmplY3RzLm1hcCgob2JqKSA9PiBvYmoubmFtZSk7XG4gICAgY29uc3Qgb2JqTG9hZGVyID0gbmV3IE9CSkxvYWRlcigpO1xuXG4gICAgLy8gZGVsZXRlIG9iamVjdHMgdGhhdCBhcmUgbm90IGluIHRoZSBwcm92aWRlZCBhcnJheVxuICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cy5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgIGlmICghb2Jqc0FkZGVkLmZpbmQoKG9iakRhdGEpID0+IG9iakRhdGEuaWQgPT09IG9iai5uYW1lKSkge1xuICAgICAgICB0aGlzLnNjZW5lLnJlbW92ZShvYmopO1xuICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMgPSB0aGlzLmNsaWNrYWJsZU9iamVjdHMuZmlsdGVyKFxuICAgICAgICAgIChvYmplY3QpID0+IG9iamVjdC5uYW1lICE9PSBvYmoubmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgb2Jqc0FkZGVkLmZvckVhY2goKG9iamVjdERhdGE6IE9iakFkZGVkKSA9PiB7XG4gICAgICBpZiAoIWV4aXN0aW5nSWRzLmluY2x1ZGVzKG9iamVjdERhdGEuaWQpKSB7XG4gICAgICAgIG9iakxvYWRlci5sb2FkKG9iamVjdERhdGEuZmlsZSwgKG5ld09iamVjdCkgPT4ge1xuICAgICAgICAgIG5ld09iamVjdC5uYW1lID0gb2JqZWN0RGF0YS5pZDtcblxuICAgICAgICAgIG5ld09iamVjdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGlmICgoY2hpbGQgYXMgVEhSRUUuTWVzaCkuaXNNZXNoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xuICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbCBpbnN0YW5jZW9mIFRIUkVFLk1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5vcGFjaXR5ID0gMC44O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBzZXQgb2JqZWN0IHBvc2l0aW9uIGFuZCByb3RhdGlvblxuICAgICAgICAgIG5ld09iamVjdC5wb3NpdGlvbi5zZXQoXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLngsXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLnksXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLnpcbiAgICAgICAgICApO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFRoZSBKU09OIGNvbmZpZ3VyYXRpb24gaGFzIHJvdGF0aW9uIGFscmVhZHkgaW4gcmFkaWFucyAoZS5nLiAzLjE0MTUuLi4pXG4gICAgICAgICAgbmV3T2JqZWN0LnJvdGF0aW9uLnNldChcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24ueCxcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24ueSxcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24uelxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBuZXdPYmplY3Quc2NhbGUuc2V0KG9iamVjdERhdGEuc2NhbGUueCwgb2JqZWN0RGF0YS5zY2FsZS55LCBvYmplY3REYXRhLnNjYWxlLnopO1xuXG4gICAgICAgICAgdGhpcy5zY2VuZS5hZGQobmV3T2JqZWN0KTtcbiAgICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMucHVzaChuZXdPYmplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xuICAgICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xuXG4gICAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcblxuICAgICAgLy8gV2hpbGUgdGhlIGdob3N0IGlzIHVwIGl0IGZvbGxvd3MgdGhlIHBvaW50ZXIgYW5kIG5vdGhpbmcgZWxzZSBzaG91bGQgcmVhY3QgdG8gaXQuIFRoZSBtb3ZlXG4gICAgICAvLyBpcyBvbmx5IHJlY29yZGVkIGhlcmU6IHBvaW50ZXIgZXZlbnRzIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiBmcmFtZXMsIGFuZCBwaWNraW5nIGEgcG9pbnRcbiAgICAgIC8vIGNvc3RzIGEgcmF5Y2FzdCBhZ2FpbnN0IHRoZSB3aG9sZSBtb2RlbCwgc28gZG9pbmcgaXQgcGVyIGV2ZW50IGlzIHdoYXQgbWFkZSB0aGUgZ2hvc3QgdHJhaWxcbiAgICAgIC8vIGJlaGluZCB0aGUgY3Vyc29yLiBUaGUgcmVuZGVyIGxvb3AgcGlja3MgdXAgdGhlIGxhdGVzdCBwb3NpdGlvbiwgb25jZSwgcGVyIGZyYW1lLlxuICAgICAgaWYgKHRoaXMuaXNQcmV2aWV3aW5nUGxhY2VtZW50KCkpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTm90IHByZXZpZXdpbmcgYW55IG1vcmUgKGEgcGFpciB3YXMganVzdCBjb21wbGV0ZWQsIHNheSk6IGRyb3AgYSBnaG9zdCBsZWZ0IG92ZXIgZnJvbSBpdC5cbiAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuXG4gICAgICAvLyBUYWdzIGZpcnN0OiB0aGV5IGRyYXcgb24gdG9wIG9mIHRoZSBtb2RlbCwgc28gdGhleSBoYXZlIHRvIGFuc3dlciB0aGUgcG9pbnRlciBmaXJzdCB0b28uXG4gICAgICBjb25zdCBob3ZlcmVkVGFnID0gdGhpcy5yYXljYXN0ZXJcbiAgICAgICAgLmludGVyc2VjdE9iamVjdHMoWy4uLnRoaXMudGFnU3ByaXRlcy52YWx1ZXMoKV0sIGZhbHNlKVxuICAgICAgICAuZmluZCgoaGl0KSA9PiBoaXQub2JqZWN0LnZpc2libGUpPy5vYmplY3Q7XG4gICAgICBpZiAoaG92ZXJlZFRhZykge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQobnVsbCk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gaG92ZXJlZFRhZy51c2VyRGF0YS5sYWJlbDtcbiAgICAgICAgdGhpcy50YWdIb3ZlcmVkJC5uZXh0KGxhYmVsID8geyBsYWJlbCwgZXZlbnQgfSA6IG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobnVsbCk7XG5cbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICAgICAgY29uc3QgaW50ZXJzZWN0ZWRPYmplY3RJZCA9IGludGVyc2VjdHNbMF0ub2JqZWN0Py5wYXJlbnQ/Lm5hbWU7XG4gICAgICAgIGlmIChpbnRlcnNlY3RlZE9iamVjdElkKSB7XG4gICAgICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQoeyBpZDogaW50ZXJzZWN0ZWRPYmplY3RJZCwgZXZlbnQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgICAgIHRoaXMub2JqZWN0SG92ZXJlZCQubmV4dChudWxsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7XG4gICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xuICAgICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xuXG4gICAgICAvLyBBbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBib3RoIHRha2UgdGhlIGNsaWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgb3BlbmVkIGJ5IGl0LlxuICAgICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcbiAgICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XG4gICAgICAgIHRoaXMuaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE1lYXN1cmluZyB0YWtlcyBldmVyeSBjbGljayBhcyBhIHBvaW50LCB0aGUgc2FtZSB3YXkgcGxhY2VtZW50IHRha2VzIGl0IGFzIGEgcG9zaXRpb24uXG4gICAgICBpZiAodGhpcy5tZWFzdXJpbmcpIHtcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XG4gICAgICAgIGlmIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB7IHgsIHksIHogfSA9IHBsYWNlbWVudC5wb3NpdGlvbjtcbiAgICAgICAgICB0aGlzLmFkZE1lYXN1cmVQb2ludChuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQbGFjZW1lbnQgd2lucyBvdmVyIGV2ZXJ5dGhpbmc6IHdoaWxlIGFybWVkLCBhIGNsaWNrIG1lYW5zIFwicHV0IGl0IGhlcmVcIiwgbm90IFwib3BlbiB0aGF0XCIuXG4gICAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGlja1BsYWNlbWVudE9uTW9kZWwoZXZlbnQpO1xuICAgICAgICBpZiAocGxhY2VtZW50KSB7XG4gICAgICAgICAgcGxhY2VtZW50LnBvaVR5cGUgPSB0aGlzLnBsYWNlbWVudFBvaVR5cGU7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nVGFnUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgICAgIHRoaXMucGxhY2luZ1RhZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgICAgICAgdGhpcy50YWdQbGFjZWQkLm5leHQocGxhY2VtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xuXG4gICAgICAvLyBTYW1lIHByZWNlZGVuY2UgYXMgaG92ZXI6IGEgdGFnIGRyYXduIG92ZXIgdGhlIG1vZGVsIGNsYWltcyB0aGUgY2xpY2suXG4gICAgICBjb25zdCB0YWdIaXRzID0gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXSwgZmFsc2UpXG4gICAgICAgIC5maWx0ZXIoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKTtcbiAgICAgIGlmICh0YWdIaXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdGFnID0gdGFnSGl0c1swXS5vYmplY3Q7XG4gICAgICAgIHRoaXMudGFnQ2xpY2tlZCQubmV4dCh7IGVsZW1lbnRJZDogdGFnLm5hbWUsIHBvaVR5cGU6IHRhZy51c2VyRGF0YS5wb2lUeXBlID8/IG51bGwgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW50ZXJzZWN0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5jbGlja2FibGVPYmplY3RzLCB0cnVlKTtcblxuICAgICAgaWYgKGludGVyc2VjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjbGlja2VkT2JqZWN0ID0gaW50ZXJzZWN0c1swXS5vYmplY3Q7XG4gICAgICAgIGNvbnN0IGlkID0gY2xpY2tlZE9iamVjdD8ucGFyZW50Py5uYW1lO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChpZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlIGNhbmNlbHMgd2hhdGV2ZXIgdGhlIHBvaW50ZXIgaXMgY3VycmVudGx5IGNvbW1pdHRlZCB0by5cbiAgICpcbiAgICogRW1pdHMgdGhyb3VnaCB0aGUgc2FtZSBzdWJqZWN0cyB0aGUgZXhwbGljaXQgQ2FuY2VsIGJ1dHRvbnMgdXNlLCBzbyB0aGUgVUkgZHJpdmluZyB0aGVtIGZvbGxvd3NcbiAgICogYWxvbmcgaW5zdGVhZCBvZiBiZWluZyBsZWZ0IHNob3dpbmcgYSBtb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIGFybWVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRXNjYXBlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XG4gICAgICAvLyBOb3RoaW5nIG91dHNpZGUgdGhlIHNjZW5lIHRyYWNrcyBwbGFjZW1lbnQsIHNvIGNsZWFyaW5nIGl0IGhlcmUgaXMgdGhlIHdob2xlIG9mIGl0LlxuICAgICAgdGhpcy5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWVhc3VyaW5nKSB7XG4gICAgICB0aGlzLmNhbmNlbE1lYXN1cmluZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hbGlnbmluZykge1xuICAgICAgdGhpcy5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFuaW1hdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZSk7XG4gICAgdGhpcy5zdGVwQ2FtZXJhVHdlZW4oKTtcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xuXG4gICAgLy8gT25lIHBpY2sgcGVyIGZyYW1lLCBhZ2FpbnN0IHRoZSBwb2ludGVyJ3MgbGF0ZXN0IHBvc2l0aW9uIC0gc2VlIG9uTW91c2VNb3ZlLlxuICAgIGlmICh0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50O1xuICAgICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICAgIHRoaXMudXBkYXRlUGxhY2VtZW50UHJldmlldyhldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEpO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xuICAgIH1cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcbiAgICBpZiAodGhpcy5jYW52YXNSZXNpemVPYnNlcnZlcikge1xuICAgICAgdGhpcy5jYW52YXNSZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmRpc2NhcmRDdXJyZW50TG9hZCgpO1xuICAgIHRoaXMuY2xlYXJUYWdzKCk7XG4gICAgdGhpcy5tZWFzdXJpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsZWFyTWVhc3VyZW1lbnQoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
2392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVqcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90aHJlZWpzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQW1GL0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLENBQWdCO0lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lB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QUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDN0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7WUFDdEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzVELE1BQU0sTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3RyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdB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SyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7d0dBNStFVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7IE9yYml0Q29udHJvbHMgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY29udHJvbHMvT3JiaXRDb250cm9scyc7XHJcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XHJcbmltcG9ydCB7IE1UTExvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL01UTExvYWRlcic7XHJcbmltcG9ydCB7IEdMVEZMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9HTFRGTG9hZGVyJztcclxuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xyXG5pbXBvcnQgeyBNZXNob3B0RGVjb2RlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saWJzL21lc2hvcHRfZGVjb2Rlci5tb2R1bGUuanMnO1xyXG5pbXBvcnQgeyBMaW5lMiB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lMic7XHJcbmltcG9ydCB7IExpbmVHZW9tZXRyeSB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lR2VvbWV0cnknO1xyXG5pbXBvcnQgeyBMaW5lTWF0ZXJpYWwgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbGluZXMvTGluZU1hdGVyaWFsJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUaHJlZUpzQWxpZ25tZW50LCBUaHJlZUpzTW9kZWxVcCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvaVR5cGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBBIHRhZyB0byBkcmF3IGluIHRoZSBUaHJlZS5qcyBzY2VuZSwgbWlycm9yaW5nIGEgTWF0dGVydGFnLlxyXG4gKlxyXG4gKiBQb3NpdGlvbnMgYXJlIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlIHNwYWNlIC0gdGhlIHNhbWUgbnVtYmVycyBzdG9yZWQgaW4gUE9JLmNvb3JkaW5hdGUgLVxyXG4gKiBub3Qgc2NlbmUgc3BhY2UuIFRoZSBzZXJ2aWNlIHJlcGFyZW50cyB0YWdzIHVuZGVyIHRoZSBtb2RlbCBzbyB0aGV5IGluaGVyaXQgdGhlIGNlbnRlcmluZyBhbmRcclxuICogc2NhbGluZyBhcHBsaWVkIGF0IGxvYWQsIHdoaWNoIG1lYW5zIGNhbGxlcnMgbmV2ZXIgZGVhbCB3aXRoIHRoYXQgdHJhbnNmb3JtLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzVGFnIHtcclxuICAvKiogVGhlIHRhZ2dlZCBlbGVtZW50J3MgaWQgKFBPSS5lbGVtZW50SUQpLCB1c2VkIHRvIHVwZGF0ZSBvciByZW1vdmUgdGhlIHRhZyBsYXRlci4gKi9cclxuICBpZDogc3RyaW5nO1xyXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICAvKiogRHJpdmVzIGJvdGggdGhlIGNsaWNrIHJvdXRlIGFuZCB0eXBlIGZpbHRlcmluZywgc28gaXQgdHJhdmVscyB3aXRoIHRoZSB0YWcuICovXHJcbiAgcG9pVHlwZT86IFBvaVR5cGUgfCBudWxsO1xyXG4gIC8qKiBTaG93biBvbiBob3Zlci4gQSBtYXJrZXIgd2l0aCBubyBpZGVudGl0eSBpcyBqdXN0IGEgZG90IG9uIGEgd2FsbC4gKi9cclxuICBsYWJlbD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFRoZSBUaHJlZS5qcyBjYXB0dXJlIHRoaXMgdGFnIHdhcyBwbGFjZWQgaW4sIHdoZW4gaXQgd2FzIHBsYWNlZCBpbiBvbmUuICovXHJcbiAgb3JpZ2luQ2FwdHVyZUlEPzogc3RyaW5nIHwgbnVsbDtcclxuICAvKipcclxuICAgKiAnbW9kZWwnIHdoZW4gdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGFncyBzaGFyZTpcclxuICAgKiBhIHRhZyBwbGFjZWQgaW4gYSBtb2RlbCBiZWZvcmUgaXQgd2FzIGNhbGlicmF0ZWQuIE9ubHkgbWVhbmluZ2Z1bCBpbiB0aGUgbW9kZWwgaXQgd2FzIHBsYWNlZCBpbi5cclxuICAgKi9cclxuICBmcmFtZT86ICdtb2RlbCcgfCBudWxsO1xyXG4gIC8qKiBJY29uIGRyYXduIG9uIHRoZSB0YWcuIEZhbGxzIGJhY2sgdG8gYSBwbGFpbiBkaXNjIHdoZW4gYWJzZW50IG9yIGl0IGZhaWxzIHRvIGxvYWQuICovXHJcbiAgaWNvblVybD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFRpbnQgZm9yIHRoZSBmYWxsYmFjayBkaXNjLCBhcyBhIENTUyBjb2xvdXIuICovXHJcbiAgY29sb3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBXaGF0IGEgY2xpY2sgb24gYSB0YWcgcmVwb3J0czogZW5vdWdoIHRvIHJvdXRlIHRvIHRoZSBlbGVtZW50J3MgZGV0YWlsIHBhZ2UuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ0NsaWNrIHtcclxuICBlbGVtZW50SWQ6IHN0cmluZztcclxuICBwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BvdCBwaWNrZWQgb24gdGhlIG1vZGVsIGZvciBhIG5ldyB0YWcuXHJcbiAqXHJcbiAqIEJvdGggdmVjdG9ycyBhcmUgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWNoIGlzIHdoYXQgUE9JLmNvb3JkaW5hdGUgc3RvcmVzLiBTY2VuZVxyXG4gKiBjb29yZGluYXRlcyBkZWxpYmVyYXRlbHkgbmV2ZXIgbGVhdmUgdGhpcyBzZXJ2aWNlOiB0aGUgbW9kZWwgaXMgc2NhbGVkIHRvIGEgZml4ZWQgc2l6ZSBvbiBsb2FkLCBzb1xyXG4gKiBhIHNjZW5lLXNwYWNlIHBvc2l0aW9uIHdvdWxkIHNpbGVudGx5IG1lYW4gc29tZXdoZXJlIGVsc2UgdGhlIG1vbWVudCB0aGUgLmdsYiBpcyByZS1leHBvcnRlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ1BsYWNlbWVudCB7XHJcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gIC8qKiBTdXJmYWNlIG5vcm1hbCBhdCB0aGUgcGlja2VkIHBvaW50IC0gTWF0dGVycG9ydCBzdG9yZXMgdGhlIHNhbWUgdGhpbmcgaW4gUE9JLm1ldGFkYXRhLiAqL1xyXG4gIG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIFdoYXQgdGhlIHBsYWNlbWVudCB3YXMgYXJtZWQgZm9yLCBzbyB0aGUgY2FsbGVyIGtub3dzIHdoaWNoIGNyZWF0aW9uIGZvcm0gdG8gb3Blbi4gKi9cclxuICBwb2lUeXBlPzogUG9pVHlwZSB8IG51bGw7XHJcbn1cclxuXHJcbi8qKiBPbmUgdGFnIHNlZW4gaW4gYm90aCBzcGFjZXM6IHdoZXJlIGl0IGlzIHN0b3JlZCwgYW5kIHdoZXJlIGl0IHJlYWxseSBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cclxuLyoqIEEgZGlzdGFuY2UgbWVhc3VyZWQgb24gdGhlIG1vZGVsOiBpdHMgcG9pbnRzLCBlYWNoIHNlZ21lbnQncyBsZW5ndGgsIGFuZCBhIHBpY3R1cmUgb2YgaXQuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc01lYXN1cmVtZW50IHtcclxuICAvKiogSW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluLCBzbyB0aGUgbGFzdCBvbmUgY2FuIGJlIHNhdmVkIGFzIHRoZSBQT0kuICovXHJcbiAgcG9pbnRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfVtdO1xyXG4gIC8qKiBNZXRyZXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBwb2ludHMsIHJvdW5kZWQgbGlrZSBNYXR0ZXJwb3J0J3MgbWVhc3VyZW1lbnRzIGFyZS4gKi9cclxuICBkaXN0YW5jZXM6IG51bWJlcltdO1xyXG4gIC8qKiBKUEVHIGRhdGEgVVJJIG9mIHRoZSBzY2VuZSB3aXRoIHRoZSBtZWFzdXJlbWVudCBkcmF3biBvbiBpdC4gKi9cclxuICBzY3JlZW5zaG90OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHRhZyBwbGFjZWQgaW4gdGhpcyBtb2RlbCB3aG9zZSBzdG9yZWQgY29vcmRpbmF0ZXMgaGFkIHRvIGNoYW5nZSBmb3IgaXQgdG8gc3RheSB3aGVyZSBpdCBpcyxcclxuICogYmVjYXVzZSB0aGUgY2FsaWJyYXRpb24gaXQgaXMgZHJhd24gdW5kZXIgY2hhbmdlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1JlYmFzZWRUYWcge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgLyoqIEl0cyBjb29yZGluYXRlcyBpbiB0aGUgc3BhY2UgdGFncyBzaGFyZSwgdW5kZXIgdGhlIG5ldyBjYWxpYnJhdGlvbi4gKi9cclxuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIFR1cm5zIGEgZGlyZWN0aW9uIHN0b3JlZCB3aXRoIHRoZSB0YWcgLSBpdHMgc3VyZmFjZSBub3JtYWwgLSB0aGUgc2FtZSB3YXkuICovXHJcbiAgcm90YXRlRGlyZWN0aW9uOiAoZGlyZWN0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSkgPT4geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc0FsaWdubWVudFBhaXIge1xyXG4gIC8qKiBUaGUgdGFnIHRoZSBwYWlyIHdhcyBtYWRlIGZyb20sIHdoZW4gaXQgY2FtZSBmcm9tIG9uZS4gKi9cclxuICB0YWdJZD86IHN0cmluZztcclxuICBzb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gIHRhcmdldDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYW4gb3J0aG9ub3JtYWwgZnJhbWUgZnJvbSB0aHJlZSBwb2ludHMsIG9yIG51bGwgd2hlbiB0aGV5IGFyZSAobmVhcmx5KSBjb2xsaW5lYXIuXHJcbiAqXHJcbiAqIFRocmVlIHBvaW50cyBkZWZpbmUgYSBwbGFuZSwgYW5kIGEgcGxhbmUgcGx1cyBhbiBvcmlnaW4gZGVmaW5lcyBhbiBvcmllbnRhdGlvbi4gQ29sbGluZWFyIHBvaW50c1xyXG4gKiBkbyBub3Q6IHRoZXkgbGVhdmUgdGhlIHJvdGF0aW9uIGFib3V0IHRoZWlyIGNvbW1vbiBsaW5lIHVuZGV0ZXJtaW5lZCwgd2hpY2ggaXMgd2h5IHRoZSBjYWxsZXIgaGFzXHJcbiAqIHRvIHJlamVjdCB0aGVtIHJhdGhlciB0aGFuIHByb2R1Y2UgYSBjb25maWRlbnQgd3JvbmcgYW5zd2VyLlxyXG4gKi9cclxuZnVuY3Rpb24gZnJhbWVGcm9tUG9pbnRzKGE6IFRIUkVFLlZlY3RvcjMsIGI6IFRIUkVFLlZlY3RvcjMsIGM6IFRIUkVFLlZlY3RvcjMpOiBUSFJFRS5NYXRyaXg0IHwgbnVsbCB7XHJcbiAgY29uc3QgZTEgPSBiLmNsb25lKCkuc3ViKGEpO1xyXG4gIGlmIChlMS5sZW5ndGhTcSgpIDwgMWUtMTIpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBlMS5ub3JtYWxpemUoKTtcclxuXHJcbiAgY29uc3QgdG9DID0gYy5jbG9uZSgpLnN1YihhKTtcclxuICBjb25zdCBlMiA9IHRvQy5jbG9uZSgpLnN1YihlMS5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKHRvQy5kb3QoZTEpKSk7XHJcbiAgaWYgKGUyLmxlbmd0aFNxKCkgPCAxZS0xMikge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGUyLm5vcm1hbGl6ZSgpO1xyXG5cclxuICByZXR1cm4gbmV3IFRIUkVFLk1hdHJpeDQoKS5tYWtlQmFzaXMoZTEsIGUyLCBlMS5jbG9uZSgpLmNyb3NzKGUyKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTb2x2ZXMgdGhlIHRyYW5zZm9ybSB0aGF0IG1hcHMgc3RvcmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoZSBsb2FkZWQgbW9kZWwsIGZyb20gYXMgbWFueSBtYXRjaGVkXHJcbiAqIHRhZ3MgYXMgdGhlcmUgYXJlIC0gdXAgdG8gdGhyZWUuXHJcbiAqXHJcbiAqIFRocmVlIHBhaXJzIHBpbiBkb3duIGV2ZXJ5dGhpbmc6IHBvc2l0aW9uLCBvcmllbnRhdGlvbiBhbmQgc2NhbGUuIEEgbW9kZWwgdGhhdCBzaGFyZXMgb25seSBhXHJcbiAqIGNvcm5lciB3aXRoIHRoZSB0YWdzJyBzcGFjZSBtYXkgbm90IGhhdmUgdGhyZWUgdGFncyB0byBvZmZlciwgc28gZmV3ZXIgYXJlIGFjY2VwdGVkLCBlYWNoXHJcbiAqIHNldHRsaW5nIHdoYXQgaXQgY2FuIGFuZCBhc3N1bWluZyB0aGUgcmVzdDpcclxuICpcclxuICogIC0gVHdvIHBhaXJzOiBwb3NpdGlvbiwgaGVhZGluZyBhbmQgc2NhbGUuIFRoZSBvbmUgdGhpbmcgdHdvIHBvaW50cyBjYW5ub3Qgc2F5IGlzIGhvdyB0aGUgbW9kZWxcclxuICogICAgaXMgdGlsdGVkLCBzbyBib3RoIHNwYWNlcyBhcmUgdGFrZW4gdG8gYWdyZWUgb24gd2hpY2ggd2F5IGlzIHVwLlxyXG4gKiAgLSBPbmUgcGFpcjogcG9zaXRpb24gb25seS4gSGVhZGluZyBhbmQgc2NhbGUgYXJlIHRha2VuIHRvIG1hdGNoIGFscmVhZHkuXHJcbiAqXHJcbiAqIGB0YXJnZXRVcGAgaXMgdGhlIG1vZGVsJ3MgdmVydGljYWwgYXhpcywgd2hpY2ggdGhlIHRhZ3MnIG93biB2ZXJ0aWNhbCAoK1kpIGlzIG1hdGNoZWQgdG8gaW4gdGhvc2VcclxuICogdHdvIGNhc2VzLiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgcG9pbnRzIGNhbm5vdCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGFza2VkIG9mIHRoZW0gLSBjb2xsaW5lYXIgZm9yXHJcbiAqIHRocmVlLCBvbmUgYWJvdmUgdGhlIG90aGVyIGZvciB0d28gLSBiZWNhdXNlIGEgd3JvbmcgY2FsaWJyYXRpb24gYXBwbGllZCBzaWxlbnRseSBpcyB3b3JzZSB0aGFuXHJcbiAqIG5vbmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc29sdmVUaHJlZUpzQWxpZ25tZW50KFxyXG4gIHBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdLFxyXG4gIHRhcmdldFVwOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSA9IHsgeDogMCwgeTogMSwgejogMCB9LFxyXG4pOiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCB7XHJcbiAgaWYgKCFwYWlycyB8fCBwYWlycy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBpZiAocGFpcnMubGVuZ3RoIDwgMykge1xyXG4gICAgcmV0dXJuIHNvbHZlUmVkdWNlZEFsaWdubWVudChwYWlycywgbmV3IFRIUkVFLlZlY3RvcjModGFyZ2V0VXAueCwgdGFyZ2V0VXAueSwgdGFyZ2V0VXAueikubm9ybWFsaXplKCkpO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc291cmNlcyA9IHBhaXJzLnNsaWNlKDAsIDMpLm1hcCgocGFpcikgPT4gbmV3IFRIUkVFLlZlY3RvcjMocGFpci5zb3VyY2UueCwgcGFpci5zb3VyY2UueSwgcGFpci5zb3VyY2UueikpO1xyXG4gIGNvbnN0IHRhcmdldHMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIudGFyZ2V0LngsIHBhaXIudGFyZ2V0LnksIHBhaXIudGFyZ2V0LnopKTtcclxuXHJcbiAgY29uc3Qgc291cmNlRnJhbWUgPSBmcmFtZUZyb21Qb2ludHMoc291cmNlc1swXSwgc291cmNlc1sxXSwgc291cmNlc1syXSk7XHJcbiAgY29uc3QgdGFyZ2V0RnJhbWUgPSBmcmFtZUZyb21Qb2ludHModGFyZ2V0c1swXSwgdGFyZ2V0c1sxXSwgdGFyZ2V0c1syXSk7XHJcbiAgaWYgKCFzb3VyY2VGcmFtZSB8fCAhdGFyZ2V0RnJhbWUpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8gQSByb3RhdGlvbidzIGludmVyc2UgaXMgaXRzIHRyYW5zcG9zZSwgc28gdGhpcyBpcyB0aGUgcm90YXRpb24gY2Fycnlpbmcgb25lIGZyYW1lIG9udG8gdGhlIG90aGVyLlxyXG4gIGNvbnN0IHJvdGF0aW9uID0gdGFyZ2V0RnJhbWUubXVsdGlwbHkoc291cmNlRnJhbWUuY2xvbmUoKS50cmFuc3Bvc2UoKSk7XHJcblxyXG4gIC8vIFNjYWxlIGZyb20gaG93IGZhciBhcGFydCB0aGUgcG9pbnRzIGFyZSBpbiBlYWNoIHNwYWNlLCBhdmVyYWdlZCBvdmVyIHRoZSB0aHJlZSBlZGdlcyBzbyBhIHNpbmdsZVxyXG4gIC8vIHNsb3BweSBjbGljayBkb2VzIG5vdCBzZXQgaXQgb24gaXRzIG93bi5cclxuICBjb25zdCBlZGdlcyA9IFtbMCwgMV0sIFsxLCAyXSwgWzAsIDJdXTtcclxuICBsZXQgcmF0aW9TdW0gPSAwO1xyXG4gIGxldCByYXRpb0NvdW50ID0gMDtcclxuICBmb3IgKGNvbnN0IFtpLCBqXSBvZiBlZGdlcykge1xyXG4gICAgY29uc3Qgc291cmNlTGVuZ3RoID0gc291cmNlc1tpXS5kaXN0YW5jZVRvKHNvdXJjZXNbal0pO1xyXG4gICAgY29uc3QgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0c1tpXS5kaXN0YW5jZVRvKHRhcmdldHNbal0pO1xyXG4gICAgaWYgKHNvdXJjZUxlbmd0aCA+IDFlLTkpIHtcclxuICAgICAgcmF0aW9TdW0gKz0gdGFyZ2V0TGVuZ3RoIC8gc291cmNlTGVuZ3RoO1xyXG4gICAgICByYXRpb0NvdW50ICs9IDE7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChyYXRpb0NvdW50ID09PSAwKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgY29uc3Qgc2NhbGUgPSByYXRpb1N1bSAvIHJhdGlvQ291bnQ7XHJcblxyXG4gIC8vIFRoZSBncm91cCBhcHBsaWVzIHBvc2l0aW9uLCB0aGVuIHJvdGF0aW9uLCB0aGVuIHNjYWxlLCBzbyBhIHBvaW50IGxhbmRzIGF0IHQgKyBzKlIqcC4gU29sdmluZ1xyXG4gIC8vIHRoYXQgZm9yIHQgYXQgdGhlIGNlbnRyb2lkcyBnaXZlcyB0aGUgdHJhbnNsYXRpb24uXHJcbiAgY29uc3Qgc291cmNlQ2VudHJvaWQgPSBzb3VyY2VzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0uYWRkKHYpLCBuZXcgVEhSRUUuVmVjdG9yMygpKS5tdWx0aXBseVNjYWxhcigxIC8gMyk7XHJcbiAgY29uc3QgdGFyZ2V0Q2VudHJvaWQgPSB0YXJnZXRzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0uYWRkKHYpLCBuZXcgVEhSRUUuVmVjdG9yMygpKS5tdWx0aXBseVNjYWxhcigxIC8gMyk7XHJcbiAgY29uc3QgdHJhbnNsYXRpb24gPSB0YXJnZXRDZW50cm9pZFxyXG4gICAgLmNsb25lKClcclxuICAgIC5zdWIoc291cmNlQ2VudHJvaWQuY2xvbmUoKS5hcHBseU1hdHJpeDQocm90YXRpb24pLm11bHRpcGx5U2NhbGFyKHNjYWxlKSk7XHJcblxyXG4gIGNvbnN0IGV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKCkuc2V0RnJvbVJvdGF0aW9uTWF0cml4KHJvdGF0aW9uKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHRyYW5zbGF0aW9uOiB7IHg6IHRyYW5zbGF0aW9uLngsIHk6IHRyYW5zbGF0aW9uLnksIHo6IHRyYW5zbGF0aW9uLnogfSxcclxuICAgIHJvdGF0aW9uOiB7IHg6IGV1bGVyLngsIHk6IGV1bGVyLnksIHo6IGV1bGVyLnogfSxcclxuICAgIHNjYWxlLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKiBUaGUgb25lLSBhbmQgdHdvLXBhaXIgY2FzZXMgb2Ygc29sdmVUaHJlZUpzQWxpZ25tZW50LCB3aGljaCBzaGFyZSB0aGUgXCJzYW1lIHZlcnRpY2FsXCIgYXNzdW1wdGlvbi4gKi9cclxuZnVuY3Rpb24gc29sdmVSZWR1Y2VkQWxpZ25tZW50KHBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdLCB1cDogVEhSRUUuVmVjdG9yMyk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcclxuICBjb25zdCBzb3VyY2VzID0gcGFpcnMubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnNvdXJjZS54LCBwYWlyLnNvdXJjZS55LCBwYWlyLnNvdXJjZS56KSk7XHJcbiAgY29uc3QgdGFyZ2V0cyA9IHBhaXJzLm1hcCgocGFpcikgPT4gbmV3IFRIUkVFLlZlY3RvcjMocGFpci50YXJnZXQueCwgcGFpci50YXJnZXQueSwgcGFpci50YXJnZXQueikpO1xyXG5cclxuICAvLyBTdGFydHMgZnJvbSB0aGUgcm90YXRpb24gdGhhdCBvbmx5IHN0YW5kcyB0aGUgdGFncycgdmVydGljYWwgb24gdGhlIG1vZGVsJ3MuXHJcbiAgY29uc3Qgcm90YXRpb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhuZXcgVEhSRUUuVmVjdG9yMygwLCAxLCAwKSwgdXApO1xyXG4gIGxldCBzY2FsZSA9IDE7XHJcblxyXG4gIGlmIChwYWlycy5sZW5ndGggPT09IDIpIHtcclxuICAgIGNvbnN0IHNvdXJjZVNwYW4gPSBzb3VyY2VzWzFdLmNsb25lKCkuc3ViKHNvdXJjZXNbMF0pO1xyXG4gICAgY29uc3QgdGFyZ2V0U3BhbiA9IHRhcmdldHNbMV0uY2xvbmUoKS5zdWIodGFyZ2V0c1swXSk7XHJcbiAgICBpZiAoc291cmNlU3Bhbi5sZW5ndGgoKSA8IDFlLTkgfHwgdGFyZ2V0U3Bhbi5sZW5ndGgoKSA8IDFlLTkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBzY2FsZSA9IHRhcmdldFNwYW4ubGVuZ3RoKCkgLyBzb3VyY2VTcGFuLmxlbmd0aCgpO1xyXG5cclxuICAgIC8vIEhlYWRpbmcgaXMgdGhlIHR1cm4gYWJvdXQgdGhlIHZlcnRpY2FsIHRoYXQgbGluZXMgdGhlIHR3byBzcGFucyB1cCwgc28gb25seSB0aGVpciBob3Jpem9udGFsXHJcbiAgICAvLyBwYXJ0cyBjb3VudC4gVHdvIHBvaW50cyBvbmUgYWJvdmUgdGhlIG90aGVyIGhhdmUgbm9uZSwgYW5kIHNheSBub3RoaW5nIGFib3V0IGhlYWRpbmcuXHJcbiAgICBjb25zdCBmbGF0dGVuID0gKHY6IFRIUkVFLlZlY3RvcjMpID0+IHYuY2xvbmUoKS5zdWIodXAuY2xvbmUoKS5tdWx0aXBseVNjYWxhcih2LmRvdCh1cCkpKTtcclxuICAgIGNvbnN0IGZyb20gPSBmbGF0dGVuKHNvdXJjZVNwYW4uY2xvbmUoKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pKTtcclxuICAgIGNvbnN0IHRvID0gZmxhdHRlbih0YXJnZXRTcGFuKTtcclxuICAgIGlmIChmcm9tLmxlbmd0aCgpIDwgMWUtNiAqIHNvdXJjZVNwYW4ubGVuZ3RoKCkgfHwgdG8ubGVuZ3RoKCkgPCAxZS02ICogdGFyZ2V0U3Bhbi5sZW5ndGgoKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRpbmcgPSBNYXRoLmF0YW4yKG5ldyBUSFJFRS5WZWN0b3IzKCkuY3Jvc3NWZWN0b3JzKGZyb20sIHRvKS5kb3QodXApLCBmcm9tLmRvdCh0bykpO1xyXG4gICAgcm90YXRpb24ucHJlbXVsdGlwbHkobmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tQXhpc0FuZ2xlKHVwLCBoZWFkaW5nKSk7XHJcbiAgfVxyXG5cclxuICAvLyBBIHBvaW50IGxhbmRzIGF0IHQgKyBzKlIqcDsgc29sdmVkIGZvciB0IGF0IHRoZSBjZW50cm9pZHMsIGFzIGluIHRoZSB0aHJlZS1wYWlyIGNhc2UuXHJcbiAgY29uc3QgY2VudHJvaWQgPSAocG9pbnRzOiBUSFJFRS5WZWN0b3IzW10pID0+XHJcbiAgICBwb2ludHMucmVkdWNlKChzdW0sIHYpID0+IHN1bS5hZGQodiksIG5ldyBUSFJFRS5WZWN0b3IzKCkpLm11bHRpcGx5U2NhbGFyKDEgLyBwb2ludHMubGVuZ3RoKTtcclxuICBjb25zdCB0cmFuc2xhdGlvbiA9IGNlbnRyb2lkKHRhcmdldHMpLnN1YihjZW50cm9pZChzb3VyY2VzKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pLm11bHRpcGx5U2NhbGFyKHNjYWxlKSk7XHJcbiAgY29uc3QgZXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoKS5zZXRGcm9tUXVhdGVybmlvbihyb3RhdGlvbik7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXHJcbiAgICByb3RhdGlvbjogeyB4OiBldWxlci54LCB5OiBldWxlci55LCB6OiBldWxlci56IH0sXHJcbiAgICBzY2FsZSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9iakFkZGVkIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBmaWxlOiBzdHJpbmc7IC8vIFRoZSBVUkwgdG8gdGhlIC5vYmogZmlsZVxyXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgc2NhbGU6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGFyc2VkTWVzaEdyb3VwIHtcclxuICBzdGFydDogbnVtYmVyO1xyXG4gIGNvdW50OiBudW1iZXI7XHJcbiAgbWF0ZXJpYWxJbmRleDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogUmF3IGdlb21ldHJ5IGRhdGEgZXh0cmFjdGVkIGZyb20gYSBwYXJzZWQgT0JKIG1lc2gsIHNlbnQgYmFjayBieSB0aGUgcGFyc2VyIHdvcmtlci4gKi9cclxuaW50ZXJmYWNlIFBhcnNlZE1lc2hEYXRhIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLy8gT25lIG5hbWUgcGVyIG1hdGVyaWFsIHVzZWQgYnkgdGhpcyBtZXNoLiBBIHNpbmdsZS1tYXRlcmlhbCBtZXNoIGhhcyBvbmUgZW50cnk7XHJcbiAgLy8gYSBtZXNoIHdpdGggbXVsdGlwbGUgdXNlbXRsIHN3aXRjaGVzIChnZW9tZXRyeS5ncm91cHMpIGhhcyBvbmUgcGVyIGdyb3VwLlxyXG4gIG1hdGVyaWFsTmFtZXM6IHN0cmluZ1tdO1xyXG4gIGdyb3VwczogUGFyc2VkTWVzaEdyb3VwW10gfCBudWxsO1xyXG4gIHBvc2l0aW9uOiBGbG9hdDMyQXJyYXk7XHJcbiAgbm9ybWFsOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIHV2OiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIGluZGV4OiBVaW50MzJBcnJheSB8IG51bGw7XHJcbiAgYm91bmRpbmdCb3g/OiB7IG1pbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtYXg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT2JqUGFyc2VyV29ya2VyUmVzcG9uc2Uge1xyXG4gIHJlcXVlc3RJZDogc3RyaW5nO1xyXG4gIHN1Y2Nlc3M6IGJvb2xlYW47XHJcbiAgbWVzaGVzPzogUGFyc2VkTWVzaERhdGFbXTtcclxuICBlcnJvcj86IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhyZWVKc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgc2NlbmUhOiBUSFJFRS5TY2VuZTtcclxuICBwcml2YXRlIGNhbWVyYSE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gIHByaXZhdGUgcmVuZGVyZXIhOiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xyXG4gIHByaXZhdGUgY29udHJvbHMhOiBPcmJpdENvbnRyb2xzO1xyXG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gUmF5Y2FzdGluZyBhbmQgaW50ZXJhY3Rpb25cclxuICBwcml2YXRlIHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcclxuICBwcml2YXRlIG1vdXNlID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdDYW1lcmE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgY2xpY2thYmxlT2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSA9IFtdO1xyXG5cclxuICAvLyBPYnNlcnZhYmxlcyBmb3IgdGhlIHZpZXdlciBjb21wb25lbnRcclxuICBwdWJsaWMgb2JqZWN0SG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGlkOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG4gIHB1YmxpYyBvYmplY3RDbGlja2VkJCA9IG5ldyBTdWJqZWN0PHN0cmluZyB8IG51bGw+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHRhZywgbWlycm9yaW5nIE1hdHRlcnBvcnQncyB0YWcgY2xpY2suICovXHJcbiAgcHVibGljIHRhZ0NsaWNrZWQkID0gbmV3IFN1YmplY3Q8VGhyZWVKc1RhZ0NsaWNrPigpO1xyXG5cclxuICAvKiogRW1pdHMgYSB0YWcncyBsYWJlbCB3aGlsZSB0aGUgcG9pbnRlciBpcyBvdmVyIGl0LCBhbmQgbnVsbCB3aGVuIGl0IGxlYXZlcy4gKi9cclxuICBwdWJsaWMgdGFnSG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGxhYmVsOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG5cclxuICAvLyBUYWdzIGxpdmUgdW5kZXIgdGhlIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzY2VuZSwgc28gdGhlIGNlbnRlcmluZyBhbmQgc2NhbGluZyBhcHBsaWVkIHdoZW4gdGhlXHJcbiAgLy8gbW9kZWwgaXMgcGxhY2VkIGNhcnJpZXMgb3ZlciBhbmQgUE9JIGNvb3JkaW5hdGVzIGNhbiBzdGF5IGluIHRoZSBtb2RlbCdzIG93biBzcGFjZS5cclxuICBwcml2YXRlIHRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgcHJpdmF0ZSB0YWdTcHJpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRIUkVFLlNwcml0ZT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xyXG5cclxuICAvKiogQWJvcnRzIHRoZSBpbi1mbGlnaHQgbW9kZWwgZG93bmxvYWQuIFBhcnNpbmcgY2Fubm90IGJlIGludGVycnVwdGVkLCBvbmx5IG5vdCBzdGFydGVkLiAqL1xyXG4gIHByaXZhdGUgbG9hZEFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcclxuXHJcbiAgLy8gVGhlIGxvYWRlZCBiYXNlIG1vZGVsLCBrZXB0IHNvIHRhZyBwbGFjZW1lbnQgY2FuIHJheWNhc3QgYWdhaW5zdCBpdHMgZ2VvbWV0cnkuXHJcbiAgcHJpdmF0ZSBtb2RlbFJvb3Q/OiBUSFJFRS5PYmplY3QzRDtcclxuXHJcbiAgLyoqIFRydWUgd2hpbGUgdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIHBsYWNlcyBhIHRhZyBpbnN0ZWFkIG9mIG9yYml0aW5nLiAqL1xyXG4gIHByaXZhdGUgcGxhY2luZ1RhZyA9IGZhbHNlO1xyXG5cclxuICAvKiogV2hhdCB0aGUgYXJtZWQgcGxhY2VtZW50IGlzIGZvciwgZWNob2VkIGJhY2sgd2hlbiB0aGUgc3BvdCBpcyBwaWNrZWQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZW1lbnRQb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb3NpdGlvbiBhbmQgbm9ybWFsIG9mIHRoZSBsYXN0IHBsYWNlZCB0YWcsIGluIG1vZGVsIHNwYWNlLCBhd2FpdGluZyBjb21taXQgdG8gYSBQT0kuICovXHJcbiAgcHJpdmF0ZSBwZW5kaW5nVGFnUGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb2ludGVyIHBvc2l0aW9uIHdhaXRpbmcgZm9yIGEgcHJldmlldyBwaWNrLCBjb2FsZXNjZWQgdG8gb25lIHBlciBmcmFtZS4gKi9cclxuICBwcml2YXRlIHBlbmRpbmdQcmV2aWV3RXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGFncyB3aG9zZSBwb3NpdGlvbiBpcyBpbiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLiBBIHNpYmxpbmcgb2YgdGhlIHRhZyBncm91cCB0aGF0IGRvZXMgbm90XHJcbiAgICogY2FycnkgdGhlIGNhbGlicmF0aW9uOiBjYWxpYnJhdGluZyBhIG1vZGVsIGZvciB0aGUgdGFncyBpdCBpbXBvcnRzIG11c3Qgbm90IG1vdmUgdGhlIG9uZXMgdGhhdFxyXG4gICAqIHdlcmUgcGxhY2VkIHN0cmFpZ2h0IG9udG8gaXQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtb2RlbFRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjYXB0dXJlIG9uIHNjcmVlbi4gQSB0YWcgcGxhY2VkIGluIGEgM0QgbW9kZWwgaXMgcmVjb3JkZWQgd2l0aCBpdCwgd2hpY2ggaXMgaG93IHRoZSB0YWdzXHJcbiAgICogcGxhY2VkIGluIHRoaXMgb25lIGFyZSB0b2xkIGZyb20gdGhvc2UgdGhhdCBjYW1lIGZyb20gZWxzZXdoZXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3VycmVudENhcHR1cmVJRDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2RlbCdzIHN1cmZhY2UgYXMgYSBncmlkOiBldmVyeSBjZWxsIHNvbWUgcGFydCBvZiB0aGUgc3VyZmFjZSBwYXNzZXMgdGhyb3VnaC5cclxuICAgKlxyXG4gICAqIEl0IGFuc3dlcnMgXCJpcyB0aGlzIHBvaW50IG5lYXIgdGhlIG1vZGVsP1wiIHdpdGhvdXQgdmlzaXRpbmcgdGhlIHRyaWFuZ2xlcywgb2Ygd2hpY2ggYSBjYXB0dXJlZFxyXG4gICAqIG1vZGVsIGhhcyBtaWxsaW9ucyAtIHRoZSBxdWVzdGlvbiBpcyBhc2tlZCBmb3IgZXZlcnkgdGFnLCBldmVyeSB0aW1lIHRoZSBjYWxpYnJhdGlvbiBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3VyZmFjZUNlbGxzOiBTZXQ8bnVtYmVyPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIHN1cmZhY2VPcmlnaW4gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG5cclxuICBwcml2YXRlIHN1cmZhY2VDZWxsU2l6ZSA9IDE7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBmYXIgZnJvbSB0aGUgbW9kZWwncyBzdXJmYWNlIGEgdGFnIG1heSBiZSBhbmQgc3RpbGwgY291bnQgYXMgb24gaXQsIGluIG1ldHJlcy5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBvZiB0aGUgc3BhY2UgaXMgb2ZmZXJlZCB0byBldmVyeSBtb2RlbDsgdGhpcyBpcyB3aGF0IGRlY2lkZXMgd2hpY2ggb25lcyBhIG1vZGVsXHJcbiAgICogc2hvd3MuIEEgdGFnIG1hcmtzIHNvbWV0aGluZyBvbiBhIHN1cmZhY2UsIHNvIG9uZSB0aGF0IGJlbG9uZ3MgaGVyZSBzaXRzIG9uIHRoZSBzdXJmYWNlIG9yXHJcbiAgICogY2xvc2UgdG8gaXQuIE9uZSB0aGF0IGxhbmRzIGRlZXAgaW5zaWRlIHRoZSBtb2RlbCwgb3Igd2VsbCBhd2F5IGZyb20gaXQsIG1hcmtzIHNvbWV0aGluZyB0aGF0XHJcbiAgICogaXMgbm90IHBhcnQgb2YgdGhpcyBtb2RlbC4gVGhlIGFsbG93YW5jZSBjb3ZlcnMgYSBjYWxpYnJhdGlvbiBkb25lIGJ5IGhhbmQgYW5kIHRoZSBtb2RlbCBub3RcclxuICAgKiBtYXRjaGluZyB0aGUgc2NhbiBleGFjdGx5LCB3aGljaCB0b2dldGhlciBydW4gdG8gYSBmZXcgdGVucyBvZiBjZW50aW1ldHJlcy5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPTl9NT0RFTF9NRVRSRVMgPSAwLjc1O1xyXG5cclxuICAvKiogQ2VsbHMgcGVyIGF4aXMgdGhlIGdyaWQncyBrZXlzIGNhbiBhZGRyZXNzLCB3aXRoIHJvb20gZWl0aGVyIHNpZGUgZm9yIHBvaW50cyBvZmYgdGhlIG1vZGVsLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVUkZBQ0VfR1JJRF9TUEFOID0gMTAyNDtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1VSRkFDRV9HUklEX1BBRCA9IDEyODtcclxuXHJcbiAgLyoqIE93biB0YWdzIG1vdmVkIHRvIGtlZXAgdGhlaXIgcGxhY2UgdW5kZXIgdGhlIGxhc3QgY2FsaWJyYXRpb24sIHdhaXRpbmcgdG8gYmUgc3RvcmVkLiAqL1xyXG4gIHByaXZhdGUgcmViYXNlZFRhZ3M6IFRocmVlSnNSZWJhc2VkVGFnW10gPSBbXTtcclxuXHJcbiAgLyoqIFRoZSB0eXBlIGZpbHRlciBpbiBmb3JjZS4gTnVsbCBzaG93cyBldmVyeSB0eXBlLiAqL1xyXG4gIHByaXZhdGUgdmlzaWJsZVRhZ1R5cGVzOiBQb2lUeXBlW10gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBtZWFzdXJpbmcgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBvaW50cyBjbGlja2VkIHNvIGZhciwgaW4gdGFnIHNwYWNlLiAqL1xyXG4gIHByaXZhdGUgbWVhc3VyZVBvaW50czogVEhSRUUuVmVjdG9yM1tdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZXJ5dGhpbmcgZHJhd24gZm9yIHRoZSBtZWFzdXJlbWVudC4gQSBjaGlsZCBvZiB0aGUgdGFnIGdyb3VwLCBzbyBpdHMgcG9pbnRzIHNoYXJlIHRoZSBmcmFtZVxyXG4gICAqIHRhZyBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluIC0gd2hpY2ggaXMgbWV0cmVzLCBhbmQgd2hhdCB0aGUgc2F2ZWQgUE9JIGhhcyB0byBiZSBpbi5cclxuICAgKi9cclxuICBwcml2YXRlIG1lYXN1cmVHcm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG5cclxuICAvKiogVGhlIHNlZ21lbnQgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyIGZyb20gdGhlIGxhc3QgcG9pbnQgY2xpY2tlZC4gKi9cclxuICBwcml2YXRlIG1lYXN1cmVSdWJiZXJCYW5kPzogYW55O1xyXG5cclxuICBwcml2YXRlIGxhc3RNZWFzdXJlbWVudDogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBIYWxmIHRoZSBtb2RlbCdzIGRpYWdvbmFsIGFzIHBsYWNlZCBpbiB0aGUgc2NlbmUsIHdoZXJlIGl0IGlzIGNlbnRyZWQgb24gdGhlIG9yaWdpbi4gKi9cclxuICBwcml2YXRlIG1vZGVsV29ybGRSYWRpdXMgPSAwO1xyXG5cclxuICAvKiogVGhlIG91dGVybW9zdCBncm91cCB0aGUgbW9kZWwgYW5kIGl0cyB0YWdzIGhhbmcgZnJvbTogd2hlcmUgXCJ3aGljaCB3YXkgaXMgdXBcIiBpcyBhcHBsaWVkLiAqL1xyXG4gIHByaXZhdGUgbW9kZWxHcm91cD86IFRIUkVFLkdyb3VwO1xyXG5cclxuICBwcml2YXRlIG1vZGVsVXA6IFRocmVlSnNNb2RlbFVwID0gJ3knO1xyXG5cclxuICAvKiogV2hpbGUgbWVhc3VyaW5nOiBob3cgbWFueSBwb2ludHMgYW5kIGVhY2ggc2VnbWVudCdzIGxlbmd0aC4gTnVsbCB3aGVuIGl0IGlzIGFiYW5kb25lZC4gKi9cclxuICBwdWJsaWMgbWVhc3VyZW1lbnRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDx7IHBvaW50czogbnVtYmVyOyBkaXN0YW5jZXM6IG51bWJlcltdIH0gfCBudWxsPigpO1xyXG5cclxuICAvKipcclxuICAgKiBMYXllciBjYXJyeWluZyB0aGUgbW9kZWwgYWxvbmUsIHNvIHRoZSBkZXB0aCBwaWNrIGNhbiByZW5kZXIgaXQgd2l0aG91dCB0aGUgdGFncy5cclxuICAgKlxyXG4gICAqIExheWVycyBhcmUgdGVzdGVkIHBlciBvYmplY3QgYXQgcmVuZGVyIHRpbWUgYW5kIGNoaWxkcmVuIGFyZSB0cmF2ZXJzZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyXHJcbiAgICogdGhlaXIgcGFyZW50IHBhc3NlZCwgc28gbWFya2luZyB0aGUgbW9kZWwncyBvd24gbWVzaGVzIGlzIGVub3VnaCAtIG5vIHJlLXBhcmVudGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQSUNLX0xBWUVSID0gMTtcclxuXHJcbiAgLyoqIFRoZSBhcHAncyBoaWdobGlnaHQgY29sb3VyLCBzbyBhIG1lYXN1cmVtZW50IHJlYWRzIGFzIHRoZSBhY3RpdmUgdGhpbmcgb24gc2NyZWVuLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1FQVNVUkVfQ09MT1IgPSAnI0ZGQjEwMyc7XHJcblxyXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGJ1Y2tldCBob2xkaW5nIGRvd25sb2FkZWQgbW9kZWxzLCBhbmQgaG93IG1hbnkgdG8ga2VlcC4gKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRSA9ICdzbWFydGVycGxhbi0zZC1tb2RlbHMnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRV9TSVpFID0gMztcclxuXHJcbiAgcHJpdmF0ZSBwaWNrVGFyZ2V0PzogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XHJcblxyXG4gIHByaXZhdGUgcGlja0NhbWVyYT86IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG5cclxuICBwcml2YXRlIHBpY2tEZXB0aE1hdGVyaWFsPzogVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWw7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGlja1BpeGVsID0gbmV3IFVpbnQ4QXJyYXkoNCk7XHJcblxyXG4gIC8qKiBFbWl0cyBvbmNlIGEgdGFnIGlzIGRyb3BwZWQgb24gdGhlIG1vZGVsLCBzbyB0aGUgVUkgY2FuIGNvbmZpcm0gYW5kIHBlcnNpc3QgaXQuICovXHJcbiAgcHVibGljIHRhZ1BsYWNlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnUGxhY2VtZW50PigpO1xyXG5cclxuICAvKiogRW1pdHMgd2hlbiB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggaXMgYWJhbmRvbmVkLCBzbyB0aGUgcGFuZWwgZHJpdmluZyBpdCBjYW4gY2xvc2UuICovXHJcbiAgcHVibGljIGFsaWdubWVudENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKiogVHJhbnNsdWNlbnQgbWFya2VyIHNob3duIHVuZGVyIHRoZSBjdXJzb3Igd2hpbGUgcGxhY2luZy4gKi9cclxuICBwcml2YXRlIHBsYWNlbWVudFByZXZpZXc/OiBUSFJFRS5TcHJpdGU7XHJcblxyXG4gIHByaXZhdGUgYWxpZ25pbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIGFsaWdubWVudFBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdID0gW107XHJcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBUaGUgdGFnIGBhbGlnbm1lbnRTb3VyY2VgIHdhcyByZWFkIGZyb20sIGtlcHQgc28gdGhlIHNhbWUgdGFnIGlzIG5vdCBtYXRjaGVkIHR3aWNlLiAqL1xyXG4gIHByaXZhdGUgYWxpZ25tZW50U291cmNlVGFnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqIERyaXZlcyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoJ3MgVUk6IGhvdyBtYW55IHBhaXJzIGFyZSBkb25lIGFuZCB3aGF0IGl0IHdhbnRzIG5leHQuICovXHJcbiAgcHVibGljIGFsaWdubWVudFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PHtcclxuICAgIHBhaXJzOiBudW1iZXI7XHJcbiAgICBhd2FpdGluZzogJ3RhZycgfCAncG9pbnQnIHwgbnVsbDtcclxuICAgIHRhZ0lkPzogc3RyaW5nO1xyXG4gIH0+KCk7XHJcblxyXG4gIC8qKiBJbi1mbGlnaHQgY2FtZXJhIG1vdmUgc3RhcnRlZCBieSBnb1RvVGFnLCBhZHZhbmNlZCBieSB0aGUgcmVuZGVyIGxvb3AuICovXHJcbiAgcHJpdmF0ZSBjYW1lcmFUd2Vlbjoge1xyXG4gICAgZnJvbVBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzO1xyXG4gICAgdG9Qb3NpdGlvbjogVEhSRUUuVmVjdG9yMztcclxuICAgIGZyb21UYXJnZXQ6IFRIUkVFLlZlY3RvcjM7XHJcbiAgICB0b1RhcmdldDogVEhSRUUuVmVjdG9yMztcclxuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xyXG4gICAgZHVyYXRpb25NczogbnVtYmVyO1xyXG4gIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIEVtaXRzIHRydWUgd2hpbGUgYSBoZWF2eSBPQkogZmlsZSBpcyBiZWluZyBwYXJzZWQgKGluIGEgd29ya2VyLCB3aGVuIGF2YWlsYWJsZSksIGZhbHNlIG9uY2UgZG9uZS4gKi9cclxuICBwdWJsaWMgbW9kZWxMb2FkaW5nJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIHByb2dyZXNzIGZvciBHTEIgbW9kZWxzLCBhcyBhIDAtMSBmcmFjdGlvbiwgb3IgbnVsbCB3aGVuIHRoZSB0b3RhbCBzaXplIGlzIHVua25vd24uXHJcbiAgICpcclxuICAgKiBBIG51bGwgbWVhbnMgdGhlIHNlcnZlciBkaWQgbm90IHNlbmQgQ29udGVudC1MZW5ndGggKGNodW5rZWQgcmVzcG9uc2VzLCBzb21lIHByb3hpZXMpIGFuZCBub1xyXG4gICAqIHBlcmNlbnRhZ2UgY2FuIGJlIGRlcml2ZWQ7IHNob3cgYW4gaW5kZXRlcm1pbmF0ZSBpbmRpY2F0b3IgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXQgb25lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBtb2RlbExvYWRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIGEgbG9hZCBhY3R1YWxseSBzdG9wcGVkIHNob3J0LCB3aGljaCBpcyBub3QgdGhlIHNhbWUgYXMgYXNraW5nIGl0IHRvLlxyXG4gICAqXHJcbiAgICogY2FuY2VsTW9kZWxMb2FkKCkgY2FuIGFycml2ZSBhZnRlciBwYXJzZSgpIGhhcyB0YWtlbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCBwYXJzZSBjYW5ub3QgYmVcclxuICAgKiBpbnRlcnJ1cHRlZCAtIHRoZSBtb2RlbCBmaW5pc2hlcyBsb2FkaW5nIHJlZ2FyZGxlc3MuIE9ubHkgdGhpcyB0ZWxscyB0aGUgVUkgd2hpY2ggb2YgdGhlIHR3b1xyXG4gICAqIGhhcHBlbmVkLCBzbyBpdCBkb2VzIG5vdCBvZmZlciB0byByZWxvYWQgc29tZXRoaW5nIHRoYXQgaXMgYWxyZWFkeSBvbiBzY3JlZW4uXHJcbiAgICovXHJcbiAgcHVibGljIG1vZGVsTG9hZENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvLyBCYWNrZ3JvdW5kIHBhcnNpbmcgb2YgaGVhdnkgLm9iaiBmaWxlcywgcHJvdmlkZWQgYnkgdGhlIGhvc3RpbmcgYXBwIChzZWUgc2V0T2JqUGFyc2VyV29ya2VyKS5cclxuICAvLyBBbmd1bGFyIGxpYnJhcmllcyBidWlsdCB3aXRoIG5nLXBhY2thZ3IgY2FuJ3QgYnVuZGxlIGBuZXcgV29ya2VyKG5ldyBVUkwoLi4uKSlgIHRoZW1zZWx2ZXMsXHJcbiAgLy8gc28gdGhlIGFwcCBpbnN0YW50aWF0ZXMgdGhlIHdvcmtlciAoaXRzIGJ1aWxkIHBpcGVsaW5lIHN1cHBvcnRzIGl0KSBhbmQgaGFuZHMgaXQgb3ZlciBoZXJlLlxyXG4gIHByaXZhdGUgb2JqUGFyc2VyV29ya2VyPzogV29ya2VyO1xyXG4gIHByaXZhdGUgb2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzID0gbmV3IE1hcDxzdHJpbmcsIHsgcmVzb2x2ZTogKG1lc2hlczogUGFyc2VkTWVzaERhdGFbXSkgPT4gdm9pZDsgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkIH0+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlcnMgYSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxyXG4gICAqIE11c3QgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBjb25zdW1pbmcgYXBwIChlLmcuIGBuZXcgV29ya2VyKG5ldyBVUkwoJy4vb2JqLXBhcnNlci53b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKWApLFxyXG4gICAqIHNpbmNlIGEgbGlicmFyeSBwYWNrYWdlZCB3aXRoIG5nLXBhY2thZ3IgY2Fubm90IGJ1bmRsZSB3b3JrZXIgZmlsZXMgaXRzZWxmLlxyXG4gICAqIFdoZW4gbm8gd29ya2VyIGlzIHByb3ZpZGVkLCBsb2FkT2JqTW9kZWwgZmFsbHMgYmFjayB0byBwYXJzaW5nIG9uIHRoZSBtYWluIHRocmVhZC5cclxuICAgKi9cclxuICBzZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcclxuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyID0gd29ya2VyO1xyXG4gICAgdGhpcy5vYmpQYXJzZXJXb3JrZXIub25tZXNzYWdlID0gKHsgZGF0YSB9OiBNZXNzYWdlRXZlbnQ8T2JqUGFyc2VyV29ya2VyUmVzcG9uc2U+KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5nZXQoZGF0YS5yZXF1ZXN0SWQpO1xyXG4gICAgICBpZiAoIXBlbmRpbmcpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcclxuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLm1lc2hlcykge1xyXG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShkYXRhLm1lc2hlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3Igd2hpbGUgcGFyc2luZyBPQkogZmlsZSBpbiB3b3JrZXInKSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RPYmpQYXJzZUluV29ya2VyKG9ialVybDogc3RyaW5nKTogUHJvbWlzZTxQYXJzZWRNZXNoRGF0YVtdPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCByZXF1ZXN0SWQgPSBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XHJcbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xyXG4gICAgICB0aGlzLm9ialBhcnNlcldvcmtlciEucG9zdE1lc3NhZ2UoeyByZXF1ZXN0SWQsIG9ialVybCB9KTtcclxuICAgICAgLy8gRGlhZ25vc3RpYyBvbmx5OiBsYXJnZSBtb2RlbHMgbGVnaXRpbWF0ZWx5IHRha2UgYSB3aGlsZSwgdGhpcyBpc24ndCBhIHRpbWVvdXQvYWJvcnQsXHJcbiAgICAgIC8vIGp1c3QgYSBzaWduYWwgaW4gY2FzZSB0aGUgd29ya2VyIHdlbnQgc2lsZW50IChlLmcuIGl0IHJhbiBvdXQgb2YgbWVtb3J5IG1pZC1wYXJzZSkuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5oYXMocmVxdWVzdElkKSkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogb2JqLXBhcnNlciB3b3JrZXIgaGFzIG5vdCByZXBsaWVkIGFmdGVyIDYwcyBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKG9ialVybD0ke29ialVybH0pLiBTdGlsbCB3YWl0aW5nIC0gbGFyZ2UgZmlsZXMgY2FuIHRha2UgYSB3aGlsZSwgYnV0IHRoaXMgbWF5IGFsc28gbWVhbiB0aGUgd29ya2VyIGh1bmcgb3IgcmFuIG91dCBvZiBtZW1vcnkuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCA2MDAwMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWJ1aWxkcyBhIFRIUkVFLk1lc2ggZnJvbSB0aGUgcmF3IHR5cGVkIGFycmF5cyBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXHJcbiAgcHJpdmF0ZSBtZXNoRnJvbVBhcnNlZERhdGEoZGF0YTogUGFyc2VkTWVzaERhdGEsIG1hdGVyaWFscz86IGFueSk6IFRIUkVFLk1lc2gge1xyXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcclxuICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEucG9zaXRpb24sIDMpKTtcclxuICAgIGlmIChkYXRhLnV2KSB7XHJcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgndXYnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEudXYsIDIpKTtcclxuICAgIH1cclxuICAgIC8vIEluZGV4IGhhcyB0byBiZSBzZXQgYmVmb3JlIGFueSBub3JtYWwgY29tcHV0YXRpb24sIHdoaWNoIHJlYWRzIGl0IHRvIGF2ZXJhZ2Ugc2hhcmVkIGZhY2VzLlxyXG4gICAgaWYgKGRhdGEuaW5kZXgpIHtcclxuICAgICAgZ2VvbWV0cnkuc2V0SW5kZXgobmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLmluZGV4LCAxKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YS5ub3JtYWwpIHtcclxuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdub3JtYWwnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEubm9ybWFsLCAzKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG4gICAgfVxyXG4gICAgLy8gQm94My5zZXRGcm9tT2JqZWN0KCkgcmV1c2VzIGFuIGFscmVhZHktc2V0IGJvdW5kaW5nQm94IGluc3RlYWQgb2Ygd2Fsa2luZyBldmVyeSB2ZXJ0ZXgsXHJcbiAgICAvLyBzbyBhZG9wdGluZyB0aGUgd29ya2VyJ3MgbWFrZXMgZnJhbWluZyB0aGUgY2FtZXJhIGNoZWFwIG5vIG1hdHRlciBob3cgZGVuc2UgdGhlIG1lc2ggaXMuXHJcbiAgICBpZiAoZGF0YS5ib3VuZGluZ0JveCkge1xyXG4gICAgICBnZW9tZXRyeS5ib3VuZGluZ0JveCA9IG5ldyBUSFJFRS5Cb3gzKFxyXG4gICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKC4uLmRhdGEuYm91bmRpbmdCb3gubWluKSxcclxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5kYXRhLmJvdW5kaW5nQm94Lm1heCksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzb2x2ZWRNYXRlcmlhbHMgPSBkYXRhLm1hdGVyaWFsTmFtZXMubWFwKChuYW1lKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbWF0ZXJpYWxzICYmIG5hbWUgPyBtYXRlcmlhbHMuY3JlYXRlKG5hbWUpIDogdW5kZWZpbmVkO1xyXG4gICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogbm8gTVRMIG1hdGVyaWFsIG5hbWVkIFwiJHtuYW1lfVwiIGZvciBtZXNoIFwiJHtkYXRhLm5hbWV9XCIsIHVzaW5nIGEgcGxhaW4gZmFsbGJhY2sgKG5vIHRleHR1cmUpLmApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBtYXRlcmlhbCB8fCBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBtZXNoOiBUSFJFRS5NZXNoO1xyXG4gICAgaWYgKGRhdGEuZ3JvdXBzICYmIGRhdGEuZ3JvdXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZGF0YS5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IGdlb21ldHJ5LmFkZEdyb3VwKGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCkpO1xyXG4gICAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHJlc29sdmVkTWF0ZXJpYWxzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgcmVzb2x2ZWRNYXRlcmlhbHNbMF0pO1xyXG4gICAgfVxyXG4gICAgbWVzaC5uYW1lID0gZGF0YS5uYW1lO1xyXG4gICAgcmV0dXJuIG1lc2g7XHJcbiAgfVxyXG5cclxuICBpbml0KGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcclxuICAgIC8vIFRoaXMgc2VydmljZSBpcyBhIHNpbmdsZXRvbiBidXQgdGhlIHZpZXdlciBjb21wb25lbnQgaXMgcmVidWlsdCBvbiBldmVyeSBuYXZpZ2F0aW9uLCBzbyBzdGF0ZVxyXG4gICAgLy8gZnJvbSB0aGUgcHJldmlvdXMgc2NlbmUgaXMgc3RpbGwgaGVyZS4gVHdvIHRoaW5ncyBvdXRsaXZlIGl0IGFuZCBoYXZlIHRvIGdvIGZpcnN0OlxyXG4gICAgLy9cclxuICAgIC8vICAtIEEgZG93bmxvYWQgc3RpbGwgaW4gZmxpZ2h0LiBJdHMgb25Mb2FkZWQgcmVzb2x2ZXMgYWdhaW5zdCB3aGF0ZXZlciBgdGhpcy5zY2VuZWAgcG9pbnRzIGF0XHJcbiAgICAvLyAgICBieSB0aGVuLCBzbyB0aGUgbW9kZWwgYmVpbmcgYWJhbmRvbmVkIHdvdWxkIGJlIGhhbmRlZCB0byB0aGUgc2NlbmUgYnVpbHQgYmVsb3cuXHJcbiAgICAvLyAgLSBUaGUgdGFnIGdyb3VwLCB3aGljaCBpcyBhIGZpZWxkIGFuZCBrZWVwcyBpdHMgc3ByaXRlcy4gVGhleSB3b3VsZCBiZSByZS1wYXJlbnRlZCB1bmRlciB0aGVcclxuICAgIC8vICAgIG5ldyBtb2RlbCBhbmQgc2hvdyB0aGUgcHJldmlvdXMgdmlzaXQncyB0YWdzIG9uIGl0LlxyXG4gICAgdGhpcy5kaXNjYXJkQ3VycmVudExvYWQoKTtcclxuICAgIHRoaXMuY2xlYXJUYWdzKCk7XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XHJcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcclxuICAgIHRoaXMubW9kZWxSb290ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8vIDEuIFNldHVwIFNjZW5lXHJcbiAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcbiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBuZXcgVEhSRUUuQ29sb3IoMHhlMGY3ZmYpOyAvLyBmcm9tIFBPQ1xyXG5cclxuICAgIC8vIDIuIFNldHVwIENhbWVyYVxyXG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNzUsIGNhbnZhcy5jbGllbnRXaWR0aCAvIGNhbnZhcy5jbGllbnRIZWlnaHQsIDAuMSwgMTAwMDApO1xyXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24uc2V0KDAsIDUsIDEwKTsgLy8gd2lsbCBiZSBvdmVycmlkZGVuIGxhdGVyIGlmIHBhc3NlZFxyXG5cclxuICAgIC8vIDMuIFNldHVwIFdlYkdMIFJlbmRlcmVyXHJcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoeyBjYW52YXMsIGFudGlhbGlhczogdHJ1ZSB9KTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZShjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCAxLjUpKTtcclxuICAgIHRoaXMub2JzZXJ2ZUNhbnZhc1Jlc2l6ZShjYW52YXMpO1xyXG4gICAgXHJcbiAgICAvLyBGaXggZm9yIFRocmVlLmpzIHIxNDcgdnMgcjE1MisgY29sb3IgbWFuYWdlbWVudFxyXG4gICAgaWYgKCdvdXRwdXRDb2xvclNwYWNlJyBpbiB0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0Q29sb3JTcGFjZSA9ICdzcmdiJzsgLy8gVEhSRUUuU1JHQkNvbG9yU3BhY2VcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0RW5jb2RpbmcgPSAzMDAxOyAvLyBUSFJFRS5zUkdCRW5jb2RpbmdcclxuICAgIH1cclxuXHJcbiAgICAvLyBXaXRob3V0IHRvbmUgbWFwcGluZyBhbnl0aGluZyBicmlnaHRlciB0aGFuIDEuMCBpcyBzaW1wbHkgY3V0IG9mZiB0byBwdXJlIHdoaXRlLiBDYXB0dXJlZFxyXG4gICAgLy8gdGV4dHVyZXMgY2FycnkgYSBzbWFsbCBmcmFjdGlvbiBvZiB2ZXJ5IGJyaWdodCBwaXhlbHMgLSBza3kgcmVmbGVjdGVkIGluIHdpbmRvd3MsIHN1bmxpdFxyXG4gICAgLy8gcmVuZGVyIC0gYW5kIG9uY2UgbGlnaHRpbmcgcHVzaGVzIHRob3NlIHBhc3QgdGhlIGxpbWl0IHRoZXkgZmxhdHRlbiBpbnRvIHdoaXRlIHNwZWNrcyB3aXRoXHJcbiAgICAvLyBubyBkZXRhaWwgbGVmdC4gUm9sbGluZyB0aGUgaGlnaGxpZ2h0cyBvZmYgaW5zdGVhZCBrZWVwcyB0aGF0IGRldGFpbCBhbmQga2VlcHMgYnJpZ2h0IGFyZWFzXHJcbiAgICAvLyByZWFkaW5nIGFzIGJyaWdodCByYXRoZXIgdGhhbiBibG93bi5cclxuICAgIHRoaXMucmVuZGVyZXIudG9uZU1hcHBpbmcgPSBUSFJFRS5BQ0VTRmlsbWljVG9uZU1hcHBpbmc7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XHJcblxyXG4gICAgLy8gNC4gTGlnaHRpbmcsIGtlcHQgZGVsaWJlcmF0ZWx5IHJlc3RyYWluZWQgYW5kIG5ldXRyYWwuXHJcbiAgICAvL1xyXG4gICAgLy8gQ2FwdHVyZWQvcGhvdG9ncmFtbWV0cnkgbW9kZWxzIGFscmVhZHkgaGF2ZSBsaWdodGluZyBiYWtlZCBpbnRvIHRoZWlyIHRleHR1cmVzICh0aGUgc3VuIGFuZFxyXG4gICAgLy8gc2hhZG93cyBjYW1lIHdpdGggdGhlIHBob3RvcyksIHNvIGxpZ2h0aW5nIHRoZW0gYWdhaW4gZGlzdG9ydHMgd2hhdCB0aGV5IGFjdHVhbGx5IGxvb2sgbGlrZS5cclxuICAgIC8vIFRoZSBpbnRlbnNpdGllcyBiZWxvdyBhZGQgdXAgdG8gcm91Z2hseSAxLjAgb24gYSBzdXJmYWNlIGZhY2luZyB0aGUgdmlld2VyLCB3aGljaCByZW5kZXJzIHRoZVxyXG4gICAgLy8gdGV4dHVyZSBhdCBpdHMgdHJ1ZSB2YWx1ZS4gQW55dGhpbmcgYWJvdmUgMS4wIGlzIGNsaXBwZWQgdG8gcHVyZSB3aGl0ZSBieSB0aGUgcmVuZGVyZXIsIHdoaWNoXHJcbiAgICAvLyBpcyB3aGF0IHR1cm5zIGJyaWdodCBhcmVhcyBpbnRvIGZsYXQgd2hpdGUgcGF0Y2hlcyB3aXRoIG5vIGRldGFpbCBsZWZ0IGluIHRoZW0uXHJcbiAgICAvL1xyXG4gICAgLy8gTmV1dHJhbCB3aGl0ZSBpcyB1c2VkIHJhdGhlciB0aGFuIGEgd2FybSB0aW50IGZvciB0aGUgc2FtZSByZWFzb246IGEgdGludGVkIGxpZ2h0IHNoaWZ0cyBldmVyeVxyXG4gICAgLy8gY29sb3VyIGluIHRoZSBtb2RlbCBhd2F5IGZyb20gd2hhdCB3YXMgY2FwdHVyZWQuXHJcbiAgICBjb25zdCBhbWJpZW50TGlnaHQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4ZmZmZmZmLCAwLjcpO1xyXG4gICAgdGhpcy5zY2VuZS5hZGQoYW1iaWVudExpZ2h0KTtcclxuXHJcbiAgICAvLyBIZWFkbGlnaHQgcmF0aGVyIHRoYW4gYSBmaXhlZCBzdW46IHBhcmVudGVkIHRvIHRoZSBjYW1lcmEgc28gaXQgYWx3YXlzIHBvaW50cyBhdCB3aGF0ZXZlciBpc1xyXG4gICAgLy8gYmVpbmcgbG9va2VkIGF0LCBnaXZpbmcgc2hhcGUgdG8gc3VyZmFjZXMgd2l0aG91dCBldmVyIGxlYXZpbmcgYSBmYWNlIHVubGl0LiBObyBzaGFkb3cgY2FzdGluZ1xyXG4gICAgLy8gLSBzaGFkb3dzIHdvdWxkIGRvdWJsZSB1cCB3aXRoIHRoZSBvbmVzIGFscmVhZHkgYmFrZWQgaW50byB0aGUgdGV4dHVyZXMsIGFuZCB0aGUgc2hhZG93IG1hcFxyXG4gICAgLy8gd2FzIGEgcmVhbCBjb3N0IHBlciBmcmFtZS5cclxuICAgIGNvbnN0IGhlYWRMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAwLjM1KTtcclxuICAgIGhlYWRMaWdodC5wb3NpdGlvbi5zZXQoMCwgMCwgMSk7XHJcbiAgICB0aGlzLmNhbWVyYS5hZGQoaGVhZExpZ2h0KTtcclxuICAgIC8vIEEgbGlnaHQgb25seSBjb250cmlidXRlcyB3aGlsZSBpdCBpcyBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCwgYW5kIHRoaXMgb25lIGhhbmdzIG9mZiB0aGUgY2FtZXJhLlxyXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5jYW1lcmEpO1xyXG5cclxuICAgIC8vIDUuIFNldHVwIENvbnRyb2xzIChmcm9tIFBPQylcclxuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgT3JiaXRDb250cm9scyh0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcclxuICAgIHRoaXMuY29udHJvbHMucm90YXRlU3BlZWQgPSAxLjA7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmRhbXBpbmdGYWN0b3IgPSAwLjE7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZURhbXBpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb250cm9scy5tb3VzZUJ1dHRvbnMgPSB7XHJcbiAgICAgIExFRlQ6IFRIUkVFLk1PVVNFLlJPVEFURSxcclxuICAgICAgTUlERExFOiBUSFJFRS5NT1VTRS5ET0xMWSxcclxuICAgICAgUklHSFQ6IFRIUkVFLk1PVVNFLlBBTixcclxuICAgIH07XHJcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7XHJcblxyXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG9uIGNvbnRyb2xzIHRvIGRpZmZlcmVudGlhdGUgZHJhZ2dpbmcgdnMgY2xpY2tpbmdcclxuICAgIHRoaXMuY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignc3RhcnQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZ1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gdHJ1ZTtcclxuICAgICAgfSwgMTUwKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5pc0RyYWdnaW5nVGltZXIpO1xyXG4gICAgICBpZiAodGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzRHJhZ2dpbmdDYW1lcmEgPSBmYWxzZTtcclxuICAgICAgICB9LCAyNTApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBJbnRlcmFjdGlvbiBFdmVudCBMaXN0ZW5lcnMgb24gY2FudmFzXHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uTW91c2VDbGljay5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcblxyXG4gICAgLy8gRXNjYXBlIGJhY2tzIG91dCBvZiBwbGFjZW1lbnQgYW5kIGNhbGlicmF0aW9uLiBPbiB0aGUgd2luZG93IHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIHdoaWNoXHJcbiAgICAvLyB3b3VsZCBuZWVkIGZvY3VzIHRoZSB1c2VyIGhhcyBubyByZWFzb24gdG8gaGF2ZSBnaXZlbiBpdCAtIHRoZXkgYXJlIGFpbWluZyB3aXRoIHRoZSBtb3VzZS5cclxuICAgIC8vIFJlbW92ZWQgZmlyc3QgYmVjYXVzZSB0aGlzIHNlcnZpY2UgaXMgYSBzaW5nbGV0b246IGluaXQoKSBydW5zIGFnYWluIGZvciBldmVyeSBjYW52YXMsIGFuZFxyXG4gICAgLy8gdGhlIHByZXZpb3VzIHJlZ2lzdHJhdGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RpbGwgYmUgYXR0YWNoZWQuXHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuICAgIHRoaXMucGlja1RhcmdldD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5waWNrVGFyZ2V0ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucGlja0NhbWVyYSA9IHVuZGVmaW5lZDtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xyXG5cclxuICAgIC8vIDYuIFN0YXJ0IHRoZSByZW5kZXIgbG9vcFxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLmFuaW1hdGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCAoc2VydmVkIGJ5IHRoZSBhcHApIGhvbGRpbmcgYmFzaXNfdHJhbnNjb2Rlci5qcy8ud2FzbSwgd2hpY2ggS1RYMkxvYWRlciBuZWVkcyB0byB0dXJuXHJcbiAgICogQmFzaXMgVW5pdmVyc2FsIHRleHR1cmVzIGludG8gd2hhdGV2ZXIgY29tcHJlc3NlZCBmb3JtYXQgdGhlIGxvY2FsIEdQVSBhY3R1YWxseSBzdXBwb3J0cy5cclxuICAgKi9cclxuICBwcml2YXRlIGt0eDJUcmFuc2NvZGVyUGF0aCA9ICdhc3NldHMvYmFzaXMvJztcclxuXHJcbiAgLyoqIE92ZXJyaWRlcyB3aGVyZSB0aGUgQmFzaXMgdHJhbnNjb2RlciBmaWxlcyBhcmUgc2VydmVkIGZyb20uICovXHJcbiAgc2V0S3R4MlRyYW5zY29kZXJQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5rdHgyVHJhbnNjb2RlclBhdGggPSBwYXRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZHMgYSBiYXNlIDNEIG1vZGVsIGluIEdMVEYvR0xCIGZvcm1hdCAtIHRoZSBwcmVmZXJyZWQgZm9ybWF0IGZvciBsYXJnZSBtb2RlbHMuXHJcbiAgICogVW5saWtlIC5vYmosIGdlb21ldHJ5IGFycml2ZXMgYXMgYmluYXJ5IHR5cGVkIGFycmF5cyAobm8gdGV4dCBwYXJzaW5nIHRvIG9mZmxvYWQgdG8gYSB3b3JrZXIpXHJcbiAgICogYW5kIHN0YXlzIGluZGV4ZWQsIHNvIGZhciBsZXNzIGRhdGEgcmVhY2hlcyB0aGUgR1BVLiBLVFgyIHRleHR1cmVzIGFyZSBzdXBwb3J0ZWQgdG9vOiB0aGV5XHJcbiAgICogc3RheSBjb21wcmVzc2VkIGluIFZSQU0gaW5zdGVhZCBvZiBiZWluZyBkZWNvZGVkIHRvIHJhdyBwaXhlbHMgbGlrZSBKUEVHL1BORy5cclxuICAgKi9cclxuICBsb2FkR0xURk1vZGVsKHVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIGNhY2hlS2V5Pzogc3RyaW5nLCB1cD86IFRocmVlSnNNb2RlbFVwKTogdm9pZCB7XHJcbiAgICBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xyXG5cclxuICAgIC8vIEtUWDIgbmVlZHMgdGhlIHJlbmRlcmVyIHRvIHJlcG9ydCB3aGljaCBjb21wcmVzc2VkIGZvcm1hdHMgdGhpcyBHUFUgYWNjZXB0cywgc28gdGhpcyBoYXMgdG9cclxuICAgIC8vIGhhcHBlbiBhZnRlciBpbml0KCkuIEd1YXJkZWQgc28gYSBtb2RlbCB3aXRob3V0IEtUWDIgdGV4dHVyZXMgc3RpbGwgbG9hZHMgaWYgaXQncyBtaXNzaW5nLlxyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBrdHgyTG9hZGVyID0gbmV3IEtUWDJMb2FkZXIoKVxyXG4gICAgICAgICAgLnNldFRyYW5zY29kZXJQYXRoKHRoaXMua3R4MlRyYW5zY29kZXJQYXRoKVxyXG4gICAgICAgICAgLmRldGVjdFN1cHBvcnQodGhpcy5yZW5kZXJlcik7XHJcbiAgICAgICAgbG9hZGVyLnNldEtUWDJMb2FkZXIoa3R4MkxvYWRlcik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdUaHJlZUpzU2VydmljZTogY291bGQgbm90IHNldCB1cCBLVFgyIHRleHR1cmUgc3VwcG9ydCwgZmFsbGluZyBiYWNrIHRvIHVuY29tcHJlc3NlZCB0ZXh0dXJlcy4nLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIExldHMgZ2x0ZnBhY2svZ2x0Zi10cmFuc2Zvcm0gb3V0cHV0IHVzaW5nIEVYVF9tZXNob3B0X2NvbXByZXNzaW9uIGxvYWQgd2l0aG91dCBleHRyYSBzZXR1cC5cclxuICAgIGxvYWRlci5zZXRNZXNob3B0RGVjb2RlcihNZXNob3B0RGVjb2Rlcik7XHJcblxyXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDApO1xyXG5cclxuICAgIC8vIE9yZGVyIG1hdHRlcnM6IG5vcm1hbHMgbXVzdCBleGlzdCBiZWZvcmUgYW5pc290cm9weSwgYW5kIHRoZSBQaG9uZyBjb252ZXJzaW9uIGhhcyB0byBydW5cclxuICAgIC8vIGJlZm9yZSBzaWRlL2ZsYXRTaGFkaW5nIGFyZSB0b3VjaGVkIHNvIHRob3NlIHNldHRpbmdzIGxhbmQgb24gdGhlIG1hdGVyaWFscyB3ZSBrZWVwLlxyXG4gICAgY29uc3Qgb25Mb2FkZWQgPSAoZ2x0ZjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY29udmVydFRvUGhvbmdNYXRlcmlhbHMoZ2x0Zi5zY2VuZSk7XHJcbiAgICAgIHRoaXMuZm9yY2VEb3VibGVTaWRlZE1hdGVyaWFscyhnbHRmLnNjZW5lKTtcclxuICAgICAgdGhpcy5lbnN1cmVWZXJ0ZXhOb3JtYWxzKGdsdGYuc2NlbmUpO1xyXG4gICAgICB0aGlzLnR1bmVUZXh0dXJlU2FtcGxpbmcoZ2x0Zi5zY2VuZSk7XHJcbiAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKGdsdGYuc2NlbmUsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbiwgdXApO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICB9O1xyXG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIC8vIENhbmNlbGxpbmcgaXMgYSBkZWNpc2lvbiwgbm90IGEgZmFpbHVyZTogY2xlYXIgdGhlIG92ZXJsYXkgd2l0aG91dCBhbiBlcnJvciBpbiB0aGUgY29uc29sZS5cclxuICAgICAgaWYgKGVycm9yPy5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcclxuICAgICAgICAvLyBPbmx5IGEgY2FuY2VsIG9mIHRoZSBsb2FkIHRoYXQgaXMgc3RpbGwgY3VycmVudCBjYW1lIGZyb20gdGhlIHVzZXI7IGFueXRoaW5nIGVsc2UgaXMgdGhpc1xyXG4gICAgICAgIC8vIGxvYWQgaGF2aW5nIGJlZW4gc3VwZXJzZWRlZCBvciBkaXNjYXJkZWQuXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uc2lnbmFsLmFib3J0ZWQpIHtcclxuICAgICAgICAgIHRoaXMubW9kZWxMb2FkQ2FuY2VsbGVkJC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgR0xURiBtb2RlbDonLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KG51bGwpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHTFRGTG9hZGVyIGRlY29kZXMgZW1iZWRkZWQgaW1hZ2VzIHdpdGggY3JlYXRlSW1hZ2VCaXRtYXAgd2hlbiB0aGUgYnJvd3NlciBvZmZlcnMgaXQsIGFuZCBvblxyXG4gICAgLy8gbGFyZ2UgdGV4dHVyZSBhdGxhc2VzIHRoYXQgcGF0aCByZXR1cm5zIHZpc2libHkgY29ycnVwdCBkYXRhIC0gc2NhdHRlcmVkIHdoaXRlIGJsb2NrcyBhY3Jvc3NcclxuICAgIC8vIHRoZSBtb2RlbC4gVGhlIGV4YWN0IHNhbWUgYnl0ZXMgZGVjb2RlZCB0aHJvdWdoIGFuIEhUTUxJbWFnZUVsZW1lbnQsIHdoaWNoIGlzIHdoYXQgdGhlIC5vYmpcclxuICAgIC8vIHBhdGggdXNlcyB2aWEgTVRMTG9hZGVyLCBjb21lIG91dCBjbGVhbi4gR0xURkxvYWRlciBhbHJlYWR5IGZhbGxzIGJhY2sgdG8gdGhhdCBkZWNvZGVyIGZvclxyXG4gICAgLy8gU2FmYXJpIGFuZCBvbGRlciBGaXJlZm94OyB0aGlzIHNpbXBseSBleHRlbmRzIHRoZSBmYWxsYmFjayB0byBjb3ZlciB0aGlzIGNhc2UgdG9vLlxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBkZWNvZGVyIGlzIGNob3NlbiB3aGlsZSBHTFRGUGFyc2VyIGlzIGJlaW5nIGNvbnN0cnVjdGVkLCB3aGljaCBoYXBwZW5zIHN5bmNocm9ub3VzbHlcclxuICAgIC8vIGluc2lkZSBwYXJzZSgpLCBzbyBoaWRpbmcgY3JlYXRlSW1hZ2VCaXRtYXAgb25seSBoYXMgdG8gaG9sZCBhY3Jvc3MgdGhhdCBjYWxsIHJhdGhlciB0aGFuXHJcbiAgICAvLyBmb3IgdGhlIHdob2xlIGRvd25sb2FkLlxyXG4gICAgdGhpcy5mZXRjaFdpdGhQcm9ncmVzcyh1cmwsIGNhY2hlS2V5KVxyXG4gICAgICAvLyBwYXJzZSgpIGhvbGRzIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyBvbiBhIGxhcmdlIG1vZGVsLiBZaWVsZCB1bnRpbCB0aGUgYnJvd3NlciBoYXNcclxuICAgICAgLy8gYWN0dWFsbHkgcGFpbnRlZCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBmaW5hbCBwcm9ncmVzcyB1cGRhdGUgbmV2ZXIgcmVhY2hlcyB0aGUgc2NyZWVuIGFuZFxyXG4gICAgICAvLyB0aGUgYmFyIGFwcGVhcnMgdG8gc3RhbGwgc2hvcnQgb2YgdGhlIGVuZC5cclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4gdGhpcy5hZnRlck5leHRQYWludCgpLnRoZW4oKCkgPT4gYnVmZmVyKSlcclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4ge1xyXG4gICAgICAgIC8vIHBhcnNlKCkgY2Fubm90IGJlIGludGVycnVwdGVkLCBzbyBhIGNhbmNlbCB0aGF0IGxhbmRzIGR1cmluZyB0aGUgcGFpbnQgeWllbGQgaGFzIHRvIGJlXHJcbiAgICAgICAgLy8gY2F1Z2h0IGhlcmUgLSB0aGUgbGFzdCBtb21lbnQgYmVmb3JlIHRoZSBtYWluIHRocmVhZCBpcyBjb21taXR0ZWQgZm9yIHNldmVyYWwgc2Vjb25kcy5cclxuICAgICAgICBpZiAodGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignTW9kZWwgbG9hZCBjYW5jZWxsZWQnLCAnQWJvcnRFcnJvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBnbG9iYWxTY29wZSA9IGdsb2JhbFRoaXMgYXMgYW55O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ3JlYXRlSW1hZ2VCaXRtYXAgPSBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbG9hZGVyLnBhcnNlKGJ1ZmZlciwgdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpLCBvbkxvYWRlZCwgb25FcnJvcik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwID0gb3JpZ2luYWxDcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChvbkVycm9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3BzIHRoZSBtb2RlbCBkb3dubG9hZCBpbiBwcm9ncmVzcywgaWYgYW55LlxyXG4gICAqXHJcbiAgICogT25seSB0aGUgZG93bmxvYWQgY2FuIGJlIGludGVycnVwdGVkOiBwYXJzZSgpIHJ1bnMgc3luY2hyb25vdXNseSBhbmQgaG9sZHMgdGhlIG1haW4gdGhyZWFkIHVudGlsXHJcbiAgICogaXQgZmluaXNoZXMsIHNvIG9uY2UgaXQgaGFzIGJlZ3VuIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBJbiBwcmFjdGljZSB0aGUgZG93bmxvYWQgaXMgdGhlXHJcbiAgICogbG9uZyBwYXJ0LCB3aGljaCBpcyB3aGVyZSBzb21lb25lIHJlYWNoZXMgZm9yIHRoaXMuXHJcbiAgICovXHJcbiAgY2FuY2VsTW9kZWxMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWJhbmRvbnMgdGhlIGxvYWQgaW4gcHJvZ3Jlc3Mgd2l0aG91dCByZXBvcnRpbmcgaXQgYXMgY2FuY2VsbGVkLlxyXG4gICAqXHJcbiAgICogRHJvcHBpbmcgdGhlIGNvbnRyb2xsZXIgaXMgd2hhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZTogb25FcnJvciB0cmVhdHMgYW4gYWJvcnQgYXMgdXNlci1pbml0aWF0ZWRcclxuICAgKiBvbmx5IHdoaWxlIHRoZSBjb250cm9sbGVyIHRoYXQgYWJvcnRlZCBpcyBzdGlsbCB0aGUgY3VycmVudCBvbmUuIFRlYXJpbmcgZG93biBvciByZWJ1aWxkaW5nIHRoZVxyXG4gICAqIHNjZW5lIGlzIG5vdCBzb21ldGhpbmcgdGhlIHBlcnNvbiBhc2tlZCBmb3IsIHNvIGl0IG11c3Qgbm90IHN1cmZhY2UgYXMgXCJsb2FkaW5nIGNhbmNlbGxlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzY2FyZEN1cnJlbnRMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZXMgb25jZSB0aGUgYnJvd3NlciBoYXMgcGFpbnRlZCBhdCBsZWFzdCBvbmUgZnJhbWUuXHJcbiAgICpcclxuICAgKiBBIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBydW5zICpiZWZvcmUqIHRoYXQgZnJhbWUgaXMgcGFpbnRlZCwgc28gYSBzaW5nbGUgb25lIGlzIG5vdFxyXG4gICAqIGVub3VnaCB0byBndWFyYW50ZWUgcGVuZGluZyBET00gY2hhbmdlcyBhcmUgb24gc2NyZWVuOyB0aGUgc2Vjb25kIGZpcmVzIGFmdGVyIHRoZSBmaXJzdCBmcmFtZVxyXG4gICAqIGhhcyBnb25lIG91dC4gRmFsbHMgYmFjayB0byBhIHRpbWVvdXQgd2hlcmUgckFGIGlzbid0IGF2YWlsYWJsZSAoU1NSLCB0ZXN0cykuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZnRlck5leHRQYWludCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWRzIGEgZmlsZSwgcmVwb3J0aW5nIHByb2dyZXNzIG9uIG1vZGVsTG9hZFByb2dyZXNzJCBhcyBpdCBhcnJpdmVzLlxyXG4gICAqXHJcbiAgICogR0xURkxvYWRlci5sb2FkKCkgd291bGQgcmVwb3J0IHByb2dyZXNzIHRocm91Z2ggWEhSLCBidXQgdGhpcyBwYXRoIGRlbGliZXJhdGVseSB1c2VzIGZldGNoKCkgK1xyXG4gICAqIHBhcnNlKCkgaW5zdGVhZCAoc2VlIGxvYWRHTFRGTW9kZWwgZm9yIHdoeSksIHNvIHByb2dyZXNzIGlzIHJlYWQgb2ZmIHRoZSByZXNwb25zZSBzdHJlYW0gaGVyZS5cclxuICAgKiBUaGF0IGlzIGFsc28gdGhlIG1vcmUgdXNlZnVsIG51bWJlcjogb24gYSBtb2RlbCBvZiB0aGlzIHNpemUgdGhlIGRvd25sb2FkIGRvbWluYXRlcywgYW5kIHRoZVxyXG4gICAqIHN0cmVhbSByZXBvcnRzIGl0IGFzIGl0IGhhcHBlbnMgcmF0aGVyIHRoYW4gaW4gb25lIGp1bXAgYXQgdGhlIGVuZC5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBjYWNoZUtleT86IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcclxuICAgIC8vIEEgbG9hZCBhbHJlYWR5IHJ1bm5pbmcgaXMgcmVwbGFjZWQsIG5vdCByYWNlZDogd2hpY2hldmVyIGZpbmlzaGVkIGxhc3Qgd291bGQgb3RoZXJ3aXNlIHdpbi5cclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIGNvbnN0IHsgc2lnbmFsIH0gPSB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI7XHJcblxyXG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5yZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXkpO1xyXG4gICAgaWYgKGNhY2hlZCkge1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDEpO1xyXG4gICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpO1xyXG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoY29udGVudExlbmd0aCkgJiYgY29udGVudExlbmd0aCA+IDAgPyBjb250ZW50TGVuZ3RoIDogMDtcclxuXHJcbiAgICAvLyBXaXRob3V0IGEgcmVhZGFibGUgc3RyZWFtIChvbGRlciBicm93c2Vycywgc29tZSBwb2x5ZmlsbHMpIHRoZXJlIGlzIG5vdGhpbmcgdG8gbWVhc3VyZSwgc29cclxuICAgIC8vIGZhbGwgYmFjayB0byBhIHBsYWluIGJ1ZmZlcmVkIHJlYWQgYW5kIGxldCB0aGUgVUkgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvci5cclxuICAgIGlmICghcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKSB7XHJcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XHJcblxyXG4gICAgLy8gV2l0aCBhIGtub3duIHNpemUsIHdyaXRlIGNodW5rcyBzdHJhaWdodCBpbnRvIG9uZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlci4gQ29sbGVjdGluZyB0aGVtIGluIGFuXHJcbiAgICAvLyBhcnJheSBhbmQgY29uY2F0ZW5hdGluZyBhZnRlcndhcmRzIHdvdWxkIGhvbGQgYm90aCBjb3BpZXMgYXQgb25jZSAtIG9uIGEgMTY0IE1CIG1vZGVsIHRoYXQgaXNcclxuICAgIC8vIGFuIGF2b2lkYWJsZSAzMDArIE1CIHBlYWsuXHJcbiAgICBjb25zdCBidWZmZXIgPSB0b3RhbCA+IDAgPyBuZXcgVWludDhBcnJheSh0b3RhbCkgOiBudWxsO1xyXG4gICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcclxuICAgIGxldCB1c2luZ0J1ZmZlciA9IGJ1ZmZlciAhPT0gbnVsbDtcclxuICAgIGxldCByZWNlaXZlZCA9IDA7XHJcbiAgICAvLyBDaHVua3MgYXJyaXZlIGluIHRlbnMgb2Yga2lsb2J5dGVzLCBzbyBhIDE2NCBNQiBtb2RlbCBwcm9kdWNlcyB0aG91c2FuZHMgb2YgdGhlbS4gRW1pdHRpbmcgb25cclxuICAgIC8vIGV2ZXJ5IG9uZSB3b3VsZCBydW4gY2hhbmdlIGRldGVjdGlvbiBqdXN0IGFzIG9mdGVuIHRvIG1vdmUgYSBiYXIgdGhhdCBpcyBtZWFzdXJlZCBpbiB3aG9sZVxyXG4gICAgLy8gcGVyY2VudCwgc28gb25seSByZXBvcnQgd2hlbiB0aGUgZGlzcGxheWVkIHZhbHVlIHdvdWxkIGFjdHVhbGx5IGNoYW5nZS5cclxuICAgIGxldCBsYXN0UmVwb3J0ZWQgPSAtMTtcclxuXHJcbiAgICBpZiAodG90YWwgPT09IDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKDs7KSB7XHJcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XHJcbiAgICAgIGlmIChkb25lKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgLy8gRnJlZSB0aGUgY29ubmVjdGlvbiByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IGRyYWluaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxyXG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcclxuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHVzaW5nQnVmZmVyICYmIHJlY2VpdmVkICsgdmFsdWUubGVuZ3RoID4gdG90YWwpIHtcclxuICAgICAgICAvLyBDb250ZW50LUxlbmd0aCB1bmRlcnN0YXRlZCB0aGUgcmVhbCBzaXplLiBNb3ZlIHdoYXQgd2UgaGF2ZSBpbnRvIHRoZSBjaHVuayBsaXN0IGFuZCBzdGF5XHJcbiAgICAgICAgLy8gdGhlcmUgZm9yIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgdGFpbC5cclxuICAgICAgICBjaHVua3MucHVzaChidWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpKTtcclxuICAgICAgICB1c2luZ0J1ZmZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh1c2luZ0J1ZmZlcikge1xyXG4gICAgICAgIGJ1ZmZlci5zZXQodmFsdWUsIHJlY2VpdmVkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWluKE1hdGgucm91bmQoKHJlY2VpdmVkIC8gdG90YWwpICogMTAwKSwgMTAwKTtcclxuICAgICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFJlcG9ydGVkKSB7XHJcbiAgICAgICAgICBsYXN0UmVwb3J0ZWQgPSBwZXJjZW50O1xyXG4gICAgICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChwZXJjZW50IC8gMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgc3RyZWFtIGNhbiBlbmQgYmVsb3cgdGhlIGFkdmVydGlzZWQgc2l6ZSAob3Igd2l0aCBubyBzaXplIGF0IGFsbCkuIExhbmQgb24gYSBmdWxsIGJhclxyXG4gICAgLy8gcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBzdHVjayBhdCB3aGF0ZXZlciB0aGUgbGFzdCBjaHVuayBoYXBwZW5lZCB0byByZWFjaC5cclxuICAgIGlmICh0b3RhbCA+IDAgJiYgbGFzdFJlcG9ydGVkICE9PSAxMDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0OiBBcnJheUJ1ZmZlcjtcclxuICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCA9PT0gdG90YWwpIHtcclxuICAgICAgcmVzdWx0ID0gYnVmZmVyLmJ1ZmZlcjtcclxuICAgIH0gZWxzZSBpZiAodXNpbmdCdWZmZXIpIHtcclxuICAgICAgLy8gRmV3ZXIgYnl0ZXMgdGhhbiBhZHZlcnRpc2VkOiBoYW5kIGJhY2sgZXhhY3RseSB3aGF0IGFycml2ZWQuXHJcbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkocmVjZWl2ZWQpO1xyXG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgICAgY2h1bmtzLmZvckVhY2goKGNodW5rKSA9PiB7XHJcbiAgICAgICAgbWVyZ2VkLnNldChjaHVuaywgb2Zmc2V0KTtcclxuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0ID0gbWVyZ2VkLmJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLndyaXRlTW9kZWxUb0NhY2hlKGNhY2hlS2V5LCByZXN1bHQpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2RlbCBzdG9yZSwgb3IgbnVsbCB3aGVyZSB0aGUgYnJvd3NlciB3aWxsIG5vdCBnaXZlIHVzIG9uZS5cclxuICAgKlxyXG4gICAqIENhY2hlIFN0b3JhZ2UgbmVlZHMgYSBzZWN1cmUgY29udGV4dCwgc28gaXQgaXMgYWJzZW50IG92ZXIgcGxhaW4gaHR0cCBhbmQgaW4gc29tZSBlbWJlZGRlZFxyXG4gICAqIHdlYnZpZXdzLiBFdmVyeSBjYWxsZXIgdHJlYXRzIHRoYXQgYXMgYSBtaXNzIC0gY2FjaGluZyBpcyBhbiBvcHRpbWlzYXRpb24sIG5ldmVyIGEgcmVxdWlyZW1lbnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kZWxDYWNoZSgpOiBQcm9taXNlPENhY2hlIHwgbnVsbD4ge1xyXG4gICAgaWYgKHR5cGVvZiBjYWNoZXMgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IGNhY2hlcy5vcGVuKFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY2FjaGVkIGNvcHkgb2YgdGhpcyBtb2RlbCwgaWYgb25lIHdhcyBzdG9yZWQuXHJcbiAgICpcclxuICAgKiBLZXllZCBieSB0aGUgUzMga2V5IHJhdGhlciB0aGFuIHRoZSBVUkwgaXQgaXMgZmV0Y2hlZCBmcm9tOiB0aGF0IFVSTCBpcyBzaWduZWQsIHNvIGl0IGNhcnJpZXMgYVxyXG4gICAqIGZyZXNoIHNpZ25hdHVyZSBhbmQgZXhwaXJ5IGV2ZXJ5IHRpbWUgYW5kIHdvdWxkIG5ldmVyIG1hdGNoIHR3aWNlLiBUaGUgYnJvd3NlcidzIG93biBIVFRQIGNhY2hlXHJcbiAgICogbWlzc2VzIGZvciB0aGUgc2FtZSByZWFzb24sIHdoaWNoIGlzIHdoeSB0aGlzIGV4aXN0cyBhdCBhbGwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyByZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFjYWNoZUtleSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBjb25zdCBoaXQgPSBhd2FpdCBjYWNoZT8ubWF0Y2godGhpcy5tb2RlbENhY2hlVXJsKGNhY2hlS2V5KSk7XHJcbiAgICAgIHJldHVybiBoaXQgPyBhd2FpdCBoaXQuYXJyYXlCdWZmZXIoKSA6IG51bGw7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIGEgbW9kZWwgZm9yIG5leHQgdGltZSwgZXZpY3RpbmcgdGhlIG9sZGVzdCBvbmNlIGEgZmV3IGFyZSBoZWxkLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWw6IEFycmF5QnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWNhY2hlS2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBpZiAoIWNhY2hlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IGNhY2hlLnB1dCh0aGlzLm1vZGVsQ2FjaGVVcmwoY2FjaGVLZXkpLCBuZXcgUmVzcG9uc2UobW9kZWwpKTtcclxuXHJcbiAgICAgIC8vIE1vZGVscyBydW4gdG8gaHVuZHJlZHMgb2YgbWVnYWJ5dGVzLCBzbyB0aGlzIGNhbm5vdCBncm93IHdpdGhvdXQgbGltaXQuIENhY2hlIFN0b3JhZ2Uga2VlcHNcclxuICAgICAgLy8gaW5zZXJ0aW9uIG9yZGVyLCB3aGljaCBtYWtlcyB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgdGhlIGxlYXN0IHJlY2VudGx5IHN0b3JlZC5cclxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IGNhY2hlLmtleXMoKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAga2V5cy5zbGljZSgwLCBNYXRoLm1heCgwLCBrZXlzLmxlbmd0aCAtIFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFX1NJWkUpKVxyXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBjYWNoZS5kZWxldGUoa2V5KSlcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBPdXQgb2YgcXVvdGEsIHByaXZhdGUgYnJvd3NpbmcsIHN0b3JhZ2UgZGlzYWJsZWQ6IHRoZSBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCBlaXRoZXIgd2F5LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENhY2hlIFN0b3JhZ2Uga2V5cyBvbiBhIFVSTCwgc28gdGhlIFMzIGtleSBpcyBleHByZXNzZWQgYXMgb25lLiBJdCBpcyBuZXZlciByZXF1ZXN0ZWQuICovXHJcbiAgcHJpdmF0ZSBtb2RlbENhY2hlVXJsKGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBodHRwczovLzNkLW1vZGVsLWNhY2hlLnNtYXJ0ZXJwbGFuLmxvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlS2V5KX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRml0cyB0aGUgY2FtZXJhJ3MgY2xpcHBpbmcgcGxhbmVzIHRvIGhvdyBiaWcgdGhlIG1vZGVsIGFjdHVhbGx5IGlzLlxyXG4gICAqXHJcbiAgICogRGVwdGggcHJlY2lzaW9uIGRlcGVuZHMgb24gdGhlIGZhci9uZWFyIHJhdGlvLCBhbmQgdGhlIGZpeGVkIDAuMSAvIDEwMDAwIHRoZSBjYW1lcmEgc3RhcnRzIHdpdGhcclxuICAgKiBpcyBhIHJhdGlvIG9mIDEwMDAwMCBmb3IgYSBtb2RlbCBvbmx5IH4xMCB1bml0cyBhY3Jvc3MuIFRoYXQgd2FzdGVzIG1vc3Qgb2YgdGhlIGRlcHRoIGJ1ZmZlciBvblxyXG4gICAqIGVtcHR5IHNwYWNlIGFuZCBsZXRzIG5lYXJseSBjb2luY2lkZW50IHN1cmZhY2VzIC0gd2hpY2ggY2FwdHVyZWQgbWVzaGVzIGhhdmUgZXZlcnl3aGVyZSAtXHJcbiAgICogZmxpY2tlciBhZ2FpbnN0IGVhY2ggb3RoZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGp1c3RDbGlwcGluZ1BsYW5lcyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHJhZGl1cyA8IDEwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAwLjAxO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDA7XHJcbiAgICB9IGVsc2UgaWYgKHJhZGl1cyA8IDEwMCkge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMC4xO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwO1xyXG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDAwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAxMDtcclxuICAgICAgdGhpcy5jYW1lcmEuZmFyID0gMTAwMDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMTAwO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3dhcHMgdGhlIFBCUiBtYXRlcmlhbHMgR0xURkxvYWRlciBidWlsZHMgZm9yIHRoZSBwbGFpbiBQaG9uZyBvbmVzIHRoZSAub2JqIHBhdGggcHJvZHVjZXMuXHJcbiAgICpcclxuICAgKiBNZXNoU3RhbmRhcmRNYXRlcmlhbCBrZWVwcyBhIHNwZWN1bGFyIHJlZmxlY3Rpb24gZXZlbiBhdCBtZXRhbG5lc3MgMCwgc2luY2UgZXZlcnkgZGllbGVjdHJpY1xyXG4gICAqIHJlZmxlY3RzIHNvbWUgbGlnaHQsIGFuZCBGcmVzbmVsIGRyaXZlcyB0aGF0IHJlZmxlY3Rpb24gdG93YXJkcyB3aGl0ZSBhcyBhIHN1cmZhY2UgdHVybnMgYXdheVxyXG4gICAqIGZyb20gdGhlIHZpZXdlci4gT24gYW4gYWVyaWFsIHZpZXcgb2YgYSBmYWNhZGUgbW9zdCBzdXJmYWNlcyBzaXQgYXQgZXhhY3RseSB0aG9zZSBncmF6aW5nXHJcbiAgICogYW5nbGVzLCB3aGljaCBwYWludHMgd2hpdGUgaGlnaGxpZ2h0cyBvdmVyIHdpbmRvdyBmcmFtZXMgYW5kIHJvb2YgZWRnZXMgLSB0aGUgc2FtZSBtb2RlbFxyXG4gICAqIGxvYWRlZCBhcyAub2JqIG5ldmVyIHNob3dzIHRoZW0sIGJlY2F1c2UgTVRMTG9hZGVyIGJ1aWxkcyBQaG9uZyBtYXRlcmlhbHMgYW5kIE9CSkxvYWRlciB6ZXJvZXNcclxuICAgKiB0aGVpciBzcGVjdWxhciB3aGVuIHRoZSAubXRsIGRlY2xhcmVzIE5zIDAuXHJcbiAgICpcclxuICAgKiBDYXB0dXJlZCBtb2RlbHMgY2FycnkgdGhlaXIgbGlnaHRpbmcgaW4gdGhlIHRleHR1cmUgYW5kIHdhbnQgbm8gc3BlY3VsYXIgcmVzcG9uc2UgYXQgYWxsLCBzb1xyXG4gICAqIG1hdGNoaW5nIHRoZSAub2JqIHBhdGggaGVyZSBpcyBib3RoIHRoZSBmaXggYW5kIHRoZSBtb3JlIGZhaXRoZnVsIGNob2ljZS5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBuZXcgTWFwPGFueSwgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw+KCk7XHJcblxyXG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XHJcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbnZlcnQgPSAoc291cmNlOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgIGlmICghc291cmNlIHx8ICEoc291cmNlIGFzIGFueSkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQuaGFzKHNvdXJjZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHBob25nID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtcclxuICAgICAgICAgICAgbWFwOiBzb3VyY2UubWFwLFxyXG4gICAgICAgICAgICBjb2xvcjogc291cmNlLmNvbG9yLFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogc291cmNlLnRyYW5zcGFyZW50LFxyXG4gICAgICAgICAgICBvcGFjaXR5OiBzb3VyY2Uub3BhY2l0eSxcclxuICAgICAgICAgICAgYWxwaGFUZXN0OiBzb3VyY2UuYWxwaGFUZXN0LFxyXG4gICAgICAgICAgICBzaWRlOiBzb3VyY2Uuc2lkZSxcclxuICAgICAgICAgICAgc3BlY3VsYXI6IG5ldyBUSFJFRS5Db2xvcigweDAwMDAwMCksXHJcbiAgICAgICAgICAgIHNoaW5pbmVzczogMCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcGhvbmcubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG4gICAgICAgICAgY29udmVydGVkLnNldChzb3VyY2UsIHBob25nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZC5nZXQoc291cmNlKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1lc2gubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpXHJcbiAgICAgICAgPyBtZXNoLm1hdGVyaWFsLm1hcChjb252ZXJ0KVxyXG4gICAgICAgIDogY29udmVydChtZXNoLm1hdGVyaWFsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBldmVyeSBtYXRlcmlhbCBkb3VibGUtc2lkZWQuXHJcbiAgICpcclxuICAgKiBSZWFsaXR5IGNhcHR1cmUgbWVzaGVzIHJvdXRpbmVseSBjb250YWluIHRyaWFuZ2xlcyB3aXRoIHJldmVyc2VkIHdpbmRpbmcgLSBhbiBhcnRlZmFjdCBvZiB0aGVcclxuICAgKiByZWNvbnN0cnVjdGlvbiwgbm90IG9mIHRoZSBmaWxlLiBXaXRoIHRoZSBkZWZhdWx0IEZyb250U2lkZSB0aG9zZSB0cmlhbmdsZXMgYXJlIGN1bGxlZCwgbGVhdmluZ1xyXG4gICAqIHNjYXR0ZXJlZCBob2xlcyB0aGF0IHNob3cgdGhlIHNjZW5lIGJhY2tncm91bmQgdGhyb3VnaCB0aGUgbW9kZWwuIEFnYWluc3QgYSBsaWdodCBiYWNrZ3JvdW5kXHJcbiAgICogdGhleSByZWFkIGFzIHdoaXRlIHNwZWNrcyB3aXRoIG5vIGRpc2Nlcm5pYmxlIHBhdHRlcm4uXHJcbiAgICpcclxuICAgKiBEcmF3aW5nIGJvdGggc2lkZXMgY29zdHMgYSBsaXR0bGUgZmlsbCByYXRlIGJ1dCBpcyB3aGF0IG1ha2VzIGNhcHR1cmVkIGdlb21ldHJ5IHJlbmRlciBhc1xyXG4gICAqIHNvbGlkOyBvdGhlciB2aWV3ZXJzIG9mIHRoaXMga2luZCBvZiBjb250ZW50IGRvIHRoZSBzYW1lIHVuY29uZGl0aW9uYWxseS5cclxuICAgKi9cclxuICBwcml2YXRlIGZvcmNlRG91YmxlU2lkZWRNYXRlcmlhbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xyXG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChtYXRlcmlhbCAmJiAhc2Vlbi5oYXMobWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICBzZWVuLmFkZChtYXRlcmlhbCk7XHJcbiAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gVEhSRUUuRG91YmxlU2lkZTtcclxuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wdXRlcyByZWFsIHZlcnRleCBub3JtYWxzIGZvciBhbnkgZ2VvbWV0cnkgdGhhdCBhcnJpdmVkIHdpdGhvdXQgdGhlbS5cclxuICAgKlxyXG4gICAqIEEgZ2xURiB3aXRob3V0IGEgTk9STUFMIGF0dHJpYnV0ZSBpcyBzcGVjLWNvbXBsaWFudCwgYW5kIEdMVEZMb2FkZXIgaGFuZGxlcyBpdCBieSBzd2l0Y2hpbmcgdGhlXHJcbiAgICogbWF0ZXJpYWwgdG8gZmxhdFNoYWRpbmcsIHdoaWNoIG1ha2VzIHRoZSBzaGFkZXIgZGVyaXZlIHRoZSBub3JtYWwgcGVyIHBpeGVsIGZyb20gc2NyZWVuLXNwYWNlXHJcbiAgICogZGVyaXZhdGl2ZXMuIFRoYXQgZGVyaXZhdGlvbiBjb2xsYXBzZXMgb24gdGhlIGRlZ2VuZXJhdGUsIG5lZWRsZS10aGluIHRyaWFuZ2xlcyB0aGF0IHJlYWxpdHlcclxuICAgKiBjYXB0dXJlIG1lc2hlcyBhcmUgZnVsbCBvZjogdGhlIGZhY2UgaGFzIGFsbW9zdCBubyBhcmVhLCB0aGUgZGVyaXZlZCBub3JtYWwgaXMgbWVhbmluZ2xlc3MsIGFuZFxyXG4gICAqIGxpZ2h0aW5nIGJsb3dzIHRob3NlIGZyYWdtZW50cyBvdXQgdG8gd2hpdGUgc3BlY2tzIC0gZGVuc2VzdCBleGFjdGx5IHdoZXJlIGZpbmUgZGV0YWlsIGlzLlxyXG4gICAqXHJcbiAgICogQ29tcHV0aW5nIG5vcm1hbHMgZnJvbSB0aGUgZ2VvbWV0cnkgaW5zdGVhZCBpcyByb2J1c3QgdG8gdGhvc2UgdHJpYW5nbGVzLCBzaW5jZSBhIGRlZ2VuZXJhdGVcclxuICAgKiBmYWNlIGNvbnRyaWJ1dGVzIGFsbW9zdCBub3RoaW5nIHRvIHRoZSBhdmVyYWdlIGFuZCBpdHMgbmVpZ2hib3VycyBkb21pbmF0ZS5cclxuICAgKi9cclxuICBwcml2YXRlIGVuc3VyZVZlcnRleE5vcm1hbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbWVzaC5nZW9tZXRyeSBhcyBUSFJFRS5CdWZmZXJHZW9tZXRyeTtcclxuICAgICAgaWYgKGdlb21ldHJ5LmdldEF0dHJpYnV0ZSgnbm9ybWFsJykpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XHJcblxyXG4gICAgICAvLyBHTFRGTG9hZGVyIGFscmVhZHkgc3dpdGNoZWQgdGhlc2UgbWF0ZXJpYWxzIHRvIGZsYXRTaGFkaW5nIGJlY2F1c2Ugbm9ybWFscyB3ZXJlIG1pc3Npbmc7XHJcbiAgICAgIC8vIG5vdyB0aGF0IHJlYWwgb25lcyBleGlzdCwgbGV0IHRoZW0gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZXJpdmF0aXZlIGZhbGxiYWNrLlxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZmxhdFNoYWRpbmcpIHtcclxuICAgICAgICAgIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJlcyBob3cgZXZlcnkgdGV4dHVyZSBpbiBhIG1vZGVsIGlzIHNhbXBsZWQ6IG1heGltdW0gYW5pc290cm9weSwgYW5kIG5vIG1pcG1hcHBpbmcuXHJcbiAgICpcclxuICAgKiBQaG90b2dyYW1tZXRyeSBhdGxhc2VzIHBhY2sgdGhlaXIgVVYgaXNsYW5kcyB3aXRoIHVudXNlZCBndXR0ZXIgcGl4ZWxzIGJldHdlZW4gdGhlbS4gTWlwbWFwcGluZ1xyXG4gICAqIGF2ZXJhZ2VzIG5laWdoYm91cmluZyBwaXhlbHMgYXQgZWFjaCBsZXZlbCwgc28gdGhvc2UgZ3V0dGVycyBibGVlZCBmdXJ0aGVyIGludG8gdGhlIGlzbGFuZHMgdGhlXHJcbiAgICogc21hbGxlciB0aGUgbGV2ZWwgZ2V0cyAtIGFuZCB2aWV3aW5nIHRoZSB3aG9sZSBtb2RlbCBhdCBvbmNlIHVzZXMgdGhlIHNtYWxsZXN0IGxldmVscywgcGFpbnRpbmdcclxuICAgKiBicmlnaHQgZ3V0dGVyIHBpeGVscyBvdmVyIHRoZSBlZGdlcyBvZiBmaW5lIGRldGFpbC4gU2FtcGxpbmcgdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBhdm9pZHNcclxuICAgKiB0aGF0LCBhdCB0aGUgY29zdCBvZiBzb21lIHNoaW1tZXIgb24gbWluaWZpZWQgc3VyZmFjZXMuXHJcbiAgICpcclxuICAgKiBOb3RlIHRoYXQgYW5pc290cm9weSBvbmx5IHRha2VzIGVmZmVjdCB3aGlsZSBtaXBtYXBwaW5nIGlzIG9uLCBzbyB3aXRoIHRoZSBzZXR0aW5ncyBiZWxvdyBpdCBpc1xyXG4gICAqIGluZXJ0OyBpdCBpcyBzZXQgYW55d2F5IHNvIHRoZSBzYW1wbGluZyBzdGF5cyBjb3JyZWN0IGZvciBhbnlvbmUgd2hvIHJlLWVuYWJsZXMgbWlwbWFwcyBoZXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHVuZVRleHR1cmVTYW1wbGluZyhyb290OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSB0aGlzLnJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XHJcbiAgICBpZiAoIW1heEFuaXNvdHJvcHkgfHwgbWF4QW5pc290cm9weSA8PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XHJcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xyXG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcclxuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNhbWUgdGV4dHVyZSBpcyByZXVzZWQgYWNyb3NzIHRoZSBtb2RlbCdzIG1hdGVyaWFsczsgb25seSB0b3VjaCBlYWNoIG9uZSBvbmNlLlxyXG4gICAgICAgIFsnbWFwJywgJ25vcm1hbE1hcCcsICdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJywgJ2VtaXNzaXZlTWFwJywgJ2FvTWFwJ10uZm9yRWFjaCgoc2xvdCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG1hdGVyaWFsW3Nsb3RdO1xyXG4gICAgICAgICAgaWYgKHRleHR1cmUgJiYgIXNlZW4uaGFzKHRleHR1cmUpKSB7XHJcbiAgICAgICAgICAgIHNlZW4uYWRkKHRleHR1cmUpO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5O1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhbiBPQkogbW9kZWwgd2l0aCBNVEwuXHJcbiAgICogVGhlIGhlYXZ5IHRleHQtcGFyc2luZyBzdGVwIHJ1bnMgaW4gYSBXZWIgV29ya2VyIHdoZW4gb25lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhXHJcbiAgICogc2V0T2JqUGFyc2VyV29ya2VyIChzZWUgdGhlcmUgZm9yIHdoeSB0aGUgYXBwLCBub3QgdGhpcyBsaWJyYXJ5LCBwcm92aWRlcyBpdCk7IHRoaXMga2VlcHNcclxuICAgKiB0aGUgbWFpbiB0aHJlYWQgZnJlZSB3aGlsZSBsYXJnZSBhcmNoaXRlY3R1cmUgbW9kZWxzIChtaWxsaW9ucyBvZiB2ZXJ0aWNlcykgYXJlIHBhcnNlZC5cclxuICAgKiBGYWxscyBiYWNrIHRvIHBhcnNpbmcgb24gdGhlIG1haW4gdGhyZWFkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBsb2FkT2JqTW9kZWwobXRsVXJsOiBzdHJpbmcsIG9ialVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcclxuICAgIGNvbnN0IG10bExvYWRlciA9IG5ldyBNVExMb2FkZXIoKTtcclxuICAgIGNvbnN0IGJhc2VQYXRoID0gbXRsVXJsLnN1YnN0cmluZygwLCBtdGxVcmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xyXG4gICAgbXRsTG9hZGVyLnNldFBhdGgoYmFzZVBhdGgpO1xyXG4gICAgY29uc3QgbXRsRmlsZU5hbWUgPSBtdGxVcmwuc3Vic3RyaW5nKG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XHJcblxyXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbXRsTG9hZGVyLmxvYWQobXRsRmlsZU5hbWUsIChtYXRlcmlhbHMpID0+IHtcclxuICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9ialBhcnNlcldvcmtlcikge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdE9ialBhcnNlSW5Xb3JrZXIob2JqVXJsKVxyXG4gICAgICAgICAgLnRoZW4oKG1lc2hlcykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG4gICAgICAgICAgICBtZXNoZXMuZm9yRWFjaCgobWVzaERhdGEpID0+IHtcclxuICAgICAgICAgICAgICBncm91cC5hZGQodGhpcy5tZXNoRnJvbVBhcnNlZERhdGEobWVzaERhdGEsIG1hdGVyaWFscykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ3JvdXAsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIE9CSiBtb2RlbCBpbiB3b3JrZXI6JywgZXJyb3IpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcbiAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIG9iakxvYWRlci5sb2FkKG9ialVybCwgKG9iamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcclxuICAgICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgIH0sIHVuZGVmaW5lZCwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBPQkogbW9kZWw6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCB1bmRlZmluZWQsIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIE1UTCBmaWxlOicsIGVycm9yKTtcclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2VudGVycywgc2NhbGVzIGFuZCBhZGRzIGEgbG9hZGVkIG9iamVjdCB0byB0aGUgc2NlbmUsIHRoZW4gZnJhbWVzIHRoZSBjYW1lcmEgb24gaXQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZUxvYWRlZE9iamVjdEluU2NlbmUob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCB1cD86IFRocmVlSnNNb2RlbFVwKTogdm9pZCB7XHJcbiAgICBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcclxuICAgIGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBtYXhEaW0gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGNvbnN0IHNjYWxlID0gbWF4RGltID4gMCA/IDEwIC8gbWF4RGltIDogMTtcclxuXHJcbiAgICAvLyBUd28gbmVzdGVkIGdyb3VwcyBzbyB0YWdzIGNhbiBzaGFyZSB0aGUgbW9kZWwncyBmcmFtZTogYGNlbnRlcmVkYCBjYXJyaWVzIHRoZSBvZmZzZXQgdGhhdFxyXG4gICAgLy8gbW92ZXMgdGhlIG1vZGVsJ3Mgb3duIG9yaWdpbiB0byB0aGUgc2NlbmUgb3JpZ2luLCBgZ3JvdXBgIGNhcnJpZXMgdGhlIHNjYWxlLiBBIHRhZyBwb3NpdGlvbmVkXHJcbiAgICAvLyB3aXRoIHJhdyBQT0kgY29vcmRpbmF0ZXMgdGhlbiBsYW5kcyBpbiB0aGUgc2FtZSBwbGFjZSB0aGUgbW9kZWwncyBnZW9tZXRyeSBkb2VzLlxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcclxuICAgIGNvbnN0IGNlbnRlcmVkID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgICBjZW50ZXJlZC5wb3NpdGlvbi5zdWIoY2VudGVyKTtcclxuXHJcbiAgICBpZiAocm90YXRpb24pIHtcclxuICAgICAgb2JqZWN0LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcclxuICAgIH1cclxuICAgIC8vIFdoaWNoIHdheSBpcyB1cC4gQSBjaG9pY2Ugc29tZW9uZSBtYWRlIGJ5IGhhbmQgYWx3YXlzIHdpbnM7IG90aGVyd2lzZSwgdW5sZXNzIHRoZSBtb2RlbCBjYW1lXHJcbiAgICAvLyB3aXRoIGFuIG9yaWVudGF0aW9uIG9mIGl0cyBvd24sIGl0IGlzIHdvcmtlZCBvdXQgZnJvbSB0aGUgZ2VvbWV0cnkuIEFwcGxpZWQgdG8gdGhlIG91dGVyXHJcbiAgICAvLyBncm91cCwgYWJvdmUgYm90aCB0aGUgbW9kZWwgYW5kIHRoZSB0YWdzOiB0aGV5IHR1cm4gdG9nZXRoZXIsIGFuZCBldmVyeSBjb29yZGluYXRlIGFscmVhZHlcclxuICAgIC8vIHN0b3JlZCAtIHRhZyBwb3NpdGlvbnMsIHRoZSBjYWxpYnJhdGlvbiAtIGtlZXBzIG1lYW5pbmcgd2hhdCBpdCBtZWFudC5cclxuICAgIHRoaXMubW9kZWxHcm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5tb2RlbFVwID0gdXAgPz8gKHJvdGF0aW9uID8gJ3knIDogdGhpcy5kZXRlY3RNb2RlbFVwKG9iamVjdCwgc2l6ZSkpO1xyXG4gICAgZ3JvdXAucXVhdGVybmlvbi5jb3B5KHRoaXMudXByaWdodFJvdGF0aW9uKHRoaXMubW9kZWxVcCkpO1xyXG5cclxuICAgIHRoaXMubW9kZWxSb290ID0gb2JqZWN0O1xyXG4gICAgdGhpcy5tb2RlbFdvcmxkUmFkaXVzID0gKHNpemUubGVuZ3RoKCkgLyAyKSAqIHNjYWxlO1xyXG4gICAgLy8gVGhlIGJveCBhYm92ZSB3YXMgbWVhc3VyZWQgYmVmb3JlIGFueSByb3RhdGlvbiBmcm9tIHRoZSBtZXRhZGF0YSB3YXMgYXBwbGllZDsgd2l0aCBvbmUsIGl0XHJcbiAgICAvLyBoYXMgdG8gYmUgbWVhc3VyZWQgYWdhaW4gdG8gYmUgdGhlIG1vZGVsIGFzIGl0IGFjdHVhbGx5IHNpdHMuXHJcbiAgICB0aGlzLmJ1aWxkU3VyZmFjZUdyaWQob2JqZWN0LCByb3RhdGlvbiA/IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpIDogYm94KTtcclxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcclxuICAgIC8vIE1hcmtzIHRoZSBtb2RlbCBmb3IgdGhlIGRlcHRoIHBpY2ssIHdoaWNoIHJlbmRlcnMgdGhpcyBsYXllciBhbG9uZSAtIHNvIHRhZ3MgYW5kIHRoZSBnaG9zdFxyXG4gICAgLy8gaXRzZWxmIGNhbm5vdCBlbmQgdXAgYmVpbmcgd2hhdCB0aGUgY3Vyc29yIHJlcG9ydHMgYXMgdGhlIHN1cmZhY2UgdW5kZXIgaXQuXHJcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiBjaGlsZC5sYXllcnMuZW5hYmxlKFRocmVlSnNTZXJ2aWNlLlBJQ0tfTEFZRVIpKTtcclxuICAgIGNlbnRlcmVkLmFkZChvYmplY3QpO1xyXG4gICAgY2VudGVyZWQuYWRkKHRoaXMudGFnR3JvdXApO1xyXG4gICAgY2VudGVyZWQuYWRkKHRoaXMubW9kZWxUYWdHcm91cCk7XHJcbiAgICBncm91cC5hZGQoY2VudGVyZWQpO1xyXG4gICAgZ3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlKTtcclxuXHJcbiAgICB0aGlzLnNjZW5lLmFkZChncm91cCk7XHJcblxyXG4gICAgLy8gVGFncyByZWdpc3RlcmVkIGJlZm9yZSB0aGUgbW9kZWwgZmluaXNoZWQgbG9hZGluZyB3ZXJlIHNpemVkIGFnYWluc3QgdGhlIG9sZCBzY2FsZS5cclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHRoaXMuc2NhbGVUYWdGb3JNb2RlbChzcHJpdGUpKTtcclxuXHJcbiAgICB0aGlzLmFkanVzdENsaXBwaW5nUGxhbmVzKChzaXplLmxlbmd0aCgpIC8gMikgKiBzY2FsZSk7XHJcblxyXG4gICAgaWYgKGNhbWVyYVBvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldChjYW1lcmFQb3NpdGlvbi54LCBjYW1lcmFQb3NpdGlvbi55LCBjYW1lcmFQb3NpdGlvbi56KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCA1LCAxNSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hpY2ggb2YgdGhlIG1vZGVsJ3MgYXhlcyBpcyBpdHMgdmVydGljYWw6ICd5JyB3aGVuIGl0IGFscmVhZHkgc3RhbmRzIHVwcmlnaHQsIG9yIHdoZW4gaXQgaXNcclxuICAgKiBub3QgY2xlYXIgZW5vdWdoIHRvIGFjdCBvbi5cclxuICAgKlxyXG4gICAqIE1vZGVscyBhcnJpdmUgaW4gdHdvIGNvbnZlbnRpb25zOiBZIHVwIChnbFRGLCBhbmQgd2hhdCB0aGlzIHZpZXdlciBhc3N1bWVzKSBhbmQgWiB1cCAobW9zdCBDQURcclxuICAgKiBhbmQgc2Nhbm5pbmcgZXhwb3J0cykuIEEgWi11cCBtb2RlbCBsb2FkcyBseWluZyBvbiBpdHMgc2lkZS4gVHdvIGluZGVwZW5kZW50IGN1ZXMgc2F5IHdoaWNoXHJcbiAgICogYXhpcyBpcyB0aGUgdmVydGljYWwgb25lLCBhbmQgYm90aCBoYXZlIHRvIGFncmVlIGJlZm9yZSBhbnl0aGluZyBpcyB0dXJuZWQ6XHJcbiAgICpcclxuICAgKiAgLSBTdXJmYWNlIGFyZWEuIEZsb29ycyBhbmQgY2VpbGluZ3MgYWxsIGZhY2UgYWxvbmcgdGhlIHZlcnRpY2FsLCB3aGlsZSB3YWxscyBhcmUgc2hhcmVkIG91dFxyXG4gICAqICAgIGJldHdlZW4gdGhlIHR3byBob3Jpem9udGFsIGF4ZXMsIHNvIHRoZSB2ZXJ0aWNhbCB1c3VhbGx5IGNvbGxlY3RzIHRoZSBtb3N0IGFyZWEuXHJcbiAgICogIC0gRXh0ZW50LiBBIGJ1aWxkaW5nIGlzIG5vcm1hbGx5IHdpZGVyIHRoYW4gaXQgaXMgdGFsbCwgc28gdGhlIHZlcnRpY2FsIGlzIGl0cyBzaG9ydGVzdCBzaWRlLlxyXG4gICAqXHJcbiAgICogRWl0aGVyIGFsb25lIGlzIHdyb25nIG9mdGVuIGVub3VnaCB0byBtYXR0ZXIgLSBhIGxvbmcgY29ycmlkb3IgaGFzIG1vcmUgd2FsbCB0aGFuIGZsb29yLCBhXHJcbiAgICogdG93ZXIgaXMgdGFsbGVyIHRoYW4gaXQgaXMgd2lkZSAtIGFuZCB0dXJuaW5nIGEgbW9kZWwgdGhhdCB3YXMgZmluZSBpcyB3b3JzZSB0aGFuIGxlYXZpbmcgb25lXHJcbiAgICogdGhhdCB3YXMgbm90LiBBIG1vZGVsIHRoYXQgYWxyZWFkeSBoYXMgWSBhcyBpdHMgdmVydGljYWwgaXMgbmV2ZXIgdG91Y2hlZC5cclxuICAgKi9cclxuICBwcml2YXRlIGRldGVjdE1vZGVsVXAob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgc2l6ZTogVEhSRUUuVmVjdG9yMyk6IFRocmVlSnNNb2RlbFVwIHtcclxuICAgIGNvbnN0IGF4ZXMgPSBbJ3gnLCAneScsICd6J10gYXMgY29uc3Q7XHJcbiAgICAvLyBQcm9qZWN0ZWQgYXJlYSBmYWNpbmcgZWFjaCB3YXkgYWxvbmcgZWFjaCBheGlzOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXS5cclxuICAgIGNvbnN0IGFyZWEgPSB7IHg6IFswLCAwXSwgeTogWzAsIDBdLCB6OiBbMCwgMF0gfTtcclxuXHJcbiAgICBsZXQgdHJpYW5nbGVDb3VudCA9IDA7XHJcbiAgICBvYmplY3QudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xyXG4gICAgICBpZiAocG9zaXRpb24pIHtcclxuICAgICAgICB0cmlhbmdsZUNvdW50ICs9IChjaGlsZC5nZW9tZXRyeS5pbmRleCA/IGNoaWxkLmdlb21ldHJ5LmluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodHJpYW5nbGVDb3VudCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gJ3knO1xyXG4gICAgfVxyXG4gICAgLy8gQSBzYW1wbGUgaXMgcGxlbnR5IHRvIHNlZSB3aGVyZSB0aGUgYXJlYSBsaWVzLCBhbmQga2VlcHMgdGhpcyBjaGVhcCBvbiBtb2RlbHMgd2l0aCBtaWxsaW9uc1xyXG4gICAgLy8gb2YgdHJpYW5nbGVzLlxyXG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRyaWFuZ2xlQ291bnQgLyAyMDAwMDApKTtcclxuXHJcbiAgICBjb25zdCBhID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgY29uc3QgYyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBjb25zdCBub3JtYWwgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgb2JqZWN0LnRyYXZlcnNlKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2hpbGQuaXNNZXNoICYmIGNoaWxkLmdlb21ldHJ5Py5hdHRyaWJ1dGVzPy5wb3NpdGlvbjtcclxuICAgICAgaWYgKCFwb3NpdGlvbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpbmRleCA9IGNoaWxkLmdlb21ldHJ5LmluZGV4O1xyXG4gICAgICBjb25zdCBjb3VudCA9IChpbmRleCA/IGluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcclxuICAgICAgZm9yIChsZXQgdHJpYW5nbGUgPSAwOyB0cmlhbmdsZSA8IGNvdW50OyB0cmlhbmdsZSArPSBzdHJpZGUpIHtcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0cmlhbmdsZSAqIDM7XHJcbiAgICAgICAgYS5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0KSA6IG9mZnNldCkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcclxuICAgICAgICBiLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24sIGluZGV4ID8gaW5kZXguZ2V0WChvZmZzZXQgKyAxKSA6IG9mZnNldCArIDEpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgYy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMikgOiBvZmZzZXQgKyAyKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xyXG4gICAgICAgIC8vIFRoZSBjcm9zcyBwcm9kdWN0J3MgbGVuZ3RoIGlzIHR3aWNlIHRoZSB0cmlhbmdsZSdzIGFyZWEsIHNvIGl0cyBjb21wb25lbnRzIGFyZSB0aGVcclxuICAgICAgICAvLyBhcmVhIHRoZSB0cmlhbmdsZSBzaG93cyBhbG9uZyBlYWNoIGF4aXMuXHJcbiAgICAgICAgbm9ybWFsLmNyb3NzVmVjdG9ycyhiLnN1YihhKSwgYy5zdWIoYSkpO1xyXG4gICAgICAgIGF4ZXMuZm9yRWFjaCgoYXhpcykgPT4ge1xyXG4gICAgICAgICAgYXJlYVtheGlzXVtub3JtYWxbYXhpc10gPj0gMCA/IDAgOiAxXSArPSBNYXRoLmFicyhub3JtYWxbYXhpc10pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0b3RhbCA9IHsgeDogYXJlYS54WzBdICsgYXJlYS54WzFdLCB5OiBhcmVhLnlbMF0gKyBhcmVhLnlbMV0sIHo6IGFyZWEuelswXSArIGFyZWEuelsxXSB9O1xyXG4gICAgY29uc3QgYnlBcmVhID0gYXhlcy5yZWR1Y2UoKGJlc3QsIGF4aXMpID0+ICh0b3RhbFtheGlzXSA+IHRvdGFsW2Jlc3RdID8gYXhpcyA6IGJlc3QpLCAneScgYXMgdHlwZW9mIGF4ZXNbbnVtYmVyXSk7XHJcbiAgICBjb25zdCBieUV4dGVudCA9IGF4ZXMucmVkdWNlKChiZXN0LCBheGlzKSA9PiAoc2l6ZVtheGlzXSA8IHNpemVbYmVzdF0gPyBheGlzIDogYmVzdCksICd5JyBhcyB0eXBlb2YgYXhlc1tudW1iZXJdKTtcclxuICAgIGlmIChieUFyZWEgPT09ICd5JyB8fCBieUFyZWEgIT09IGJ5RXh0ZW50IHx8IHRvdGFsW2J5QXJlYV0gPCAxLjI1ICogdG90YWwueSkge1xyXG4gICAgICByZXR1cm4gJ3knO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoaWNoIHdheSBhbG9uZyB0aGF0IGF4aXMgaXMgdXAuIFJvb2ZzIGFuZCBncm91bmQgbWFrZSBhbiBvdXRkb29yIG1vZGVsIGZhY2UgbW9zdGx5IHVwd2FyZCxcclxuICAgIC8vIHdoaWNoIHNldHRsZXMgaXQ7IGluZG9vcnMgZmxvb3JzIGFuZCBjZWlsaW5ncyBiYWxhbmNlIG91dCwgYW5kIHRoZSBjb252ZW50aW9uIC0gcG9zaXRpdmUgaXNcclxuICAgIC8vIHVwIC0gaXMgdGhlIGJldHRlciBndWVzcy5cclxuICAgIGNvbnN0IFtwb3NpdGl2ZSwgbmVnYXRpdmVdID0gYXJlYVtieUFyZWFdO1xyXG4gICAgY29uc3QgdXAgPSBgJHtuZWdhdGl2ZSA+IDAuNjUgKiAocG9zaXRpdmUgKyBuZWdhdGl2ZSkgPyAnLScgOiAnJ30ke2J5QXJlYX1gIGFzIFRocmVlSnNNb2RlbFVwO1xyXG4gICAgY29uc29sZS5pbmZvKGBUaHJlZUpzU2VydmljZTogdGhpcyBtb2RlbCdzIHZlcnRpY2FsIGF4aXMgbG9va3MgbGlrZSAke3VwfSwgbm90IHkgLSBzdGFuZGluZyBpdCB1cHJpZ2h0LmApO1xyXG4gICAgcmV0dXJuIHVwO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSByb3RhdGlvbiB0aGF0IGJyaW5ncyB0aGUgZ2l2ZW4gbW9kZWwgYXhpcyB0byBwb2ludCB1cC4gKi9cclxuICBwcml2YXRlIHVwcmlnaHRSb3RhdGlvbih1cDogVGhyZWVKc01vZGVsVXApOiBUSFJFRS5RdWF0ZXJuaW9uIHtcclxuICAgIGNvbnN0IGF4aXMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgYXhpc1t1cC5yZXBsYWNlKCctJywgJycpIGFzICd4JyB8ICd5JyB8ICd6J10gPSB1cC5zdGFydHNXaXRoKCctJykgPyAtMSA6IDE7XHJcbiAgICByZXR1cm4gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMoYXhpcywgbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoaWNoIG9mIHRoZSBtb2RlbCdzIGF4ZXMgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgdXAsIHdoZXRoZXIgY2hvc2VuIG9yIHdvcmtlZCBvdXQuICovXHJcbiAgZ2V0TW9kZWxVcCgpOiBUaHJlZUpzTW9kZWxVcCB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbFVwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHVybnMgdGhlIG1vZGVsIHNvIHRoZSBnaXZlbiBheGlzIHBvaW50cyB1cCwgYXQgb25jZS5cclxuICAgKlxyXG4gICAqIFRoZSBtb2RlbCBhbmQgaXRzIHRhZ3MgdHVybiBhcyBvbmUsIHNvIG5vdGhpbmcgc3RvcmVkIGhhcyB0byBiZSByZWNvbXB1dGVkLiBUaGUgY2FsbGVyIGlzXHJcbiAgICogZXhwZWN0ZWQgdG8gc3RvcmUgdGhlIGNob2ljZSwgb3IgdGhlIG5leHQgbG9hZCBnb2VzIGJhY2sgdG8gd29ya2luZyBpdCBvdXQuXHJcbiAgICovXHJcbiAgc2V0TW9kZWxVcCh1cDogVGhyZWVKc01vZGVsVXApOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWxVcCA9IHVwO1xyXG4gICAgdGhpcy5tb2RlbEdyb3VwPy5xdWF0ZXJuaW9uLmNvcHkodGhpcy51cHJpZ2h0Um90YXRpb24odXApKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtlZXBzIHRoZSBkcmF3aW5nIGJ1ZmZlciBhbmQgY2FtZXJhIG1hdGNoZWQgdG8gdGhlIGNhbnZhcyBhcyBpdCBpcyByZXNpemVkLlxyXG4gICAqXHJcbiAgICogcmVuZGVyZXIuc2V0U2l6ZSgpIHdyaXRlcyBleHBsaWNpdCBwaXhlbCB3aWR0aC9oZWlnaHQgaW50byB0aGUgY2FudmFzJ3Mgc3R5bGUsIG92ZXJyaWRpbmcgdGhlXHJcbiAgICogMTAwJS8xMDAlIGl0IHN0YXJ0cyB3aXRoLiBXaXRob3V0IHRoaXMsIHRoZSBjYW52YXMga2VlcHMgd2hhdGV2ZXIgc2l6ZSBpdCBoYWQgYXQgc3RhcnR1cDogaGlkaW5nXHJcbiAgICogdGhlIHRvcCBtZW51IGdyb3dzIHRoZSBjb250YWluZXIsIHRoZSBjYW52YXMgZG9lcyBub3QgZm9sbG93LCBhbmQgdGhlIHN0cmlwIHRoYXQgb3BlbnMgdXAgc2hvd3NcclxuICAgKiB0aGUgcGFnZSBiZWhpbmQgaXQgaW5zdGVhZCBvZiB0aGUgc2NlbmUuXHJcbiAgICpcclxuICAgKiBUaGUgcGFyZW50IGlzIG9ic2VydmVkIHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIGJlY2F1c2UgcmVzaXppbmcgdGhlIGNhbnZhcyBpcyB3aGF0IHRoaXMgcmVhY3RzXHJcbiAgICogdG8gLSB3YXRjaGluZyB0aGUgZWxlbWVudCB3ZSByZXNpemUgd291bGQgcmV0cmlnZ2VyIHRoZSBvYnNlcnZlci5cclxuICAgKi9cclxuICBwcml2YXRlIG9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBpZiAoIWNvbnRhaW5lciB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcclxuICAgICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0cyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBpcywgdGhyZWUgdGltZXMuXHJcbiAgICpcclxuICAgKiBFeGlzdGluZyB0YWdzIGFyZSB0aGUgY29ycmVzcG9uZGVuY2VzIC0gdGhleSBhbHJlYWR5IGNhcnJ5IHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgc28gdGhlIHBlcnNvblxyXG4gICAqIG9ubHkgaGFzIHRvIHN1cHBseSB0aGUgbWF0Y2hpbmcgc3BvdCBvbiB0aGUgbW9kZWwuIE5vIG5ldyByZWNvcmRzIGFyZSB3cml0dGVuOyBub3RoaW5nIGlzXHJcbiAgICogYXBwbGllZCB1bnRpbCBzb2x2ZUFsaWdubWVudEZyb21QYWlycygpIHN1Y2NlZWRzLlxyXG4gICAqL1xyXG4gIHN0YXJ0VGFnQWxpZ25tZW50KCk6IHZvaWQge1xyXG4gICAgLy8gT25lIHBvaW50ZXIgbW9kZSBhdCBhIHRpbWUsIHRoZSBzYW1lIHJ1bGUgc3RhcnRNZWFzdXJpbmcoKSBhcHBsaWVzIHRoZSBvdGhlciB3YXkgcm91bmQuXHJcbiAgICBpZiAodGhpcy5tZWFzdXJpbmcpIHtcclxuICAgICAgdGhpcy5jYW5jZWxNZWFzdXJpbmcoKTtcclxuICAgIH1cclxuICAgIHRoaXMuYWxpZ25pbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycyA9IFtdO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSBudWxsO1xyXG4gICAgLy8gV2hpbGUgY2FsaWJyYXRpbmcsIHRoZSB0YWdzIGZyb20gZWxzZXdoZXJlIGFyZSBhbGwgc2hvd24gLSBpbmNsdWRpbmcgdGhlIG9uZXMgb2ZmIHRoZSBtb2RlbCxcclxuICAgIC8vIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBvbmVzIGEgY2FsaWJyYXRpb24gaXMgZm9yLlxyXG4gICAgdGhpcy5yZWZyZXNoVGFnVmlzaWJpbGl0eSgpO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7IHBhaXJzOiAwLCBhd2FpdGluZzogJ3RhZycgfSk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxUYWdBbGlnbm1lbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YXNBbGlnbmluZyA9IHRoaXMuYWxpZ25pbmc7XHJcbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmFsaWdubWVudFBhaXJzID0gW107XHJcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7IHBhaXJzOiAwLCBhd2FpdGluZzogbnVsbCB9KTtcclxuICAgIGlmICh3YXNBbGlnbmluZykge1xyXG4gICAgICB0aGlzLmFsaWdubWVudENhbmNlbGxlZCQubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNBbGlnbmluZ1RhZ3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGlnbmluZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIHBvaW50ZXIgc2hvdWxkIGJlIHNob3dpbmcgdGhlIHBsYWNlbWVudCBnaG9zdC5cclxuICAgKlxyXG4gICAqIFRydWUgd2hpbGUgcGxhY2luZyBhIHRhZywgYW5kIHdoaWxlIGNhbGlicmF0aW5nIG9uY2UgYSB0YWcgaGFzIGJlZW4gcGlja2VkIC0gdGhhdCBzZWNvbmQgY2xpY2tcclxuICAgKiBpcyB0aGUgc2FtZSBxdWVzdGlvbiAoXCJ3aGVyZSBvbiB0aGUgbW9kZWw/XCIpIGFuZCBkZXNlcnZlcyB0aGUgc2FtZSBhaW1pbmcgYWlkLiBOb3QgdHJ1ZSBmb3IgdGhlXHJcbiAgICogZmlyc3QgaGFsZiBvZiBhIHBhaXIsIHdoaWNoIGlzIGEgY2xpY2sgb24gYSB0YWcsIG5vdCBvbiB0aGUgbW9kZWwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1ByZXZpZXdpbmdQbGFjZW1lbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjaW5nVGFnIHx8IHRoaXMubWVhc3VyaW5nIHx8ICh0aGlzLmFsaWduaW5nICYmICEhdGhpcy5hbGlnbm1lbnRTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgYSB0YWcgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC4gKi9cclxuICBoYXNUYWcoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRhZ1Nwcml0ZXMuaGFzKGVsZW1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogSG93IG1hbnkgdGFncyBhcmUgb24gc2hvdyAtIHRoZSBvbmVzIGEgcGVyc29uIGNvdWxkIGFjdHVhbGx5IGNsaWNrLiAqL1xyXG4gIGdldFRhZ0NvdW50KCk6IG51bWJlciB7XHJcbiAgICBsZXQgdmlzaWJsZSA9IDA7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIGlmIChzcHJpdGUudmlzaWJsZSkge1xyXG4gICAgICAgIHZpc2libGUgKz0gMTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmlzaWJsZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvbHZlcyBhbmQgYXBwbGllcyB0aGUgYWxpZ25tZW50IGNvbGxlY3RlZCBzbyBmYXIsIHJldHVybmluZyBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwZXJzaXN0IGl0LlxyXG4gICAqXHJcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHRocmVlIHRhZ3MgdHVybiBvdXQgdG8gYmUgY29sbGluZWFyLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaXMgYXBwbGllZCBhbmRcclxuICAgKiB0aGUgd2Fsa3Rocm91Z2ggc3RheXMgb3BlbiBmb3IgdGhlIHBlcnNvbiB0byBwaWNrIGEgYmV0dGVyIHRoaXJkIHBvaW50LlxyXG4gICAqL1xyXG4gIHNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IHVwID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIHVwW3RoaXMubW9kZWxVcC5yZXBsYWNlKCctJywgJycpIGFzICd4JyB8ICd5JyB8ICd6J10gPSB0aGlzLm1vZGVsVXAuc3RhcnRzV2l0aCgnLScpID8gLTEgOiAxO1xyXG4gICAgY29uc3QgYWxpZ25tZW50ID0gc29sdmVUaHJlZUpzQWxpZ25tZW50KHRoaXMuYWxpZ25tZW50UGFpcnMsIHVwKTtcclxuICAgIGlmICghYWxpZ25tZW50KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gT3V0IG9mIGNhbGlicmF0aW5nIG1vZGUgZmlyc3Q6IGFwcGx5aW5nIHRoZSByZXN1bHQgcmUtZGVjaWRlcyB3aGljaCB0YWdzIHNob3csIGFuZCBmcm9tIGhlcmVcclxuICAgIC8vIG9uIHRoYXQgaXMgdGhlIG9uZXMgb24gdGhlIG1vZGVsIGFnYWluLCBub3QgYWxsIG9mIHRoZW0uXHJcbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MoYWxpZ25tZW50KTtcclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoLCBhd2FpdGluZzogbnVsbCB9KTtcclxuICAgIHJldHVybiBhbGlnbm1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIGEgbmV3IGNhbGlicmF0aW9uIHdoaWxlIGtlZXBpbmcgZXZlcnkgdGFnIHBsYWNlZCBpbiB0aGlzIG1vZGVsIGV4YWN0bHkgd2hlcmUgaXQgaXMuXHJcbiAgICpcclxuICAgKiBBIGNhbGlicmF0aW9uIGlzIHdvcmtlZCBvdXQgZm9yIHRoZSB0YWdzIHRoYXQgY2FtZSBmcm9tIGVsc2V3aGVyZS4gVGhlIG1vZGVsJ3Mgb3duIHRhZ3Mgd2VyZSBwdXRcclxuICAgKiB3aGVyZSB0aGV5IGFyZSBieSBzb21lb25lIGNsaWNraW5nIHRoZSBtb2RlbCwgc28gdGhleSBtdXN0IG5vdCBmb2xsb3cgaXQuIFRoZWlyIHN0b3JlZFxyXG4gICAqIGNvb3JkaW5hdGVzIGFyZSByZXdyaXR0ZW4gaW5zdGVhZDogaW50byB0aGUgc2hhcmVkIHNwYWNlIGFzIHRoZSBuZXcgY2FsaWJyYXRpb24gZGVmaW5lcyBpdC5cclxuICAgKiBUaGF0IGlzIGFsc28gd2hhdCBtYWtlcyB0aGVtIGNvbXBhcmFibGUgd2l0aCBvdGhlciB2aXNpdHMgZnJvbSBoZXJlIG9uIC0gYSB0YWcgcGxhY2VkIGJlZm9yZVxyXG4gICAqIHRoZSBtb2RlbCB3YXMgY2FsaWJyYXRlZCB3YXMgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB2aXNpYmxlIG5vd2hlcmUgZWxzZS5cclxuICAgKlxyXG4gICAqIFRoZSByZXdyaXR0ZW4gdGFncyBhcmUga2VwdCBmb3IgdGhlIGNhbGxlciB0byBzdG9yZTsgc2VlIHRha2VSZWJhc2VkVGFncygpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlBbGlnbm1lbnRLZWVwaW5nT3duVGFncyhhbGlnbm1lbnQ6IFRocmVlSnNBbGlnbm1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG93biA9IFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLmZpbHRlcigoc3ByaXRlKSA9PiB0aGlzLmlzT3duZWRCeVZpc2l0KHNwcml0ZSkpO1xyXG4gICAgLy8gV2hlcmUgZWFjaCBvbmUgaXMgbm93LCBpbiB0aGUgc3BhY2UgdGhlIG1vZGVsIHNpdHMgaW4sIGFuZCBob3cgaXRzIHBhcmVudCB3YXMgdHVybmVkLlxyXG4gICAgY29uc3QgcGxhY2VkID0gb3duLm1hcCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIHNwcml0ZS5wYXJlbnQ/LnVwZGF0ZU1hdHJpeCgpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHNwcml0ZSxcclxuICAgICAgICBwb3NpdGlvbjogc3ByaXRlLnBvc2l0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHNwcml0ZS5wYXJlbnQ/Lm1hdHJpeCA/PyBuZXcgVEhSRUUuTWF0cml4NCgpKSxcclxuICAgICAgICB0dXJuOiBzcHJpdGUucGFyZW50Py5xdWF0ZXJuaW9uLmNsb25lKCkgPz8gbmV3IFRIUkVFLlF1YXRlcm5pb24oKSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudCk7XHJcblxyXG4gICAgY29uc3QgaW52ZXJzZSA9IHRoaXMudGFnR3JvdXAubWF0cml4LmNsb25lKCkuaW52ZXJ0KCk7XHJcbiAgICBjb25zdCB1bnR1cm4gPSB0aGlzLnRhZ0dyb3VwLnF1YXRlcm5pb24uY2xvbmUoKS5pbnZlcnQoKTtcclxuICAgIHRoaXMucmViYXNlZFRhZ3MgPSBwbGFjZWQubWFwKCh7IHNwcml0ZSwgcG9zaXRpb24sIHR1cm4gfSkgPT4ge1xyXG4gICAgICBzcHJpdGUucG9zaXRpb24uY29weShwb3NpdGlvbi5hcHBseU1hdHJpeDQoaW52ZXJzZSkpO1xyXG4gICAgICBzcHJpdGUudXNlckRhdGEuZnJhbWUgPSBudWxsO1xyXG4gICAgICB0aGlzLnBhcmVudFRhZyhzcHJpdGUpO1xyXG4gICAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcclxuICAgICAgY29uc3Qgcm90YXRpb24gPSB1bnR1cm4uY2xvbmUoKS5tdWx0aXBseSh0dXJuKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogc3ByaXRlLm5hbWUsXHJcbiAgICAgICAgcG9zaXRpb246IHsgeDogc3ByaXRlLnBvc2l0aW9uLngsIHk6IHNwcml0ZS5wb3NpdGlvbi55LCB6OiBzcHJpdGUucG9zaXRpb24ueiB9LFxyXG4gICAgICAgIHJvdGF0ZURpcmVjdGlvbjogKHsgeCwgeSwgeiB9KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0dXJuZWQgPSBuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pO1xyXG4gICAgICAgICAgcmV0dXJuIHsgeDogdHVybmVkLngsIHk6IHR1cm5lZC55LCB6OiB0dXJuZWQueiB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcclxuICB9XHJcblxyXG4gIC8qKiBIYW5kcyBvdmVyIHRoZSB0YWdzIHRoZSBsYXN0IGNhbGlicmF0aW9uIHJld3JvdGUsIG9uY2UsIGZvciB0aGVtIHRvIGJlIHN0b3JlZC4gKi9cclxuICB0YWtlUmViYXNlZFRhZ3MoKTogVGhyZWVKc1JlYmFzZWRUYWdbXSB7XHJcbiAgICBjb25zdCByZWJhc2VkID0gdGhpcy5yZWJhc2VkVGFncztcclxuICAgIHRoaXMucmViYXNlZFRhZ3MgPSBbXTtcclxuICAgIHJldHVybiByZWJhc2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hvb3NlcyB0aGUgdGFnIGZvciB0aGUgcGFpciBiZWluZyBtYXRjaGVkIGJ5IGlkLCBpbnN0ZWFkIG9mIGJ5IGNsaWNraW5nIGl0LlxyXG4gICAqXHJcbiAgICogQ2xpY2tpbmcgYSB0YWcgc3VwcG9zZXMgaXQgY2FuIGJlIGZvdW5kLiBPbiBhIG1vZGVsIHRoYXQgaGFzIG5ldmVyIGJlZW4gY2FsaWJyYXRlZCB0aGUgdGFncyBtYXlcclxuICAgKiBzaXQgZmFyIGZyb20gaXQsIG9yIGFsbCBvbiB0b3Agb2Ygb25lIGFub3RoZXI7IGEgbGlzdCBoYXMgbmVpdGhlciBwcm9ibGVtLlxyXG4gICAqL1xyXG4gIHNlbGVjdEFsaWdubWVudFRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc3ByaXRlID0gdGhpcy50YWdTcHJpdGVzLmdldChlbGVtZW50SWQpO1xyXG4gICAgaWYgKCF0aGlzLmFsaWduaW5nIHx8IHRoaXMuYWxpZ25tZW50U291cmNlIHx8ICFzcHJpdGUgfHwgIXRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkuaW5jbHVkZXMoc3ByaXRlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEFsaWdubWVudFNvdXJjZShzcHJpdGUpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEFsaWdubWVudFNvdXJjZShzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICAvLyBUaGUgc3ByaXRlJ3Mgb3duIHBvc2l0aW9uIGlzIHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgdW50b3VjaGVkIGJ5IGFueSBhbGlnbm1lbnQgYWxyZWFkeVxyXG4gICAgLy8gYXBwbGllZCAtIHRoYXQgdHJhbnNmb3JtIGxpdmVzIG9uIHRoZSBncm91cCwgbm90IG9uIHRoZSBzcHJpdGUuXHJcbiAgICBjb25zdCBzdG9yZWQgPSBzcHJpdGUucG9zaXRpb247XHJcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IHsgeDogc3RvcmVkLngsIHk6IHN0b3JlZC55LCB6OiBzdG9yZWQueiB9O1xyXG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2VUYWdJZCA9IHNwcml0ZS5uYW1lO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XHJcbiAgICAgIHBhaXJzOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCxcclxuICAgICAgYXdhaXRpbmc6ICdwb2ludCcsXHJcbiAgICAgIHRhZ0lkOiBzcHJpdGUubmFtZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZXMgYSBjbGljayB3aGlsZSB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoIGlzIHJ1bm5pbmcuICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVBbGlnbm1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFsaWdubWVudFNvdXJjZSkge1xyXG4gICAgICAvLyBGaXJzdCBoYWxmIG9mIGEgcGFpcjogd2hpY2ggdGFnIGFyZSB3ZSB0YWxraW5nIGFib3V0P1xyXG4gICAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCksIGZhbHNlKVswXTtcclxuICAgICAgaWYgKCFoaXQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRBbGlnbm1lbnRTb3VyY2UoaGl0Lm9iamVjdCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZWNvbmQgaGFsZjogd2hlcmUgdGhhdCB0YWcgYWN0dWFsbHkgYmVsb25ncyBvbiB0aGUgbW9kZWwuXHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBpY2tBbGlnbm1lbnRUYXJnZXQoZXZlbnQpO1xyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycy5wdXNoKHsgdGFnSWQ6IHRoaXMuYWxpZ25tZW50U291cmNlVGFnSWQsIHNvdXJjZTogdGhpcy5hbGlnbm1lbnRTb3VyY2UsIHRhcmdldCB9KTtcclxuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcclxuICAgIC8vIFRoZSBnaG9zdCBiZWxvbmdzIHRvIHRoZSBjbGljayB0aGF0IGp1c3QgaGFwcGVuZWQ7IHRoZSBuZXh0IGhhbGYgaXMgYSBjbGljayBvbiBhIHRhZy5cclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoe1xyXG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXHJcbiAgICAgIC8vIERvbmUgYXQgdGhyZWUsIG9yIHNvb25lciB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHRhZ3MgdG8gbWF0Y2g6IGZld2VyIHBhaXJzIHN0aWxsIGNhbGlicmF0ZSxcclxuICAgICAgLy8gb25seSBsZXNzIGNvbXBsZXRlbHkuXHJcbiAgICAgIGF3YWl0aW5nOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+PSAzIHx8IHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkubGVuZ3RoID09PSAwID8gbnVsbCA6ICd0YWcnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFydHMgYSBtZWFzdXJlbWVudDogZXZlcnkgY2xpY2sgb24gdGhlIG1vZGVsIGFkZHMgYSBwb2ludCwgYW5kIGVhY2ggcGFpciBvZiBjb25zZWN1dGl2ZVxyXG4gICAqIHBvaW50cyBpcyBhIG1lYXN1cmVkIHNlZ21lbnQuXHJcbiAgICpcclxuICAgKiBJdCBlbmRzIHRocm91Z2ggZmluaXNoTWVhc3VyaW5nKCkgb3IgY2FuY2VsTWVhc3VyaW5nKCkgcmF0aGVyIHRoYW4gb24gaXRzIG93biBhZnRlciB0d28gcG9pbnRzLFxyXG4gICAqIGJlY2F1c2UgYSBtZWFzdXJlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHNlZ21lbnRzIC0gdGhlIHNhbWUgYXMgTWF0dGVycG9ydCdzLCB3aG9zZSByZXN1bHRzIGFyZVxyXG4gICAqIHN0b3JlZCBhcyBhIGxpc3Qgb2YgZGlzdGFuY2VzLlxyXG4gICAqL1xyXG4gIHN0YXJ0TWVhc3VyaW5nKCk6IHZvaWQge1xyXG4gICAgLy8gT25lIHBvaW50ZXIgbW9kZSBhdCBhIHRpbWU6IGEgY2xpY2sgY2Fubm90IGJlIGJvdGggYSB0YWcgcG9zaXRpb24gYW5kIGEgbWVhc3VyZWQgcG9pbnQuXHJcbiAgICB0aGlzLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcclxuICAgICAgdGhpcy5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXJNZWFzdXJlbWVudCgpO1xyXG4gICAgaWYgKHRoaXMubWVhc3VyZUdyb3VwLnBhcmVudCAhPT0gdGhpcy50YWdHcm91cCkge1xyXG4gICAgICB0aGlzLnRhZ0dyb3VwLmFkZCh0aGlzLm1lYXN1cmVHcm91cCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmVtZW50UHJvZ3Jlc3MkLm5leHQoeyBwb2ludHM6IDAsIGRpc3RhbmNlczogW10gfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBYmFuZG9ucyB0aGUgbWVhc3VyZW1lbnQgYW5kIHJlbW92ZXMgd2hhdCB3YXMgZHJhd24uXHJcbiAgICpcclxuICAgKiBBbHNvIHdoYXQgY2xlYXJzIGEgZmluaXNoZWQgbWVhc3VyZW1lbnQgb2ZmIHRoZSBtb2RlbCBvbmNlIGl0cyBmb3JtIGlzIHNhdmVkIG9yIGNsb3NlZCwgd2hpY2hcclxuICAgKiBpcyB3aHkgaXQgb25seSByZXBvcnRzIGFuIGFiYW5kb25tZW50IHdoZW4gb25lIHdhcyBhY3R1YWxseSBpbiBwcm9ncmVzcy5cclxuICAgKi9cclxuICBjYW5jZWxNZWFzdXJpbmcoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YXNNZWFzdXJpbmcgPSB0aGlzLm1lYXN1cmluZztcclxuICAgIHRoaXMubWVhc3VyaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICB0aGlzLmNsZWFyTWVhc3VyZW1lbnQoKTtcclxuICAgIC8vIEZvcmdvdHRlbiBoZXJlIHNvIHRoYXQgYSBmb3JtIG9wZW5lZCBsYXRlciBjYW5ub3QgcGljayB1cCBhIG1lYXN1cmVtZW50IGFscmVhZHkgZGVhbHQgd2l0aC5cclxuICAgIHRoaXMubGFzdE1lYXN1cmVtZW50ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB9XHJcbiAgICBpZiAod2FzTWVhc3VyaW5nKSB7XHJcbiAgICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuZHMgdGhlIG1lYXN1cmVtZW50IGFuZCByZXR1cm5zIGl0LCBvciBudWxsIHdoZW4gdGhlcmUgYXJlIG5vdCB5ZXQgdHdvIHBvaW50cyB0byBtZWFzdXJlXHJcbiAgICogYmV0d2VlbiAtIGluIHdoaWNoIGNhc2UgbWVhc3VyaW5nIHNpbXBseSBjYXJyaWVzIG9uLlxyXG4gICAqXHJcbiAgICogVGhlIGRyYXdpbmcgc3RheXMgb24gdGhlIG1vZGVsIHNvIGl0IGlzIHN0aWxsIHZpc2libGUgd2hpbGUgdGhlIHBlcnNvbiBuYW1lcyB0aGUgbWVhc3VyZW1lbnQ7XHJcbiAgICogY2FuY2VsTWVhc3VyaW5nKCkgdGFrZXMgaXQgYXdheSBhZnRlcndhcmRzLlxyXG4gICAqL1xyXG4gIGZpbmlzaE1lYXN1cmluZygpOiBUaHJlZUpzTWVhc3VyZW1lbnQgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tZWFzdXJpbmcgfHwgdGhpcy5tZWFzdXJlUG9pbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcclxuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgdGhpcy51cGRhdGVNZWFzdXJlUnViYmVyQmFuZChudWxsKTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcblxyXG4gICAgdGhpcy5sYXN0TWVhc3VyZW1lbnQgPSB7XHJcbiAgICAgIHBvaW50czogdGhpcy5tZWFzdXJlUG9pbnRzLm1hcCgocG9pbnQpID0+ICh7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfSkpLFxyXG4gICAgICBkaXN0YW5jZXM6IHRoaXMubWVhc3VyZURpc3RhbmNlcygpLFxyXG4gICAgICBzY3JlZW5zaG90OiB0aGlzLmNhcHR1cmVNZWFzdXJlbWVudFNjcmVlbnNob3QoKSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5sYXN0TWVhc3VyZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBpc01lYXN1cmluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmluZztcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgbWVhc3VyZW1lbnQgZmluaXNoTWVhc3VyaW5nKCkgbGFzdCBwcm9kdWNlZCwgZm9yIHRoZSBmb3JtIHRoYXQgc2F2ZXMgaXQuICovXHJcbiAgZ2V0TGFzdE1lYXN1cmVtZW50KCk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubGFzdE1lYXN1cmVtZW50O1xyXG4gIH1cclxuXHJcbiAgLyoqIE1ldHJlcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIHBvaW50cy4gVGFnIHNwYWNlIGlzIGluIG1ldHJlcywgc28gbm8gY29udmVyc2lvbiBpcyBpbnZvbHZlZC4gKi9cclxuICBwcml2YXRlIG1lYXN1cmVEaXN0YW5jZXMoKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHRoaXMubWVhc3VyZVBvaW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcclxuICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLm1lYXN1cmVQb2ludHNbaW5kZXggLSAxXS5kaXN0YW5jZVRvKHRoaXMubWVhc3VyZVBvaW50c1tpbmRleF0pO1xyXG4gICAgICAvLyBUd28gZGVjaW1hbHMsIHRoZSBwcmVjaXNpb24gTWF0dGVycG9ydCdzIG93biBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCB3aXRoLlxyXG4gICAgICBkaXN0YW5jZXMucHVzaChNYXRoLnJvdW5kKGRpc3RhbmNlICogMTAwKSAvIDEwMCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGlzdGFuY2VzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRNZWFzdXJlUG9pbnQocG9pbnQ6IFRIUkVFLlZlY3RvcjMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5tZWFzdXJlUG9pbnRzW3RoaXMubWVhc3VyZVBvaW50cy5sZW5ndGggLSAxXTtcclxuICAgIHRoaXMubWVhc3VyZVBvaW50cy5wdXNoKHBvaW50KTtcclxuXHJcbiAgICBjb25zdCBtYXJrZXIgPSBuZXcgVEhSRUUuU3ByaXRlKFxyXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xyXG4gICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLFxyXG4gICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgLy8gU2l6ZWQgYWdhaW5zdCB0aGUgdmlld3BvcnQsIG5vdCB0aGUgbW9kZWw6IG1lYXN1cmluZyBpcyBkb25lIHpvb21lZCByaWdodCBpbiwgd2hlcmVcclxuICAgICAgICAvLyBhbnl0aGluZyBzaXplZCBpbiBtZXRyZXMgd291bGQgY292ZXIgdGhlIHZlcnkgdGhpbmcgYmVpbmcgbWVhc3VyZWQuXHJcbiAgICAgICAgc2l6ZUF0dGVudWF0aW9uOiBmYWxzZSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBtYXJrZXIuc2NhbGUuc2V0KDAuMDIyLCAwLjAyMiwgMSk7XHJcbiAgICBtYXJrZXIucG9zaXRpb24uY29weShwb2ludCk7XHJcbiAgICBtYXJrZXIucmVuZGVyT3JkZXIgPSAxMDAxO1xyXG4gICAgdGhpcy5tZWFzdXJlR3JvdXAuYWRkKG1hcmtlcik7XHJcblxyXG4gICAgaWYgKHByZXZpb3VzKSB7XHJcbiAgICAgIHRoaXMubWVhc3VyZUdyb3VwLmFkZCh0aGlzLmNyZWF0ZU1lYXN1cmVMaW5lKHByZXZpb3VzLCBwb2ludCkpO1xyXG5cclxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnJvdW5kKHByZXZpb3VzLmRpc3RhbmNlVG8ocG9pbnQpICogMTAwKSAvIDEwMDtcclxuICAgICAgY29uc3QgbGFiZWwgPSBuZXcgVEhSRUUuU3ByaXRlKFxyXG4gICAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XHJcbiAgICAgICAgICBtYXA6IHRoaXMuY3JlYXRlTWVhc3VyZUxhYmVsVGV4dHVyZShgJHtkaXN0YW5jZS50b0ZpeGVkKDIpfSBtYCksXHJcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxyXG4gICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICBzaXplQXR0ZW51YXRpb246IGZhbHNlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGxhYmVsLnNjYWxlLnNldCgwLjE1LCAwLjA1LCAxKTtcclxuICAgICAgbGFiZWwucG9zaXRpb24uY29weShwcmV2aW91cykuYWRkKHBvaW50KS5tdWx0aXBseVNjYWxhcigwLjUpO1xyXG4gICAgICBsYWJlbC5yZW5kZXJPcmRlciA9IDEwMDI7XHJcbiAgICAgIHRoaXMubWVhc3VyZUdyb3VwLmFkZChsYWJlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZWFzdXJlbWVudFByb2dyZXNzJC5uZXh0KHtcclxuICAgICAgcG9pbnRzOiB0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoLFxyXG4gICAgICBkaXN0YW5jZXM6IHRoaXMubWVhc3VyZURpc3RhbmNlcygpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHNlZ21lbnQgd2l0aCBhIHdpZHRoIGluIHBpeGVscy5cclxuICAgKlxyXG4gICAqIFdlYkdMJ3Mgb3duIGxpbmVzIGFyZSBvbmUgcGl4ZWwgd2lkZSB3aGF0ZXZlciBpcyBhc2tlZCBmb3IsIHdoaWNoIGFsbCBidXQgZGlzYXBwZWFycyBvdmVyIGFcclxuICAgKiBwaG90b2dyYXBoaWMgdGV4dHVyZS4gVGhpcyBraW5kIGlzIGRyYXduIGFzIHNjcmVlbi1mYWNpbmcgZ2VvbWV0cnksIHNvIHRoZSB3aWR0aCBob2xkcy5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMaW5lKGZyb206IFRIUkVFLlZlY3RvcjMsIHRvOiBUSFJFRS5WZWN0b3IzKTogYW55IHtcclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IExpbmVHZW9tZXRyeSgpO1xyXG4gICAgZ2VvbWV0cnkuc2V0UG9zaXRpb25zKFtmcm9tLngsIGZyb20ueSwgZnJvbS56LCB0by54LCB0by55LCB0by56XSk7XHJcbiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lTWF0ZXJpYWwoe1xyXG4gICAgICBjb2xvcjogbmV3IFRIUkVFLkNvbG9yKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLmdldEhleCgpLFxyXG4gICAgICBsaW5ld2lkdGg6IDMsXHJcbiAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IyKCkpO1xyXG4gICAgbWF0ZXJpYWwucmVzb2x1dGlvbi5zZXQoc2l6ZS54LCBzaXplLnkpO1xyXG4gICAgY29uc3QgbGluZSA9IG5ldyBMaW5lMihnZW9tZXRyeSwgbWF0ZXJpYWwpO1xyXG4gICAgbGluZS5yZW5kZXJPcmRlciA9IDEwMDA7XHJcbiAgICByZXR1cm4gbGluZTtcclxuICB9XHJcblxyXG4gIC8qKiBMaW5lIHdpZHRocyBhcmUgaW4gcGl4ZWxzLCB3aGljaCB0aGUgbWF0ZXJpYWwgY2FuIG9ubHkgaG9ub3VyIGlmIGl0IGtub3dzIHRoZSBjYW52YXMgc2l6ZS4gKi9cclxuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZW5kZXJlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IyKCkpO1xyXG4gICAgdGhpcy5tZWFzdXJlR3JvdXAuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoY2hpbGQubWF0ZXJpYWw/LnJlc29sdXRpb24pIHtcclxuICAgICAgICBjaGlsZC5tYXRlcmlhbC5yZXNvbHV0aW9uLnNldChzaXplLngsIHNpemUueSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0cmV0Y2hlcyBhIHNlZ21lbnQgZnJvbSB0aGUgbGFzdCBwb2ludCB0byB0aGUgcG9pbnRlciwgb3IgaGlkZXMgaXQgd2hlbiBnaXZlbiBudWxsLiAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQodGFyZ2V0OiBUSFJFRS5WZWN0b3IzIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGFzdCA9IHRoaXMubWVhc3VyZVBvaW50c1t0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAoIXRoaXMubWVhc3VyaW5nIHx8ICFsYXN0IHx8ICF0YXJnZXQpIHtcclxuICAgICAgaWYgKHRoaXMubWVhc3VyZVJ1YmJlckJhbmQpIHtcclxuICAgICAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMubWVhc3VyZVJ1YmJlckJhbmQpIHtcclxuICAgICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZCA9IHRoaXMuY3JlYXRlTWVhc3VyZUxpbmUobGFzdCwgdGFyZ2V0KTtcclxuICAgICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZC5tYXRlcmlhbC5vcGFjaXR5ID0gMC42O1xyXG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQodGhpcy5tZWFzdXJlUnViYmVyQmFuZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLmdlb21ldHJ5LnNldFBvc2l0aW9ucyhbXHJcbiAgICAgIGxhc3QueCwgbGFzdC55LCBsYXN0LnosXHJcbiAgICAgIHRhcmdldC54LCB0YXJnZXQueSwgdGFyZ2V0LnosXHJcbiAgICBdKTtcclxuICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQudmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMYWJlbFRleHR1cmUodGV4dDogc3RyaW5nKTogVEhSRUUuQ2FudmFzVGV4dHVyZSB7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IDM4NDtcclxuICAgIGNhbnZhcy5oZWlnaHQgPSAxMjg7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgY29uc3QgcmFkaXVzID0gMjg7XHJcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDAsIDAuNzgpJztcclxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XHJcbiAgICBjb250ZXh0Lm1vdmVUbyhyYWRpdXMsIDgpO1xyXG4gICAgY29udGV4dC5hcmNUbyhjYW52YXMud2lkdGggLSA4LCA4LCBjYW52YXMud2lkdGggLSA4LCBjYW52YXMuaGVpZ2h0IC0gOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuYXJjVG8oY2FudmFzLndpZHRoIC0gOCwgY2FudmFzLmhlaWdodCAtIDgsIDgsIGNhbnZhcy5oZWlnaHQgLSA4LCByYWRpdXMpO1xyXG4gICAgY29udGV4dC5hcmNUbyg4LCBjYW52YXMuaGVpZ2h0IC0gOCwgOCwgOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuYXJjVG8oOCwgOCwgY2FudmFzLndpZHRoIC0gOCwgOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XHJcbiAgICBjb250ZXh0LmZpbGwoKTtcclxuXHJcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICcjRkZGRkZGJztcclxuICAgIGNvbnRleHQuZm9udCA9ICdib2xkIDYwcHggc2Fucy1zZXJpZic7XHJcbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcclxuICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgY2FudmFzLndpZHRoIC8gMiwgY2FudmFzLmhlaWdodCAvIDIgKyA0KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY2FudmFzKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgZHJhd24gZm9yIGEgbWVhc3VyZW1lbnQgYW5kIGZvcmdldHMgaXRzIHBvaW50cy4gKi9cclxuICBwcml2YXRlIGNsZWFyTWVhc3VyZW1lbnQoKTogdm9pZCB7XHJcbiAgICBbLi4udGhpcy5tZWFzdXJlR3JvdXAuY2hpbGRyZW5dLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tZWFzdXJlR3JvdXAucmVtb3ZlKGNoaWxkKTtcclxuICAgICAgY2hpbGQuZ2VvbWV0cnk/LmRpc3Bvc2U/LigpO1xyXG4gICAgICBjaGlsZC5tYXRlcmlhbD8ubWFwPy5kaXNwb3NlPy4oKTtcclxuICAgICAgY2hpbGQubWF0ZXJpYWw/LmRpc3Bvc2U/LigpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5tZWFzdXJlUG9pbnRzID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHBpY3R1cmUgb2YgdGhlIHNjZW5lIHdpdGggdGhlIG1lYXN1cmVtZW50IG9uIGl0LCBhcyBNYXR0ZXJwb3J0IGF0dGFjaGVzIHRvIGl0cyBvd24uXHJcbiAgICpcclxuICAgKiBUYWdzIGFyZSBsZWZ0IG91dCwgYXMgdGhleSBhcmUgdGhlcmU6IHRoZSBwaWN0dXJlIGlzIGFib3V0IHRoZSBtZWFzdXJlbWVudC4gSXQgaXMgdGFrZW4gc3RyYWlnaHRcclxuICAgKiBhZnRlciBhIHJlbmRlciBiZWNhdXNlIHRoZSBkcmF3aW5nIGJ1ZmZlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gaG9sZCB0aGUgZnJhbWUgdW50aWwgdGhlXHJcbiAgICogYnJvd3NlciBwcmVzZW50cyBpdCwgYW5kIHNjYWxlZCBkb3duIHNpbmNlIGl0IGlzIHVwbG9hZGVkIGFuZCBzaG93biBhcyBhIHRodW1ibmFpbC5cclxuICAgKi9cclxuICBwcml2YXRlIGNhcHR1cmVNZWFzdXJlbWVudFNjcmVlbnNob3QoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGhpZGRlbjogVEhSRUUuU3ByaXRlW10gPSBbXTtcclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcclxuICAgICAgaWYgKHNwcml0ZS52aXNpYmxlKSB7XHJcbiAgICAgICAgc3ByaXRlLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICBoaWRkZW4ucHVzaChzcHJpdGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQ7XHJcbiAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIDgwMCAvIHNvdXJjZS53aWR0aCwgNjAwIC8gc291cmNlLmhlaWdodCk7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc291cmNlLndpZHRoICogc2NhbGUpKTtcclxuICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNvdXJjZS5oZWlnaHQgKiBzY2FsZSkpO1xyXG4gICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHNvdXJjZSwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuXHJcbiAgICBoaWRkZW4uZm9yRWFjaCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIHNwcml0ZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjg1KTtcclxuICB9XHJcblxyXG4gIC8qKiBBcm1zIHRhZyBwbGFjZW1lbnQ6IHRoZSBuZXh0IGNsaWNrIG9uIHRoZSBtb2RlbCBkcm9wcyBhIHRhZyBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuICovXHJcbiAgc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZTogUG9pVHlwZSB8IG51bGwgPSBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLnBsYWNpbmdUYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5wbGFjZW1lbnRQb2lUeXBlID0gcG9pVHlwZTtcclxuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTGVhdmVzIHBsYWNlbWVudCBtb2RlIHdpdGhvdXQgcGxhY2luZyBhbnl0aGluZy4gKi9cclxuICBjYW5jZWxUYWdQbGFjZW1lbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcclxuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3MgYSB0cmFuc2x1Y2VudCB0YWcgdW5kZXIgdGhlIGN1cnNvciB3aGlsZSBwbGFjaW5nLCBzbyB0aGUgc3BvdCBpcyB2aXNpYmxlIGJlZm9yZSBjb21taXRpbmcuXHJcbiAgICpcclxuICAgKiBNYXR0ZXJwb3J0IGRvZXMgdGhpcyB3aXRoIGEgdGFnIHRoYXQgZm9sbG93cyB0aGUgcG9pbnRlcjsgdGhlIGVxdWl2YWxlbnQgaGVyZSBpcyBhIHByZXZpZXdcclxuICAgKiBzcHJpdGUgdGhhdCBnZXRzIHJlbW92ZWQgdGhlIG1vbWVudCB0aGUgcmVhbCB0YWcgdGFrZXMgaXRzIHBsYWNlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlUGxhY2VtZW50UHJldmlldyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBpY2tQb2ludE9uR3B1KGV2ZW50KTtcclxuICAgIGlmICghcG9zaXRpb24pIHtcclxuICAgICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICAgIHRoaXMudXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQobnVsbCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xyXG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcclxuICAgICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3ID0gbmV3IFRIUkVFLlNwcml0ZShcclxuICAgICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xyXG4gICAgICAgICAgbWFwOiB0aGlzLmNyZWF0ZVRhZ1RleHR1cmUoJyM5RTlFOUUnKSxcclxuICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgIG9wYWNpdHk6IDAuNixcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcucmVuZGVyT3JkZXIgPSA5OTk7XHJcbiAgICAgIHRoaXMudGFnR3JvdXAuYWRkKHRoaXMucGxhY2VtZW50UHJldmlldyk7XHJcbiAgICAgIHRoaXMuc2NhbGVUYWdGb3JNb2RlbCh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3LnBvc2l0aW9uLmNvcHkocG9zaXRpb24pO1xyXG4gICAgdGhpcy51cGRhdGVNZWFzdXJlUnViYmVyQmFuZChwb3NpdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcG9pbnQgdW5kZXIgdGhlIGN1cnNvciwgcmVhZCBmcm9tIHRoZSBkZXB0aCBidWZmZXIgaW5zdGVhZCBvZiByYXljYXN0LCBpbiB0YWcgc3BhY2UuXHJcbiAgICpcclxuICAgKiBBIHJheWNhc3Qgd2Fsa3MgZXZlcnkgdHJpYW5nbGUgb2YgdGhlIG1lc2ggaXQgaGl0czogb24gYSBjYXB0dXJlZCBtb2RlbCB0aGF0IGlzIG1pbGxpb25zIG9mXHJcbiAgICogdGhlbSwgdGVucyBvZiBtaWxsaXNlY29uZHMsIGV2ZXJ5IHRpbWUgdGhlIHBvaW50ZXIgbW92ZXMuIENvYWxlc2NpbmcgdG8gb25lIHBlciBmcmFtZSBkaWQgbm90XHJcbiAgICogaGVscCwgYmVjYXVzZSB0aGUgY29zdCBpcyB0aGUgcGljayBpdHNlbGYgLSBpdCBzaW1wbHkgYmVjYW1lIG9uZSBzbG93IGZyYW1lIGluc3RlYWQgb2Ygc2V2ZXJhbC5cclxuICAgKlxyXG4gICAqIFJlbmRlcmluZyB0aGUgbW9kZWwncyBkZXB0aCBpbnRvIGEgc2luZ2xlIHBpeGVsIHVuZGVyIHRoZSBjdXJzb3IgYW5zd2VycyB0aGUgc2FtZSBxdWVzdGlvbiBvblxyXG4gICAqIHRoZSBHUFUgaW4gY29uc3RhbnQgdGltZSwgd2hhdGV2ZXIgdGhlIG1vZGVsJ3Mgc2l6ZS4gVGhlIGNhbWVyYSdzIHZpZXcgb2Zmc2V0IGlzIHdoYXQgbmFycm93c1xyXG4gICAqIHRoZSB3aG9sZSBpbWFnZSBkb3duIHRvIHRoYXQgb25lIHBpeGVsLCBzbyB0aGUgdmFsdWUgcmVhZCBiYWNrIGlzIHRoZSBkZXB0aCB0aGUgY3Vyc29yIGlzIG92ZXIuXHJcbiAgICpcclxuICAgKiBVc2VkIGZvciB0aGUgZ2hvc3Qgb25seS4gVGhlIGNsaWNrIHRoYXQgYWN0dWFsbHkgcGxhY2VzIGEgdGFnIHN0aWxsIHJheWNhc3RzOiBpdCBpcyBvbmUgcGljayxcclxuICAgKiBpdHMgY29zdCBkb2VzIG5vdCBtYXR0ZXIsIGFuZCBpdCB5aWVsZHMgdGhlIHN1cmZhY2Ugbm9ybWFsLCB3aGljaCBkZXB0aCBhbG9uZSBjYW5ub3QgZ2l2ZS5cclxuICAgKi9cclxuICBwcml2YXRlIHBpY2tQb2ludE9uR3B1KGV2ZW50OiBNb3VzZUV2ZW50KTogVEhSRUUuVmVjdG9yMyB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLm1vZGVsUm9vdCB8fCAhdGhpcy5yZW5kZXJlciB8fCAhdGhpcy5jYW1lcmEpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnBpY2tUYXJnZXQpIHtcclxuICAgICAgdGhpcy5waWNrVGFyZ2V0ID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KDEsIDEpO1xyXG4gICAgICB0aGlzLnBpY2tDYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoKTtcclxuICAgICAgdGhpcy5waWNrQ2FtZXJhLmxheWVycy5zZXQoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUik7XHJcbiAgICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWwoe1xyXG4gICAgICAgIGRlcHRoUGFja2luZzogVEhSRUUuUkdCQURlcHRoUGFja2luZyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xyXG4gICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcclxuICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID4gcmVjdC53aWR0aCB8fCB5ID4gcmVjdC5oZWlnaHQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5waWNrQ2FtZXJhLmNvcHkodGhpcy5jYW1lcmEpO1xyXG4gICAgdGhpcy5waWNrQ2FtZXJhLmxheWVycy5zZXQoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUik7XHJcbiAgICAvLyBSZW5kZXJzIHRoZSBvbmUgcGl4ZWwgdGhlIGN1cnNvciBpcyBvdmVyIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGltYWdlIC0gb2Zmc2V0IGJ5IGhhbGYgYVxyXG4gICAgLy8gcGl4ZWwgc28gdGhlIGN1cnNvciBzaXRzIGF0IHRoYXQgcGl4ZWwncyBjZW50cmUsIHdoaWNoIGlzIHdoZXJlIE5EQyAoMCwgMCkgbGFuZHMuXHJcbiAgICB0aGlzLnBpY2tDYW1lcmEuc2V0Vmlld09mZnNldChyZWN0LndpZHRoLCByZWN0LmhlaWdodCwgeCAtIDAuNSwgeSAtIDAuNSwgMSwgMSk7XHJcblxyXG4gICAgLy8gV2hlcmUgdGhlIG1vZGVsIGlzIG5vdCwgdGhlIHBpeGVsIG11c3QgcmVhZCBhcyBcIm5vdGhpbmdcIiwgc28gaXQgaXMgY2xlYXJlZCB0byB3aGl0ZSAtIGEgdmFsdWVcclxuICAgIC8vIG5vIHJlYWwgZGVwdGggcGFja3MgdG8uIFR3byB0aGluZ3Mgd291bGQgb3RoZXJ3aXNlIHBhaW50IG92ZXIgdGhhdDogdGhlIGRlZmF1bHQgYmxhY2sgY2xlYXIsXHJcbiAgICAvLyB3aGljaCBkZWNvZGVzIGFzIGRlcHRoIDAgKGEgaGl0IGFnYWluc3QgdGhlIGxlbnMpLCBhbmQgdGhlIHNjZW5lIGJhY2tncm91bmQsIHdoaWNoIHRocmVlLmpzXHJcbiAgICAvLyBkcmF3cyBpbiBwbGFjZSBvZiB0aGUgY2xlYXIgY29sb3VyIHdoZW5ldmVyIG9uZSBpcyBzZXQuXHJcbiAgICBjb25zdCBwcmV2aW91c0NsZWFyQ29sb3IgPSB0aGlzLnJlbmRlcmVyLmdldENsZWFyQ29sb3IobmV3IFRIUkVFLkNvbG9yKCkpO1xyXG4gICAgY29uc3QgcHJldmlvdXNDbGVhckFscGhhID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XHJcbiAgICBjb25zdCBwcmV2aW91c1RhcmdldCA9IHRoaXMucmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcbiAgICBjb25zdCBwcmV2aW91c0JhY2tncm91bmQgPSB0aGlzLnNjZW5lLmJhY2tncm91bmQ7XHJcblxyXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuICAgIHRoaXMuc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IHRoaXMucGlja0RlcHRoTWF0ZXJpYWw7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHhmZmZmZmYsIDEpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5waWNrVGFyZ2V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMucGlja0NhbWVyYSk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzKHRoaXMucGlja1RhcmdldCwgMCwgMCwgMSwgMSwgdGhpcy5waWNrUGl4ZWwpO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHByZXZpb3VzVGFyZ2V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihwcmV2aW91c0NsZWFyQ29sb3IsIHByZXZpb3VzQ2xlYXJBbHBoYSk7XHJcbiAgICB0aGlzLnNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xyXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gcHJldmlvdXNCYWNrZ3JvdW5kO1xyXG5cclxuICAgIGNvbnN0IFtyLCBnLCBiLCBhXSA9IHRoaXMucGlja1BpeGVsO1xyXG4gICAgaWYgKHIgPT09IDI1NSAmJiBnID09PSAyNTUgJiYgYiA9PT0gMjU1ICYmIGEgPT09IDI1NSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgaW52ZXJzZSBvZiB0aHJlZSdzIHBhY2tEZXB0aFRvUkdCQSwgd2hpY2ggc3RvcmVzIHRoZSB2YWx1ZSBpdHNlbGYgaW4gYWxwaGEgYW5kIGV2ZXIgZmluZXJcclxuICAgIC8vIGZyYWN0aW9ucyBvZiBpdCBpbiBibHVlLCBncmVlbiBhbmQgcmVkIC0gYWxwaGEgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgbm90IHJlZC4gUmVhZCB0aGVcclxuICAgIC8vIG90aGVyIHdheSByb3VuZCwgdGhlIHJlc3VsdCBpcyBtb3N0bHkgdGhlIGxvdy1vcmRlciBub2lzZSwgb2Z0ZW4gbmVhciB6ZXJvLCB3aGljaCB1bnByb2plY3RzXHJcbiAgICAvLyBvbnRvIHRoZSBuZWFyIHBsYW5lOiBhIGdob3N0IHByZXNzZWQgYWdhaW5zdCB0aGUgbGVucywgZmlsbGluZyB0aGUgd2hvbGUgc2NyZWVuLlxyXG4gICAgY29uc3QgZG93bnNjYWxlID0gMjU1IC8gMjU2O1xyXG4gICAgY29uc3QgZGVwdGggPVxyXG4gICAgICAociAvIDI1NSkgKiBkb3duc2NhbGUgLyAoMjU2ICogMjU2ICogMjU2KSArXHJcbiAgICAgIChnIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYpICtcclxuICAgICAgKGIgLyAyNTUpICogZG93bnNjYWxlIC8gMjU2ICtcclxuICAgICAgKGEgLyAyNTUpICogZG93bnNjYWxlO1xyXG5cclxuICAgIC8vIE5EQyB4IGFuZCB5IGFyZSB6ZXJvIGJlY2F1c2UgdGhlIHBpeGVsIHJlYWQgaXMgdGhlIGNlbnRyZSBvZiB0aGF0IG9uZS1waXhlbCBpbWFnZSAtIHdoaWNoIG9ubHlcclxuICAgIC8vIGhvbGRzIHdoaWxlIHRoZSB2aWV3IG9mZnNldCBpcyBpbiBlZmZlY3QuIENsZWFyaW5nIGl0IGZpcnN0IHdvdWxkIHVucHJvamVjdCB0aHJvdWdoIHRoZSBmdWxsXHJcbiAgICAvLyB2aWV3IGluc3RlYWQsIGxhbmRpbmcgdGhlIHBvaW50IG9uIHRoZSByYXkgdGhyb3VnaCB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4uIFRoZSBvZmZzZXQgaXNcclxuICAgIC8vIHNpbXBseSByZXBsYWNlZCBieSB0aGUgbmV4dCBwaWNrLCBzbyBpdCBpcyBuZXZlciBjbGVhcmVkLlxyXG4gICAgY29uc3Qgd29ybGQgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCBkZXB0aCAqIDIgLSAxKS51bnByb2plY3QodGhpcy5waWNrQ2FtZXJhKTtcclxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMudGFnR3JvdXAud29ybGRUb0xvY2FsKHdvcmxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlUGxhY2VtZW50UHJldmlldygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wbGFjZW1lbnRQcmV2aWV3KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudGFnR3JvdXAucmVtb3ZlKHRoaXMucGxhY2VtZW50UHJldmlldyk7XHJcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwubWFwPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNob3dzIG9yIGhpZGVzIG9uZSB0YWcsIGxlYXZpbmcgaXQgcmVnaXN0ZXJlZCBzbyBpdCBjYW4gYmUgYnJvdWdodCBiYWNrIHdpdGhvdXQgcmVsb2FkaW5nLiAqL1xyXG4gIHNldFRhZ1Zpc2liaWxpdHkoZWxlbWVudElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcclxuICAgIGlmIChzcHJpdGUpIHtcclxuICAgICAgc3ByaXRlLnZpc2libGUgPSB2aXNpYmxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3Mgb25seSB0YWdzIG9mIHRoZSBnaXZlbiB0eXBlcywgaGlkaW5nIHRoZSByZXN0LlxyXG4gICAqXHJcbiAgICogUGFzc2luZyBudWxsIHNob3dzIGV2ZXJ5dGhpbmcgLSB0aGUgXCJubyBmaWx0ZXJcIiBzdGF0ZSwgZGlzdGluY3QgZnJvbSBhbiBlbXB0eSBhcnJheSwgd2hpY2ggaXMgYVxyXG4gICAqIGZpbHRlciB0aGF0IGhhcHBlbnMgdG8gbWF0Y2ggbm90aGluZy5cclxuICAgKi9cclxuICBzZXRWaXNpYmxlVGFnVHlwZXModHlwZXM6IFBvaVR5cGVbXSB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMudmlzaWJsZVRhZ1R5cGVzID0gdHlwZXM7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpKTtcclxuICB9XHJcblxyXG4gIC8qKiBTYXlzIHdoaWNoIGNhcHR1cmUgaXMgb24gc2NyZWVuLCBzbyB0aGUgdGFncyBwbGFjZWQgaW4gaXQgY2FuIGJlIHRvbGQgZnJvbSB0aGUgcmVzdC4gKi9cclxuICBzZXRDdXJyZW50Q2FwdHVyZShjYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudENhcHR1cmVJRCA9IGNhcHR1cmVJRDtcclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcclxuICAgICAgdGhpcy5wYXJlbnRUYWcoc3ByaXRlKTtcclxuICAgICAgdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoc3ByaXRlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV2ZXJ5IHRhZyByZWdpc3RlcmVkIGluIHRoZSBzY2VuZSwgc2hvd24gb3Igbm90LiAqL1xyXG4gIGdldFRhZ3MoKToge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcG9pVHlwZTogUG9pVHlwZSB8IG51bGw7XHJcbiAgICB2aXNpYmxlOiBib29sZWFuO1xyXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGNhbiB1c2UgaXQuICovXHJcbiAgICBjYWxpYnJhdGFibGU6IGJvb2xlYW47XHJcbiAgfVtdIHtcclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkpO1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLm1hcCgoc3ByaXRlKSA9PiAoe1xyXG4gICAgICBpZDogc3ByaXRlLm5hbWUsXHJcbiAgICAgIGxhYmVsOiBzcHJpdGUudXNlckRhdGEubGFiZWwgPz8gbnVsbCxcclxuICAgICAgcG9pVHlwZTogc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPz8gbnVsbCxcclxuICAgICAgdmlzaWJsZTogc3ByaXRlLnZpc2libGUsXHJcbiAgICAgIGNhbGlicmF0YWJsZTogY2FuZGlkYXRlcy5oYXMoc3ByaXRlKSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBmYXIgdGhlIHRhZ3MgZnJvbSBlbHNld2hlcmUgc2l0IGZyb20gdGhlIG1vZGVsLCBtZWFzdXJlZCBpbiBtb2RlbCByYWRpaS4gTnVsbCB3aXRob3V0IGJvdGguXHJcbiAgICpcclxuICAgKiBCZWZvcmUgYSBtb2RlbCBpcyBjYWxpYnJhdGVkIHRob3NlIHRhZ3MgYXJlIHdoZXJldmVyIHRoZWlyIG93biBjb29yZGluYXRlcyBwdXQgdGhlbSwgd2hpY2ggZm9yXHJcbiAgICogYSBtb2RlbCB3aXRoIGEgZGlmZmVyZW50IG9yaWdpbiBjYW4gYmUgYSBsb25nIHdheSBvZmYgLSB0b28gZmFyIHRvIGZpbmQsIGxldCBhbG9uZSBjbGljay5cclxuICAgKi9cclxuICBnZXRUYWdEaXN0YW5jZUZyb21Nb2RlbCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tb2RlbFJvb3QgfHwgIXRoaXMubW9kZWxXb3JsZFJhZGl1cykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGNlbnRyb2lkID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpO1xyXG4gICAgY2FuZGlkYXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IGNlbnRyb2lkLmFkZChzcHJpdGUuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKSkpO1xyXG4gICAgY29uc3QgY291bnQgPSBjYW5kaWRhdGVzLmxlbmd0aDtcclxuICAgIGlmIChjb3VudCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8vIFRoZSBtb2RlbCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4gd2hlbiBpdCBpcyBwbGFjZWQuXHJcbiAgICByZXR1cm4gY2VudHJvaWQuZGl2aWRlU2NhbGFyKGNvdW50KS5sZW5ndGgoKSAvIHRoaXMubW9kZWxXb3JsZFJhZGl1cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmdzIGEgdGFnIGZyb20gdGhlIGdyb3VwIGl0cyBjb29yZGluYXRlcyBiZWxvbmcgdG86IG91dHNpZGUgdGhlIGNhbGlicmF0aW9uIHdoZW4gdGhleSBhcmUgaW5cclxuICAgKiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB1bmRlciBpdCBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJlbnRUYWcoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFyZW50ID0gc3ByaXRlLnVzZXJEYXRhLmZyYW1lID09PSAnbW9kZWwnICYmIHRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKVxyXG4gICAgICA/IHRoaXMubW9kZWxUYWdHcm91cFxyXG4gICAgICA6IHRoaXMudGFnR3JvdXA7XHJcbiAgICBpZiAoc3ByaXRlLnBhcmVudCAhPT0gcGFyZW50KSB7XHJcbiAgICAgIHBhcmVudC5hZGQoc3ByaXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0YWdzIGEgY2FsaWJyYXRpb24gY2FuIGJlIHdvcmtlZCBvdXQgZnJvbTogdGhvc2UgdGhhdCBjYW1lIGZyb20gc29tZXdoZXJlIGVsc2UsIHdoZXRoZXIgb3JcclxuICAgKiBub3QgdGhleSBhcmUgb24gc2hvdyAtIGJlZm9yZSBjYWxpYnJhdGluZywgbW9zdCBvZiB0aGVtIHdpbGwgbm90IGJlLlxyXG4gICAqXHJcbiAgICogVGFncyBwbGFjZWQgaW4gdGhpcyBtb2RlbCBhcmUgd2hlcmUgdGhleSBhcmUgYmVjYXVzZSBzb21lb25lIGNsaWNrZWQgdGhlcmU7IG1hdGNoaW5nIHRoZW0gdG9cclxuICAgKiBcIndoZXJlIHRoZXkgcmVhbGx5IGFyZVwiIHdvdWxkIGJlIGNpcmN1bGFyLiBBIHRhZyBpbiBhbm90aGVyIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzIGNhbm5vdCBiZVxyXG4gICAqIHBsYWNlZCBoZXJlIGF0IGFsbC4gQW5kIGEgdGFnIGFscmVhZHkgdXNlZCBpbiB0aGlzIGNhbGlicmF0aW9uIGNhbm5vdCBiZSB1c2VkIGFnYWluIC0gdHdvXHJcbiAgICogcGFpcnMgZnJvbSBvbmUgdGFnIGNhcnJ5IG5vIG1vcmUgdGhhbiBvbmUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKTogVEhSRUUuT2JqZWN0M0RbXSB7XHJcbiAgICBjb25zdCB1c2VkID0gbmV3IFNldCh0aGlzLmFsaWdubWVudFBhaXJzLm1hcCgocGFpcikgPT4gcGFpci50YWdJZCkpO1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLmZpbHRlcigoc3ByaXRlKSA9PlxyXG4gICAgICBzcHJpdGUucGFyZW50ID09PSB0aGlzLnRhZ0dyb3VwXHJcbiAgICAgICYmIHNwcml0ZS51c2VyRGF0YS5mcmFtZSAhPT0gJ21vZGVsJ1xyXG4gICAgICAmJiAhdGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpXHJcbiAgICAgICYmICF1c2VkLmhhcyhzcHJpdGUubmFtZSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhvdyBtYW55IHRhZ3MgdGhlcmUgYXJlIHRvIGNhbGlicmF0ZSB3aXRoLCBub3QgY291bnRpbmcgdGhvc2UgYWxyZWFkeSB1c2VkLiAqL1xyXG4gIGdldENhbGlicmF0aW9uQ2FuZGlkYXRlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBtYW55IHRhZ3MgZnJvbSBlbHNld2hlcmUgYXJlIG5vdCBvbiB0aGlzIG1vZGVsLCBhbmQgc28gbm90IHNob3duIG9uIGl0LlxyXG4gICAqXHJcbiAgICogT24gYSBtb2RlbCB0aGF0IGhhcyBub3QgYmVlbiBjYWxpYnJhdGVkLCB0aGlzIGlzIHdoYXQgc3VnZ2VzdHMgaXQgc2hvdWxkIGJlOiB0aGUgdGFncyBhcmUgb3V0XHJcbiAgICogdGhlcmUsIGp1c3Qgbm90IHdoZXJlIHRoZSBtb2RlbCBpcy5cclxuICAgKi9cclxuICBnZXRPZmZNb2RlbFRhZ0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKS5maWx0ZXIoKHNwcml0ZSkgPT4gIXRoaXMuaXNPbk1vZGVsKHNwcml0ZSkpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSB0YWcgd2FzIHBsYWNlZCBpbiB0aGUgdmlzaXQgb24gc2NyZWVuLiAqL1xyXG4gIHByaXZhdGUgaXNPd25lZEJ5VmlzaXQoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhc3ByaXRlLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRFxyXG4gICAgICAmJiBzcHJpdGUudXNlckRhdGEub3JpZ2luQ2FwdHVyZUlEID09PSB0aGlzLmN1cnJlbnRDYXB0dXJlSUQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHRhZyBzaG93cyB3aGVuIGl0cyB0eXBlIGlzIG5vdCBmaWx0ZXJlZCBvdXQgYW5kIGl0IGJlbG9uZ3Mgb24gdGhpcyBtb2RlbC5cclxuICAgKlxyXG4gICAqIE9uZSBwbGFjZSBkZWNpZGVzLCBiZWNhdXNlIHRoZSB0d28gdXNlZCB0byBzZXQgYHZpc2libGVgIHNlcGFyYXRlbHkgYW5kIHdoaWNoZXZlciByYW4gbGFzdFxyXG4gICAqIHVuZGlkIHRoZSBvdGhlci5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCB0eXBlQWxsb3dlZCA9IHRoaXMudmlzaWJsZVRhZ1R5cGVzID09PSBudWxsXHJcbiAgICAgIHx8IHRoaXMudmlzaWJsZVRhZ1R5cGVzLmluY2x1ZGVzKHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlKTtcclxuICAgIHNwcml0ZS52aXNpYmxlID0gdHlwZUFsbG93ZWQgJiYgdGhpcy5iZWxvbmdzT25UaGlzTW9kZWwoc3ByaXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgYSB0YWcgaGFzIGEgcGxhY2Ugb24gdGhpcyBtb2RlbC5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBvZiB0aGUgc3BhY2UgaXMgb2ZmZXJlZCB0byBldmVyeSBtb2RlbCAtIHRoZXJlIGlzIG9uZSBzZXQgb2YgdGFncywgbm90IG9uZSBwZXIgbW9kZWwuXHJcbiAgICogV2hhdCBhIG1vZGVsIHNob3dzIG9mIGl0IGlzIHRoZSBwYXJ0IHRoYXQgc2l0cyBvbiB0aGUgbW9kZWwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBiZWxvbmdzT25UaGlzTW9kZWwoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gUGxhY2VkIGhlcmUgYnkgYSBjbGljayBvbiB0aGlzIHZlcnkgc3VyZmFjZS5cclxuICAgIGlmICh0aGlzLmlzT3duZWRCeVZpc2l0KHNwcml0ZSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBQbGFjZWQgaW4gYW5vdGhlciBtb2RlbCBiZWZvcmUgdGhhdCBvbmUgd2FzIGNhbGlicmF0ZWQ6IGl0cyBjb29yZGluYXRlcyBhcmUgdGhhdCBtb2RlbCdzIG93blxyXG4gICAgLy8gYW5kIHNheSBub3RoaW5nIGFib3V0IHdoZXJlIGl0IHdvdWxkIGJlIGluIHRoaXMgb25lLlxyXG4gICAgaWYgKHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9PT0gJ21vZGVsJykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBDYWxpYnJhdGluZyBpcyBtYXRjaGluZyB0YWdzIHRvIHdoZXJlIHRoZXkgYmVsb25nLCBzbyB0aGV5IGFsbCBoYXZlIHRvIGJlIG9uIG9mZmVyLlxyXG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pc09uTW9kZWwoc3ByaXRlKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIGEgdGFnLCBkcmF3biB3aGVyZSBpdHMgY29vcmRpbmF0ZXMgYW5kIHRoZSBjYWxpYnJhdGlvbiBwdXQgaXQsIHNpdHMgb24gdGhlIG1vZGVsLiAqL1xyXG4gIHByaXZhdGUgaXNPbk1vZGVsKHNwcml0ZTogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zdXJmYWNlQ2VsbHMpIHtcclxuICAgICAgLy8gTm8gbW9kZWwgdG8gYmUgb24geWV0LlxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnQgPSBzcHJpdGUucGFyZW50ID8/IHRoaXMudGFnR3JvdXA7XHJcbiAgICBwYXJlbnQudXBkYXRlTWF0cml4KCk7XHJcbiAgICAvLyBUaGUgZ3JpZCBpcyBpbiB0aGUgbW9kZWwncyBvd24gdW5pdHM7IHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIGlzIGhvdyBtYW55IG9mIHRob3NlIGEgbWV0cmUgaXMuXHJcbiAgICBjb25zdCByZWFjaCA9IFRocmVlSnNTZXJ2aWNlLk9OX01PREVMX01FVFJFUyAqIChwYXJlbnQuc2NhbGUueCB8fCAxKTtcclxuICAgIHJldHVybiB0aGlzLmlzTmVhclN1cmZhY2Uoc3ByaXRlLnBvc2l0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHBhcmVudC5tYXRyaXgpLCByZWFjaCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmUtZGVjaWRlcyBldmVyeSB0YWcncyB2aXNpYmlsaXR5OiB0aGUgbW9kZWwsIHRoZSBjYWxpYnJhdGlvbiBvciB0aGUgbW9kZSBjaGFuZ2VkLiAqL1xyXG4gIHByaXZhdGUgcmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3VyZmFjZUtleSh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHNwYW4gPSBUaHJlZUpzU2VydmljZS5TVVJGQUNFX0dSSURfU1BBTjtcclxuICAgIGNvbnN0IHBhZCA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9QQUQ7XHJcbiAgICBjb25zdCBbaSwgaiwga10gPSBbeCArIHBhZCwgeSArIHBhZCwgeiArIHBhZF07XHJcbiAgICBpZiAoaSA8IDAgfHwgaiA8IDAgfHwgayA8IDAgfHwgaSA+PSBzcGFuIHx8IGogPj0gc3BhbiB8fCBrID49IHNwYW4pIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGkgKyBzcGFuICogKGogKyBzcGFuICogayk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXlzIHRoZSBncmlkIG92ZXIgdGhlIG1vZGVsJ3Mgc3VyZmFjZS5cclxuICAgKlxyXG4gICAqIFJ1bnMgb25jZSBwZXIgbW9kZWwsIGluIG9uZSBwYXNzIG92ZXIgaXRzIHRyaWFuZ2xlcy4gQSB0cmlhbmdsZSBzbWFsbGVyIHRoYW4gYSBjZWxsIGlzIG1hcmtlZFxyXG4gICAqIGJ5IGl0cyBjZW50cmUsIHdoaWNoIGlzIGV2ZXJ5IHRyaWFuZ2xlIG9mIGEgc2Nhbm5lZCBtb2RlbDsgYSBsYXJnZXIgb25lIC0gdGhlIHR3byB0cmlhbmdsZXMgb2ZcclxuICAgKiBhIGRyYXduIHdhbGwgLSBpcyBzYW1wbGVkIGFjcm9zcyBpdHMgZmFjZSwgb3IgdGhlIG1pZGRsZSBvZiB0aGUgd2FsbCB3b3VsZCByZWFkIGFzIGVtcHR5LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlR3JpZChvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBib3g6IFRIUkVFLkJveDMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNpemUgPSBib3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcclxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGlmICghKGxvbmdlc3QgPiAwKSkge1xyXG4gICAgICB0aGlzLnN1cmZhY2VDZWxscyA9IG51bGw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEEgcXVhcnRlciBvZiBhIG1ldHJlIHdoZXJlIHRoZSBtb2RlbCBpcyBpbiBtZXRyZXM7IGNvYXJzZXIgb24gYSB2ZXJ5IGxhcmdlIG9uZSwgc28gdGhlIGdyaWRcclxuICAgIC8vIHN0YXlzIGFkZHJlc3NhYmxlIGFuZCBpdHMgbWVtb3J5IGJvdW5kZWQuXHJcbiAgICBjb25zdCBjZWxsID0gTWF0aC5tYXgoMC4yNSwgbG9uZ2VzdCAvIDM4NCk7XHJcbiAgICBjb25zdCBvcmlnaW4gPSBib3gubWluLmNsb25lKCk7XHJcbiAgICBjb25zdCBjZWxscyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG4gICAgY29uc3QgbWFyayA9IChwb2ludDogVEhSRUUuVmVjdG9yMykgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnN1cmZhY2VLZXkoXHJcbiAgICAgICAgTWF0aC5mbG9vcigocG9pbnQueCAtIG9yaWdpbi54KSAvIGNlbGwpLFxyXG4gICAgICAgIE1hdGguZmxvb3IoKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsKSxcclxuICAgICAgICBNYXRoLmZsb29yKChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbCksXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChrZXkgPj0gMCkge1xyXG4gICAgICAgIGNlbGxzLmFkZChrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCB0cmlhbmdsZUNvdW50ID0gMDtcclxuICAgIG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNoaWxkLmlzTWVzaCAmJiBjaGlsZC5nZW9tZXRyeT8uYXR0cmlidXRlcz8ucG9zaXRpb247XHJcbiAgICAgIGlmIChwb3NpdGlvbikge1xyXG4gICAgICAgIHRyaWFuZ2xlQ291bnQgKz0gKGNoaWxkLmdlb21ldHJ5LmluZGV4ID8gY2hpbGQuZ2VvbWV0cnkuaW5kZXguY291bnQgOiBwb3NpdGlvbi5jb3VudCkgLyAzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIFBhc3QgYSBmZXcgbWlsbGlvbiB0cmlhbmdsZXMgdGhleSBhcmUgZmFyIHNtYWxsZXIgdGhhbiBhIGNlbGwsIGFuZCBldmVyeSBjZWxsIGlzIGhpdCBtYW55XHJcbiAgICAvLyB0aW1lcyBvdmVyOyBhIHNhbXBsZSBtYXJrcyB0aGUgc2FtZSBjZWxscy5cclxuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0cmlhbmdsZUNvdW50IC8gMzAwMDAwMCkpO1xyXG5cclxuICAgIGNvbnN0IGEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBjb25zdCBjID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IHBvaW50ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNoaWxkLmlzTWVzaCAmJiBjaGlsZC5nZW9tZXRyeT8uYXR0cmlidXRlcz8ucG9zaXRpb247XHJcbiAgICAgIGlmICghcG9zaXRpb24pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaW5kZXggPSBjaGlsZC5nZW9tZXRyeS5pbmRleDtcclxuICAgICAgY29uc3QgY291bnQgPSAoaW5kZXggPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50KSAvIDM7XHJcbiAgICAgIGZvciAobGV0IHRyaWFuZ2xlID0gMDsgdHJpYW5nbGUgPCBjb3VudDsgdHJpYW5nbGUgKz0gc3RyaWRlKSB7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHJpYW5nbGUgKiAzO1xyXG4gICAgICAgIGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCkgOiBvZmZzZXQpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgYi5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMSkgOiBvZmZzZXQgKyAxKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xyXG4gICAgICAgIGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCArIDIpIDogb2Zmc2V0ICsgMikuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcclxuICAgICAgICBjb25zdCBlZGdlID0gTWF0aC5tYXgoYS5kaXN0YW5jZVRvKGIpLCBiLmRpc3RhbmNlVG8oYyksIGMuZGlzdGFuY2VUbyhhKSk7XHJcbiAgICAgICAgaWYgKGVkZ2UgPD0gY2VsbCkge1xyXG4gICAgICAgICAgbWFyayhwb2ludC5jb3B5KGEpLmFkZChiKS5hZGQoYykubXVsdGlwbHlTY2FsYXIoMSAvIDMpKTtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBIYWxmLWNlbGwgc3RlcHMgYWNyb3NzIHRoZSBmYWNlLiBDYXBwZWQsIHNvIG9uZSBlbm9ybW91cyB0cmlhbmdsZSBjYW5ub3Qgc3RhbGwgdGhlIGxvYWQ7XHJcbiAgICAgICAgLy8gdGhlIHJlYWNoIGEgdGFnIGlzIHRlc3RlZCB3aXRoIHNwYW5zIHNldmVyYWwgY2VsbHMgYW5kIGJyaWRnZXMgd2hhdCB0aGUgY2FwIGxlYXZlcy5cclxuICAgICAgICBjb25zdCBzdGVwcyA9IE1hdGgubWluKDk2LCBNYXRoLmNlaWwoKDIgKiBlZGdlKSAvIGNlbGwpKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSArPSAxKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBzdGVwcyAtIGk7IGogKz0gMSkge1xyXG4gICAgICAgICAgICBwb2ludC5jb3B5KGEpXHJcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihiLmNsb25lKCkuc3ViKGEpLCBpIC8gc3RlcHMpXHJcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihjLmNsb25lKCkuc3ViKGEpLCBqIC8gc3RlcHMpO1xyXG4gICAgICAgICAgICBtYXJrKHBvaW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3VyZmFjZUNlbGxzID0gY2VsbHM7XHJcbiAgICB0aGlzLnN1cmZhY2VPcmlnaW4uY29weShvcmlnaW4pO1xyXG4gICAgdGhpcy5zdXJmYWNlQ2VsbFNpemUgPSBjZWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgc29tZSBwYXJ0IG9mIHRoZSBtb2RlbCdzIHN1cmZhY2UgbGllcyB3aXRoaW4gYHJlYWNoYCBvZiBhIHBvaW50LCBpbiBtb2RlbCB1bml0cy4gKi9cclxuICBwcml2YXRlIGlzTmVhclN1cmZhY2UocG9pbnQ6IFRIUkVFLlZlY3RvcjMsIHJlYWNoOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNlbGwgPSB0aGlzLnN1cmZhY2VDZWxsU2l6ZTtcclxuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuc3VyZmFjZU9yaWdpbjtcclxuICAgIGNvbnN0IHggPSAocG9pbnQueCAtIG9yaWdpbi54KSAvIGNlbGw7XHJcbiAgICBjb25zdCB5ID0gKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsO1xyXG4gICAgY29uc3QgeiA9IChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbDtcclxuICAgIC8vIEluIGNlbGxzLiBDYXBwZWQ6IGJleW9uZCB0aGlzIHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIG1ha2VzIGEgbWV0cmUgc28gbWFueSBjZWxscyB0aGF0IHRoZVxyXG4gICAgLy8gc2VhcmNoIHdvdWxkIGR3YXJmIHRoZSBtb2RlbCwgYW5kIGEgdGFnIHRoYXQgZmFyIG9mZiBpcyBub3Qgb24gaXQgYnkgYW55IHJlYWRpbmcuXHJcbiAgICBjb25zdCBzcGFuID0gTWF0aC5taW4oMTYsIE1hdGguY2VpbChyZWFjaCAvIGNlbGwpKTtcclxuICAgIC8vIEEgY2VsbCBpcyBcIndpdGhpbiByZWFjaFwiIHdoZW4gaXRzIGNlbnRyZSBpcywgZ2l2ZSBvciB0YWtlIHRoZSBoYWxmLWRpYWdvbmFsIG9mIHRoZSBjZWxsLlxyXG4gICAgY29uc3QgbGltaXQgPSAocmVhY2ggLyBjZWxsICsgMC44NykgKiogMjtcclxuICAgIGNvbnN0IFtjeCwgY3ksIGN6XSA9IFtNYXRoLmZsb29yKHgpLCBNYXRoLmZsb29yKHkpLCBNYXRoLmZsb29yKHopXTtcclxuICAgIGZvciAobGV0IGsgPSBjeiAtIHNwYW47IGsgPD0gY3ogKyBzcGFuOyBrICs9IDEpIHtcclxuICAgICAgZm9yIChsZXQgaiA9IGN5IC0gc3BhbjsgaiA8PSBjeSArIHNwYW47IGogKz0gMSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBjeCAtIHNwYW47IGkgPD0gY3ggKyBzcGFuOyBpICs9IDEpIHtcclxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gKGkgKyAwLjUgLSB4KSAqKiAyICsgKGogKyAwLjUgLSB5KSAqKiAyICsgKGsgKyAwLjUgLSB6KSAqKiAyO1xyXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDw9IGxpbWl0ICYmIHRoaXMuc3VyZmFjZUNlbGxzLmhhcyh0aGlzLnN1cmZhY2VLZXkoaSwgaiwgaykpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGNhbWVyYSB0byBsb29rIGF0IGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuXHJcbiAgICpcclxuICAgKiBBbmltYXRlZCByYXRoZXIgdGhhbiB0ZWxlcG9ydGVkOiBqdW1waW5nIHRoZSBjYW1lcmEgbG9zZXMgdGhlIHZpZXdlcidzIHNlbnNlIG9mIHdoZXJlIHRoZXkgd2VyZVxyXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC4gVGhlIGFwcHJvYWNoIGRpc3RhbmNlIGZvbGxvd3MgdGhlIG1vZGVsJ3Mgc2l6ZSBzbyBpdCBmcmFtZXMgc2Vuc2libHlcclxuICAgKiB3aGF0ZXZlciB0aGUgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIGdvVG9UYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcclxuICAgIGlmICghc3ByaXRlIHx8ICF0aGlzLmNhbWVyYSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMubW9kZWxSb290XHJcbiAgICAgID8gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KHRoaXMubW9kZWxSb290KS5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpLmxlbmd0aCgpICogMC4xNVxyXG4gICAgICA6IDU7XHJcblxyXG4gICAgLy8gQXBwcm9hY2ggYWxvbmcgdGhlIGN1cnJlbnQgdmlld2luZyBkaXJlY3Rpb24sIHNvIHRoZSBjYW1lcmEgY2xvc2VzIGluIHJhdGhlciB0aGFuIHN3aW5naW5nXHJcbiAgICAvLyBhcm91bmQgdG8gYW4gYXJiaXRyYXJ5IHNpZGUuXHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yih0aGlzLmNvbnRyb2xzLnRhcmdldCkubm9ybWFsaXplKCk7XHJcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0ge1xyXG4gICAgICBmcm9tUG9zaXRpb246IHRoaXMuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksXHJcbiAgICAgIHRvUG9zaXRpb246IHRhcmdldC5jbG9uZSgpLmFkZChkaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpKSxcclxuICAgICAgZnJvbVRhcmdldDogdGhpcy5jb250cm9scy50YXJnZXQuY2xvbmUoKSxcclxuICAgICAgdG9UYXJnZXQ6IHRhcmdldCxcclxuICAgICAgc3RhcnRlZEF0OiBwZXJmb3JtYW5jZS5ub3coKSxcclxuICAgICAgZHVyYXRpb25NczogNjAwLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBBZHZhbmNlcyB0aGUgY2FtZXJhIGFuaW1hdGlvbiBzdGFydGVkIGJ5IGdvVG9UYWcsIGlmIG9uZSBpcyBydW5uaW5nLiAqL1xyXG4gIHByaXZhdGUgc3RlcENhbWVyYVR3ZWVuKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbWVyYVR3ZWVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCBmcm9tVGFyZ2V0LCB0b1RhcmdldCwgc3RhcnRlZEF0LCBkdXJhdGlvbk1zIH0gPSB0aGlzLmNhbWVyYVR3ZWVuO1xyXG4gICAgY29uc3QgbGluZWFyID0gTWF0aC5taW4oKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uTXMsIDEpO1xyXG4gICAgLy8gRWFzZSBvdXQsIHNvIHRoZSBtb3ZlIHNldHRsZXMgaW5zdGVhZCBvZiBzdG9wcGluZyBkZWFkLlxyXG4gICAgY29uc3QgdCA9IDEgLSBNYXRoLnBvdygxIC0gbGluZWFyLCAzKTtcclxuXHJcbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5sZXJwVmVjdG9ycyhmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHQpO1xyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQubGVycFZlY3RvcnMoZnJvbVRhcmdldCwgdG9UYXJnZXQsIHQpO1xyXG5cclxuICAgIGlmIChsaW5lYXIgPj0gMSkge1xyXG4gICAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzUGxhY2luZ1RhZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNwb3QgcGlja2VkIGJ5IHRoZSBsYXN0IHBsYWNlbWVudCwgZm9yIHdob2V2ZXIgY29tbWl0cyBpdCB0byBhIFBPSS4gKi9cclxuICBnZXRQZW5kaW5nVGFnUGxhY2VtZW50KCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYXljYXN0cyBhIGNsaWNrIGFnYWluc3QgdGhlIG1vZGVsJ3MgZ2VvbWV0cnkgYW5kIHJldHVybnMgdGhlIGhpdCwgaW4gd29ybGQgc3BhY2UuXHJcbiAgICpcclxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgY2xpY2sgbWlzc2VkLCB3aGljaCBpcyBhIG5vcm1hbCBvdXRjb21lIC0gdGhlIHVzZXIgY2xpY2tlZCB0aGUgc2t5IC0gYW5kXHJcbiAgICogbGVhdmVzIHdoYXRldmVyIG1vZGUgaXMgYXJtZWQgc3RpbGwgYXJtZWQsIHNvIHRoZXkgY2FuIHNpbXBseSB0cnkgYWdhaW4uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByYXljYXN0TW9kZWwoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5JbnRlcnNlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tb2RlbFJvb3QpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdCh0aGlzLm1vZGVsUm9vdCwgdHJ1ZSlbMF0gPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR1cm5zIGEgY2xpY2sgaW50byBhIHBvaW50IG9uIHRoZSBtb2RlbCwgaW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgcGVyc2lzdGVkIGluLlxyXG4gICAqXHJcbiAgICogVGhhdCBmcmFtZSBpcyB0aGUgdGFnIGdyb3VwJ3MsIG5vdCB0aGUgbW9kZWwncy4gQSBzdG9yZWQgY29vcmRpbmF0ZSBpcyByZWFkIGJhY2sgYXMgYSBzcHJpdGVcclxuICAgKiBwb3NpdGlvbiBpbnNpZGUgdGhhdCBncm91cCwgc28gYSBjb29yZGluYXRlIGNhcHR1cmVkIGluIGFueSBvdGhlciBmcmFtZSBjb21lcyBiYWNrIGRpc3BsYWNlZCBieVxyXG4gICAqIGV4YWN0bHkgaG93ZXZlciBmYXIgdGhlIGFsaWdubWVudCBtb3ZlcyB0aGUgZ3JvdXAuIFRoZSB0d28gZnJhbWVzIGFncmVlIG9ubHkgd2hpbGUgdGhlXHJcbiAgICogYWxpZ25tZW50IGlzIGlkZW50aXR5LCB3aGljaCBpcyB3aHkgdGhpcyBzdGF5ZWQgaW52aXNpYmxlIHVudGlsIGEgbW9kZWwgd2FzIGNhbGlicmF0ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwaWNrUGxhY2VtZW50T25Nb2RlbChldmVudDogTW91c2VFdmVudCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdE1vZGVsKGV2ZW50KTtcclxuICAgIGlmICghaGl0KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnRhZ0dyb3VwLndvcmxkVG9Mb2NhbChoaXQucG9pbnQuY2xvbmUoKSk7XHJcblxyXG4gICAgLy8gQSBmYWNlIG5vcm1hbCBpcyBpbiB0aGUgZ2VvbWV0cnkncyBsb2NhbCBzcGFjZSBhbHJlYWR5LCBidXQgdGhlIG1lc2ggaXQgYmVsb25ncyB0byBtYXkgc2l0XHJcbiAgICAvLyB1bmRlciB0cmFuc2Zvcm1zIG9mIGl0cyBvd24sIHNvIHRha2UgaXQgb3V0IHRocm91Z2ggdGhvc2UgYW5kIGJhY2sgaW50byB0aGUgdGFnIGZyYW1lLCBzbyBpdFxyXG4gICAgLy8gZGVzY3JpYmVzIHRoZSBzYW1lIG9yaWVudGF0aW9uIHRoZSBwb3NpdGlvbiBkb2VzLlxyXG4gICAgbGV0IG5vcm1hbCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApO1xyXG4gICAgaWYgKGhpdC5mYWNlKSB7XHJcbiAgICAgIG5vcm1hbCA9IGhpdC5mYWNlLm5vcm1hbFxyXG4gICAgICAgIC5jbG9uZSgpXHJcbiAgICAgICAgLnRyYW5zZm9ybURpcmVjdGlvbihoaXQub2JqZWN0Lm1hdHJpeFdvcmxkKVxyXG4gICAgICAgIC50cmFuc2Zvcm1EaXJlY3Rpb24obmV3IFRIUkVFLk1hdHJpeDQoKS5jb3B5KHRoaXMudGFnR3JvdXAubWF0cml4V29ybGQpLmludmVydCgpKVxyXG4gICAgICAgIC5ub3JtYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55LCB6OiBwb3NpdGlvbi56IH0sXHJcbiAgICAgIG5vcm1hbDogeyB4OiBub3JtYWwueCwgeTogbm9ybWFsLnksIHo6IG5vcm1hbC56IH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlcmUgdGhlIHVzZXIgc2F5cyBhIHRhZyByZWFsbHkgYmVsb25ncywgaW4gdGhlIHNwYWNlIHRoZSBzb2x2ZWQgYWxpZ25tZW50IG1hcHMgb250by5cclxuICAgKlxyXG4gICAqIHNldFRhZ0FsaWdubWVudCB3cml0ZXMgdGhlIHNvbHV0aW9uIHRvIHRoZSB0YWcgZ3JvdXAncyBvd24gdHJhbnNmb3JtLCB3aGljaCBpcyBleHByZXNzZWRcclxuICAgKiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IC0gc28gdGhlIHRhcmdldCBoYXMgdG8gYmUgaW4gdGhlIHBhcmVudCdzIGZyYW1lLiBNZWFzdXJpbmcgaXQgaW4gdGhlXHJcbiAgICogZ3JvdXAncyBvd24gZnJhbWUgaW5zdGVhZCB3b3VsZCBmb2xkIHRoZSBjdXJyZW50IGFsaWdubWVudCBpbnRvIHRoZSBhbnN3ZXIsIG1ha2luZyBlYWNoXHJcbiAgICogY2FsaWJyYXRpb24gZGVwZW5kIG9uIHRoZSBvbmUgYmVmb3JlIGl0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGlja0FsaWdubWVudFRhcmdldChldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XHJcbiAgICBpZiAoIWhpdCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1lID0gdGhpcy50YWdHcm91cC5wYXJlbnQgPz8gdGhpcy5zY2VuZTtcclxuICAgIGZyYW1lLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcclxuICAgIGNvbnN0IHBvaW50ID0gZnJhbWUud29ybGRUb0xvY2FsKGhpdC5wb2ludC5jbG9uZSgpKTtcclxuICAgIHJldHVybiB7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRyYW5zZm9ybSBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwncyBzcGFjZS5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBjb21lcyBmcm9tIHRoZSBzYW1lIHNvdXJjZSBzcGFjZSwgc28gdGhpcyBpcyBvbmUgdHJhbnNmb3JtIG9uIHRoZSBncm91cCByYXRoZXIgdGhhblxyXG4gICAqIHBlci10YWcgbWF0aHMgLSB3aGljaCBhbHNvIG1lYW5zIGl0IGFwcGxpZXMgcmV0cm9hY3RpdmVseSB0byB0YWdzIGFscmVhZHkgcGxhY2VkLCBhbmQgY2FuIGJlXHJcbiAgICogYWRqdXN0ZWQgbGl2ZSB3aGlsZSBzb21lb25lIGRpYWxzIHRoZSBudW1iZXJzIGluLlxyXG4gICAqXHJcbiAgICogUGFzc2luZyBudWxsIHJlc2V0cyB0byBpZGVudGl0eSwgaS5lLiB0YWcgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gbW9kZWwgc3BhY2UuXHJcbiAgICovXHJcbiAgc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudDogVGhyZWVKc0FsaWdubWVudCB8IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBzY2FsZSB9ID0gYWxpZ25tZW50ID8/IHt9O1xyXG4gICAgdGhpcy50YWdHcm91cC5wb3NpdGlvbi5zZXQodHJhbnNsYXRpb24/LnggPz8gMCwgdHJhbnNsYXRpb24/LnkgPz8gMCwgdHJhbnNsYXRpb24/LnogPz8gMCk7XHJcbiAgICB0aGlzLnRhZ0dyb3VwLnJvdGF0aW9uLnNldChyb3RhdGlvbj8ueCA/PyAwLCByb3RhdGlvbj8ueSA/PyAwLCByb3RhdGlvbj8ueiA/PyAwKTtcclxuICAgIHRoaXMudGFnR3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlID8/IDEpO1xyXG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVNYXRyaXgoKTtcclxuXHJcbiAgICAvLyBUYWcgc2l6ZSBpcyBkZXJpdmVkIGZyb20gdGhlIHdvcmxkIHNjYWxlIGl0IGluaGVyaXRzLCB3aGljaCB0aGlzIGNhbGwganVzdCBjaGFuZ2VkIC0gYW5kIHNvXHJcbiAgICAvLyBpcyB3aGljaCB0YWdzIGxhbmQgb24gdGhlIG1vZGVsLlxyXG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSkpO1xyXG4gICAgdGhpcy5yZWZyZXNoVGFnVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIHRhZywgb3IgbW92ZXMvcmVzdHlsZXMgdGhlIG9uZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC5cclxuICAgKlxyXG4gICAqIFVwc2VydCByYXRoZXIgdGhhbiBhIGRlY2xhcmF0aXZlIFwiaGVyZSBpcyB0aGUgZnVsbCBsaXN0XCIgY2FsbCwgYmVjYXVzZSB0YWdzIGFycml2ZSBwZXIgdHlwZVxyXG4gICAqIChlcXVpcG1lbnQsIHRoZW4gdGlja2V0cywgdGhlbiBtZWFzdXJlbWVudHMuLi4pIGZyb20gc2VwYXJhdGUgc3Vic2NyaXB0aW9ucyAtIHJlcGxhY2luZyB0aGUgc2V0XHJcbiAgICogb24gZWFjaCBvZiB0aG9zZSB3b3VsZCB3aXBlIHRoZSB0eXBlcyB0aGF0IGNhbWUgYmVmb3JlLlxyXG4gICAqL1xyXG4gIHVwc2VydFRhZyh0YWc6IFRocmVlSnNUYWcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy50YWdTcHJpdGVzLmdldCh0YWcuaWQpO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIGV4aXN0aW5nLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcclxuICAgICAgZXhpc3RpbmcudXNlckRhdGEucG9pVHlwZSA9IHRhZy5wb2lUeXBlID8/IGV4aXN0aW5nLnVzZXJEYXRhLnBvaVR5cGU7XHJcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLmxhYmVsID0gdGFnLmxhYmVsID8/IGV4aXN0aW5nLnVzZXJEYXRhLmxhYmVsO1xyXG4gICAgICBleGlzdGluZy51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IGV4aXN0aW5nLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRDtcclxuICAgICAgZXhpc3RpbmcudXNlckRhdGEuZnJhbWUgPSB0YWcuZnJhbWUgPz8gZXhpc3RpbmcudXNlckRhdGEuZnJhbWU7XHJcbiAgICAgIHRoaXMucGFyZW50VGFnKGV4aXN0aW5nKTtcclxuICAgICAgdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoZXhpc3RpbmcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3ByaXRlID0gbmV3IFRIUkVFLlNwcml0ZShcclxuICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHtcclxuICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSh0YWcuY29sb3IpLFxyXG4gICAgICAgIC8vIFRhZ3MgcmVhZCBhcyBVSSByYXRoZXIgdGhhbiBnZW9tZXRyeSwgc28gdGhleSBzdGF5IHZpc2libGUgdGhyb3VnaCB0aGUgbW9kZWwgaW5zdGVhZCBvZlxyXG4gICAgICAgIC8vIGJlaW5nIG9jY2x1ZGVkIGJ5IHdoYXRldmVyIHdhbGwgaGFwcGVucyB0byBiZSBiZXR3ZWVuIHRoZW0gYW5kIHRoZSBjYW1lcmEuXHJcbiAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcclxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBzcHJpdGUubmFtZSA9IHRhZy5pZDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlID0gdGFnLnBvaVR5cGUgPz8gbnVsbDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5sYWJlbCA9IHRhZy5sYWJlbCA/PyBudWxsO1xyXG4gICAgc3ByaXRlLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRCA9IHRhZy5vcmlnaW5DYXB0dXJlSUQgPz8gbnVsbDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9IHRhZy5mcmFtZSA/PyBudWxsO1xyXG4gICAgc3ByaXRlLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcclxuICAgIHNwcml0ZS5yZW5kZXJPcmRlciA9IDk5OTtcclxuICAgIHRoaXMucGFyZW50VGFnKHNwcml0ZSk7XHJcbiAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcclxuICAgIHRoaXMuYXBwbHlUYWdWaXNpYmlsaXR5KHNwcml0ZSk7XHJcblxyXG4gICAgdGhpcy50YWdTcHJpdGVzLnNldCh0YWcuaWQsIHNwcml0ZSk7XHJcblxyXG4gICAgaWYgKHRhZy5pY29uVXJsKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlUYWdJY29uKHNwcml0ZSwgdGFnLmljb25VcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgdGhlIHRhZyByZWdpc3RlcmVkIGZvciBhbiBlbGVtZW50LCBpZiB0aGVyZSBpcyBvbmUuICovXHJcbiAgcmVtb3ZlVGFnKGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XHJcbiAgICBpZiAoIXNwcml0ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzcHJpdGUucGFyZW50Py5yZW1vdmUoc3ByaXRlKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZGVsZXRlKGVsZW1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyBldmVyeSB0YWcgZnJvbSB0aGUgc2NlbmUuICovXHJcbiAgY2xlYXJUYWdzKCk6IHZvaWQge1xyXG4gICAgWy4uLnRoaXMudGFnU3ByaXRlcy5rZXlzKCldLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlbW92ZVRhZyhpZCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIExvYWRzIGFuIGljb24gaW50byBhbiBleGlzdGluZyB0YWcsIGxlYXZpbmcgdGhlIGZhbGxiYWNrIGRpc2MgaW4gcGxhY2UgaWYgaXQgZmFpbHMuICovXHJcbiAgcHJpdmF0ZSBhcHBseVRhZ0ljb24oc3ByaXRlOiBUSFJFRS5TcHJpdGUsIGljb25Vcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKFxyXG4gICAgICBpY29uVXJsLFxyXG4gICAgICAodGV4dHVyZSkgPT4ge1xyXG4gICAgICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubWFwID0gdGV4dHVyZTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgICgpID0+IGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBsb2FkIHRhZyBpY29uIFwiJHtpY29uVXJsfVwiLCBrZWVwaW5nIHRoZSBkZWZhdWx0IG1hcmtlci5gKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBEcmF3cyB0aGUgZGVmYXVsdCB0YWcgbWFya2VyOiBhIGZpbGxlZCBkaXNjIHdpdGggYSB3aGl0ZSByaW5nLCBzbyBpdCByZWFkcyBvbiBhbnkgYmFja2dyb3VuZC4gKi9cclxuICBwcml2YXRlIGNyZWF0ZVRhZ1RleHR1cmUoY29sb3IgPSAnIzFFODhFNScpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcclxuICAgIGNvbnN0IHNpemUgPSAxMjg7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gc2l6ZTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xyXG4gICAgY29udGV4dC5hcmMoc2l6ZSAvIDIsIHNpemUgLyAyLCBzaXplIC8gMiAtIDgsIDAsIE1hdGguUEkgKiAyKTtcclxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XHJcbiAgICBjb250ZXh0LmZpbGwoKTtcclxuICAgIGNvbnRleHQubGluZVdpZHRoID0gODtcclxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XHJcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xyXG5cclxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2l6ZXMgYSB0YWcgcmVsYXRpdmUgdG8gdGhlIG1vZGVsLlxyXG4gICAqXHJcbiAgICogQSBzcHJpdGUgaW5oZXJpdHMgdGhlIG1vZGVsJ3Mgc2NhbGUgYW5kIHRoZSBhbGlnbm1lbnQncywgc28gYSBmaXhlZCBzaXplIHdvdWxkIGNvbWUgb3V0IHRpbnkgb25cclxuICAgKiBhIGxhcmdlIG1vZGVsIGFuZCBodWdlIG9uIGEgc21hbGwgb25lLiBEaXZpZGluZyBieSB0aGUgZ3JvdXAncyB3b3JsZCBzY2FsZSBrZWVwcyB0YWdzIHRoZSBzYW1lXHJcbiAgICogc2l6ZSBvbiBzY3JlZW4gd2hhdGV2ZXIgdGhlIG1vZGVsJ3MgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2NhbGVUYWdGb3JNb2RlbChzcHJpdGU6IFRIUkVFLlNwcml0ZSk6IHZvaWQge1xyXG4gICAgLy8gSXRzIG93biBwYXJlbnQncyBzY2FsZTogdGFncyBpbiB0aGUgbW9kZWwncyBjb29yZGluYXRlcyBkbyBub3QgaW5oZXJpdCB0aGUgY2FsaWJyYXRpb24ncy5cclxuICAgIGNvbnN0IHdvcmxkU2NhbGUgPSAoc3ByaXRlLnBhcmVudCA/PyB0aGlzLnRhZ0dyb3VwKS5nZXRXb3JsZFNjYWxlKG5ldyBUSFJFRS5WZWN0b3IzKCkpLnggfHwgMTtcclxuICAgIGNvbnN0IHNpemUgPSAwLjQgLyB3b3JsZFNjYWxlO1xyXG4gICAgc3ByaXRlLnNjYWxlLnNldChzaXplLCBzaXplLCAxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgc2Vjb25kYXJ5IGludGVyYWN0aXZlIG9iamVjdHMgKGUuZy4sIFBPSXMsIHNlbnNvcnMpIHRvIHRoZSBzY2VuZS5cclxuICAgKi9cclxuICB1cGRhdGVPYmpzVG9TY2VuZShvYmpzQWRkZWQ6IE9iakFkZGVkW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gdGhpcy5jbGlja2FibGVPYmplY3RzLm1hcCgob2JqKSA9PiBvYmoubmFtZSk7XHJcbiAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcblxyXG4gICAgLy8gZGVsZXRlIG9iamVjdHMgdGhhdCBhcmUgbm90IGluIHRoZSBwcm92aWRlZCBhcnJheVxyXG4gICAgdGhpcy5jbGlja2FibGVPYmplY3RzLmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBpZiAoIW9ianNBZGRlZC5maW5kKChvYmpEYXRhKSA9PiBvYmpEYXRhLmlkID09PSBvYmoubmFtZSkpIHtcclxuICAgICAgICB0aGlzLnNjZW5lLnJlbW92ZShvYmopO1xyXG4gICAgICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cyA9IHRoaXMuY2xpY2thYmxlT2JqZWN0cy5maWx0ZXIoXHJcbiAgICAgICAgICAob2JqZWN0KSA9PiBvYmplY3QubmFtZSAhPT0gb2JqLm5hbWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBvYmpzQWRkZWQuZm9yRWFjaCgob2JqZWN0RGF0YTogT2JqQWRkZWQpID0+IHtcclxuICAgICAgaWYgKCFleGlzdGluZ0lkcy5pbmNsdWRlcyhvYmplY3REYXRhLmlkKSkge1xyXG4gICAgICAgIG9iakxvYWRlci5sb2FkKG9iamVjdERhdGEuZmlsZSwgKG5ld09iamVjdCkgPT4ge1xyXG4gICAgICAgICAgbmV3T2JqZWN0Lm5hbWUgPSBvYmplY3REYXRhLmlkO1xyXG5cclxuICAgICAgICAgIG5ld09iamVjdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgaWYgKChjaGlsZCBhcyBUSFJFRS5NZXNoKS5pc01lc2gpIHtcclxuICAgICAgICAgICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcclxuICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbCBpbnN0YW5jZW9mIFRIUkVFLk1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwub3BhY2l0eSA9IDAuODtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIHNldCBvYmplY3QgcG9zaXRpb24gYW5kIHJvdGF0aW9uXHJcbiAgICAgICAgICBuZXdPYmplY3QucG9zaXRpb24uc2V0KFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLngsXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucG9zaXRpb24ueSxcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5wb3NpdGlvbi56XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAvLyBUaGUgSlNPTiBjb25maWd1cmF0aW9uIGhhcyByb3RhdGlvbiBhbHJlYWR5IGluIHJhZGlhbnMgKGUuZy4gMy4xNDE1Li4uKVxyXG4gICAgICAgICAgbmV3T2JqZWN0LnJvdGF0aW9uLnNldChcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5yb3RhdGlvbi54LFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnJvdGF0aW9uLnksXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24uelxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBuZXdPYmplY3Quc2NhbGUuc2V0KG9iamVjdERhdGEuc2NhbGUueCwgb2JqZWN0RGF0YS5zY2FsZS55LCBvYmplY3REYXRhLnNjYWxlLnopO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2NlbmUuYWRkKG5ld09iamVjdCk7XHJcbiAgICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMucHVzaChuZXdPYmplY3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XHJcblxyXG4gICAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcclxuXHJcbiAgICAgIC8vIFdoaWxlIHRoZSBnaG9zdCBpcyB1cCBpdCBmb2xsb3dzIHRoZSBwb2ludGVyIGFuZCBub3RoaW5nIGVsc2Ugc2hvdWxkIHJlYWN0IHRvIGl0LiBUaGUgbW92ZVxyXG4gICAgICAvLyBpcyBvbmx5IHJlY29yZGVkIGhlcmU6IHBvaW50ZXIgZXZlbnRzIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiBmcmFtZXMsIGFuZCBwaWNraW5nIGEgcG9pbnRcclxuICAgICAgLy8gY29zdHMgYSByYXljYXN0IGFnYWluc3QgdGhlIHdob2xlIG1vZGVsLCBzbyBkb2luZyBpdCBwZXIgZXZlbnQgaXMgd2hhdCBtYWRlIHRoZSBnaG9zdCB0cmFpbFxyXG4gICAgICAvLyBiZWhpbmQgdGhlIGN1cnNvci4gVGhlIHJlbmRlciBsb29wIHBpY2tzIHVwIHRoZSBsYXRlc3QgcG9zaXRpb24sIG9uY2UsIHBlciBmcmFtZS5cclxuICAgICAgaWYgKHRoaXMuaXNQcmV2aWV3aW5nUGxhY2VtZW50KCkpIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBldmVudDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIE5vdCBwcmV2aWV3aW5nIGFueSBtb3JlIChhIHBhaXIgd2FzIGp1c3QgY29tcGxldGVkLCBzYXkpOiBkcm9wIGEgZ2hvc3QgbGVmdCBvdmVyIGZyb20gaXQuXHJcbiAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG5cclxuICAgICAgLy8gVGFncyBmaXJzdDogdGhleSBkcmF3IG9uIHRvcCBvZiB0aGUgbW9kZWwsIHNvIHRoZXkgaGF2ZSB0byBhbnN3ZXIgdGhlIHBvaW50ZXIgZmlyc3QgdG9vLlxyXG4gICAgICBjb25zdCBob3ZlcmVkVGFnID0gdGhpcy5yYXljYXN0ZXJcclxuICAgICAgICAuaW50ZXJzZWN0T2JqZWN0cyhbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXSwgZmFsc2UpXHJcbiAgICAgICAgLmZpbmQoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKT8ub2JqZWN0O1xyXG4gICAgICBpZiAoaG92ZXJlZFRhZykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gaG92ZXJlZFRhZy51c2VyRGF0YS5sYWJlbDtcclxuICAgICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobGFiZWwgPyB7IGxhYmVsLCBldmVudCB9IDogbnVsbCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGFnSG92ZXJlZCQubmV4dChudWxsKTtcclxuXHJcbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoaW50ZXJzZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICBjb25zdCBpbnRlcnNlY3RlZE9iamVjdElkID0gaW50ZXJzZWN0c1swXS5vYmplY3Q/LnBhcmVudD8ubmFtZTtcclxuICAgICAgICBpZiAoaW50ZXJzZWN0ZWRPYmplY3RJZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQoeyBpZDogaW50ZXJzZWN0ZWRPYmplY3RJZCwgZXZlbnQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcclxuICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XHJcblxyXG4gICAgICAvLyBBbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBib3RoIHRha2UgdGhlIGNsaWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgb3BlbmVkIGJ5IGl0LlxyXG4gICAgICBpZiAodGhpcy5hbGlnbmluZykge1xyXG4gICAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gTWVhc3VyaW5nIHRha2VzIGV2ZXJ5IGNsaWNrIGFzIGEgcG9pbnQsIHRoZSBzYW1lIHdheSBwbGFjZW1lbnQgdGFrZXMgaXQgYXMgYSBwb3NpdGlvbi5cclxuICAgICAgaWYgKHRoaXMubWVhc3VyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XHJcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSBwbGFjZW1lbnQucG9zaXRpb247XHJcbiAgICAgICAgICB0aGlzLmFkZE1lYXN1cmVQb2ludChuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUGxhY2VtZW50IHdpbnMgb3ZlciBldmVyeXRoaW5nOiB3aGlsZSBhcm1lZCwgYSBjbGljayBtZWFucyBcInB1dCBpdCBoZXJlXCIsIG5vdCBcIm9wZW4gdGhhdFwiLlxyXG4gICAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XHJcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XHJcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgcGxhY2VtZW50LnBvaVR5cGUgPSB0aGlzLnBsYWNlbWVudFBvaVR5cGU7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgICAgICAgIHRoaXMudGFnUGxhY2VkJC5uZXh0KHBsYWNlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgICAvLyBTYW1lIHByZWNlZGVuY2UgYXMgaG92ZXI6IGEgdGFnIGRyYXduIG92ZXIgdGhlIG1vZGVsIGNsYWltcyB0aGUgY2xpY2suXHJcbiAgICAgIGNvbnN0IHRhZ0hpdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLCBmYWxzZSlcclxuICAgICAgICAuZmlsdGVyKChoaXQpID0+IGhpdC5vYmplY3QudmlzaWJsZSk7XHJcbiAgICAgIGlmICh0YWdIaXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB0YWcgPSB0YWdIaXRzWzBdLm9iamVjdDtcclxuICAgICAgICB0aGlzLnRhZ0NsaWNrZWQkLm5leHQoeyBlbGVtZW50SWQ6IHRhZy5uYW1lLCBwb2lUeXBlOiB0YWcudXNlckRhdGEucG9pVHlwZSA/PyBudWxsIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW50ZXJzZWN0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5jbGlja2FibGVPYmplY3RzLCB0cnVlKTtcclxuXHJcbiAgICAgIGlmIChpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBjbGlja2VkT2JqZWN0ID0gaW50ZXJzZWN0c1swXS5vYmplY3Q7XHJcbiAgICAgICAgY29uc3QgaWQgPSBjbGlja2VkT2JqZWN0Py5wYXJlbnQ/Lm5hbWU7XHJcbiAgICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNjYXBlIGNhbmNlbHMgd2hhdGV2ZXIgdGhlIHBvaW50ZXIgaXMgY3VycmVudGx5IGNvbW1pdHRlZCB0by5cclxuICAgKlxyXG4gICAqIEVtaXRzIHRocm91Z2ggdGhlIHNhbWUgc3ViamVjdHMgdGhlIGV4cGxpY2l0IENhbmNlbCBidXR0b25zIHVzZSwgc28gdGhlIFVJIGRyaXZpbmcgdGhlbSBmb2xsb3dzXHJcbiAgICogYWxvbmcgaW5zdGVhZCBvZiBiZWluZyBsZWZ0IHNob3dpbmcgYSBtb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIGFybWVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25LZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRXNjYXBlJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XHJcbiAgICAgIC8vIE5vdGhpbmcgb3V0c2lkZSB0aGUgc2NlbmUgdHJhY2tzIHBsYWNlbWVudCwgc28gY2xlYXJpbmcgaXQgaGVyZSBpcyB0aGUgd2hvbGUgb2YgaXQuXHJcbiAgICAgIHRoaXMuY2FuY2VsVGFnUGxhY2VtZW50KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1lYXN1cmluZykge1xyXG4gICAgICB0aGlzLmNhbmNlbE1lYXN1cmluZygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hbGlnbmluZykge1xyXG4gICAgICB0aGlzLmNhbmNlbFRhZ0FsaWdubWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhbmltYXRlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZSk7XHJcbiAgICB0aGlzLnN0ZXBDYW1lcmFUd2VlbigpO1xyXG4gICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcclxuXHJcbiAgICAvLyBPbmUgcGljayBwZXIgZnJhbWUsIGFnYWluc3QgdGhlIHBvaW50ZXIncyBsYXRlc3QgcG9zaXRpb24gLSBzZWUgb25Nb3VzZU1vdmUuXHJcbiAgICBpZiAodGhpcy5wZW5kaW5nUHJldmlld0V2ZW50KSB7XHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50O1xyXG4gICAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudFByZXZpZXcoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCk7XHJcbiAgICB9XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuICAgIGlmICh0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMuY2FudmFzUmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaXNjYXJkQ3VycmVudExvYWQoKTtcclxuICAgIHRoaXMuY2xlYXJUYWdzKCk7XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRyb2xzKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbHMuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=